diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000..36b4839181 Binary files /dev/null and b/.DS_Store differ diff --git a/.browserslistrc b/.browserslistrc new file mode 100644 index 0000000000..e94f8140cc --- /dev/null +++ b/.browserslistrc @@ -0,0 +1 @@ +defaults diff --git a/.generators b/.generators new file mode 100644 index 0000000000..a36888e32d --- /dev/null +++ b/.generators @@ -0,0 +1,8 @@ + + diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000..f22dd34725 --- /dev/null +++ b/.gitignore @@ -0,0 +1,36 @@ +# See https://help.github.com/articles/ignoring-files for more about ignoring files. +# +# If you find yourself ignoring temporary files generated by your text editor +# or operating system, you probably want to add a global ignore instead: +# git config --global core.excludesfile '~/.gitignore_global' + +# Ignore bundler config. +/.bundle + +# Ignore all logfiles and tempfiles. +/log/* +/tmp/* +!/log/.keep +!/tmp/.keep + +# Ignore pidfiles, but keep the directory. +/tmp/pids/* +!/tmp/pids/ +!/tmp/pids/.keep + +# Ignore uploaded files in development. +/storage/* +!/storage/.keep + +/public/assets +.byebug_history + +# Ignore master key for decrypting credentials and more. +/config/master.key + +/public/packs +/public/packs-test +/node_modules +/yarn-error.log +yarn-debug.log* +.yarn-integrity diff --git a/.idea/.generators b/.idea/.generators new file mode 100644 index 0000000000..5dad2b050e --- /dev/null +++ b/.idea/.generators @@ -0,0 +1,8 @@ + + diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000000..73f69e0958 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml +# Editor-based HTTP Client requests +/httpRequests/ diff --git a/.idea/.rakeTasks b/.idea/.rakeTasks new file mode 100644 index 0000000000..a73e500b08 --- /dev/null +++ b/.idea/.rakeTasks @@ -0,0 +1,7 @@ + + diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 0000000000..b0db9b0fca --- /dev/null +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/.idea/media-ranker.iml b/.idea/media-ranker.iml new file mode 100644 index 0000000000..f2bba1e519 --- /dev/null +++ b/.idea/media-ranker.iml @@ -0,0 +1,136 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000000..510e7fcc8f --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000000..447a2b2231 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000000..94a25f7f4c --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.ruby-version b/.ruby-version new file mode 100644 index 0000000000..57cf282ebb --- /dev/null +++ b/.ruby-version @@ -0,0 +1 @@ +2.6.5 diff --git a/Gemfile b/Gemfile new file mode 100644 index 0000000000..e0b31f7ec5 --- /dev/null +++ b/Gemfile @@ -0,0 +1,73 @@ +source 'https://rubygems.org' +git_source(:github) { |repo| "https://github.com/#{repo}.git" } + +ruby '2.6.5' + +# Bundle edge Rails instead: gem 'rails', github: 'rails/rails' +gem 'rails', '~> 6.0.3', '>= 6.0.3.4' +# Use postgresql as the database for Active Record +gem 'pg', '>= 0.18', '< 2.0' +# Use Puma as the app server +gem 'puma', '~> 4.1' +# Use SCSS for stylesheets +gem 'sass-rails', '>= 6' +# Transpile app-like JavaScript. Read more: https://github.com/rails/webpacker +gem 'webpacker', '~> 4.0' +# Turbolinks makes navigating your web application faster. Read more: https://github.com/turbolinks/turbolinks +gem 'turbolinks', '~> 5' +# Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder +gem 'jbuilder', '~> 2.7' +# Use Redis adapter to run Action Cable in production +# gem 'redis', '~> 4.0' +# Use Active Model has_secure_password +# gem 'bcrypt', '~> 3.1.7' + +# Use Active Storage variant +# gem 'image_processing', '~> 1.2' + +# Reduces boot times through caching; required in config/boot.rb +gem 'bootsnap', '>= 1.4.2', require: false + +group :development, :test do + # Call 'byebug' anywhere in the code to stop execution and get a debugger console + gem 'byebug', platforms: [:mri, :mingw, :x64_mingw] +end + +group :development do + # Access an interactive console on exception pages or by calling 'console' anywhere in the code. + gem 'web-console', '>= 3.3.0' + gem 'listen', '~> 3.2' + # Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring + gem 'spring' + gem 'spring-watcher-listen', '~> 2.0.0' +end + +group :test do + # Adds support for Capybara system testing and selenium driver + gem 'capybara', '>= 2.15' + gem 'selenium-webdriver' + # Easy installation and use of web drivers to run system tests with browsers + gem 'webdrivers' +end + +# Windows does not include zoneinfo files, so bundle the tzinfo-data gem +gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby] + +gem 'jquery-rails' +gem 'jquery-turbolinks' +gem 'bootstrap', '~> 4.1.3' +group :development, :test do + gem 'pry-rails' +end + +group :development do + gem 'better_errors' + gem 'binding_of_caller' + gem 'guard' + gem 'guard-minitest' +end + +group :test do + gem 'minitest-rails' + gem 'minitest-reporters' +end diff --git a/Gemfile.lock b/Gemfile.lock new file mode 100644 index 0000000000..5e5884e46a --- /dev/null +++ b/Gemfile.lock @@ -0,0 +1,296 @@ +GEM + remote: https://rubygems.org/ + specs: + actioncable (6.0.3.4) + actionpack (= 6.0.3.4) + nio4r (~> 2.0) + websocket-driver (>= 0.6.1) + actionmailbox (6.0.3.4) + actionpack (= 6.0.3.4) + activejob (= 6.0.3.4) + activerecord (= 6.0.3.4) + activestorage (= 6.0.3.4) + activesupport (= 6.0.3.4) + mail (>= 2.7.1) + actionmailer (6.0.3.4) + actionpack (= 6.0.3.4) + actionview (= 6.0.3.4) + activejob (= 6.0.3.4) + mail (~> 2.5, >= 2.5.4) + rails-dom-testing (~> 2.0) + actionpack (6.0.3.4) + actionview (= 6.0.3.4) + activesupport (= 6.0.3.4) + rack (~> 2.0, >= 2.0.8) + rack-test (>= 0.6.3) + rails-dom-testing (~> 2.0) + rails-html-sanitizer (~> 1.0, >= 1.2.0) + actiontext (6.0.3.4) + actionpack (= 6.0.3.4) + activerecord (= 6.0.3.4) + activestorage (= 6.0.3.4) + activesupport (= 6.0.3.4) + nokogiri (>= 1.8.5) + actionview (6.0.3.4) + activesupport (= 6.0.3.4) + builder (~> 3.1) + erubi (~> 1.4) + rails-dom-testing (~> 2.0) + rails-html-sanitizer (~> 1.1, >= 1.2.0) + activejob (6.0.3.4) + activesupport (= 6.0.3.4) + globalid (>= 0.3.6) + activemodel (6.0.3.4) + activesupport (= 6.0.3.4) + activerecord (6.0.3.4) + activemodel (= 6.0.3.4) + activesupport (= 6.0.3.4) + activestorage (6.0.3.4) + actionpack (= 6.0.3.4) + activejob (= 6.0.3.4) + activerecord (= 6.0.3.4) + marcel (~> 0.3.1) + activesupport (6.0.3.4) + concurrent-ruby (~> 1.0, >= 1.0.2) + i18n (>= 0.7, < 2) + minitest (~> 5.1) + tzinfo (~> 1.1) + zeitwerk (~> 2.2, >= 2.2.2) + addressable (2.7.0) + public_suffix (>= 2.0.2, < 5.0) + ansi (1.5.0) + autoprefixer-rails (10.0.2.0) + execjs + better_errors (2.9.1) + coderay (>= 1.0.0) + erubi (>= 1.0.0) + rack (>= 0.9.0) + bindex (0.8.1) + binding_of_caller (0.8.0) + debug_inspector (>= 0.0.1) + bootsnap (1.5.1) + msgpack (~> 1.0) + bootstrap (4.1.3) + autoprefixer-rails (>= 6.0.3) + popper_js (>= 1.12.9, < 2) + sass (>= 3.5.2) + builder (3.2.4) + byebug (11.1.3) + capybara (3.33.0) + addressable + mini_mime (>= 0.1.3) + nokogiri (~> 1.8) + rack (>= 1.6.0) + rack-test (>= 0.6.3) + regexp_parser (~> 1.5) + xpath (~> 3.2) + childprocess (3.0.0) + coderay (1.1.3) + concurrent-ruby (1.1.7) + crass (1.0.6) + debug_inspector (0.0.3) + erubi (1.10.0) + execjs (2.7.0) + ffi (1.13.1) + formatador (0.2.5) + globalid (0.4.2) + activesupport (>= 4.2.0) + guard (2.16.2) + formatador (>= 0.2.4) + listen (>= 2.7, < 4.0) + lumberjack (>= 1.0.12, < 2.0) + nenv (~> 0.1) + notiffany (~> 0.0) + pry (>= 0.9.12) + shellany (~> 0.0) + thor (>= 0.18.1) + guard-compat (1.2.1) + guard-minitest (2.4.6) + guard-compat (~> 1.2) + minitest (>= 3.0) + i18n (1.8.5) + concurrent-ruby (~> 1.0) + jbuilder (2.10.1) + activesupport (>= 5.0.0) + jquery-rails (4.4.0) + rails-dom-testing (>= 1, < 3) + railties (>= 4.2.0) + thor (>= 0.14, < 2.0) + jquery-turbolinks (2.1.0) + railties (>= 3.1.0) + turbolinks + listen (3.3.1) + rb-fsevent (~> 0.10, >= 0.10.3) + rb-inotify (~> 0.9, >= 0.9.10) + loofah (2.7.0) + crass (~> 1.0.2) + nokogiri (>= 1.5.9) + lumberjack (1.2.8) + mail (2.7.1) + mini_mime (>= 0.1.1) + marcel (0.3.3) + mimemagic (~> 0.3.2) + method_source (1.0.0) + mimemagic (0.3.5) + mini_mime (1.0.2) + mini_portile2 (2.4.0) + minitest (5.14.2) + minitest-rails (6.0.1) + minitest (~> 5.10) + railties (~> 6.0.0) + minitest-reporters (1.4.2) + ansi + builder + minitest (>= 5.0) + ruby-progressbar + msgpack (1.3.3) + nenv (0.3.0) + nio4r (2.5.4) + nokogiri (1.10.10) + mini_portile2 (~> 2.4.0) + notiffany (0.1.3) + nenv (~> 0.1) + shellany (~> 0.0) + pg (1.2.3) + popper_js (1.16.0) + pry (0.13.1) + coderay (~> 1.1) + method_source (~> 1.0) + pry-rails (0.3.9) + pry (>= 0.10.4) + public_suffix (4.0.6) + puma (4.3.6) + nio4r (~> 2.0) + rack (2.2.3) + rack-proxy (0.6.5) + rack + rack-test (1.1.0) + rack (>= 1.0, < 3) + rails (6.0.3.4) + actioncable (= 6.0.3.4) + actionmailbox (= 6.0.3.4) + actionmailer (= 6.0.3.4) + actionpack (= 6.0.3.4) + actiontext (= 6.0.3.4) + actionview (= 6.0.3.4) + activejob (= 6.0.3.4) + activemodel (= 6.0.3.4) + activerecord (= 6.0.3.4) + activestorage (= 6.0.3.4) + activesupport (= 6.0.3.4) + bundler (>= 1.3.0) + railties (= 6.0.3.4) + sprockets-rails (>= 2.0.0) + rails-dom-testing (2.0.3) + activesupport (>= 4.2.0) + nokogiri (>= 1.6) + rails-html-sanitizer (1.3.0) + loofah (~> 2.3) + railties (6.0.3.4) + actionpack (= 6.0.3.4) + activesupport (= 6.0.3.4) + method_source + rake (>= 0.8.7) + thor (>= 0.20.3, < 2.0) + rake (13.0.1) + rb-fsevent (0.10.4) + rb-inotify (0.10.1) + ffi (~> 1.0) + regexp_parser (1.8.2) + ruby-progressbar (1.10.1) + rubyzip (2.3.0) + sass (3.7.4) + sass-listen (~> 4.0.0) + sass-listen (4.0.0) + rb-fsevent (~> 0.9, >= 0.9.4) + rb-inotify (~> 0.9, >= 0.9.7) + sass-rails (6.0.0) + sassc-rails (~> 2.1, >= 2.1.1) + sassc (2.4.0) + ffi (~> 1.9) + sassc-rails (2.1.2) + railties (>= 4.0.0) + sassc (>= 2.0) + sprockets (> 3.0) + sprockets-rails + tilt + selenium-webdriver (3.142.7) + childprocess (>= 0.5, < 4.0) + rubyzip (>= 1.2.2) + shellany (0.0.1) + spring (2.1.1) + spring-watcher-listen (2.0.1) + listen (>= 2.7, < 4.0) + spring (>= 1.2, < 3.0) + sprockets (4.0.2) + concurrent-ruby (~> 1.0) + rack (> 1, < 3) + sprockets-rails (3.2.2) + actionpack (>= 4.0) + activesupport (>= 4.0) + sprockets (>= 3.0.0) + thor (1.0.1) + thread_safe (0.3.6) + tilt (2.0.10) + turbolinks (5.2.1) + turbolinks-source (~> 5.2) + turbolinks-source (5.2.0) + tzinfo (1.2.8) + thread_safe (~> 0.1) + web-console (4.1.0) + actionview (>= 6.0.0) + activemodel (>= 6.0.0) + bindex (>= 0.4.0) + railties (>= 6.0.0) + webdrivers (4.4.1) + nokogiri (~> 1.6) + rubyzip (>= 1.3.0) + selenium-webdriver (>= 3.0, < 4.0) + webpacker (4.3.0) + activesupport (>= 4.2) + rack-proxy (>= 0.6.1) + railties (>= 4.2) + websocket-driver (0.7.3) + websocket-extensions (>= 0.1.0) + websocket-extensions (0.1.5) + xpath (3.2.0) + nokogiri (~> 1.8) + zeitwerk (2.4.1) + +PLATFORMS + ruby + +DEPENDENCIES + better_errors + binding_of_caller + bootsnap (>= 1.4.2) + bootstrap (~> 4.1.3) + byebug + capybara (>= 2.15) + guard + guard-minitest + jbuilder (~> 2.7) + jquery-rails + jquery-turbolinks + listen (~> 3.2) + minitest-rails + minitest-reporters + pg (>= 0.18, < 2.0) + pry-rails + puma (~> 4.1) + rails (~> 6.0.3, >= 6.0.3.4) + sass-rails (>= 6) + selenium-webdriver + spring + spring-watcher-listen (~> 2.0.0) + turbolinks (~> 5) + tzinfo-data + web-console (>= 3.3.0) + webdrivers + webpacker (~> 4.0) + +RUBY VERSION + ruby 2.6.5p114 + +BUNDLED WITH + 2.1.4 diff --git a/Rakefile b/Rakefile new file mode 100644 index 0000000000..e85f913914 --- /dev/null +++ b/Rakefile @@ -0,0 +1,6 @@ +# Add your own tasks in files placed in lib/tasks ending in .rake, +# for example lib/tasks/capistrano.rake, and they will automatically be available to Rake. + +require_relative 'config/application' + +Rails.application.load_tasks diff --git a/app/assets/config/manifest.js b/app/assets/config/manifest.js new file mode 100644 index 0000000000..591819335f --- /dev/null +++ b/app/assets/config/manifest.js @@ -0,0 +1,2 @@ +//= link_tree ../images +//= link_directory ../stylesheets .css diff --git a/app/assets/images/.keep b/app/assets/images/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css new file mode 100644 index 0000000000..c12cbbdfb4 --- /dev/null +++ b/app/assets/stylesheets/application.css @@ -0,0 +1,8822 @@ +/* + * This is a manifest file that'll be compiled into application.css, which will include all the files + * listed below. + * + * Any CSS and SCSS file within this directory, lib/assets/stylesheets, or any plugin's + * vendor/assets/stylesheets directory can be referenced here using a relative path. + * + * You're free to add application-wide styles to this file and they'll appear at the bottom of the + * compiled file so the styles you add here take precedence over styles defined in any other CSS/SCSS + * files in this directory. Styles in this file should be added after the last require_* statement. + * It is generally better to create a new file per style scope. + * +/* *= require_tree .*/ +/* *= require_self*/ +/* *!*/ + +/*!* Custom bootstrap variables must be set or imported *before* bootstrap. *!*/ + + +/*// @import "bootstrap";*/ +/*//*/ +/*// @import "**!*";*/ + + + + +/*// TAKEN FROM INSPECTOR*/ +/* !*!*/ +/* * Bootstrap v4.1.3 (https://getbootstrap.com/)*/ +/* * Copyright 2011-2018 The Bootstrap Authors*/ +/* * Copyright 2011-2018 Twitter, Inc.*/ +/* * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)*/ +/* *!*/ +:root { + --blue: #007bff;--indigo: #6610f2;--purple: #6f42c1;--pink: #e83e8c;--red: #dc3545;--orange: #fd7e14;--yellow: #ffc107;--green: #28a745;--teal: #20c997;--cyan: #17a2b8;--white: #fff;--gray: #6c757d;--gray-dark: #343a40;--primary: #007bff;--secondary: #6c757d;--success: #28a745;--info: #17a2b8;--warning: #ffc107;--danger: #dc3545;--light: #f8f9fa;--dark: #343a40;--breakpoint-xs: 0;--breakpoint-sm: 576px;--breakpoint-md: 768px;--breakpoint-lg: 992px;--breakpoint-xl: 1200px;--font-family-sans-serif: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace} + +*,*::before,*::after { + box-sizing: border-box +} + +html { + font-family: sans-serif; + line-height: 1.15; + -webkit-text-size-adjust: 100%; + -ms-text-size-adjust: 100%; + -ms-overflow-style: scrollbar; + -webkit-tap-highlight-color: transparent +} + +@-ms-viewport { + width: device-width +} + +article,aside,figcaption,figure,footer,header,hgroup,main,nav,section { + display: block +} + +body { + margin: 0; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; + font-size: 1rem; + font-weight: 400; + line-height: 1.5; + color: #212529; + text-align: left; + background-color: #fff +} + +[tabindex="-1"]:focus { + outline: 0 !important +} + +hr { + box-sizing: content-box; + height: 0; + overflow: visible +} + +h1,h2,h3,h4,h5,h6 { + margin-top: 0; + margin-bottom: 0.5rem +} + +p { + margin-top: 0; + margin-bottom: 1rem +} + +abbr[title],abbr[data-original-title] { + text-decoration: underline; + -webkit-text-decoration: underline dotted; + text-decoration: underline dotted; + cursor: help; + border-bottom: 0 +} +/*section.top-ten__list-container {*/ +/* display: -webkit-flex;*/ +/* display: flex;*/ +/*}*/ + +/*header.top-ten__header {*/ +/* display: -webkit-flex;*/ +/* display: flex;*/ +/*}*/ + + + +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 +} + +dfn { + font-style: italic +} + +b,strong { + font-weight: bolder +} + +small { + font-size: 80% +} + +sub,sup { + position: relative; + font-size: 75%; + line-height: 0; + vertical-align: baseline +} + +sub { + bottom: -.25em +} + +sup { + top: -.5em +} + +a { + color: #007bff; + text-decoration: none; + background-color: transparent; + -webkit-text-decoration-skip: objects +} + +a:hover { + color: #0056b3; + text-decoration: underline +} + +a:not([href]):not([tabindex]) { + color: inherit; + text-decoration: none +} + +a:not([href]):not([tabindex]):hover,a:not([href]):not([tabindex]):focus { + color: inherit; + text-decoration: none +} + +a:not([href]):not([tabindex]):focus { + outline: 0 +} + +pre,code,kbd,samp { + font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; + font-size: 1em +} + +pre { + margin-top: 0; + margin-bottom: 1rem; + overflow: auto; + -ms-overflow-style: scrollbar +} + +figure { + margin: 0 0 1rem +} + +img { + vertical-align: middle; + border-style: none +} + +svg { + overflow: hidden; + vertical-align: middle +} + +table { + border-collapse: collapse +} + +caption { + padding-top: 0.75rem; + padding-bottom: 0.75rem; + color: #6c757d; + text-align: left; + caption-side: bottom +} + +th { + text-align: inherit +} + +label { + display: inline-block; + margin-bottom: 0.5rem +} + +button { + border-radius: 0 +} + +button:focus { + outline: 1px dotted; + outline: 5px auto -webkit-focus-ring-color +} + +input,button,select,optgroup,textarea { + margin: 0; + font-family: inherit; + font-size: inherit; + line-height: inherit +} + +button,input { + overflow: visible +} + +button,select { + text-transform: none +} + +button,html [type="button"],[type="reset"],[type="submit"] { + -webkit-appearance: button +} + +button::-moz-focus-inner,[type="button"]::-moz-focus-inner,[type="reset"]::-moz-focus-inner,[type="submit"]::-moz-focus-inner { + padding: 0; + border-style: none +} + +input[type="radio"],input[type="checkbox"] { + box-sizing: border-box; + padding: 0 +} + +input[type="date"],input[type="time"],input[type="datetime-local"],input[type="month"] { + -webkit-appearance: listbox +} + +textarea { + overflow: auto; + resize: vertical +} + +fieldset { + min-width: 0; + padding: 0; + margin: 0; + border: 0 +} + +legend { + display: block; + width: 100%; + max-width: 100%; + padding: 0; + margin-bottom: .5rem; + font-size: 1.5rem; + line-height: inherit; + color: inherit; + white-space: normal +} + +progress { + vertical-align: baseline +} + +[type="number"]::-webkit-inner-spin-button,[type="number"]::-webkit-outer-spin-button { + height: auto +} + +[type="search"] { + outline-offset: -2px; + -webkit-appearance: none +} + +[type="search"]::-webkit-search-cancel-button,[type="search"]::-webkit-search-decoration { + -webkit-appearance: none +} + +::-webkit-file-upload-button { + font: inherit; + -webkit-appearance: button +} + +output { + display: inline-block +} + +summary { + display: list-item; + cursor: pointer +} + +template { + display: none +} + +[hidden] { + display: none !important +} + +h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6 { + margin-bottom: 0.5rem; + font-family: inherit; + font-weight: 500; + line-height: 1.2; + 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; + line-height: 1.2 +} + +.display-2 { + font-size: 5.5rem; + font-weight: 300; + line-height: 1.2 +} + +.display-3 { + font-size: 4.5rem; + font-weight: 300; + line-height: 1.2 +} + +.display-4 { + font-size: 3.5rem; + font-weight: 300; + line-height: 1.2 +} + +hr { + margin-top: 1rem; + margin-bottom: 1rem; + border: 0; + border-top: 1px solid rgba(0,0,0,0.1) +} + +small,.small { + font-size: 80%; + font-weight: 400 +} + +mark,.mark { + padding: 0.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: 0.5rem +} + +.initialism { + font-size: 90%; + text-transform: uppercase +} + +.blockquote { + margin-bottom: 1rem; + font-size: 1.25rem +} + +.blockquote-footer { + display: block; + font-size: 80%; + color: #6c757d +} + +.blockquote-footer::before { + content: "\2014 \00A0" +} + +.img-fluid { + max-width: 100%; + height: auto +} + +.img-thumbnail { + padding: 0.25rem; + background-color: #fff; + border: 1px solid #dee2e6; + border-radius: 0.25rem; + max-width: 100%; + height: auto +} + +.figure { + display: inline-block +} + +.figure-img { + margin-bottom: 0.5rem; + line-height: 1 +} + +.figure-caption { + font-size: 90%; + color: #6c757d +} + +code { + font-size: 87.5%; + color: #e83e8c; + word-break: break-word +} + +a>code { + color: inherit +} + +kbd { + padding: 0.2rem 0.4rem; + font-size: 87.5%; + color: #fff; + background-color: #212529; + border-radius: 0.2rem +} + +kbd kbd { + padding: 0; + font-size: 100%; + font-weight: 700 +} + +pre { + display: block; + font-size: 87.5%; + color: #212529 +} + +pre code { + font-size: inherit; + color: inherit; + word-break: normal +} + +.pre-scrollable { + max-height: 340px; + overflow-y: scroll +} + +.container { + width: 100%; + padding-right: 15px; + padding-left: 15px; + margin-right: auto; + margin-left: auto +} + +@media (min-width: 576px) { + .container { + max-width:540px + } +} + +@media (min-width: 768px) { + .container { + max-width:720px + } +} + +@media (min-width: 992px) { + .container { + max-width:960px + } +} + +@media (min-width: 1200px) { + .container { + max-width:1140px + } +} + +.container-fluid { + width: 100%; + padding-right: 15px; + padding-left: 15px; + margin-right: auto; + margin-left: auto +} + +.row { + display: flex; + flex-wrap: wrap; + margin-right: -15px; + margin-left: -15px +} + +.no-gutters { + margin-right: 0; + margin-left: 0 +} + +.no-gutters>.col,.no-gutters>[class*="col-"] { + padding-right: 0; + padding-left: 0 +} + +.col-1,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-10,.col-11,.col-12,.col,.col-auto,.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm,.col-sm-auto,.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12,.col-md,.col-md-auto,.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg,.col-lg-auto,.col-xl-1,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl,.col-xl-auto { + position: relative; + width: 100%; + min-height: 1px; + padding-right: 15px; + padding-left: 15px +} + +.col { + flex-basis: 0; + flex-grow: 1; + max-width: 100% +} + +.col-auto { + flex: 0 0 auto; + width: auto; + max-width: none +} + +.col-1 { + flex: 0 0 8.3333333333%; + max-width: 8.3333333333% +} + +.col-2 { + flex: 0 0 16.6666666667%; + max-width: 16.6666666667% +} + +.col-3 { + flex: 0 0 25%; + max-width: 25% +} + +.col-4 { + flex: 0 0 33.3333333333%; + max-width: 33.3333333333% +} + +.col-5 { + flex: 0 0 41.6666666667%; + max-width: 41.6666666667% +} + +.col-6 { + flex: 0 0 50%; + max-width: 50% +} + +.col-7 { + flex: 0 0 58.3333333333%; + max-width: 58.3333333333% +} + +.col-8 { + flex: 0 0 66.6666666667%; + max-width: 66.6666666667% +} + +.col-9 { + flex: 0 0 75%; + max-width: 75% +} + +.col-10 { + flex: 0 0 83.3333333333%; + max-width: 83.3333333333% +} + +.col-11 { + flex: 0 0 91.6666666667%; + max-width: 91.6666666667% +} + +.col-12 { + flex: 0 0 100%; + max-width: 100% +} + +.order-first { + order: -1 +} + +.order-last { + order: 13 +} + +.order-0 { + order: 0 +} + +.order-1 { + order: 1 +} + +.order-2 { + order: 2 +} + +.order-3 { + order: 3 +} + +.order-4 { + order: 4 +} + +.order-5 { + order: 5 +} + +.order-6 { + order: 6 +} + +.order-7 { + order: 7 +} + +.order-8 { + order: 8 +} + +.order-9 { + order: 9 +} + +.order-10 { + order: 10 +} + +.order-11 { + order: 11 +} + +.order-12 { + order: 12 +} + +.offset-1 { + margin-left: 8.3333333333% +} + +.offset-2 { + margin-left: 16.6666666667% +} + +.offset-3 { + margin-left: 25% +} + +.offset-4 { + margin-left: 33.3333333333% +} + +.offset-5 { + margin-left: 41.6666666667% +} + +.offset-6 { + margin-left: 50% +} + +.offset-7 { + margin-left: 58.3333333333% +} + +.offset-8 { + margin-left: 66.6666666667% +} + +.offset-9 { + margin-left: 75% +} + +.offset-10 { + margin-left: 83.3333333333% +} + +.offset-11 { + margin-left: 91.6666666667% +} + +@media (min-width: 576px) { + .col-sm { + flex-basis:0; + flex-grow: 1; + max-width: 100% + } + + .col-sm-auto { + flex: 0 0 auto; + width: auto; + max-width: none + } + + .col-sm-1 { + flex: 0 0 8.3333333333%; + max-width: 8.3333333333% + } + + .col-sm-2 { + flex: 0 0 16.6666666667%; + max-width: 16.6666666667% + } + + .col-sm-3 { + flex: 0 0 25%; + max-width: 25% + } + + .col-sm-4 { + flex: 0 0 33.3333333333%; + max-width: 33.3333333333% + } + + .col-sm-5 { + flex: 0 0 41.6666666667%; + max-width: 41.6666666667% + } + + .col-sm-6 { + flex: 0 0 50%; + max-width: 50% + } + + .col-sm-7 { + flex: 0 0 58.3333333333%; + max-width: 58.3333333333% + } + + .col-sm-8 { + flex: 0 0 66.6666666667%; + max-width: 66.6666666667% + } + + .col-sm-9 { + flex: 0 0 75%; + max-width: 75% + } + + .col-sm-10 { + flex: 0 0 83.3333333333%; + max-width: 83.3333333333% + } + + .col-sm-11 { + flex: 0 0 91.6666666667%; + max-width: 91.6666666667% + } + + .col-sm-12 { + flex: 0 0 100%; + max-width: 100% + } + + .order-sm-first { + order: -1 + } + + .order-sm-last { + order: 13 + } + + .order-sm-0 { + order: 0 + } + + .order-sm-1 { + order: 1 + } + + .order-sm-2 { + order: 2 + } + + .order-sm-3 { + order: 3 + } + + .order-sm-4 { + order: 4 + } + + .order-sm-5 { + order: 5 + } + + .order-sm-6 { + order: 6 + } + + .order-sm-7 { + order: 7 + } + + .order-sm-8 { + order: 8 + } + + .order-sm-9 { + order: 9 + } + + .order-sm-10 { + order: 10 + } + + .order-sm-11 { + order: 11 + } + + .order-sm-12 { + order: 12 + } + + .offset-sm-0 { + margin-left: 0 + } + + .offset-sm-1 { + margin-left: 8.3333333333% + } + + .offset-sm-2 { + margin-left: 16.6666666667% + } + + .offset-sm-3 { + margin-left: 25% + } + + .offset-sm-4 { + margin-left: 33.3333333333% + } + + .offset-sm-5 { + margin-left: 41.6666666667% + } + + .offset-sm-6 { + margin-left: 50% + } + + .offset-sm-7 { + margin-left: 58.3333333333% + } + + .offset-sm-8 { + margin-left: 66.6666666667% + } + + .offset-sm-9 { + margin-left: 75% + } + + .offset-sm-10 { + margin-left: 83.3333333333% + } + + .offset-sm-11 { + margin-left: 91.6666666667% + } +} + +@media (min-width: 768px) { + .col-md { + flex-basis:0; + flex-grow: 1; + max-width: 100% + } + + .col-md-auto { + flex: 0 0 auto; + width: auto; + max-width: none + } + + .col-md-1 { + flex: 0 0 8.3333333333%; + max-width: 8.3333333333% + } + + .col-md-2 { + flex: 0 0 16.6666666667%; + max-width: 16.6666666667% + } + + .col-md-3 { + flex: 0 0 25%; + max-width: 25% + } + + .col-md-4 { + flex: 0 0 33.3333333333%; + max-width: 33.3333333333% + } + + .col-md-5 { + flex: 0 0 41.6666666667%; + max-width: 41.6666666667% + } + + .col-md-6 { + flex: 0 0 50%; + max-width: 50% + } + + .col-md-7 { + flex: 0 0 58.3333333333%; + max-width: 58.3333333333% + } + + .col-md-8 { + flex: 0 0 66.6666666667%; + max-width: 66.6666666667% + } + + .col-md-9 { + flex: 0 0 75%; + max-width: 75% + } + + .col-md-10 { + flex: 0 0 83.3333333333%; + max-width: 83.3333333333% + } + + .col-md-11 { + flex: 0 0 91.6666666667%; + max-width: 91.6666666667% + } + + .col-md-12 { + flex: 0 0 100%; + max-width: 100% + } + + .order-md-first { + order: -1 + } + + .order-md-last { + order: 13 + } + + .order-md-0 { + order: 0 + } + + .order-md-1 { + order: 1 + } + + .order-md-2 { + order: 2 + } + + .order-md-3 { + order: 3 + } + + .order-md-4 { + order: 4 + } + + .order-md-5 { + order: 5 + } + + .order-md-6 { + order: 6 + } + + .order-md-7 { + order: 7 + } + + .order-md-8 { + order: 8 + } + + .order-md-9 { + order: 9 + } + + .order-md-10 { + order: 10 + } + + .order-md-11 { + order: 11 + } + + .order-md-12 { + order: 12 + } + + .offset-md-0 { + margin-left: 0 + } + + .offset-md-1 { + margin-left: 8.3333333333% + } + + .offset-md-2 { + margin-left: 16.6666666667% + } + + .offset-md-3 { + margin-left: 25% + } + + .offset-md-4 { + margin-left: 33.3333333333% + } + + .offset-md-5 { + margin-left: 41.6666666667% + } + + .offset-md-6 { + margin-left: 50% + } + + .offset-md-7 { + margin-left: 58.3333333333% + } + + .offset-md-8 { + margin-left: 66.6666666667% + } + + .offset-md-9 { + margin-left: 75% + } + + .offset-md-10 { + margin-left: 83.3333333333% + } + + .offset-md-11 { + margin-left: 91.6666666667% + } +} + +@media (min-width: 992px) { + .col-lg { + flex-basis:0; + flex-grow: 1; + max-width: 100% + } + + .col-lg-auto { + flex: 0 0 auto; + width: auto; + max-width: none + } + + .col-lg-1 { + flex: 0 0 8.3333333333%; + max-width: 8.3333333333% + } + + .col-lg-2 { + flex: 0 0 16.6666666667%; + max-width: 16.6666666667% + } + + .col-lg-3 { + flex: 0 0 25%; + max-width: 25% + } + + .col-lg-4 { + flex: 0 0 33.3333333333%; + max-width: 33.3333333333% + } + + .col-lg-5 { + flex: 0 0 41.6666666667%; + max-width: 41.6666666667% + } + + .col-lg-6 { + flex: 0 0 50%; + max-width: 50% + } + + .col-lg-7 { + flex: 0 0 58.3333333333%; + max-width: 58.3333333333% + } + + .col-lg-8 { + flex: 0 0 66.6666666667%; + max-width: 66.6666666667% + } + + .col-lg-9 { + flex: 0 0 75%; + max-width: 75% + } + + .col-lg-10 { + flex: 0 0 83.3333333333%; + max-width: 83.3333333333% + } + + .col-lg-11 { + flex: 0 0 91.6666666667%; + max-width: 91.6666666667% + } + + .col-lg-12 { + flex: 0 0 100%; + max-width: 100% + } + + .order-lg-first { + order: -1 + } + + .order-lg-last { + order: 13 + } + + .order-lg-0 { + order: 0 + } + + .order-lg-1 { + order: 1 + } + + .order-lg-2 { + order: 2 + } + + .order-lg-3 { + order: 3 + } + + .order-lg-4 { + order: 4 + } + + .order-lg-5 { + order: 5 + } + + .order-lg-6 { + order: 6 + } + + .order-lg-7 { + order: 7 + } + + .order-lg-8 { + order: 8 + } + + .order-lg-9 { + order: 9 + } + + .order-lg-10 { + order: 10 + } + + .order-lg-11 { + order: 11 + } + + .order-lg-12 { + order: 12 + } + + .offset-lg-0 { + margin-left: 0 + } + + .offset-lg-1 { + margin-left: 8.3333333333% + } + + .offset-lg-2 { + margin-left: 16.6666666667% + } + + .offset-lg-3 { + margin-left: 25% + } + + .offset-lg-4 { + margin-left: 33.3333333333% + } + + .offset-lg-5 { + margin-left: 41.6666666667% + } + + .offset-lg-6 { + margin-left: 50% + } + + .offset-lg-7 { + margin-left: 58.3333333333% + } + + .offset-lg-8 { + margin-left: 66.6666666667% + } + + .offset-lg-9 { + margin-left: 75% + } + + .offset-lg-10 { + margin-left: 83.3333333333% + } + + .offset-lg-11 { + margin-left: 91.6666666667% + } +} + +@media (min-width: 1200px) { + .col-xl { + flex-basis:0; + flex-grow: 1; + max-width: 100% + } + + .col-xl-auto { + flex: 0 0 auto; + width: auto; + max-width: none + } + + .col-xl-1 { + flex: 0 0 8.3333333333%; + max-width: 8.3333333333% + } + + .col-xl-2 { + flex: 0 0 16.6666666667%; + max-width: 16.6666666667% + } + + .col-xl-3 { + flex: 0 0 25%; + max-width: 25% + } + + .col-xl-4 { + flex: 0 0 33.3333333333%; + max-width: 33.3333333333% + } + + .col-xl-5 { + flex: 0 0 41.6666666667%; + max-width: 41.6666666667% + } + + .col-xl-6 { + flex: 0 0 50%; + max-width: 50% + } + + .col-xl-7 { + flex: 0 0 58.3333333333%; + max-width: 58.3333333333% + } + + .col-xl-8 { + flex: 0 0 66.6666666667%; + max-width: 66.6666666667% + } + + .col-xl-9 { + flex: 0 0 75%; + max-width: 75% + } + + .col-xl-10 { + flex: 0 0 83.3333333333%; + max-width: 83.3333333333% + } + + .col-xl-11 { + flex: 0 0 91.6666666667%; + max-width: 91.6666666667% + } + + .col-xl-12 { + flex: 0 0 100%; + max-width: 100% + } + + .order-xl-first { + order: -1 + } + + .order-xl-last { + order: 13 + } + + .order-xl-0 { + order: 0 + } + + .order-xl-1 { + order: 1 + } + + .order-xl-2 { + order: 2 + } + + .order-xl-3 { + order: 3 + } + + .order-xl-4 { + order: 4 + } + + .order-xl-5 { + order: 5 + } + + .order-xl-6 { + order: 6 + } + + .order-xl-7 { + order: 7 + } + + .order-xl-8 { + order: 8 + } + + .order-xl-9 { + order: 9 + } + + .order-xl-10 { + order: 10 + } + + .order-xl-11 { + order: 11 + } + + .order-xl-12 { + order: 12 + } + + .offset-xl-0 { + margin-left: 0 + } + + .offset-xl-1 { + margin-left: 8.3333333333% + } + + .offset-xl-2 { + margin-left: 16.6666666667% + } + + .offset-xl-3 { + margin-left: 25% + } + + .offset-xl-4 { + margin-left: 33.3333333333% + } + + .offset-xl-5 { + margin-left: 41.6666666667% + } + + .offset-xl-6 { + margin-left: 50% + } + + .offset-xl-7 { + margin-left: 58.3333333333% + } + + .offset-xl-8 { + margin-left: 66.6666666667% + } + + .offset-xl-9 { + margin-left: 75% + } + + .offset-xl-10 { + margin-left: 83.3333333333% + } + + .offset-xl-11 { + margin-left: 91.6666666667% + } +} + +.table { + width: 100%; + margin-bottom: 1rem; + background-color: transparent +} + +.table th,.table td { + padding: 0.75rem; + vertical-align: top; + border-top: 1px solid #dee2e6 +} + +.table thead th { + vertical-align: bottom; + border-bottom: 2px solid #dee2e6 +} + +.table tbody+tbody { + border-top: 2px solid #dee2e6 +} + +.table .table { + background-color: #fff +} + +.table-sm th,.table-sm td { + padding: 0.3rem +} + +.table-bordered { + border: 1px solid #dee2e6 +} + +.table-bordered th,.table-bordered td { + border: 1px solid #dee2e6 +} + +.table-bordered thead th,.table-bordered thead td { + border-bottom-width: 2px +} + +.table-borderless th,.table-borderless td,.table-borderless thead th,.table-borderless tbody+tbody { + border: 0 +} + +.table-striped tbody tr:nth-of-type(odd) { + background-color: rgba(0,0,0,0.05) +} + +.table-hover tbody tr:hover { + background-color: rgba(0,0,0,0.075) +} + +.table-primary,.table-primary>th,.table-primary>td { + background-color: #b8daff +} + +.table-hover .table-primary:hover { + background-color: #9fcdff +} + +.table-hover .table-primary:hover>td,.table-hover .table-primary:hover>th { + background-color: #9fcdff +} + +.table-secondary,.table-secondary>th,.table-secondary>td { + background-color: #d6d8db +} + +.table-hover .table-secondary:hover { + background-color: #c8cbcf +} + +.table-hover .table-secondary:hover>td,.table-hover .table-secondary:hover>th { + background-color: #c8cbcf +} + +.table-success,.table-success>th,.table-success>td { + background-color: #c3e6cb +} + +.table-hover .table-success:hover { + background-color: #b1dfbb +} + +.table-hover .table-success:hover>td,.table-hover .table-success:hover>th { + background-color: #b1dfbb +} + +.table-info,.table-info>th,.table-info>td { + background-color: #bee5eb +} + +.table-hover .table-info:hover { + background-color: #abdde5 +} + +.table-hover .table-info:hover>td,.table-hover .table-info:hover>th { + background-color: #abdde5 +} + +.table-warning,.table-warning>th,.table-warning>td { + background-color: #ffeeba +} + +.table-hover .table-warning:hover { + background-color: #ffe8a1 +} + +.table-hover .table-warning:hover>td,.table-hover .table-warning:hover>th { + background-color: #ffe8a1 +} + +.table-danger,.table-danger>th,.table-danger>td { + background-color: #f5c6cb +} + +.table-hover .table-danger:hover { + background-color: #f1b0b7 +} + +.table-hover .table-danger:hover>td,.table-hover .table-danger:hover>th { + background-color: #f1b0b7 +} + +.table-light,.table-light>th,.table-light>td { + background-color: #fdfdfe +} + +.table-hover .table-light:hover { + background-color: #ececf6 +} + +.table-hover .table-light:hover>td,.table-hover .table-light:hover>th { + background-color: #ececf6 +} + +.table-dark,.table-dark>th,.table-dark>td { + background-color: #c6c8ca +} + +.table-hover .table-dark:hover { + background-color: #b9bbbe +} + +.table-hover .table-dark:hover>td,.table-hover .table-dark:hover>th { + background-color: #b9bbbe +} + +.table-active,.table-active>th,.table-active>td { + background-color: rgba(0,0,0,0.075) +} + +.table-hover .table-active:hover { + background-color: rgba(0,0,0,0.075) +} + +.table-hover .table-active:hover>td,.table-hover .table-active:hover>th { + background-color: rgba(0,0,0,0.075) +} + +.table .thead-dark th { + color: #fff; + background-color: #212529; + border-color: #32383e +} + +.table .thead-light th { + color: #495057; + background-color: #e9ecef; + border-color: #dee2e6 +} + +.table-dark { + color: #fff; + background-color: #212529 +} + +.table-dark th,.table-dark td,.table-dark thead th { + border-color: #32383e +} + +.table-dark.table-bordered { + border: 0 +} + +.table-dark.table-striped tbody tr:nth-of-type(odd) { + background-color: rgba(255,255,255,0.05) +} + +.table-dark.table-hover tbody tr:hover { + background-color: rgba(255,255,255,0.075) +} + +@media (max-width: 575.98px) { + .table-responsive-sm { + display:block; + width: 100%; + overflow-x: auto; + -webkit-overflow-scrolling: touch; + -ms-overflow-style: -ms-autohiding-scrollbar + } + + .table-responsive-sm>.table-bordered { + border: 0 + } +} + +@media (max-width: 767.98px) { + .table-responsive-md { + display:block; + width: 100%; + overflow-x: auto; + -webkit-overflow-scrolling: touch; + -ms-overflow-style: -ms-autohiding-scrollbar + } + + .table-responsive-md>.table-bordered { + border: 0 + } +} + +@media (max-width: 991.98px) { + .table-responsive-lg { + display:block; + width: 100%; + overflow-x: auto; + -webkit-overflow-scrolling: touch; + -ms-overflow-style: -ms-autohiding-scrollbar + } + + .table-responsive-lg>.table-bordered { + border: 0 + } +} + +@media (max-width: 1199.98px) { + .table-responsive-xl { + display:block; + width: 100%; + overflow-x: auto; + -webkit-overflow-scrolling: touch; + -ms-overflow-style: -ms-autohiding-scrollbar + } + + .table-responsive-xl>.table-bordered { + border: 0 + } +} + +.table-responsive { + display: block; + width: 100%; + overflow-x: auto; + -webkit-overflow-scrolling: touch; + -ms-overflow-style: -ms-autohiding-scrollbar +} + +.table-responsive>.table-bordered { + border: 0 +} + +.form-control { + display: block; + width: 100%; + height: calc(2.25rem + 2px); + padding: 0.375rem 0.75rem; + font-size: 1rem; + line-height: 1.5; + color: #495057; + background-color: #fff; + background-clip: padding-box; + border: 1px solid #ced4da; + border-radius: 0.25rem; + transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out +} + +@media screen and (prefers-reduced-motion: reduce) { + .form-control { + transition: none + } +} + +.form-control::-ms-expand { + background-color: transparent; + border: 0 +} + +.form-control:focus { + color: #495057; + background-color: #fff; + border-color: #80bdff; + outline: 0; + box-shadow: 0 0 0 0.2rem rgba(0,123,255,0.25) +} + +.form-control::-webkit-input-placeholder { + color: #6c757d; + opacity: 1 +} + +.form-control:-ms-input-placeholder { + color: #6c757d; + opacity: 1 +} + +.form-control::-ms-input-placeholder { + color: #6c757d; + opacity: 1 +} + +.form-control::placeholder { + color: #6c757d; + opacity: 1 +} + +.form-control:disabled,.form-control[readonly] { + background-color: #e9ecef; + opacity: 1 +} + +select.form-control:focus::-ms-value { + color: #495057; + background-color: #fff +} + +.form-control-file,.form-control-range { + display: block; + width: 100% +} + +.col-form-label { + padding-top: calc(0.375rem + 1px); + padding-bottom: calc(0.375rem + 1px); + margin-bottom: 0; + font-size: inherit; + line-height: 1.5 +} + +.col-form-label-lg { + padding-top: calc(0.5rem + 1px); + padding-bottom: calc(0.5rem + 1px); + font-size: 1.25rem; + line-height: 1.5 +} + +.col-form-label-sm { + padding-top: calc(0.25rem + 1px); + padding-bottom: calc(0.25rem + 1px); + font-size: 0.875rem; + line-height: 1.5 +} + +.form-control-plaintext { + display: block; + width: 100%; + padding-top: 0.375rem; + padding-bottom: 0.375rem; + margin-bottom: 0; + line-height: 1.5; + color: #212529; + background-color: transparent; + border: solid transparent; + border-width: 1px 0 +} + +.form-control-plaintext.form-control-sm,.form-control-plaintext.form-control-lg { + padding-right: 0; + padding-left: 0 +} + +.form-control-sm { + height: calc(1.8125rem + 2px); + padding: 0.25rem 0.5rem; + font-size: 0.875rem; + line-height: 1.5; + border-radius: 0.2rem +} + +.form-control-lg { + height: calc(2.875rem + 2px); + padding: 0.5rem 1rem; + font-size: 1.25rem; + line-height: 1.5; + border-radius: 0.3rem +} + +select.form-control[size],select.form-control[multiple] { + height: auto +} + +textarea.form-control { + height: auto +} + +.form-group { + margin-bottom: 1rem +} + +.form-text { + display: block; + margin-top: 0.25rem +} + +.form-row { + display: flex; + flex-wrap: wrap; + margin-right: -5px; + margin-left: -5px +} + +.form-row>.col,.form-row>[class*="col-"] { + padding-right: 5px; + padding-left: 5px +} + +.form-check { + position: relative; + display: block; + padding-left: 1.25rem +} + +.form-check-input { + position: absolute; + margin-top: 0.3rem; + margin-left: -1.25rem +} + +.form-check-input:disabled ~ .form-check-label { + color: #6c757d +} + +.form-check-label { + margin-bottom: 0 +} + +.form-check-inline { + display: inline-flex; + align-items: center; + padding-left: 0; + margin-right: 0.75rem +} + +.form-check-inline .form-check-input { + position: static; + margin-top: 0; + margin-right: 0.3125rem; + margin-left: 0 +} + +.valid-feedback { + display: none; + width: 100%; + margin-top: 0.25rem; + font-size: 80%; + color: #28a745 +} + +.valid-tooltip { + position: absolute; + top: 100%; + z-index: 5; + display: none; + max-width: 100%; + padding: 0.25rem 0.5rem; + margin-top: .1rem; + font-size: 0.875rem; + line-height: 1.5; + color: #fff; + background-color: rgba(40,167,69,0.9); + border-radius: 0.25rem +} + +.was-validated .form-control:valid,.form-control.is-valid,.was-validated .custom-select:valid,.custom-select.is-valid { + border-color: #28a745 +} + +.was-validated .form-control:valid:focus,.form-control.is-valid:focus,.was-validated .custom-select:valid:focus,.custom-select.is-valid:focus { + border-color: #28a745; + box-shadow: 0 0 0 0.2rem rgba(40,167,69,0.25) +} + +.was-validated .form-control:valid ~ .valid-feedback,.was-validated .form-control:valid ~ .valid-tooltip,.form-control.is-valid ~ .valid-feedback,.form-control.is-valid ~ .valid-tooltip,.was-validated .custom-select:valid ~ .valid-feedback,.was-validated .custom-select:valid ~ .valid-tooltip,.custom-select.is-valid ~ .valid-feedback,.custom-select.is-valid ~ .valid-tooltip { + display: block +} + +.was-validated .form-control-file:valid ~ .valid-feedback,.was-validated .form-control-file:valid ~ .valid-tooltip,.form-control-file.is-valid ~ .valid-feedback,.form-control-file.is-valid ~ .valid-tooltip { + display: block +} + +.was-validated .form-check-input:valid ~ .form-check-label,.form-check-input.is-valid ~ .form-check-label { + color: #28a745 +} + +.was-validated .form-check-input:valid ~ .valid-feedback,.was-validated .form-check-input:valid ~ .valid-tooltip,.form-check-input.is-valid ~ .valid-feedback,.form-check-input.is-valid ~ .valid-tooltip { + display: block +} + +.was-validated .custom-control-input:valid ~ .custom-control-label,.custom-control-input.is-valid ~ .custom-control-label { + color: #28a745 +} + +.was-validated .custom-control-input:valid ~ .custom-control-label::before,.custom-control-input.is-valid ~ .custom-control-label::before { + background-color: #71dd8a +} + +.was-validated .custom-control-input:valid ~ .valid-feedback,.was-validated .custom-control-input:valid ~ .valid-tooltip,.custom-control-input.is-valid ~ .valid-feedback,.custom-control-input.is-valid ~ .valid-tooltip { + display: block +} + +.was-validated .custom-control-input:valid:checked ~ .custom-control-label::before,.custom-control-input.is-valid:checked ~ .custom-control-label::before { + background-color: #34ce57 +} + +.was-validated .custom-control-input:valid:focus ~ .custom-control-label::before,.custom-control-input.is-valid:focus ~ .custom-control-label::before { + box-shadow: 0 0 0 1px #fff,0 0 0 0.2rem rgba(40,167,69,0.25) +} + +.was-validated .custom-file-input:valid ~ .custom-file-label,.custom-file-input.is-valid ~ .custom-file-label { + border-color: #28a745 +} + +.was-validated .custom-file-input:valid ~ .custom-file-label::after,.custom-file-input.is-valid ~ .custom-file-label::after { + border-color: inherit +} + +.was-validated .custom-file-input:valid ~ .valid-feedback,.was-validated .custom-file-input:valid ~ .valid-tooltip,.custom-file-input.is-valid ~ .valid-feedback,.custom-file-input.is-valid ~ .valid-tooltip { + display: block +} + +.was-validated .custom-file-input:valid:focus ~ .custom-file-label,.custom-file-input.is-valid:focus ~ .custom-file-label { + box-shadow: 0 0 0 0.2rem rgba(40,167,69,0.25) +} + +.invalid-feedback { + display: none; + width: 100%; + margin-top: 0.25rem; + font-size: 80%; + color: #dc3545 +} + +.invalid-tooltip { + position: absolute; + top: 100%; + z-index: 5; + display: none; + max-width: 100%; + padding: 0.25rem 0.5rem; + margin-top: .1rem; + font-size: 0.875rem; + line-height: 1.5; + color: #fff; + background-color: rgba(220,53,69,0.9); + border-radius: 0.25rem +} + +.was-validated .form-control:invalid,.form-control.is-invalid,.was-validated .custom-select:invalid,.custom-select.is-invalid { + border-color: #dc3545 +} + +.was-validated .form-control:invalid:focus,.form-control.is-invalid:focus,.was-validated .custom-select:invalid:focus,.custom-select.is-invalid:focus { + border-color: #dc3545; + box-shadow: 0 0 0 0.2rem rgba(220,53,69,0.25) +} + +.was-validated .form-control:invalid ~ .invalid-feedback,.was-validated .form-control:invalid ~ .invalid-tooltip,.form-control.is-invalid ~ .invalid-feedback,.form-control.is-invalid ~ .invalid-tooltip,.was-validated .custom-select:invalid ~ .invalid-feedback,.was-validated .custom-select:invalid ~ .invalid-tooltip,.custom-select.is-invalid ~ .invalid-feedback,.custom-select.is-invalid ~ .invalid-tooltip { + display: block +} + +.was-validated .form-control-file:invalid ~ .invalid-feedback,.was-validated .form-control-file:invalid ~ .invalid-tooltip,.form-control-file.is-invalid ~ .invalid-feedback,.form-control-file.is-invalid ~ .invalid-tooltip { + display: block +} + +.was-validated .form-check-input:invalid ~ .form-check-label,.form-check-input.is-invalid ~ .form-check-label { + color: #dc3545 +} + +.was-validated .form-check-input:invalid ~ .invalid-feedback,.was-validated .form-check-input:invalid ~ .invalid-tooltip,.form-check-input.is-invalid ~ .invalid-feedback,.form-check-input.is-invalid ~ .invalid-tooltip { + display: block +} + +.was-validated .custom-control-input:invalid ~ .custom-control-label,.custom-control-input.is-invalid ~ .custom-control-label { + color: #dc3545 +} + +.was-validated .custom-control-input:invalid ~ .custom-control-label::before,.custom-control-input.is-invalid ~ .custom-control-label::before { + background-color: #efa2a9 +} + +.was-validated .custom-control-input:invalid ~ .invalid-feedback,.was-validated .custom-control-input:invalid ~ .invalid-tooltip,.custom-control-input.is-invalid ~ .invalid-feedback,.custom-control-input.is-invalid ~ .invalid-tooltip { + display: block +} + +.was-validated .custom-control-input:invalid:checked ~ .custom-control-label::before,.custom-control-input.is-invalid:checked ~ .custom-control-label::before { + background-color: #e4606d +} + +.was-validated .custom-control-input:invalid:focus ~ .custom-control-label::before,.custom-control-input.is-invalid:focus ~ .custom-control-label::before { + box-shadow: 0 0 0 1px #fff,0 0 0 0.2rem rgba(220,53,69,0.25) +} + +.was-validated .custom-file-input:invalid ~ .custom-file-label,.custom-file-input.is-invalid ~ .custom-file-label { + border-color: #dc3545 +} + +.was-validated .custom-file-input:invalid ~ .custom-file-label::after,.custom-file-input.is-invalid ~ .custom-file-label::after { + border-color: inherit +} + +.was-validated .custom-file-input:invalid ~ .invalid-feedback,.was-validated .custom-file-input:invalid ~ .invalid-tooltip,.custom-file-input.is-invalid ~ .invalid-feedback,.custom-file-input.is-invalid ~ .invalid-tooltip { + display: block +} + +.was-validated .custom-file-input:invalid:focus ~ .custom-file-label,.custom-file-input.is-invalid:focus ~ .custom-file-label { + box-shadow: 0 0 0 0.2rem rgba(220,53,69,0.25) +} + +.form-inline { + display: flex; + flex-flow: row wrap; + align-items: center +} + +.form-inline .form-check { + width: 100% +} + +@media (min-width: 576px) { + .form-inline label { + display:flex; + align-items: center; + justify-content: center; + margin-bottom: 0 + } + + .form-inline .form-group { + display: flex; + flex: 0 0 auto; + flex-flow: row wrap; + align-items: center; + margin-bottom: 0 + } + + .form-inline .form-control { + display: inline-block; + width: auto; + vertical-align: middle + } + + .form-inline .form-control-plaintext { + display: inline-block + } + + .form-inline .input-group,.form-inline .custom-select { + width: auto + } + + .form-inline .form-check { + display: flex; + align-items: center; + justify-content: center; + width: auto; + padding-left: 0 + } + + .form-inline .form-check-input { + position: relative; + margin-top: 0; + margin-right: 0.25rem; + margin-left: 0 + } + + .form-inline .custom-control { + align-items: center; + justify-content: center + } + + .form-inline .custom-control-label { + margin-bottom: 0 + } +} + +.btn { + display: inline-block; + font-weight: 400; + text-align: center; + white-space: nowrap; + vertical-align: middle; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + border: 1px solid transparent; + padding: 0.375rem 0.75rem; + font-size: 1rem; + line-height: 1.5; + border-radius: 0.25rem; + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out +} + +@media screen and (prefers-reduced-motion: reduce) { + .btn { + transition: none + } +} + +.btn:hover,.btn:focus { + text-decoration: none +} + +.btn:focus,.btn.focus { + outline: 0; + box-shadow: 0 0 0 0.2rem rgba(0,123,255,0.25) +} + +.btn.disabled,.btn:disabled { + opacity: 0.65 +} + +.btn:not(:disabled):not(.disabled) { + cursor: pointer +} + +a.btn.disabled,fieldset:disabled a.btn { + pointer-events: none +} + +.btn-primary { + color: #fff; + background-color: #007bff; + border-color: #007bff +} + +.btn-primary:hover { + color: #fff; + background-color: #0069d9; + border-color: #0062cc +} + +.btn-primary:focus,.btn-primary.focus { + box-shadow: 0 0 0 0.2rem rgba(0,123,255,0.5) +} + +.btn-primary.disabled,.btn-primary:disabled { + color: #fff; + background-color: #007bff; + border-color: #007bff +} + +.btn-primary:not(:disabled):not(.disabled):active,.btn-primary:not(:disabled):not(.disabled).active,.show>.btn-primary.dropdown-toggle { + color: #fff; + background-color: #0062cc; + border-color: #005cbf +} + +.btn-primary:not(:disabled):not(.disabled):active:focus,.btn-primary:not(:disabled):not(.disabled).active:focus,.show>.btn-primary.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(0,123,255,0.5) +} + +.btn-secondary { + color: #fff; + background-color: #6c757d; + border-color: #6c757d +} + +.btn-secondary:hover { + color: #fff; + background-color: #5a6268; + border-color: #545b62 +} + +.btn-secondary:focus,.btn-secondary.focus { + box-shadow: 0 0 0 0.2rem rgba(108,117,125,0.5) +} + +.btn-secondary.disabled,.btn-secondary:disabled { + color: #fff; + background-color: #6c757d; + border-color: #6c757d +} + +.btn-secondary:not(:disabled):not(.disabled):active,.btn-secondary:not(:disabled):not(.disabled).active,.show>.btn-secondary.dropdown-toggle { + color: #fff; + background-color: #545b62; + border-color: #4e555b +} + +.btn-secondary:not(:disabled):not(.disabled):active:focus,.btn-secondary:not(:disabled):not(.disabled).active:focus,.show>.btn-secondary.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(108,117,125,0.5) +} + +.btn-success { + color: #fff; + background-color: #28a745; + border-color: #28a745 +} + +.btn-success:hover { + color: #fff; + background-color: #218838; + border-color: #1e7e34 +} + +.btn-success:focus,.btn-success.focus { + box-shadow: 0 0 0 0.2rem rgba(40,167,69,0.5) +} + +.btn-success.disabled,.btn-success:disabled { + color: #fff; + background-color: #28a745; + border-color: #28a745 +} + +.btn-success:not(:disabled):not(.disabled):active,.btn-success:not(:disabled):not(.disabled).active,.show>.btn-success.dropdown-toggle { + color: #fff; + background-color: #1e7e34; + border-color: #1c7430 +} + +.btn-success:not(:disabled):not(.disabled):active:focus,.btn-success:not(:disabled):not(.disabled).active:focus,.show>.btn-success.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(40,167,69,0.5) +} + +.btn-info { + color: #fff; + background-color: #17a2b8; + border-color: #17a2b8 +} + +.btn-info:hover { + color: #fff; + background-color: #138496; + border-color: #117a8b +} + +.btn-info:focus,.btn-info.focus { + box-shadow: 0 0 0 0.2rem rgba(23,162,184,0.5) +} + +.btn-info.disabled,.btn-info:disabled { + color: #fff; + background-color: #17a2b8; + border-color: #17a2b8 +} + +.btn-info:not(:disabled):not(.disabled):active,.btn-info:not(:disabled):not(.disabled).active,.show>.btn-info.dropdown-toggle { + color: #fff; + background-color: #117a8b; + border-color: #10707f +} + +.btn-info:not(:disabled):not(.disabled):active:focus,.btn-info:not(:disabled):not(.disabled).active:focus,.show>.btn-info.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(23,162,184,0.5) +} + +.btn-warning { + color: #212529; + background-color: #ffc107; + border-color: #ffc107 +} + +.btn-warning:hover { + color: #212529; + background-color: #e0a800; + border-color: #d39e00 +} + +.btn-warning:focus,.btn-warning.focus { + box-shadow: 0 0 0 0.2rem rgba(255,193,7,0.5) +} + +.btn-warning.disabled,.btn-warning:disabled { + color: #212529; + background-color: #ffc107; + border-color: #ffc107 +} + +.btn-warning:not(:disabled):not(.disabled):active,.btn-warning:not(:disabled):not(.disabled).active,.show>.btn-warning.dropdown-toggle { + color: #212529; + background-color: #d39e00; + border-color: #c69500 +} + +.btn-warning:not(:disabled):not(.disabled):active:focus,.btn-warning:not(:disabled):not(.disabled).active:focus,.show>.btn-warning.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(255,193,7,0.5) +} + +.btn-danger { + color: #fff; + background-color: #dc3545; + border-color: #dc3545 +} + +.btn-danger:hover { + color: #fff; + background-color: #c82333; + border-color: #bd2130 +} + +.btn-danger:focus,.btn-danger.focus { + box-shadow: 0 0 0 0.2rem rgba(220,53,69,0.5) +} + +.btn-danger.disabled,.btn-danger:disabled { + color: #fff; + background-color: #dc3545; + border-color: #dc3545 +} + +.btn-danger:not(:disabled):not(.disabled):active,.btn-danger:not(:disabled):not(.disabled).active,.show>.btn-danger.dropdown-toggle { + color: #fff; + background-color: #bd2130; + border-color: #b21f2d +} + +.btn-danger:not(:disabled):not(.disabled):active:focus,.btn-danger:not(:disabled):not(.disabled).active:focus,.show>.btn-danger.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(220,53,69,0.5) +} + +.btn-light { + color: #212529; + background-color: #f8f9fa; + border-color: #f8f9fa +} + +.btn-light:hover { + color: #212529; + background-color: #e2e6ea; + border-color: #dae0e5 +} + +.btn-light:focus,.btn-light.focus { + box-shadow: 0 0 0 0.2rem rgba(248,249,250,0.5) +} + +.btn-light.disabled,.btn-light:disabled { + color: #212529; + background-color: #f8f9fa; + border-color: #f8f9fa +} + +.btn-light:not(:disabled):not(.disabled):active,.btn-light:not(:disabled):not(.disabled).active,.show>.btn-light.dropdown-toggle { + color: #212529; + background-color: #dae0e5; + border-color: #d3d9df +} + +.btn-light:not(:disabled):not(.disabled):active:focus,.btn-light:not(:disabled):not(.disabled).active:focus,.show>.btn-light.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(248,249,250,0.5) +} + +.btn-dark { + color: #fff; + background-color: #343a40; + border-color: #343a40 +} + +.btn-dark:hover { + color: #fff; + background-color: #23272b; + border-color: #1d2124 +} + +.btn-dark:focus,.btn-dark.focus { + box-shadow: 0 0 0 0.2rem rgba(52,58,64,0.5) +} + +.btn-dark.disabled,.btn-dark:disabled { + color: #fff; + background-color: #343a40; + border-color: #343a40 +} + +.btn-dark:not(:disabled):not(.disabled):active,.btn-dark:not(:disabled):not(.disabled).active,.show>.btn-dark.dropdown-toggle { + color: #fff; + background-color: #1d2124; + border-color: #171a1d +} + +.btn-dark:not(:disabled):not(.disabled):active:focus,.btn-dark:not(:disabled):not(.disabled).active:focus,.show>.btn-dark.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(52,58,64,0.5) +} + +.btn-outline-primary { + color: #007bff; + background-color: transparent; + background-image: none; + border-color: #007bff +} + +.btn-outline-primary:hover { + color: #fff; + background-color: #007bff; + border-color: #007bff +} + +.btn-outline-primary:focus,.btn-outline-primary.focus { + box-shadow: 0 0 0 0.2rem rgba(0,123,255,0.5) +} + +.btn-outline-primary.disabled,.btn-outline-primary:disabled { + color: #007bff; + background-color: transparent +} + +.btn-outline-primary:not(:disabled):not(.disabled):active,.btn-outline-primary:not(:disabled):not(.disabled).active,.show>.btn-outline-primary.dropdown-toggle { + color: #fff; + background-color: #007bff; + border-color: #007bff +} + +.btn-outline-primary:not(:disabled):not(.disabled):active:focus,.btn-outline-primary:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-primary.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(0,123,255,0.5) +} + +.btn-outline-secondary { + color: #6c757d; + background-color: transparent; + background-image: none; + border-color: #6c757d +} + +.btn-outline-secondary:hover { + color: #fff; + background-color: #6c757d; + border-color: #6c757d +} + +.btn-outline-secondary:focus,.btn-outline-secondary.focus { + box-shadow: 0 0 0 0.2rem rgba(108,117,125,0.5) +} + +.btn-outline-secondary.disabled,.btn-outline-secondary:disabled { + color: #6c757d; + background-color: transparent +} + +.btn-outline-secondary:not(:disabled):not(.disabled):active,.btn-outline-secondary:not(:disabled):not(.disabled).active,.show>.btn-outline-secondary.dropdown-toggle { + color: #fff; + background-color: #6c757d; + border-color: #6c757d +} + +.btn-outline-secondary:not(:disabled):not(.disabled):active:focus,.btn-outline-secondary:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-secondary.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(108,117,125,0.5) +} + +.btn-outline-success { + color: #28a745; + background-color: transparent; + background-image: none; + border-color: #28a745 +} + +.btn-outline-success:hover { + color: #fff; + background-color: #28a745; + border-color: #28a745 +} + +.btn-outline-success:focus,.btn-outline-success.focus { + box-shadow: 0 0 0 0.2rem rgba(40,167,69,0.5) +} + +.btn-outline-success.disabled,.btn-outline-success:disabled { + color: #28a745; + background-color: transparent +} + +.btn-outline-success:not(:disabled):not(.disabled):active,.btn-outline-success:not(:disabled):not(.disabled).active,.show>.btn-outline-success.dropdown-toggle { + color: #fff; + background-color: #28a745; + border-color: #28a745 +} + +.btn-outline-success:not(:disabled):not(.disabled):active:focus,.btn-outline-success:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-success.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(40,167,69,0.5) +} + +.btn-outline-info { + color: #17a2b8; + background-color: transparent; + background-image: none; + border-color: #17a2b8 +} + +.btn-outline-info:hover { + color: #fff; + background-color: #17a2b8; + border-color: #17a2b8 +} + +.btn-outline-info:focus,.btn-outline-info.focus { + box-shadow: 0 0 0 0.2rem rgba(23,162,184,0.5) +} + +.btn-outline-info.disabled,.btn-outline-info:disabled { + color: #17a2b8; + background-color: transparent +} + +.btn-outline-info:not(:disabled):not(.disabled):active,.btn-outline-info:not(:disabled):not(.disabled).active,.show>.btn-outline-info.dropdown-toggle { + color: #fff; + background-color: #17a2b8; + border-color: #17a2b8 +} + +.btn-outline-info:not(:disabled):not(.disabled):active:focus,.btn-outline-info:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-info.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(23,162,184,0.5) +} + +.btn-outline-warning { + color: #ffc107; + background-color: transparent; + background-image: none; + border-color: #ffc107 +} + +.btn-outline-warning:hover { + color: #212529; + background-color: #ffc107; + border-color: #ffc107 +} + +.btn-outline-warning:focus,.btn-outline-warning.focus { + box-shadow: 0 0 0 0.2rem rgba(255,193,7,0.5) +} + +.btn-outline-warning.disabled,.btn-outline-warning:disabled { + color: #ffc107; + background-color: transparent +} + +.btn-outline-warning:not(:disabled):not(.disabled):active,.btn-outline-warning:not(:disabled):not(.disabled).active,.show>.btn-outline-warning.dropdown-toggle { + color: #212529; + background-color: #ffc107; + border-color: #ffc107 +} + +.btn-outline-warning:not(:disabled):not(.disabled):active:focus,.btn-outline-warning:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-warning.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(255,193,7,0.5) +} + +.btn-outline-danger { + color: #dc3545; + background-color: transparent; + background-image: none; + border-color: #dc3545 +} + +.btn-outline-danger:hover { + color: #fff; + background-color: #dc3545; + border-color: #dc3545 +} + +.btn-outline-danger:focus,.btn-outline-danger.focus { + box-shadow: 0 0 0 0.2rem rgba(220,53,69,0.5) +} + +.btn-outline-danger.disabled,.btn-outline-danger:disabled { + color: #dc3545; + background-color: transparent +} + +.btn-outline-danger:not(:disabled):not(.disabled):active,.btn-outline-danger:not(:disabled):not(.disabled).active,.show>.btn-outline-danger.dropdown-toggle { + color: #fff; + background-color: #dc3545; + border-color: #dc3545 +} + +.btn-outline-danger:not(:disabled):not(.disabled):active:focus,.btn-outline-danger:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-danger.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(220,53,69,0.5) +} + +.btn-outline-light { + color: #f8f9fa; + background-color: transparent; + background-image: none; + border-color: #f8f9fa +} + +.btn-outline-light:hover { + color: #212529; + background-color: #f8f9fa; + border-color: #f8f9fa +} + +.btn-outline-light:focus,.btn-outline-light.focus { + box-shadow: 0 0 0 0.2rem rgba(248,249,250,0.5) +} + +.btn-outline-light.disabled,.btn-outline-light:disabled { + color: #f8f9fa; + background-color: transparent +} + +.btn-outline-light:not(:disabled):not(.disabled):active,.btn-outline-light:not(:disabled):not(.disabled).active,.show>.btn-outline-light.dropdown-toggle { + color: #212529; + background-color: #f8f9fa; + border-color: #f8f9fa +} + +.btn-outline-light:not(:disabled):not(.disabled):active:focus,.btn-outline-light:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-light.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(248,249,250,0.5) +} + +.btn-outline-dark { + color: #343a40; + background-color: transparent; + background-image: none; + border-color: #343a40 +} + +.btn-outline-dark:hover { + color: #fff; + background-color: #343a40; + border-color: #343a40 +} + +.btn-outline-dark:focus,.btn-outline-dark.focus { + box-shadow: 0 0 0 0.2rem rgba(52,58,64,0.5) +} + +.btn-outline-dark.disabled,.btn-outline-dark:disabled { + color: #343a40; + background-color: transparent +} + +.btn-outline-dark:not(:disabled):not(.disabled):active,.btn-outline-dark:not(:disabled):not(.disabled).active,.show>.btn-outline-dark.dropdown-toggle { + color: #fff; + background-color: #343a40; + border-color: #343a40 +} + +.btn-outline-dark:not(:disabled):not(.disabled):active:focus,.btn-outline-dark:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-dark.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(52,58,64,0.5) +} + +.btn-link { + font-weight: 400; + color: #007bff; + background-color: transparent +} + +.btn-link:hover { + color: #0056b3; + text-decoration: underline; + background-color: transparent; + border-color: transparent +} + +.btn-link:focus,.btn-link.focus { + text-decoration: underline; + border-color: transparent; + box-shadow: none +} + +.btn-link:disabled,.btn-link.disabled { + color: #6c757d; + pointer-events: none +} + +.btn-lg,.btn-group-lg>.btn { + padding: 0.5rem 1rem; + font-size: 1.25rem; + line-height: 1.5; + border-radius: 0.3rem +} + +.btn-sm,.btn-group-sm>.btn { + padding: 0.25rem 0.5rem; + font-size: 0.875rem; + line-height: 1.5; + border-radius: 0.2rem +} + +.btn-block { + display: block; + width: 100% +} + +.btn-block+.btn-block { + margin-top: 0.5rem +} + +input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block { + width: 100% +} + +.fade { + transition: opacity 0.15s linear +} + +@media screen and (prefers-reduced-motion: reduce) { + .fade { + transition: none + } +} + +.fade:not(.show) { + opacity: 0 +} + +.collapse:not(.show) { + display: none +} + +.collapsing { + position: relative; + height: 0; + overflow: hidden; + transition: height 0.35s ease +} + +@media screen and (prefers-reduced-motion: reduce) { + .collapsing { + transition: none + } +} + +.dropup,.dropright,.dropdown,.dropleft { + position: relative +} + +.dropdown-toggle::after { + display: inline-block; + width: 0; + height: 0; + margin-left: 0.255em; + vertical-align: 0.255em; + content: ""; + border-top: 0.3em solid; + border-right: 0.3em solid transparent; + border-bottom: 0; + border-left: 0.3em solid transparent +} + +.dropdown-toggle:empty::after { + margin-left: 0 +} + +.dropdown-menu { + position: absolute; + top: 100%; + left: 0; + z-index: 1000; + display: none; + float: left; + min-width: 10rem; + padding: 0.5rem 0; + margin: 0.125rem 0 0; + font-size: 1rem; + color: #212529; + text-align: left; + list-style: none; + background-color: #fff; + background-clip: padding-box; + border: 1px solid rgba(0,0,0,0.15); + border-radius: 0.25rem +} + +.dropdown-menu-right { + right: 0; + left: auto +} + +.dropup .dropdown-menu { + top: auto; + bottom: 100%; + margin-top: 0; + margin-bottom: 0.125rem +} + +.dropup .dropdown-toggle::after { + display: inline-block; + width: 0; + height: 0; + margin-left: 0.255em; + vertical-align: 0.255em; + content: ""; + border-top: 0; + border-right: 0.3em solid transparent; + border-bottom: 0.3em solid; + border-left: 0.3em solid transparent +} + +.dropup .dropdown-toggle:empty::after { + margin-left: 0 +} + +.dropright .dropdown-menu { + top: 0; + right: auto; + left: 100%; + margin-top: 0; + margin-left: 0.125rem +} + +.dropright .dropdown-toggle::after { + display: inline-block; + width: 0; + height: 0; + margin-left: 0.255em; + vertical-align: 0.255em; + content: ""; + border-top: 0.3em solid transparent; + border-right: 0; + border-bottom: 0.3em solid transparent; + border-left: 0.3em solid +} + +.dropright .dropdown-toggle:empty::after { + margin-left: 0 +} + +.dropright .dropdown-toggle::after { + vertical-align: 0 +} + +.dropleft .dropdown-menu { + top: 0; + right: 100%; + left: auto; + margin-top: 0; + margin-right: 0.125rem +} + +.dropleft .dropdown-toggle::after { + display: inline-block; + width: 0; + height: 0; + margin-left: 0.255em; + vertical-align: 0.255em; + content: "" +} + +.dropleft .dropdown-toggle::after { + display: none +} + +.dropleft .dropdown-toggle::before { + display: inline-block; + width: 0; + height: 0; + margin-right: 0.255em; + vertical-align: 0.255em; + content: ""; + border-top: 0.3em solid transparent; + border-right: 0.3em solid; + border-bottom: 0.3em solid transparent +} + +.dropleft .dropdown-toggle:empty::after { + margin-left: 0 +} + +.dropleft .dropdown-toggle::before { + vertical-align: 0 +} + +.dropdown-menu[x-placement^="top"],.dropdown-menu[x-placement^="right"],.dropdown-menu[x-placement^="bottom"],.dropdown-menu[x-placement^="left"] { + right: auto; + bottom: auto +} + +.dropdown-divider { + height: 0; + margin: 0.5rem 0; + overflow: hidden; + border-top: 1px solid #e9ecef +} + +.dropdown-item { + display: block; + width: 100%; + padding: 0.25rem 1.5rem; + clear: both; + font-weight: 400; + color: #212529; + text-align: inherit; + white-space: nowrap; + background-color: transparent; + border: 0 +} + +.dropdown-item:hover,.dropdown-item:focus { + color: #16181b; + text-decoration: none; + background-color: #f8f9fa +} + +.dropdown-item.active,.dropdown-item:active { + color: #fff; + text-decoration: none; + background-color: #007bff +} + +.dropdown-item.disabled,.dropdown-item:disabled { + color: #6c757d; + background-color: transparent +} + +.dropdown-menu.show { + display: block +} + +.dropdown-header { + display: block; + padding: 0.5rem 1.5rem; + margin-bottom: 0; + font-size: 0.875rem; + color: #6c757d; + white-space: nowrap +} + +.dropdown-item-text { + display: block; + padding: 0.25rem 1.5rem; + color: #212529 +} + +.btn-group,.btn-group-vertical { + position: relative; + display: inline-flex; + vertical-align: middle +} + +.btn-group>.btn,.btn-group-vertical>.btn { + position: relative; + flex: 0 1 auto +} + +.btn-group>.btn:hover,.btn-group-vertical>.btn:hover { + z-index: 1 +} + +.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: 1 +} + +.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group,.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-left: -1px +} + +.btn-toolbar { + display: flex; + flex-wrap: wrap; + justify-content: flex-start +} + +.btn-toolbar .input-group { + width: auto +} + +.btn-group>.btn:first-child { + margin-left: 0 +} + +.btn-group>.btn:not(:last-child):not(.dropdown-toggle),.btn-group>.btn-group:not(:last-child)>.btn { + border-top-right-radius: 0; + border-bottom-right-radius: 0 +} + +.btn-group>.btn:not(:first-child),.btn-group>.btn-group:not(:first-child)>.btn { + border-top-left-radius: 0; + border-bottom-left-radius: 0 +} + +.dropdown-toggle-split { + padding-right: 0.5625rem; + padding-left: 0.5625rem +} + +.dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after,.dropright .dropdown-toggle-split::after { + margin-left: 0 +} + +.dropleft .dropdown-toggle-split::before { + margin-right: 0 +} + +.btn-sm+.dropdown-toggle-split,.btn-group-sm>.btn+.dropdown-toggle-split { + padding-right: 0.375rem; + padding-left: 0.375rem +} + +.btn-lg+.dropdown-toggle-split,.btn-group-lg>.btn+.dropdown-toggle-split { + padding-right: 0.75rem; + padding-left: 0.75rem +} + +.btn-group-vertical { + flex-direction: column; + align-items: flex-start; + justify-content: center +} + +.btn-group-vertical .btn,.btn-group-vertical .btn-group { + width: 100% +} + +.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(:last-child):not(.dropdown-toggle),.btn-group-vertical>.btn-group:not(:last-child)>.btn { + border-bottom-right-radius: 0; + border-bottom-left-radius: 0 +} + +.btn-group-vertical>.btn:not(:first-child),.btn-group-vertical>.btn-group:not(:first-child)>.btn { + border-top-left-radius: 0; + border-top-right-radius: 0 +} + +.btn-group-toggle>.btn,.btn-group-toggle>.btn-group>.btn { + margin-bottom: 0 +} + +.btn-group-toggle>.btn input[type="radio"],.btn-group-toggle>.btn input[type="checkbox"],.btn-group-toggle>.btn-group>.btn input[type="radio"],.btn-group-toggle>.btn-group>.btn input[type="checkbox"] { + position: absolute; + clip: rect(0, 0, 0, 0); + pointer-events: none +} + +.input-group { + position: relative; + display: flex; + flex-wrap: wrap; + align-items: stretch; + width: 100% +} + +.input-group>.form-control,.input-group>.custom-select,.input-group>.custom-file { + position: relative; + flex: 1 1 auto; + width: 1%; + margin-bottom: 0 +} + +.input-group>.form-control+.form-control,.input-group>.form-control+.custom-select,.input-group>.form-control+.custom-file,.input-group>.custom-select+.form-control,.input-group>.custom-select+.custom-select,.input-group>.custom-select+.custom-file,.input-group>.custom-file+.form-control,.input-group>.custom-file+.custom-select,.input-group>.custom-file+.custom-file { + margin-left: -1px +} + +.input-group>.form-control:focus,.input-group>.custom-select:focus,.input-group>.custom-file .custom-file-input:focus ~ .custom-file-label { + z-index: 3 +} + +.input-group>.custom-file .custom-file-input:focus { + z-index: 4 +} + +.input-group>.form-control:not(:last-child),.input-group>.custom-select:not(:last-child) { + border-top-right-radius: 0; + border-bottom-right-radius: 0 +} + +.input-group>.form-control:not(:first-child),.input-group>.custom-select:not(:first-child) { + border-top-left-radius: 0; + border-bottom-left-radius: 0 +} + +.input-group>.custom-file { + display: flex; + align-items: center +} + +.input-group>.custom-file:not(:last-child) .custom-file-label,.input-group>.custom-file:not(:last-child) .custom-file-label::after { + border-top-right-radius: 0; + border-bottom-right-radius: 0 +} + +.input-group>.custom-file:not(:first-child) .custom-file-label { + border-top-left-radius: 0; + border-bottom-left-radius: 0 +} + +.input-group-prepend,.input-group-append { + display: flex +} + +.input-group-prepend .btn,.input-group-append .btn { + position: relative; + z-index: 2 +} + +.input-group-prepend .btn+.btn,.input-group-prepend .btn+.input-group-text,.input-group-prepend .input-group-text+.input-group-text,.input-group-prepend .input-group-text+.btn,.input-group-append .btn+.btn,.input-group-append .btn+.input-group-text,.input-group-append .input-group-text+.input-group-text,.input-group-append .input-group-text+.btn { + margin-left: -1px +} + +.input-group-prepend { + margin-right: -1px +} + +.input-group-append { + margin-left: -1px +} + +.input-group-text { + display: flex; + align-items: center; + padding: 0.375rem 0.75rem; + margin-bottom: 0; + font-size: 1rem; + font-weight: 400; + line-height: 1.5; + color: #495057; + text-align: center; + white-space: nowrap; + background-color: #e9ecef; + border: 1px solid #ced4da; + border-radius: 0.25rem +} + +.input-group-text input[type="radio"],.input-group-text input[type="checkbox"] { + margin-top: 0 +} + +.input-group-lg>.form-control,.input-group-lg>.input-group-prepend>.input-group-text,.input-group-lg>.input-group-append>.input-group-text,.input-group-lg>.input-group-prepend>.btn,.input-group-lg>.input-group-append>.btn { + height: calc(2.875rem + 2px); + padding: 0.5rem 1rem; + font-size: 1.25rem; + line-height: 1.5; + border-radius: 0.3rem +} + +.input-group-sm>.form-control,.input-group-sm>.input-group-prepend>.input-group-text,.input-group-sm>.input-group-append>.input-group-text,.input-group-sm>.input-group-prepend>.btn,.input-group-sm>.input-group-append>.btn { + height: calc(1.8125rem + 2px); + padding: 0.25rem 0.5rem; + font-size: 0.875rem; + line-height: 1.5; + border-radius: 0.2rem +} + +.input-group>.input-group-prepend>.btn,.input-group>.input-group-prepend>.input-group-text,.input-group>.input-group-append:not(:last-child)>.btn,.input-group>.input-group-append:not(:last-child)>.input-group-text,.input-group>.input-group-append:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group>.input-group-append:last-child>.input-group-text:not(:last-child) { + border-top-right-radius: 0; + border-bottom-right-radius: 0 +} + +.input-group>.input-group-append>.btn,.input-group>.input-group-append>.input-group-text,.input-group>.input-group-prepend:not(:first-child)>.btn,.input-group>.input-group-prepend:not(:first-child)>.input-group-text,.input-group>.input-group-prepend:first-child>.btn:not(:first-child),.input-group>.input-group-prepend:first-child>.input-group-text:not(:first-child) { + border-top-left-radius: 0; + border-bottom-left-radius: 0 +} + +.custom-control { + position: relative; + display: block; + min-height: 1.5rem; + padding-left: 1.5rem +} + +.custom-control-inline { + display: inline-flex; + margin-right: 1rem +} + +.custom-control-input { + position: absolute; + z-index: -1; + opacity: 0 +} + +.custom-control-input:checked ~ .custom-control-label::before { + color: #fff; + background-color: #007bff +} + +.custom-control-input:focus ~ .custom-control-label::before { + box-shadow: 0 0 0 1px #fff,0 0 0 0.2rem rgba(0,123,255,0.25) +} + +.custom-control-input:active ~ .custom-control-label::before { + color: #fff; + background-color: #b3d7ff +} + +.custom-control-input:disabled ~ .custom-control-label { + color: #6c757d +} + +.custom-control-input:disabled ~ .custom-control-label::before { + background-color: #e9ecef +} + +.custom-control-label { + position: relative; + margin-bottom: 0 +} + +.custom-control-label::before { + position: absolute; + top: 0.25rem; + left: -1.5rem; + display: block; + width: 1rem; + height: 1rem; + pointer-events: none; + content: ""; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + background-color: #dee2e6 +} + +.custom-control-label::after { + position: absolute; + top: 0.25rem; + left: -1.5rem; + display: block; + width: 1rem; + height: 1rem; + content: ""; + background-repeat: no-repeat; + background-position: center center; + background-size: 50% 50% +} + +.custom-checkbox .custom-control-label::before { + border-radius: 0.25rem +} + +.custom-checkbox .custom-control-input:checked ~ .custom-control-label::before { + background-color: #007bff +} + +.custom-checkbox .custom-control-input:checked ~ .custom-control-label::after { + background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E") +} + +.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::before { + background-color: #007bff +} + +.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::after { + background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3E%3Cpath stroke='%23fff' d='M0 2h4'/%3E%3C/svg%3E") +} + +.custom-checkbox .custom-control-input:disabled:checked ~ .custom-control-label::before { + background-color: rgba(0,123,255,0.5) +} + +.custom-checkbox .custom-control-input:disabled:indeterminate ~ .custom-control-label::before { + background-color: rgba(0,123,255,0.5) +} + +.custom-radio .custom-control-label::before { + border-radius: 50% +} + +.custom-radio .custom-control-input:checked ~ .custom-control-label::before { + background-color: #007bff +} + +.custom-radio .custom-control-input:checked ~ .custom-control-label::after { + background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='%23fff'/%3E%3C/svg%3E") +} + +.custom-radio .custom-control-input:disabled:checked ~ .custom-control-label::before { + background-color: rgba(0,123,255,0.5) +} + +.custom-select { + display: inline-block; + width: 100%; + height: calc(2.25rem + 2px); + padding: 0.375rem 1.75rem 0.375rem 0.75rem; + line-height: 1.5; + color: #495057; + vertical-align: middle; + background: #fff url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3E%3Cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") no-repeat right 0.75rem center; + background-size: 8px 10px; + border: 1px solid #ced4da; + border-radius: 0.25rem; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none +} + +.custom-select:focus { + border-color: #80bdff; + outline: 0; + box-shadow: 0 0 0 0.2rem rgba(128,189,255,0.5) +} + +.custom-select:focus::-ms-value { + color: #495057; + background-color: #fff +} + +.custom-select[multiple],.custom-select[size]:not([size="1"]) { + height: auto; + padding-right: 0.75rem; + background-image: none +} + +.custom-select:disabled { + color: #6c757d; + background-color: #e9ecef +} + +.custom-select::-ms-expand { + opacity: 0 +} + +.custom-select-sm { + height: calc(1.8125rem + 2px); + padding-top: 0.375rem; + padding-bottom: 0.375rem; + font-size: 75% +} + +.custom-select-lg { + height: calc(2.875rem + 2px); + padding-top: 0.375rem; + padding-bottom: 0.375rem; + font-size: 125% +} + +.custom-file { + position: relative; + display: inline-block; + width: 100%; + height: calc(2.25rem + 2px); + margin-bottom: 0 +} + +.custom-file-input { + position: relative; + z-index: 2; + width: 100%; + height: calc(2.25rem + 2px); + margin: 0; + opacity: 0 +} + +.custom-file-input:focus ~ .custom-file-label { + border-color: #80bdff; + box-shadow: 0 0 0 0.2rem rgba(0,123,255,0.25) +} + +.custom-file-input:focus ~ .custom-file-label::after { + border-color: #80bdff +} + +.custom-file-input:disabled ~ .custom-file-label { + background-color: #e9ecef +} + +.custom-file-input:lang(en) ~ .custom-file-label::after { + content: "Browse" +} + +.custom-file-label { + position: absolute; + top: 0; + right: 0; + left: 0; + z-index: 1; + height: calc(2.25rem + 2px); + padding: 0.375rem 0.75rem; + line-height: 1.5; + color: #495057; + background-color: #fff; + border: 1px solid #ced4da; + border-radius: 0.25rem +} + +.custom-file-label::after { + position: absolute; + top: 0; + right: 0; + bottom: 0; + z-index: 3; + display: block; + height: 2.25rem; + padding: 0.375rem 0.75rem; + line-height: 1.5; + color: #495057; + content: "Browse"; + background-color: #e9ecef; + border-left: 1px solid #ced4da; + border-radius: 0 0.25rem 0.25rem 0 +} + +.custom-range { + width: 100%; + padding-left: 0; + background-color: transparent; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none +} + +.custom-range:focus { + outline: none +} + +.custom-range:focus::-webkit-slider-thumb { + box-shadow: 0 0 0 1px #fff,0 0 0 0.2rem rgba(0,123,255,0.25) +} + +.custom-range:focus::-moz-range-thumb { + box-shadow: 0 0 0 1px #fff,0 0 0 0.2rem rgba(0,123,255,0.25) +} + +.custom-range:focus::-ms-thumb { + box-shadow: 0 0 0 1px #fff,0 0 0 0.2rem rgba(0,123,255,0.25) +} + +.custom-range::-moz-focus-outer { + border: 0 +} + +.custom-range::-webkit-slider-thumb { + width: 1rem; + height: 1rem; + margin-top: -0.25rem; + background-color: #007bff; + border: 0; + border-radius: 1rem; + transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + -webkit-appearance: none; + appearance: none +} + +@media screen and (prefers-reduced-motion: reduce) { + .custom-range::-webkit-slider-thumb { + transition: none + } +} + +.custom-range::-webkit-slider-thumb:active { + background-color: #b3d7ff +} + +.custom-range::-webkit-slider-runnable-track { + width: 100%; + height: 0.5rem; + color: transparent; + cursor: pointer; + background-color: #dee2e6; + border-color: transparent; + border-radius: 1rem +} + +.custom-range::-moz-range-thumb { + width: 1rem; + height: 1rem; + background-color: #007bff; + border: 0; + border-radius: 1rem; + transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + -moz-appearance: none; + appearance: none +} + +@media screen and (prefers-reduced-motion: reduce) { + .custom-range::-moz-range-thumb { + transition: none + } +} + +.custom-range::-moz-range-thumb:active { + background-color: #b3d7ff +} + +.custom-range::-moz-range-track { + width: 100%; + height: 0.5rem; + color: transparent; + cursor: pointer; + background-color: #dee2e6; + border-color: transparent; + border-radius: 1rem +} + +.custom-range::-ms-thumb { + width: 1rem; + height: 1rem; + margin-top: 0; + margin-right: 0.2rem; + margin-left: 0.2rem; + background-color: #007bff; + border: 0; + border-radius: 1rem; + transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + appearance: none +} + +@media screen and (prefers-reduced-motion: reduce) { + .custom-range::-ms-thumb { + transition: none + } +} + +.custom-range::-ms-thumb:active { + background-color: #b3d7ff +} + +.custom-range::-ms-track { + width: 100%; + height: 0.5rem; + color: transparent; + cursor: pointer; + background-color: transparent; + border-color: transparent; + border-width: 0.5rem +} + +.custom-range::-ms-fill-lower { + background-color: #dee2e6; + border-radius: 1rem +} + +.custom-range::-ms-fill-upper { + margin-right: 15px; + background-color: #dee2e6; + border-radius: 1rem +} + +.custom-control-label::before,.custom-file-label,.custom-select { + transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out +} + +@media screen and (prefers-reduced-motion: reduce) { + .custom-control-label::before,.custom-file-label,.custom-select { + transition: none + } +} + +.nav { + display: flex; + flex-wrap: wrap; + padding-left: 0; + margin-bottom: 0; + list-style: none +} + +.nav-link { + display: block; + padding: 0.5rem 1rem +} + +.nav-link:hover,.nav-link:focus { + text-decoration: none +} + +.nav-link.disabled { + color: #6c757d +} + +.nav-tabs { + border-bottom: 1px solid #dee2e6 +} + +.nav-tabs .nav-item { + margin-bottom: -1px +} + +.nav-tabs .nav-link { + border: 1px solid transparent; + border-top-left-radius: 0.25rem; + border-top-right-radius: 0.25rem +} + +.nav-tabs .nav-link:hover,.nav-tabs .nav-link:focus { + border-color: #e9ecef #e9ecef #dee2e6 +} + +.nav-tabs .nav-link.disabled { + color: #6c757d; + background-color: transparent; + border-color: transparent +} + +.nav-tabs .nav-link.active,.nav-tabs .nav-item.show .nav-link { + color: #495057; + background-color: #fff; + border-color: #dee2e6 #dee2e6 #fff +} + +.nav-tabs .dropdown-menu { + margin-top: -1px; + border-top-left-radius: 0; + border-top-right-radius: 0 +} + +.nav-pills .nav-link { + border-radius: 0.25rem +} + +.nav-pills .nav-link.active,.nav-pills .show>.nav-link { + color: #fff; + background-color: #007bff +} + +.nav-fill .nav-item { + flex: 1 1 auto; + text-align: center +} + +.nav-justified .nav-item { + flex-basis: 0; + flex-grow: 1; + text-align: center +} + +.tab-content>.tab-pane { + display: none +} + +.tab-content>.active { + display: block +} + +.navbar { + position: relative; + display: flex; + flex-wrap: wrap; + align-items: center; + justify-content: space-between; + padding: 0.5rem 1rem +} + +.navbar>.container,.navbar>.container-fluid { + display: flex; + flex-wrap: wrap; + align-items: center; + justify-content: space-between +} + +.navbar-brand { + display: inline-block; + padding-top: 0.3125rem; + padding-bottom: 0.3125rem; + margin-right: 1rem; + font-size: 1.25rem; + line-height: inherit; + white-space: nowrap +} + +.navbar-brand:hover,.navbar-brand:focus { + text-decoration: none +} + +.navbar-nav { + display: flex; + flex-direction: column; + padding-left: 0; + margin-bottom: 0; + list-style: none +} + +.navbar-nav .nav-link { + padding-right: 0; + padding-left: 0 +} + +.navbar-nav .dropdown-menu { + position: static; + float: none +} + +.navbar-text { + display: inline-block; + padding-top: 0.5rem; + padding-bottom: 0.5rem +} + +.navbar-collapse { + flex-basis: 100%; + flex-grow: 1; + align-items: center +} + +.navbar-toggler { + padding: 0.25rem 0.75rem; + font-size: 1.25rem; + line-height: 1; + background-color: transparent; + border: 1px solid transparent; + border-radius: 0.25rem +} + +.navbar-toggler:hover,.navbar-toggler:focus { + text-decoration: none +} + +.navbar-toggler:not(:disabled):not(.disabled) { + cursor: pointer +} + +.navbar-toggler-icon { + display: inline-block; + width: 1.5em; + height: 1.5em; + vertical-align: middle; + content: ""; + background: no-repeat center center; + background-size: 100% 100% +} + +@media (max-width: 575.98px) { + .navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid { + padding-right:0; + padding-left: 0 + } +} + +@media (min-width: 576px) { + .navbar-expand-sm { + flex-flow:row nowrap; + justify-content: flex-start + } + + .navbar-expand-sm .navbar-nav { + flex-direction: row + } + + .navbar-expand-sm .navbar-nav .dropdown-menu { + position: absolute + } + + .navbar-expand-sm .navbar-nav .nav-link { + padding-right: 0.5rem; + padding-left: 0.5rem + } + + .navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid { + flex-wrap: nowrap + } + + .navbar-expand-sm .navbar-collapse { + display: flex !important; + flex-basis: auto + } + + .navbar-expand-sm .navbar-toggler { + display: none + } +} + +@media (max-width: 767.98px) { + .navbar-expand-md>.container,.navbar-expand-md>.container-fluid { + padding-right:0; + padding-left: 0 + } +} + +@media (min-width: 768px) { + .navbar-expand-md { + flex-flow:row nowrap; + justify-content: flex-start + } + + .navbar-expand-md .navbar-nav { + flex-direction: row + } + + .navbar-expand-md .navbar-nav .dropdown-menu { + position: absolute + } + + .navbar-expand-md .navbar-nav .nav-link { + padding-right: 0.5rem; + padding-left: 0.5rem + } + + .navbar-expand-md>.container,.navbar-expand-md>.container-fluid { + flex-wrap: nowrap + } + + .navbar-expand-md .navbar-collapse { + display: flex !important; + flex-basis: auto + } + + .navbar-expand-md .navbar-toggler { + display: none + } +} + +@media (max-width: 991.98px) { + .navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid { + padding-right:0; + padding-left: 0 + } +} + +@media (min-width: 992px) { + .navbar-expand-lg { + flex-flow:row nowrap; + justify-content: flex-start + } + + .navbar-expand-lg .navbar-nav { + flex-direction: row + } + + .navbar-expand-lg .navbar-nav .dropdown-menu { + position: absolute + } + + .navbar-expand-lg .navbar-nav .nav-link { + padding-right: 0.5rem; + padding-left: 0.5rem + } + + .navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid { + flex-wrap: nowrap + } + + .navbar-expand-lg .navbar-collapse { + display: flex !important; + flex-basis: auto + } + + .navbar-expand-lg .navbar-toggler { + display: none + } +} + +@media (max-width: 1199.98px) { + .navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid { + padding-right:0; + padding-left: 0 + } +} + +@media (min-width: 1200px) { + .navbar-expand-xl { + flex-flow:row nowrap; + justify-content: flex-start + } + + .navbar-expand-xl .navbar-nav { + flex-direction: row + } + + .navbar-expand-xl .navbar-nav .dropdown-menu { + position: absolute + } + + .navbar-expand-xl .navbar-nav .nav-link { + padding-right: 0.5rem; + padding-left: 0.5rem + } + + .navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid { + flex-wrap: nowrap + } + + .navbar-expand-xl .navbar-collapse { + display: flex !important; + flex-basis: auto + } + + .navbar-expand-xl .navbar-toggler { + display: none + } +} + +.navbar-expand { + flex-flow: row nowrap; + justify-content: flex-start +} + +.navbar-expand>.container,.navbar-expand>.container-fluid { + padding-right: 0; + padding-left: 0 +} + +.navbar-expand .navbar-nav { + flex-direction: row +} + +.navbar-expand .navbar-nav .dropdown-menu { + position: absolute +} + +.navbar-expand .navbar-nav .nav-link { + padding-right: 0.5rem; + padding-left: 0.5rem +} + +.navbar-expand>.container,.navbar-expand>.container-fluid { + flex-wrap: nowrap +} + +.navbar-expand .navbar-collapse { + display: flex !important; + flex-basis: auto +} + +.navbar-expand .navbar-toggler { + display: none +} + +.navbar-light .navbar-brand { + color: rgba(0,0,0,0.9) +} + +.navbar-light .navbar-brand:hover,.navbar-light .navbar-brand:focus { + color: rgba(0,0,0,0.9) +} + +.navbar-light .navbar-nav .nav-link { + color: rgba(0,0,0,0.5) +} + +.navbar-light .navbar-nav .nav-link:hover,.navbar-light .navbar-nav .nav-link:focus { + color: rgba(0,0,0,0.7) +} + +.navbar-light .navbar-nav .nav-link.disabled { + color: rgba(0,0,0,0.3) +} + +.navbar-light .navbar-nav .show>.nav-link,.navbar-light .navbar-nav .active>.nav-link,.navbar-light .navbar-nav .nav-link.show,.navbar-light .navbar-nav .nav-link.active { + color: rgba(0,0,0,0.9) +} + +.navbar-light .navbar-toggler { + color: rgba(0,0,0,0.5); + border-color: rgba(0,0,0,0.1) +} + +.navbar-light .navbar-toggler-icon { + background-image: url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(0, 0, 0, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E") +} + +.navbar-light .navbar-text { + color: rgba(0,0,0,0.5) +} + +.navbar-light .navbar-text a { + color: rgba(0,0,0,0.9) +} + +.navbar-light .navbar-text a:hover,.navbar-light .navbar-text a:focus { + color: rgba(0,0,0,0.9) +} + +.navbar-dark .navbar-brand { + color: #fff +} + +.navbar-dark .navbar-brand:hover,.navbar-dark .navbar-brand:focus { + color: #fff +} + +.navbar-dark .navbar-nav .nav-link { + color: rgba(255,255,255,0.5) +} + +.navbar-dark .navbar-nav .nav-link:hover,.navbar-dark .navbar-nav .nav-link:focus { + color: rgba(255,255,255,0.75) +} + +.navbar-dark .navbar-nav .nav-link.disabled { + color: rgba(255,255,255,0.25) +} + +.navbar-dark .navbar-nav .show>.nav-link,.navbar-dark .navbar-nav .active>.nav-link,.navbar-dark .navbar-nav .nav-link.show,.navbar-dark .navbar-nav .nav-link.active { + color: #fff +} + +.navbar-dark .navbar-toggler { + color: rgba(255,255,255,0.5); + border-color: rgba(255,255,255,0.1) +} + +.navbar-dark .navbar-toggler-icon { + background-image: url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(255, 255, 255, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E") +} + +.navbar-dark .navbar-text { + color: rgba(255,255,255,0.5) +} + +.navbar-dark .navbar-text a { + color: #fff +} + +.navbar-dark .navbar-text a:hover,.navbar-dark .navbar-text a:focus { + color: #fff +} + +.card { + position: relative; + display: flex; + flex-direction: column; + min-width: 0; + word-wrap: break-word; + background-color: #fff; + background-clip: border-box; + border: 1px solid rgba(0,0,0,0.125); + border-radius: 0.25rem +} + +.card>hr { + margin-right: 0; + margin-left: 0 +} + +.card>.list-group:first-child .list-group-item:first-child { + border-top-left-radius: 0.25rem; + border-top-right-radius: 0.25rem +} + +.card>.list-group:last-child .list-group-item:last-child { + border-bottom-right-radius: 0.25rem; + border-bottom-left-radius: 0.25rem +} + +.card-body { + flex: 1 1 auto; + padding: 1.25rem +} + +.card-title { + margin-bottom: 0.75rem +} + +.card-subtitle { + margin-top: -0.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-header { + padding: 0.75rem 1.25rem; + margin-bottom: 0; + background-color: rgba(0,0,0,0.03); + border-bottom: 1px solid rgba(0,0,0,0.125) +} + +.card-header:first-child { + border-radius: calc(0.25rem - 1px) calc(0.25rem - 1px) 0 0 +} + +.card-header+.list-group .list-group-item:first-child { + border-top: 0 +} + +.card-footer { + padding: 0.75rem 1.25rem; + background-color: rgba(0,0,0,0.03); + border-top: 1px solid rgba(0,0,0,0.125) +} + +.card-footer:last-child { + border-radius: 0 0 calc(0.25rem - 1px) calc(0.25rem - 1px) +} + +.card-header-tabs { + margin-right: -0.625rem; + margin-bottom: -0.75rem; + margin-left: -0.625rem; + border-bottom: 0 +} + +.card-header-pills { + margin-right: -0.625rem; + margin-left: -0.625rem +} + +.card-img-overlay { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + padding: 1.25rem +} + +.card-img { + width: 100%; + border-radius: calc(0.25rem - 1px) +} + +.card-img-top { + width: 100%; + border-top-left-radius: calc(0.25rem - 1px); + border-top-right-radius: calc(0.25rem - 1px) +} + +.card-img-bottom { + width: 100%; + border-bottom-right-radius: calc(0.25rem - 1px); + border-bottom-left-radius: calc(0.25rem - 1px) +} + +.card-deck { + display: flex; + flex-direction: column +} + +.card-deck .card { + margin-bottom: 15px +} + +@media (min-width: 576px) { + .card-deck { + flex-flow:row wrap; + margin-right: -15px; + margin-left: -15px + } + + .card-deck .card { + display: flex; + flex: 1 0 0%; + flex-direction: column; + margin-right: 15px; + margin-bottom: 0; + margin-left: 15px + } +} + +.card-group { + display: flex; + flex-direction: column +} + +.card-group>.card { + margin-bottom: 15px +} + +@media (min-width: 576px) { + .card-group { + flex-flow:row wrap + } + + .card-group>.card { + flex: 1 0 0%; + margin-bottom: 0 + } + + .card-group>.card+.card { + margin-left: 0; + border-left: 0 + } + + .card-group>.card:first-child { + border-top-right-radius: 0; + border-bottom-right-radius: 0 + } + + .card-group>.card:first-child .card-img-top,.card-group>.card:first-child .card-header { + border-top-right-radius: 0 + } + + .card-group>.card:first-child .card-img-bottom,.card-group>.card:first-child .card-footer { + border-bottom-right-radius: 0 + } + + .card-group>.card:last-child { + border-top-left-radius: 0; + border-bottom-left-radius: 0 + } + + .card-group>.card:last-child .card-img-top,.card-group>.card:last-child .card-header { + border-top-left-radius: 0 + } + + .card-group>.card:last-child .card-img-bottom,.card-group>.card:last-child .card-footer { + border-bottom-left-radius: 0 + } + + .card-group>.card:only-child { + border-radius: 0.25rem + } + + .card-group>.card:only-child .card-img-top,.card-group>.card:only-child .card-header { + border-top-left-radius: 0.25rem; + border-top-right-radius: 0.25rem + } + + .card-group>.card:only-child .card-img-bottom,.card-group>.card:only-child .card-footer { + border-bottom-right-radius: 0.25rem; + border-bottom-left-radius: 0.25rem + } + + .card-group>.card:not(:first-child):not(:last-child):not(:only-child) { + border-radius: 0 + } + + .card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-img-top,.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-img-bottom,.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-header,.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-footer { + border-radius: 0 + } +} + +.card-columns .card { + margin-bottom: 0.75rem +} + +@media (min-width: 576px) { + .card-columns { + -webkit-column-count:3; + column-count: 3; + -webkit-column-gap: 1.25rem; + column-gap: 1.25rem; + orphans: 1; + widows: 1 + } + + .card-columns .card { + display: inline-block; + width: 100% + } +} + +.accordion .card:not(:first-of-type):not(:last-of-type) { + border-bottom: 0; + border-radius: 0 +} + +.accordion .card:not(:first-of-type) .card-header:first-child { + border-radius: 0 +} + +.accordion .card:first-of-type { + border-bottom: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0 +} + +.accordion .card:last-of-type { + border-top-left-radius: 0; + border-top-right-radius: 0 +} + +.breadcrumb { + display: flex; + flex-wrap: wrap; + padding: 0.75rem 1rem; + margin-bottom: 1rem; + list-style: none; + background-color: #e9ecef; + border-radius: 0.25rem +} + +.breadcrumb-item+.breadcrumb-item { + padding-left: 0.5rem +} + +.breadcrumb-item+.breadcrumb-item::before { + display: inline-block; + padding-right: 0.5rem; + color: #6c757d; + content: "/" +} + +.breadcrumb-item+.breadcrumb-item:hover::before { + text-decoration: underline +} + +.breadcrumb-item+.breadcrumb-item:hover::before { + text-decoration: none +} + +.breadcrumb-item.active { + color: #6c757d +} + +.pagination { + display: flex; + padding-left: 0; + list-style: none; + border-radius: 0.25rem +} + +.page-link { + position: relative; + display: block; + padding: 0.5rem 0.75rem; + margin-left: -1px; + line-height: 1.25; + color: #007bff; + background-color: #fff; + border: 1px solid #dee2e6 +} + +.page-link:hover { + z-index: 2; + color: #0056b3; + text-decoration: none; + background-color: #e9ecef; + border-color: #dee2e6 +} + +.page-link:focus { + z-index: 2; + outline: 0; + box-shadow: 0 0 0 0.2rem rgba(0,123,255,0.25) +} + +.page-link:not(:disabled):not(.disabled) { + cursor: pointer +} + +.page-item:first-child .page-link { + margin-left: 0; + border-top-left-radius: 0.25rem; + border-bottom-left-radius: 0.25rem +} + +.page-item:last-child .page-link { + border-top-right-radius: 0.25rem; + border-bottom-right-radius: 0.25rem +} + +.page-item.active .page-link { + z-index: 1; + color: #fff; + background-color: #007bff; + border-color: #007bff +} + +.page-item.disabled .page-link { + color: #6c757d; + pointer-events: none; + cursor: auto; + background-color: #fff; + border-color: #dee2e6 +} + +.pagination-lg .page-link { + padding: 0.75rem 1.5rem; + font-size: 1.25rem; + line-height: 1.5 +} + +.pagination-lg .page-item:first-child .page-link { + border-top-left-radius: 0.3rem; + border-bottom-left-radius: 0.3rem +} + +.pagination-lg .page-item:last-child .page-link { + border-top-right-radius: 0.3rem; + border-bottom-right-radius: 0.3rem +} + +.pagination-sm .page-link { + padding: 0.25rem 0.5rem; + font-size: 0.875rem; + line-height: 1.5 +} + +.pagination-sm .page-item:first-child .page-link { + border-top-left-radius: 0.2rem; + border-bottom-left-radius: 0.2rem +} + +.pagination-sm .page-item:last-child .page-link { + border-top-right-radius: 0.2rem; + border-bottom-right-radius: 0.2rem +} + +.badge { + display: inline-block; + padding: 0.25em 0.4em; + font-size: 75%; + font-weight: 700; + line-height: 1; + text-align: center; + white-space: nowrap; + vertical-align: baseline; + border-radius: 0.25rem +} + +.badge:empty { + display: none +} + +.btn .badge { + position: relative; + top: -1px +} + +.badge-pill { + padding-right: 0.6em; + padding-left: 0.6em; + border-radius: 10rem +} + +.badge-primary { + color: #fff; + background-color: #007bff +} + +.badge-primary[href]:hover,.badge-primary[href]:focus { + color: #fff; + text-decoration: none; + background-color: #0062cc +} + +.badge-secondary { + color: #fff; + background-color: #6c757d +} + +.badge-secondary[href]:hover,.badge-secondary[href]:focus { + color: #fff; + text-decoration: none; + background-color: #545b62 +} + +.badge-success { + color: #fff; + background-color: #28a745 +} + +.badge-success[href]:hover,.badge-success[href]:focus { + color: #fff; + text-decoration: none; + background-color: #1e7e34 +} + +.badge-info { + color: #fff; + background-color: #17a2b8 +} + +.badge-info[href]:hover,.badge-info[href]:focus { + color: #fff; + text-decoration: none; + background-color: #117a8b +} + +.badge-warning { + color: #212529; + background-color: #ffc107 +} + +.badge-warning[href]:hover,.badge-warning[href]:focus { + color: #212529; + text-decoration: none; + background-color: #d39e00 +} + +.badge-danger { + color: #fff; + background-color: #dc3545 +} + +.badge-danger[href]:hover,.badge-danger[href]:focus { + color: #fff; + text-decoration: none; + background-color: #bd2130 +} + +.badge-light { + color: #212529; + background-color: #f8f9fa +} + +.badge-light[href]:hover,.badge-light[href]:focus { + color: #212529; + text-decoration: none; + background-color: #dae0e5 +} + +.badge-dark { + color: #fff; + background-color: #343a40 +} + +.badge-dark[href]:hover,.badge-dark[href]:focus { + color: #fff; + text-decoration: none; + background-color: #1d2124 +} + +.jumbotron { + padding: 2rem 1rem; + margin-bottom: 2rem; + background-color: #e9ecef; + border-radius: 0.3rem +} + +@media (min-width: 576px) { + .jumbotron { + padding:4rem 2rem + } +} + +.jumbotron-fluid { + padding-right: 0; + padding-left: 0; + border-radius: 0 +} + +.alert { + position: relative; + padding: 0.75rem 1.25rem; + margin-bottom: 1rem; + border: 1px solid transparent; + border-radius: 0.25rem +} + +.alert-heading { + color: inherit +} + +.alert-link { + font-weight: 700 +} + +.alert-dismissible { + padding-right: 4rem +} + +.alert-dismissible .close { + position: absolute; + top: 0; + right: 0; + padding: 0.75rem 1.25rem; + color: inherit +} + +.alert-primary { + color: #004085; + background-color: #cce5ff; + border-color: #b8daff +} + +.alert-primary hr { + border-top-color: #9fcdff +} + +.alert-primary .alert-link { + color: #002752 +} + +.alert-secondary { + color: #383d41; + background-color: #e2e3e5; + border-color: #d6d8db +} + +.alert-secondary hr { + border-top-color: #c8cbcf +} + +.alert-secondary .alert-link { + color: #202326 +} + +.alert-success { + color: #155724; + background-color: #d4edda; + border-color: #c3e6cb +} + +.alert-success hr { + border-top-color: #b1dfbb +} + +.alert-success .alert-link { + color: #0b2e13 +} + +.alert-info { + color: #0c5460; + background-color: #d1ecf1; + border-color: #bee5eb +} + +.alert-info hr { + border-top-color: #abdde5 +} + +.alert-info .alert-link { + color: #062c33 +} + +.alert-warning { + color: #856404; + background-color: #fff3cd; + border-color: #ffeeba +} + +.alert-warning hr { + border-top-color: #ffe8a1 +} + +.alert-warning .alert-link { + color: #533f03 +} + +.alert-danger { + color: #721c24; + background-color: #f8d7da; + border-color: #f5c6cb +} + +.alert-danger hr { + border-top-color: #f1b0b7 +} + +.alert-danger .alert-link { + color: #491217 +} + +.alert-light { + color: #818182; + background-color: #fefefe; + border-color: #fdfdfe +} + +.alert-light hr { + border-top-color: #ececf6 +} + +.alert-light .alert-link { + color: #686868 +} + +.alert-dark { + color: #1b1e21; + background-color: #d6d8d9; + border-color: #c6c8ca +} + +.alert-dark hr { + border-top-color: #b9bbbe +} + +.alert-dark .alert-link { + color: #040505 +} + +@-webkit-keyframes progress-bar-stripes { + from { + background-position: 1rem 0 + } + + to { + background-position: 0 0 + } +} + +@keyframes progress-bar-stripes { + from { + background-position: 1rem 0 + } + + to { + background-position: 0 0 + } +} + +.progress { + display: flex; + height: 1rem; + overflow: hidden; + font-size: 0.75rem; + background-color: #e9ecef; + border-radius: 0.25rem +} + +.progress-bar { + display: flex; + flex-direction: column; + justify-content: center; + color: #fff; + text-align: center; + white-space: nowrap; + background-color: #007bff; + transition: width 0.6s ease +} + +@media screen and (prefers-reduced-motion: reduce) { + .progress-bar { + transition: none + } +} + +.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-bar-animated { + -webkit-animation: progress-bar-stripes 1s linear infinite; + animation: progress-bar-stripes 1s linear infinite +} + +.media { + display: flex; + align-items: flex-start +} + +.media-body { + flex: 1 +} + +.list-group { + display: flex; + flex-direction: column; + padding-left: 0; + margin-bottom: 0 +} + +.list-group-item-action { + width: 100%; + color: #495057; + text-align: inherit +} + +.list-group-item-action:hover,.list-group-item-action:focus { + color: #495057; + text-decoration: none; + background-color: #f8f9fa +} + +.list-group-item-action:active { + color: #212529; + background-color: #e9ecef +} + +.list-group-item { + position: relative; + display: block; + padding: 0.75rem 1.25rem; + margin-bottom: -1px; + background-color: #fff; + border: 1px solid rgba(0,0,0,0.125) +} + +.list-group-item:first-child { + border-top-left-radius: 0.25rem; + border-top-right-radius: 0.25rem +} + +.list-group-item:last-child { + margin-bottom: 0; + border-bottom-right-radius: 0.25rem; + border-bottom-left-radius: 0.25rem +} + +.list-group-item:hover,.list-group-item:focus { + z-index: 1; + text-decoration: none +} + +.list-group-item.disabled,.list-group-item:disabled { + color: #6c757d; + background-color: #fff +} + +.list-group-item.active { + z-index: 2; + color: #fff; + background-color: #007bff; + border-color: #007bff +} + +.list-group-flush .list-group-item { + border-right: 0; + border-left: 0; + border-radius: 0 +} + +.list-group-flush:first-child .list-group-item:first-child { + border-top: 0 +} + +.list-group-flush:last-child .list-group-item:last-child { + border-bottom: 0 +} + +.list-group-item-primary { + color: #004085; + background-color: #b8daff +} + +.list-group-item-primary.list-group-item-action:hover,.list-group-item-primary.list-group-item-action:focus { + color: #004085; + background-color: #9fcdff +} + +.list-group-item-primary.list-group-item-action.active { + color: #fff; + background-color: #004085; + border-color: #004085 +} + +.list-group-item-secondary { + color: #383d41; + background-color: #d6d8db +} + +.list-group-item-secondary.list-group-item-action:hover,.list-group-item-secondary.list-group-item-action:focus { + color: #383d41; + background-color: #c8cbcf +} + +.list-group-item-secondary.list-group-item-action.active { + color: #fff; + background-color: #383d41; + border-color: #383d41 +} + +.list-group-item-success { + color: #155724; + background-color: #c3e6cb +} + +.list-group-item-success.list-group-item-action:hover,.list-group-item-success.list-group-item-action:focus { + color: #155724; + background-color: #b1dfbb +} + +.list-group-item-success.list-group-item-action.active { + color: #fff; + background-color: #155724; + border-color: #155724 +} + +.list-group-item-info { + color: #0c5460; + background-color: #bee5eb +} + +.list-group-item-info.list-group-item-action:hover,.list-group-item-info.list-group-item-action:focus { + color: #0c5460; + background-color: #abdde5 +} + +.list-group-item-info.list-group-item-action.active { + color: #fff; + background-color: #0c5460; + border-color: #0c5460 +} + +.list-group-item-warning { + color: #856404; + background-color: #ffeeba +} + +.list-group-item-warning.list-group-item-action:hover,.list-group-item-warning.list-group-item-action:focus { + color: #856404; + background-color: #ffe8a1 +} + +.list-group-item-warning.list-group-item-action.active { + color: #fff; + background-color: #856404; + border-color: #856404 +} + +.list-group-item-danger { + color: #721c24; + background-color: #f5c6cb +} + +.list-group-item-danger.list-group-item-action:hover,.list-group-item-danger.list-group-item-action:focus { + color: #721c24; + background-color: #f1b0b7 +} + +.list-group-item-danger.list-group-item-action.active { + color: #fff; + background-color: #721c24; + border-color: #721c24 +} + +.list-group-item-light { + color: #818182; + background-color: #fdfdfe +} + +.list-group-item-light.list-group-item-action:hover,.list-group-item-light.list-group-item-action:focus { + color: #818182; + background-color: #ececf6 +} + +.list-group-item-light.list-group-item-action.active { + color: #fff; + background-color: #818182; + border-color: #818182 +} + +.list-group-item-dark { + color: #1b1e21; + background-color: #c6c8ca +} + +.list-group-item-dark.list-group-item-action:hover,.list-group-item-dark.list-group-item-action:focus { + color: #1b1e21; + background-color: #b9bbbe +} + +.list-group-item-dark.list-group-item-action.active { + color: #fff; + background-color: #1b1e21; + border-color: #1b1e21 +} + +.close { + float: right; + font-size: 1.5rem; + font-weight: 700; + line-height: 1; + color: #000; + text-shadow: 0 1px 0 #fff; + opacity: .5 +} + +.close:not(:disabled):not(.disabled) { + cursor: pointer +} + +.close:not(:disabled):not(.disabled):hover,.close:not(:disabled):not(.disabled):focus { + color: #000; + text-decoration: none; + opacity: .75 +} + +button.close { + padding: 0; + background-color: transparent; + border: 0; + -webkit-appearance: none +} + +.modal-open { + overflow: hidden +} + +.modal-open .modal { + overflow-x: hidden; + overflow-y: auto +} + +.modal { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1050; + display: none; + overflow: hidden; + outline: 0 +} + +.modal-dialog { + position: relative; + width: auto; + margin: 0.5rem; + pointer-events: none +} + +.modal.fade .modal-dialog { + transition: -webkit-transform 0.3s ease-out; + transition: transform 0.3s ease-out; + transition: transform 0.3s ease-out, -webkit-transform 0.3s ease-out; + -webkit-transform: translate(0, -25%); + transform: translate(0, -25%) +} + +@media screen and (prefers-reduced-motion: reduce) { + .modal.fade .modal-dialog { + transition: none + } +} + +.modal.show .modal-dialog { + -webkit-transform: translate(0, 0); + transform: translate(0, 0) +} + +.modal-dialog-centered { + display: flex; + align-items: center; + min-height: calc(100% - (0.5rem * 2)) +} + +.modal-dialog-centered::before { + display: block; + height: calc(100vh - (0.5rem * 2)); + content: "" +} + +.modal-content { + position: relative; + display: flex; + flex-direction: column; + width: 100%; + pointer-events: auto; + background-color: #fff; + background-clip: padding-box; + border: 1px solid rgba(0,0,0,0.2); + border-radius: 0.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.show { + opacity: 0.5 +} + +.modal-header { + display: flex; + align-items: flex-start; + justify-content: space-between; + padding: 1rem; + border-bottom: 1px solid #e9ecef; + border-top-left-radius: 0.3rem; + border-top-right-radius: 0.3rem +} + +.modal-header .close { + padding: 1rem; + margin: -1rem -1rem -1rem auto +} + +.modal-title { + margin-bottom: 0; + line-height: 1.5 +} + +.modal-body { + position: relative; + flex: 1 1 auto; + padding: 1rem +} + +.modal-footer { + display: flex; + align-items: center; + justify-content: flex-end; + padding: 1rem; + border-top: 1px solid #e9ecef +} + +.modal-footer>:not(:first-child) { + margin-left: .25rem +} + +.modal-footer>:not(:last-child) { + margin-right: .25rem +} + +.modal-scrollbar-measure { + position: absolute; + top: -9999px; + width: 50px; + height: 50px; + overflow: scroll +} + +@media (min-width: 576px) { + .modal-dialog { + max-width:500px; + margin: 1.75rem auto + } + + .modal-dialog-centered { + min-height: calc(100% - (1.75rem * 2)) + } + + .modal-dialog-centered::before { + height: calc(100vh - (1.75rem * 2)) + } + + .modal-sm { + max-width: 300px + } +} + +@media (min-width: 992px) { + .modal-lg { + max-width:800px + } +} + +.tooltip { + position: absolute; + z-index: 1070; + display: block; + margin: 0; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; + font-style: normal; + font-weight: 400; + line-height: 1.5; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + letter-spacing: normal; + word-break: normal; + word-spacing: normal; + white-space: normal; + line-break: auto; + font-size: 0.875rem; + word-wrap: break-word; + opacity: 0 +} + +.tooltip.show { + opacity: 0.9 +} + +.tooltip .arrow { + position: absolute; + display: block; + width: 0.8rem; + height: 0.4rem +} + +.tooltip .arrow::before { + position: absolute; + content: ""; + border-color: transparent; + border-style: solid +} + +.bs-tooltip-top,.bs-tooltip-auto[x-placement^="top"] { + padding: 0.4rem 0 +} + +.bs-tooltip-top .arrow,.bs-tooltip-auto[x-placement^="top"] .arrow { + bottom: 0 +} + +.bs-tooltip-top .arrow::before,.bs-tooltip-auto[x-placement^="top"] .arrow::before { + top: 0; + border-width: 0.4rem 0.4rem 0; + border-top-color: #000 +} + +.bs-tooltip-right,.bs-tooltip-auto[x-placement^="right"] { + padding: 0 0.4rem +} + +.bs-tooltip-right .arrow,.bs-tooltip-auto[x-placement^="right"] .arrow { + left: 0; + width: 0.4rem; + height: 0.8rem +} + +.bs-tooltip-right .arrow::before,.bs-tooltip-auto[x-placement^="right"] .arrow::before { + right: 0; + border-width: 0.4rem 0.4rem 0.4rem 0; + border-right-color: #000 +} + +.bs-tooltip-bottom,.bs-tooltip-auto[x-placement^="bottom"] { + padding: 0.4rem 0 +} + +.bs-tooltip-bottom .arrow,.bs-tooltip-auto[x-placement^="bottom"] .arrow { + top: 0 +} + +.bs-tooltip-bottom .arrow::before,.bs-tooltip-auto[x-placement^="bottom"] .arrow::before { + bottom: 0; + border-width: 0 0.4rem 0.4rem; + border-bottom-color: #000 +} + +.bs-tooltip-left,.bs-tooltip-auto[x-placement^="left"] { + padding: 0 0.4rem +} + +.bs-tooltip-left .arrow,.bs-tooltip-auto[x-placement^="left"] .arrow { + right: 0; + width: 0.4rem; + height: 0.8rem +} + +.bs-tooltip-left .arrow::before,.bs-tooltip-auto[x-placement^="left"] .arrow::before { + left: 0; + border-width: 0.4rem 0 0.4rem 0.4rem; + border-left-color: #000 +} + +.tooltip-inner { + max-width: 200px; + padding: 0.25rem 0.5rem; + color: #fff; + text-align: center; + background-color: #000; + border-radius: 0.25rem +} + +.popover { + position: absolute; + top: 0; + left: 0; + z-index: 1060; + display: block; + max-width: 276px; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; + font-style: normal; + font-weight: 400; + line-height: 1.5; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + letter-spacing: normal; + word-break: normal; + word-spacing: normal; + white-space: normal; + line-break: auto; + font-size: 0.875rem; + word-wrap: break-word; + background-color: #fff; + background-clip: padding-box; + border: 1px solid rgba(0,0,0,0.2); + border-radius: 0.3rem +} + +.popover .arrow { + position: absolute; + display: block; + width: 1rem; + height: 0.5rem; + margin: 0 0.3rem +} + +.popover .arrow::before,.popover .arrow::after { + position: absolute; + display: block; + content: ""; + border-color: transparent; + border-style: solid +} + +.bs-popover-top,.bs-popover-auto[x-placement^="top"] { + margin-bottom: 0.5rem +} + +.bs-popover-top .arrow,.bs-popover-auto[x-placement^="top"] .arrow { + bottom: calc((0.5rem + 1px) * -1) +} + +.bs-popover-top .arrow::before,.bs-popover-auto[x-placement^="top"] .arrow::before,.bs-popover-top .arrow::after,.bs-popover-auto[x-placement^="top"] .arrow::after { + border-width: 0.5rem 0.5rem 0 +} + +.bs-popover-top .arrow::before,.bs-popover-auto[x-placement^="top"] .arrow::before { + bottom: 0; + border-top-color: rgba(0,0,0,0.25) +} + +.bs-popover-top .arrow::after,.bs-popover-auto[x-placement^="top"] .arrow::after { + bottom: 1px; + border-top-color: #fff +} + +.bs-popover-right,.bs-popover-auto[x-placement^="right"] { + margin-left: 0.5rem +} + +.bs-popover-right .arrow,.bs-popover-auto[x-placement^="right"] .arrow { + left: calc((0.5rem + 1px) * -1); + width: 0.5rem; + height: 1rem; + margin: 0.3rem 0 +} + +.bs-popover-right .arrow::before,.bs-popover-auto[x-placement^="right"] .arrow::before,.bs-popover-right .arrow::after,.bs-popover-auto[x-placement^="right"] .arrow::after { + border-width: 0.5rem 0.5rem 0.5rem 0 +} + +.bs-popover-right .arrow::before,.bs-popover-auto[x-placement^="right"] .arrow::before { + left: 0; + border-right-color: rgba(0,0,0,0.25) +} + +.bs-popover-right .arrow::after,.bs-popover-auto[x-placement^="right"] .arrow::after { + left: 1px; + border-right-color: #fff +} + +.bs-popover-bottom,.bs-popover-auto[x-placement^="bottom"] { + margin-top: 0.5rem +} + +.bs-popover-bottom .arrow,.bs-popover-auto[x-placement^="bottom"] .arrow { + top: calc((0.5rem + 1px) * -1) +} + +.bs-popover-bottom .arrow::before,.bs-popover-auto[x-placement^="bottom"] .arrow::before,.bs-popover-bottom .arrow::after,.bs-popover-auto[x-placement^="bottom"] .arrow::after { + border-width: 0 0.5rem 0.5rem 0.5rem +} + +.bs-popover-bottom .arrow::before,.bs-popover-auto[x-placement^="bottom"] .arrow::before { + top: 0; + border-bottom-color: rgba(0,0,0,0.25) +} + +.bs-popover-bottom .arrow::after,.bs-popover-auto[x-placement^="bottom"] .arrow::after { + top: 1px; + border-bottom-color: #fff +} + +.bs-popover-bottom .popover-header::before,.bs-popover-auto[x-placement^="bottom"] .popover-header::before { + position: absolute; + top: 0; + left: 50%; + display: block; + width: 1rem; + margin-left: -0.5rem; + content: ""; + border-bottom: 1px solid #f7f7f7 +} + +.bs-popover-left,.bs-popover-auto[x-placement^="left"] { + margin-right: 0.5rem +} + +.bs-popover-left .arrow,.bs-popover-auto[x-placement^="left"] .arrow { + right: calc((0.5rem + 1px) * -1); + width: 0.5rem; + height: 1rem; + margin: 0.3rem 0 +} + +.bs-popover-left .arrow::before,.bs-popover-auto[x-placement^="left"] .arrow::before,.bs-popover-left .arrow::after,.bs-popover-auto[x-placement^="left"] .arrow::after { + border-width: 0.5rem 0 0.5rem 0.5rem +} + +.bs-popover-left .arrow::before,.bs-popover-auto[x-placement^="left"] .arrow::before { + right: 0; + border-left-color: rgba(0,0,0,0.25) +} + +.bs-popover-left .arrow::after,.bs-popover-auto[x-placement^="left"] .arrow::after { + right: 1px; + border-left-color: #fff +} + +.popover-header { + padding: 0.5rem 0.75rem; + margin-bottom: 0; + font-size: 1rem; + color: inherit; + background-color: #f7f7f7; + border-bottom: 1px solid #ebebeb; + border-top-left-radius: calc(0.3rem - 1px); + border-top-right-radius: calc(0.3rem - 1px) +} + +.popover-header:empty { + display: none +} + +.popover-body { + padding: 0.5rem 0.75rem; + color: #212529 +} + +.carousel { + position: relative +} + +.carousel-inner { + position: relative; + width: 100%; + overflow: hidden +} + +.carousel-item { + position: relative; + display: none; + align-items: center; + width: 100%; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + -webkit-perspective: 1000px; + perspective: 1000px +} + +.carousel-item.active,.carousel-item-next,.carousel-item-prev { + display: block; + transition: -webkit-transform 0.6s ease; + transition: transform 0.6s ease; + transition: transform 0.6s ease, -webkit-transform 0.6s ease +} + +@media screen and (prefers-reduced-motion: reduce) { + .carousel-item.active,.carousel-item-next,.carousel-item-prev { + transition: none + } +} + +.carousel-item-next,.carousel-item-prev { + position: absolute; + top: 0 +} + +.carousel-item-next.carousel-item-left,.carousel-item-prev.carousel-item-right { + -webkit-transform: translateX(0); + transform: translateX(0) +} + +@supports (-webkit-transform-style: preserve-3d) or (transform-style: preserve-3d) { + .carousel-item-next.carousel-item-left,.carousel-item-prev.carousel-item-right { + -webkit-transform:translate3d(0, 0, 0); + transform: translate3d(0, 0, 0) + } +} + +.carousel-item-next,.active.carousel-item-right { + -webkit-transform: translateX(100%); + transform: translateX(100%) +} + +@supports (-webkit-transform-style: preserve-3d) or (transform-style: preserve-3d) { + .carousel-item-next,.active.carousel-item-right { + -webkit-transform:translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0) + } +} + +.carousel-item-prev,.active.carousel-item-left { + -webkit-transform: translateX(-100%); + transform: translateX(-100%) +} + +@supports (-webkit-transform-style: preserve-3d) or (transform-style: preserve-3d) { + .carousel-item-prev,.active.carousel-item-left { + -webkit-transform:translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0) + } +} + +.carousel-fade .carousel-item { + opacity: 0; + transition-duration: .6s; + transition-property: opacity +} + +.carousel-fade .carousel-item.active,.carousel-fade .carousel-item-next.carousel-item-left,.carousel-fade .carousel-item-prev.carousel-item-right { + opacity: 1 +} + +.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right { + opacity: 0 +} + +.carousel-fade .carousel-item-next,.carousel-fade .carousel-item-prev,.carousel-fade .carousel-item.active,.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-prev { + -webkit-transform: translateX(0); + transform: translateX(0) +} + +@supports (-webkit-transform-style: preserve-3d) or (transform-style: preserve-3d) { + .carousel-fade .carousel-item-next,.carousel-fade .carousel-item-prev,.carousel-fade .carousel-item.active,.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-prev { + -webkit-transform:translate3d(0, 0, 0); + transform: translate3d(0, 0, 0) + } +} + +.carousel-control-prev,.carousel-control-next { + position: absolute; + top: 0; + bottom: 0; + display: flex; + align-items: center; + justify-content: center; + width: 15%; + color: #fff; + text-align: center; + opacity: 0.5 +} + +.carousel-control-prev:hover,.carousel-control-prev:focus,.carousel-control-next:hover,.carousel-control-next:focus { + color: #fff; + text-decoration: none; + outline: 0; + opacity: .9 +} + +.carousel-control-prev { + left: 0 +} + +.carousel-control-next { + right: 0 +} + +.carousel-control-prev-icon,.carousel-control-next-icon { + display: inline-block; + width: 20px; + height: 20px; + background: transparent no-repeat center center; + background-size: 100% 100% +} + +.carousel-control-prev-icon { + background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M5.25 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3E%3C/svg%3E") +} + +.carousel-control-next-icon { + background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M2.75 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3E%3C/svg%3E") +} + +.carousel-indicators { + position: absolute; + right: 0; + bottom: 10px; + left: 0; + z-index: 15; + display: flex; + justify-content: center; + padding-left: 0; + margin-right: 15%; + margin-left: 15%; + list-style: none +} + +.carousel-indicators li { + position: relative; + flex: 0 1 auto; + width: 30px; + height: 3px; + margin-right: 3px; + margin-left: 3px; + text-indent: -999px; + cursor: pointer; + background-color: rgba(255,255,255,0.5) +} + +.carousel-indicators li::before { + position: absolute; + top: -10px; + left: 0; + display: inline-block; + width: 100%; + height: 10px; + content: "" +} + +.carousel-indicators li::after { + position: absolute; + bottom: -10px; + left: 0; + display: inline-block; + width: 100%; + height: 10px; + content: "" +} + +.carousel-indicators .active { + 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 +} + +.align-baseline { + vertical-align: baseline !important +} + +.align-top { + vertical-align: top !important +} + +.align-middle { + vertical-align: middle !important +} + +.align-bottom { + vertical-align: bottom !important +} + +.align-text-bottom { + vertical-align: text-bottom !important +} + +.align-text-top { + vertical-align: text-top !important +} + +.bg-primary { + background-color: #007bff !important +} + +a.bg-primary:hover,a.bg-primary:focus,button.bg-primary:hover,button.bg-primary:focus { + background-color: #0062cc !important +} + +.bg-secondary { + background-color: #6c757d !important +} + +a.bg-secondary:hover,a.bg-secondary:focus,button.bg-secondary:hover,button.bg-secondary:focus { + background-color: #545b62 !important +} + +.bg-success { + background-color: #28a745 !important +} + +a.bg-success:hover,a.bg-success:focus,button.bg-success:hover,button.bg-success:focus { + background-color: #1e7e34 !important +} + +.bg-info { + background-color: #17a2b8 !important +} + +a.bg-info:hover,a.bg-info:focus,button.bg-info:hover,button.bg-info:focus { + background-color: #117a8b !important +} + +.bg-warning { + background-color: #ffc107 !important +} + +a.bg-warning:hover,a.bg-warning:focus,button.bg-warning:hover,button.bg-warning:focus { + background-color: #d39e00 !important +} + +.bg-danger { + background-color: #dc3545 !important +} + +a.bg-danger:hover,a.bg-danger:focus,button.bg-danger:hover,button.bg-danger:focus { + background-color: #bd2130 !important +} + +.bg-light { + background-color: #f8f9fa !important +} + +a.bg-light:hover,a.bg-light:focus,button.bg-light:hover,button.bg-light:focus { + background-color: #dae0e5 !important +} + +.bg-dark { + background-color: #343a40 !important +} + +a.bg-dark:hover,a.bg-dark:focus,button.bg-dark:hover,button.bg-dark:focus { + background-color: #1d2124 !important +} + +.bg-white { + background-color: #fff !important +} + +.bg-transparent { + background-color: transparent !important +} + +.border { + border: 1px solid #dee2e6 !important +} + +.border-top { + border-top: 1px solid #dee2e6 !important +} + +.border-right { + border-right: 1px solid #dee2e6 !important +} + +.border-bottom { + border-bottom: 1px solid #dee2e6 !important +} + +.border-left { + border-left: 1px solid #dee2e6 !important +} + +.border-0 { + border: 0 !important +} + +.border-top-0 { + border-top: 0 !important +} + +.border-right-0 { + border-right: 0 !important +} + +.border-bottom-0 { + border-bottom: 0 !important +} + +.border-left-0 { + border-left: 0 !important +} + +.border-primary { + border-color: #007bff !important +} + +.border-secondary { + border-color: #6c757d !important +} + +.border-success { + border-color: #28a745 !important +} + +.border-info { + border-color: #17a2b8 !important +} + +.border-warning { + border-color: #ffc107 !important +} + +.border-danger { + border-color: #dc3545 !important +} + +.border-light { + border-color: #f8f9fa !important +} + +.border-dark { + border-color: #343a40 !important +} + +.border-white { + border-color: #fff !important +} + +.rounded { + border-radius: 0.25rem !important +} + +.rounded-top { + border-top-left-radius: 0.25rem !important; + border-top-right-radius: 0.25rem !important +} + +.rounded-right { + border-top-right-radius: 0.25rem !important; + border-bottom-right-radius: 0.25rem !important +} + +.rounded-bottom { + border-bottom-right-radius: 0.25rem !important; + border-bottom-left-radius: 0.25rem !important +} + +.rounded-left { + border-top-left-radius: 0.25rem !important; + border-bottom-left-radius: 0.25rem !important +} + +.rounded-circle { + border-radius: 50% !important +} + +.rounded-0 { + border-radius: 0 !important +} + +.clearfix::after { + display: block; + clear: both; + content: "" +} + +.d-none { + display: none !important +} + +.d-inline { + display: inline !important +} + +.d-inline-block { + display: inline-block !important +} + +.d-block { + display: block !important +} + +.d-table { + display: table !important +} + +.d-table-row { + display: table-row !important +} + +.d-table-cell { + display: table-cell !important +} + +.d-flex { + display: flex !important +} + +.d-inline-flex { + display: inline-flex !important +} + +@media (min-width: 576px) { + .d-sm-none { + display:none !important + } + + .d-sm-inline { + display: inline !important + } + + .d-sm-inline-block { + display: inline-block !important + } + + .d-sm-block { + display: block !important + } + + .d-sm-table { + display: table !important + } + + .d-sm-table-row { + display: table-row !important + } + + .d-sm-table-cell { + display: table-cell !important + } + + .d-sm-flex { + display: flex !important + } + + .d-sm-inline-flex { + display: inline-flex !important + } +} + +@media (min-width: 768px) { + .d-md-none { + display:none !important + } + + .d-md-inline { + display: inline !important + } + + .d-md-inline-block { + display: inline-block !important + } + + .d-md-block { + display: block !important + } + + .d-md-table { + display: table !important + } + + .d-md-table-row { + display: table-row !important + } + + .d-md-table-cell { + display: table-cell !important + } + + .d-md-flex { + display: flex !important + } + + .d-md-inline-flex { + display: inline-flex !important + } +} + +@media (min-width: 992px) { + .d-lg-none { + display:none !important + } + + .d-lg-inline { + display: inline !important + } + + .d-lg-inline-block { + display: inline-block !important + } + + .d-lg-block { + display: block !important + } + + .d-lg-table { + display: table !important + } + + .d-lg-table-row { + display: table-row !important + } + + .d-lg-table-cell { + display: table-cell !important + } + + .d-lg-flex { + display: flex !important + } + + .d-lg-inline-flex { + display: inline-flex !important + } +} + +@media (min-width: 1200px) { + .d-xl-none { + display:none !important + } + + .d-xl-inline { + display: inline !important + } + + .d-xl-inline-block { + display: inline-block !important + } + + .d-xl-block { + display: block !important + } + + .d-xl-table { + display: table !important + } + + .d-xl-table-row { + display: table-row !important + } + + .d-xl-table-cell { + display: table-cell !important + } + + .d-xl-flex { + display: flex !important + } + + .d-xl-inline-flex { + display: inline-flex !important + } +} + +@media print { + .d-print-none { + display: none !important + } + + .d-print-inline { + display: inline !important + } + + .d-print-inline-block { + display: inline-block !important + } + + .d-print-block { + display: block !important + } + + .d-print-table { + display: table !important + } + + .d-print-table-row { + display: table-row !important + } + + .d-print-table-cell { + display: table-cell !important + } + + .d-print-flex { + display: flex !important + } + + .d-print-inline-flex { + display: inline-flex !important + } +} + +.embed-responsive { + position: relative; + display: block; + width: 100%; + padding: 0; + overflow: hidden +} + +.embed-responsive::before { + display: block; + content: "" +} + +.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::before { + padding-top: 42.8571428571% +} + +.embed-responsive-16by9::before { + padding-top: 56.25% +} + +.embed-responsive-4by3::before { + padding-top: 75% +} + +.embed-responsive-1by1::before { + padding-top: 100% +} + +.flex-row { + flex-direction: row !important +} + +.flex-column { + flex-direction: column !important +} + +.flex-row-reverse { + flex-direction: row-reverse !important +} + +.flex-column-reverse { + flex-direction: column-reverse !important +} + +.flex-wrap { + flex-wrap: wrap !important +} + +.flex-nowrap { + flex-wrap: nowrap !important +} + +.flex-wrap-reverse { + flex-wrap: wrap-reverse !important +} + +.flex-fill { + flex: 1 1 auto !important +} + +.flex-grow-0 { + flex-grow: 0 !important +} + +.flex-grow-1 { + flex-grow: 1 !important +} + +.flex-shrink-0 { + flex-shrink: 0 !important +} + +.flex-shrink-1 { + flex-shrink: 1 !important +} + +.justify-content-start { + justify-content: flex-start !important +} + +.justify-content-end { + justify-content: flex-end !important +} + +.justify-content-center { + justify-content: center !important +} + +.justify-content-between { + justify-content: space-between !important +} + +.justify-content-around { + justify-content: space-around !important +} + +.align-items-start { + align-items: flex-start !important +} + +.align-items-end { + align-items: flex-end !important +} + +.align-items-center { + align-items: center !important +} + +.align-items-baseline { + align-items: baseline !important +} + +.align-items-stretch { + align-items: stretch !important +} + +.align-content-start { + align-content: flex-start !important +} + +.align-content-end { + align-content: flex-end !important +} + +.align-content-center { + align-content: center !important +} + +.align-content-between { + align-content: space-between !important +} + +.align-content-around { + align-content: space-around !important +} + +.align-content-stretch { + align-content: stretch !important +} + +.align-self-auto { + align-self: auto !important +} + +.align-self-start { + align-self: flex-start !important +} + +.align-self-end { + align-self: flex-end !important +} + +.align-self-center { + align-self: center !important +} + +.align-self-baseline { + align-self: baseline !important +} + +.align-self-stretch { + align-self: stretch !important +} + +@media (min-width: 576px) { + .flex-sm-row { + flex-direction:row !important + } + + .flex-sm-column { + flex-direction: column !important + } + + .flex-sm-row-reverse { + flex-direction: row-reverse !important + } + + .flex-sm-column-reverse { + flex-direction: column-reverse !important + } + + .flex-sm-wrap { + flex-wrap: wrap !important + } + + .flex-sm-nowrap { + flex-wrap: nowrap !important + } + + .flex-sm-wrap-reverse { + flex-wrap: wrap-reverse !important + } + + .flex-sm-fill { + flex: 1 1 auto !important + } + + .flex-sm-grow-0 { + flex-grow: 0 !important + } + + .flex-sm-grow-1 { + flex-grow: 1 !important + } + + .flex-sm-shrink-0 { + flex-shrink: 0 !important + } + + .flex-sm-shrink-1 { + flex-shrink: 1 !important + } + + .justify-content-sm-start { + justify-content: flex-start !important + } + + .justify-content-sm-end { + justify-content: flex-end !important + } + + .justify-content-sm-center { + justify-content: center !important + } + + .justify-content-sm-between { + justify-content: space-between !important + } + + .justify-content-sm-around { + justify-content: space-around !important + } + + .align-items-sm-start { + align-items: flex-start !important + } + + .align-items-sm-end { + align-items: flex-end !important + } + + .align-items-sm-center { + align-items: center !important + } + + .align-items-sm-baseline { + align-items: baseline !important + } + + .align-items-sm-stretch { + align-items: stretch !important + } + + .align-content-sm-start { + align-content: flex-start !important + } + + .align-content-sm-end { + align-content: flex-end !important + } + + .align-content-sm-center { + align-content: center !important + } + + .align-content-sm-between { + align-content: space-between !important + } + + .align-content-sm-around { + align-content: space-around !important + } + + .align-content-sm-stretch { + align-content: stretch !important + } + + .align-self-sm-auto { + align-self: auto !important + } + + .align-self-sm-start { + align-self: flex-start !important + } + + .align-self-sm-end { + align-self: flex-end !important + } + + .align-self-sm-center { + align-self: center !important + } + + .align-self-sm-baseline { + align-self: baseline !important + } + + .align-self-sm-stretch { + align-self: stretch !important + } +} + +@media (min-width: 768px) { + .flex-md-row { + flex-direction:row !important + } + + .flex-md-column { + flex-direction: column !important + } + + .flex-md-row-reverse { + flex-direction: row-reverse !important + } + + .flex-md-column-reverse { + flex-direction: column-reverse !important + } + + .flex-md-wrap { + flex-wrap: wrap !important + } + + .flex-md-nowrap { + flex-wrap: nowrap !important + } + + .flex-md-wrap-reverse { + flex-wrap: wrap-reverse !important + } + + .flex-md-fill { + flex: 1 1 auto !important + } + + .flex-md-grow-0 { + flex-grow: 0 !important + } + + .flex-md-grow-1 { + flex-grow: 1 !important + } + + .flex-md-shrink-0 { + flex-shrink: 0 !important + } + + .flex-md-shrink-1 { + flex-shrink: 1 !important + } + + .justify-content-md-start { + justify-content: flex-start !important + } + + .justify-content-md-end { + justify-content: flex-end !important + } + + .justify-content-md-center { + justify-content: center !important + } + + .justify-content-md-between { + justify-content: space-between !important + } + + .justify-content-md-around { + justify-content: space-around !important + } + + .align-items-md-start { + align-items: flex-start !important + } + + .align-items-md-end { + align-items: flex-end !important + } + + .align-items-md-center { + align-items: center !important + } + + .align-items-md-baseline { + align-items: baseline !important + } + + .align-items-md-stretch { + align-items: stretch !important + } + + .align-content-md-start { + align-content: flex-start !important + } + + .align-content-md-end { + align-content: flex-end !important + } + + .align-content-md-center { + align-content: center !important + } + + .align-content-md-between { + align-content: space-between !important + } + + .align-content-md-around { + align-content: space-around !important + } + + .align-content-md-stretch { + align-content: stretch !important + } + + .align-self-md-auto { + align-self: auto !important + } + + .align-self-md-start { + align-self: flex-start !important + } + + .align-self-md-end { + align-self: flex-end !important + } + + .align-self-md-center { + align-self: center !important + } + + .align-self-md-baseline { + align-self: baseline !important + } + + .align-self-md-stretch { + align-self: stretch !important + } +} + +@media (min-width: 992px) { + .flex-lg-row { + flex-direction:row !important + } + + .flex-lg-column { + flex-direction: column !important + } + + .flex-lg-row-reverse { + flex-direction: row-reverse !important + } + + .flex-lg-column-reverse { + flex-direction: column-reverse !important + } + + .flex-lg-wrap { + flex-wrap: wrap !important + } + + .flex-lg-nowrap { + flex-wrap: nowrap !important + } + + .flex-lg-wrap-reverse { + flex-wrap: wrap-reverse !important + } + + .flex-lg-fill { + flex: 1 1 auto !important + } + + .flex-lg-grow-0 { + flex-grow: 0 !important + } + + .flex-lg-grow-1 { + flex-grow: 1 !important + } + + .flex-lg-shrink-0 { + flex-shrink: 0 !important + } + + .flex-lg-shrink-1 { + flex-shrink: 1 !important + } + + .justify-content-lg-start { + justify-content: flex-start !important + } + + .justify-content-lg-end { + justify-content: flex-end !important + } + + .justify-content-lg-center { + justify-content: center !important + } + + .justify-content-lg-between { + justify-content: space-between !important + } + + .justify-content-lg-around { + justify-content: space-around !important + } + + .align-items-lg-start { + align-items: flex-start !important + } + + .align-items-lg-end { + align-items: flex-end !important + } + + .align-items-lg-center { + align-items: center !important + } + + .align-items-lg-baseline { + align-items: baseline !important + } + + .align-items-lg-stretch { + align-items: stretch !important + } + + .align-content-lg-start { + align-content: flex-start !important + } + + .align-content-lg-end { + align-content: flex-end !important + } + + .align-content-lg-center { + align-content: center !important + } + + .align-content-lg-between { + align-content: space-between !important + } + + .align-content-lg-around { + align-content: space-around !important + } + + .align-content-lg-stretch { + align-content: stretch !important + } + + .align-self-lg-auto { + align-self: auto !important + } + + .align-self-lg-start { + align-self: flex-start !important + } + + .align-self-lg-end { + align-self: flex-end !important + } + + .align-self-lg-center { + align-self: center !important + } + + .align-self-lg-baseline { + align-self: baseline !important + } + + .align-self-lg-stretch { + align-self: stretch !important + } +} + +@media (min-width: 1200px) { + .flex-xl-row { + flex-direction:row !important + } + + .flex-xl-column { + flex-direction: column !important + } + + .flex-xl-row-reverse { + flex-direction: row-reverse !important + } + + .flex-xl-column-reverse { + flex-direction: column-reverse !important + } + + .flex-xl-wrap { + flex-wrap: wrap !important + } + + .flex-xl-nowrap { + flex-wrap: nowrap !important + } + + .flex-xl-wrap-reverse { + flex-wrap: wrap-reverse !important + } + + .flex-xl-fill { + flex: 1 1 auto !important + } + + .flex-xl-grow-0 { + flex-grow: 0 !important + } + + .flex-xl-grow-1 { + flex-grow: 1 !important + } + + .flex-xl-shrink-0 { + flex-shrink: 0 !important + } + + .flex-xl-shrink-1 { + flex-shrink: 1 !important + } + + .justify-content-xl-start { + justify-content: flex-start !important + } + + .justify-content-xl-end { + justify-content: flex-end !important + } + + .justify-content-xl-center { + justify-content: center !important + } + + .justify-content-xl-between { + justify-content: space-between !important + } + + .justify-content-xl-around { + justify-content: space-around !important + } + + .align-items-xl-start { + align-items: flex-start !important + } + + .align-items-xl-end { + align-items: flex-end !important + } + + .align-items-xl-center { + align-items: center !important + } + + .align-items-xl-baseline { + align-items: baseline !important + } + + .align-items-xl-stretch { + align-items: stretch !important + } + + .align-content-xl-start { + align-content: flex-start !important + } + + .align-content-xl-end { + align-content: flex-end !important + } + + .align-content-xl-center { + align-content: center !important + } + + .align-content-xl-between { + align-content: space-between !important + } + + .align-content-xl-around { + align-content: space-around !important + } + + .align-content-xl-stretch { + align-content: stretch !important + } + + .align-self-xl-auto { + align-self: auto !important + } + + .align-self-xl-start { + align-self: flex-start !important + } + + .align-self-xl-end { + align-self: flex-end !important + } + + .align-self-xl-center { + align-self: center !important + } + + .align-self-xl-baseline { + align-self: baseline !important + } + + .align-self-xl-stretch { + align-self: stretch !important + } +} + +.float-left { + float: left !important +} + +.float-right { + float: right !important +} + +.float-none { + float: none !important +} + +@media (min-width: 576px) { + .float-sm-left { + float:left !important + } + + .float-sm-right { + float: right !important + } + + .float-sm-none { + float: none !important + } +} + +@media (min-width: 768px) { + .float-md-left { + float:left !important + } + + .float-md-right { + float: right !important + } + + .float-md-none { + float: none !important + } +} + +@media (min-width: 992px) { + .float-lg-left { + float:left !important + } + + .float-lg-right { + float: right !important + } + + .float-lg-none { + float: none !important + } +} + +@media (min-width: 1200px) { + .float-xl-left { + float:left !important + } + + .float-xl-right { + float: right !important + } + + .float-xl-none { + float: none !important + } +} + +.position-static { + position: static !important +} + +.position-relative { + position: relative !important +} + +.position-absolute { + position: absolute !important +} + +.position-fixed { + position: fixed !important +} + +.position-sticky { + position: -webkit-sticky !important; + position: sticky !important +} + +.fixed-top { + position: fixed; + top: 0; + right: 0; + left: 0; + z-index: 1030 +} + +.fixed-bottom { + position: fixed; + right: 0; + bottom: 0; + left: 0; + z-index: 1030 +} + +@supports (position: -webkit-sticky) or (position: sticky) { + .sticky-top { + position:-webkit-sticky; + position: sticky; + top: 0; + z-index: 1020 + } +} + +.sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + overflow: hidden; + clip: rect(0, 0, 0, 0); + white-space: nowrap; + border: 0 +} + +.sr-only-focusable:active,.sr-only-focusable:focus { + position: static; + width: auto; + height: auto; + overflow: visible; + clip: auto; + white-space: normal +} + +.shadow-sm { + box-shadow: 0 0.125rem 0.25rem rgba(0,0,0,0.075) !important +} + +.shadow { + box-shadow: 0 0.5rem 1rem rgba(0,0,0,0.15) !important +} + +.shadow-lg { + box-shadow: 0 1rem 3rem rgba(0,0,0,0.175) !important +} + +.shadow-none { + box-shadow: none !important +} + +.w-25 { + width: 25% !important +} + +.w-50 { + width: 50% !important +} + +.w-75 { + width: 75% !important +} + +.w-100 { + width: 100% !important +} + +.w-auto { + width: auto !important +} + +.h-25 { + height: 25% !important +} + +.h-50 { + height: 50% !important +} + +.h-75 { + height: 75% !important +} + +.h-100 { + height: 100% !important +} + +.h-auto { + height: auto !important +} + +.mw-100 { + max-width: 100% !important +} + +.mh-100 { + max-height: 100% !important +} + +.m-0 { + margin: 0 !important +} + +.mt-0,.my-0 { + margin-top: 0 !important +} + +.mr-0,.mx-0 { + margin-right: 0 !important +} + +.mb-0,.my-0 { + margin-bottom: 0 !important +} + +.ml-0,.mx-0 { + margin-left: 0 !important +} + +.m-1 { + margin: 0.25rem !important +} + +.mt-1,.my-1 { + margin-top: 0.25rem !important +} + +.mr-1,.mx-1 { + margin-right: 0.25rem !important +} + +.mb-1,.my-1 { + margin-bottom: 0.25rem !important +} + +.ml-1,.mx-1 { + margin-left: 0.25rem !important +} + +.m-2 { + margin: 0.5rem !important +} + +.mt-2,.my-2 { + margin-top: 0.5rem !important +} + +.mr-2,.mx-2 { + margin-right: 0.5rem !important +} + +.mb-2,.my-2 { + margin-bottom: 0.5rem !important +} + +.ml-2,.mx-2 { + margin-left: 0.5rem !important +} + +.m-3 { + margin: 1rem !important +} + +.mt-3,.my-3 { + margin-top: 1rem !important +} + +.mr-3,.mx-3 { + margin-right: 1rem !important +} + +.mb-3,.my-3 { + margin-bottom: 1rem !important +} + +.ml-3,.mx-3 { + margin-left: 1rem !important +} + +.m-4 { + margin: 1.5rem !important +} + +.mt-4,.my-4 { + margin-top: 1.5rem !important +} + +.mr-4,.mx-4 { + margin-right: 1.5rem !important +} + +.mb-4,.my-4 { + margin-bottom: 1.5rem !important +} + +.ml-4,.mx-4 { + margin-left: 1.5rem !important +} + +.m-5 { + margin: 3rem !important +} + +.mt-5,.my-5 { + margin-top: 3rem !important +} + +.mr-5,.mx-5 { + margin-right: 3rem !important +} + +.mb-5,.my-5 { + margin-bottom: 3rem !important +} + +.ml-5,.mx-5 { + margin-left: 3rem !important +} + +.p-0 { + padding: 0 !important +} + +.pt-0,.py-0 { + padding-top: 0 !important +} + +.pr-0,.px-0 { + padding-right: 0 !important +} + +.pb-0,.py-0 { + padding-bottom: 0 !important +} + +.pl-0,.px-0 { + padding-left: 0 !important +} + +.p-1 { + padding: 0.25rem !important +} + +.pt-1,.py-1 { + padding-top: 0.25rem !important +} + +.pr-1,.px-1 { + padding-right: 0.25rem !important +} + +.pb-1,.py-1 { + padding-bottom: 0.25rem !important +} + +.pl-1,.px-1 { + padding-left: 0.25rem !important +} + +.p-2 { + padding: 0.5rem !important +} + +.pt-2,.py-2 { + padding-top: 0.5rem !important +} + +.pr-2,.px-2 { + padding-right: 0.5rem !important +} + +.pb-2,.py-2 { + padding-bottom: 0.5rem !important +} + +.pl-2,.px-2 { + padding-left: 0.5rem !important +} + +.p-3 { + padding: 1rem !important +} + +.pt-3,.py-3 { + padding-top: 1rem !important +} + +.pr-3,.px-3 { + padding-right: 1rem !important +} + +.pb-3,.py-3 { + padding-bottom: 1rem !important +} + +.pl-3,.px-3 { + padding-left: 1rem !important +} + +.p-4 { + padding: 1.5rem !important +} + +.pt-4,.py-4 { + padding-top: 1.5rem !important +} + +.pr-4,.px-4 { + padding-right: 1.5rem !important +} + +.pb-4,.py-4 { + padding-bottom: 1.5rem !important +} + +.pl-4,.px-4 { + padding-left: 1.5rem !important +} + +.p-5 { + padding: 3rem !important +} + +.pt-5,.py-5 { + padding-top: 3rem !important +} + +.pr-5,.px-5 { + padding-right: 3rem !important +} + +.pb-5,.py-5 { + padding-bottom: 3rem !important +} + +.pl-5,.px-5 { + padding-left: 3rem !important +} + +.m-auto { + margin: auto !important +} + +.mt-auto,.my-auto { + margin-top: auto !important +} + +.mr-auto,.mx-auto { + margin-right: auto !important +} + +.mb-auto,.my-auto { + margin-bottom: auto !important +} + +.ml-auto,.mx-auto { + margin-left: auto !important +} + +@media (min-width: 576px) { + .m-sm-0 { + margin:0 !important + } + + .mt-sm-0,.my-sm-0 { + margin-top: 0 !important + } + + .mr-sm-0,.mx-sm-0 { + margin-right: 0 !important + } + + .mb-sm-0,.my-sm-0 { + margin-bottom: 0 !important + } + + .ml-sm-0,.mx-sm-0 { + margin-left: 0 !important + } + + .m-sm-1 { + margin: 0.25rem !important + } + + .mt-sm-1,.my-sm-1 { + margin-top: 0.25rem !important + } + + .mr-sm-1,.mx-sm-1 { + margin-right: 0.25rem !important + } + + .mb-sm-1,.my-sm-1 { + margin-bottom: 0.25rem !important + } + + .ml-sm-1,.mx-sm-1 { + margin-left: 0.25rem !important + } + + .m-sm-2 { + margin: 0.5rem !important + } + + .mt-sm-2,.my-sm-2 { + margin-top: 0.5rem !important + } + + .mr-sm-2,.mx-sm-2 { + margin-right: 0.5rem !important + } + + .mb-sm-2,.my-sm-2 { + margin-bottom: 0.5rem !important + } + + .ml-sm-2,.mx-sm-2 { + margin-left: 0.5rem !important + } + + .m-sm-3 { + margin: 1rem !important + } + + .mt-sm-3,.my-sm-3 { + margin-top: 1rem !important + } + + .mr-sm-3,.mx-sm-3 { + margin-right: 1rem !important + } + + .mb-sm-3,.my-sm-3 { + margin-bottom: 1rem !important + } + + .ml-sm-3,.mx-sm-3 { + margin-left: 1rem !important + } + + .m-sm-4 { + margin: 1.5rem !important + } + + .mt-sm-4,.my-sm-4 { + margin-top: 1.5rem !important + } + + .mr-sm-4,.mx-sm-4 { + margin-right: 1.5rem !important + } + + .mb-sm-4,.my-sm-4 { + margin-bottom: 1.5rem !important + } + + .ml-sm-4,.mx-sm-4 { + margin-left: 1.5rem !important + } + + .m-sm-5 { + margin: 3rem !important + } + + .mt-sm-5,.my-sm-5 { + margin-top: 3rem !important + } + + .mr-sm-5,.mx-sm-5 { + margin-right: 3rem !important + } + + .mb-sm-5,.my-sm-5 { + margin-bottom: 3rem !important + } + + .ml-sm-5,.mx-sm-5 { + margin-left: 3rem !important + } + + .p-sm-0 { + padding: 0 !important + } + + .pt-sm-0,.py-sm-0 { + padding-top: 0 !important + } + + .pr-sm-0,.px-sm-0 { + padding-right: 0 !important + } + + .pb-sm-0,.py-sm-0 { + padding-bottom: 0 !important + } + + .pl-sm-0,.px-sm-0 { + padding-left: 0 !important + } + + .p-sm-1 { + padding: 0.25rem !important + } + + .pt-sm-1,.py-sm-1 { + padding-top: 0.25rem !important + } + + .pr-sm-1,.px-sm-1 { + padding-right: 0.25rem !important + } + + .pb-sm-1,.py-sm-1 { + padding-bottom: 0.25rem !important + } + + .pl-sm-1,.px-sm-1 { + padding-left: 0.25rem !important + } + + .p-sm-2 { + padding: 0.5rem !important + } + + .pt-sm-2,.py-sm-2 { + padding-top: 0.5rem !important + } + + .pr-sm-2,.px-sm-2 { + padding-right: 0.5rem !important + } + + .pb-sm-2,.py-sm-2 { + padding-bottom: 0.5rem !important + } + + .pl-sm-2,.px-sm-2 { + padding-left: 0.5rem !important + } + + .p-sm-3 { + padding: 1rem !important + } + + .pt-sm-3,.py-sm-3 { + padding-top: 1rem !important + } + + .pr-sm-3,.px-sm-3 { + padding-right: 1rem !important + } + + .pb-sm-3,.py-sm-3 { + padding-bottom: 1rem !important + } + + .pl-sm-3,.px-sm-3 { + padding-left: 1rem !important + } + + .p-sm-4 { + padding: 1.5rem !important + } + + .pt-sm-4,.py-sm-4 { + padding-top: 1.5rem !important + } + + .pr-sm-4,.px-sm-4 { + padding-right: 1.5rem !important + } + + .pb-sm-4,.py-sm-4 { + padding-bottom: 1.5rem !important + } + + .pl-sm-4,.px-sm-4 { + padding-left: 1.5rem !important + } + + .p-sm-5 { + padding: 3rem !important + } + + .pt-sm-5,.py-sm-5 { + padding-top: 3rem !important + } + + .pr-sm-5,.px-sm-5 { + padding-right: 3rem !important + } + + .pb-sm-5,.py-sm-5 { + padding-bottom: 3rem !important + } + + .pl-sm-5,.px-sm-5 { + padding-left: 3rem !important + } + + .m-sm-auto { + margin: auto !important + } + + .mt-sm-auto,.my-sm-auto { + margin-top: auto !important + } + + .mr-sm-auto,.mx-sm-auto { + margin-right: auto !important + } + + .mb-sm-auto,.my-sm-auto { + margin-bottom: auto !important + } + + .ml-sm-auto,.mx-sm-auto { + margin-left: auto !important + } +} + +@media (min-width: 768px) { + .m-md-0 { + margin:0 !important + } + + .mt-md-0,.my-md-0 { + margin-top: 0 !important + } + + .mr-md-0,.mx-md-0 { + margin-right: 0 !important + } + + .mb-md-0,.my-md-0 { + margin-bottom: 0 !important + } + + .ml-md-0,.mx-md-0 { + margin-left: 0 !important + } + + .m-md-1 { + margin: 0.25rem !important + } + + .mt-md-1,.my-md-1 { + margin-top: 0.25rem !important + } + + .mr-md-1,.mx-md-1 { + margin-right: 0.25rem !important + } + + .mb-md-1,.my-md-1 { + margin-bottom: 0.25rem !important + } + + .ml-md-1,.mx-md-1 { + margin-left: 0.25rem !important + } + + .m-md-2 { + margin: 0.5rem !important + } + + .mt-md-2,.my-md-2 { + margin-top: 0.5rem !important + } + + .mr-md-2,.mx-md-2 { + margin-right: 0.5rem !important + } + + .mb-md-2,.my-md-2 { + margin-bottom: 0.5rem !important + } + + .ml-md-2,.mx-md-2 { + margin-left: 0.5rem !important + } + + .m-md-3 { + margin: 1rem !important + } + + .mt-md-3,.my-md-3 { + margin-top: 1rem !important + } + + .mr-md-3,.mx-md-3 { + margin-right: 1rem !important + } + + .mb-md-3,.my-md-3 { + margin-bottom: 1rem !important + } + + .ml-md-3,.mx-md-3 { + margin-left: 1rem !important + } + + .m-md-4 { + margin: 1.5rem !important + } + + .mt-md-4,.my-md-4 { + margin-top: 1.5rem !important + } + + .mr-md-4,.mx-md-4 { + margin-right: 1.5rem !important + } + + .mb-md-4,.my-md-4 { + margin-bottom: 1.5rem !important + } + + .ml-md-4,.mx-md-4 { + margin-left: 1.5rem !important + } + + .m-md-5 { + margin: 3rem !important + } + + .mt-md-5,.my-md-5 { + margin-top: 3rem !important + } + + .mr-md-5,.mx-md-5 { + margin-right: 3rem !important + } + + .mb-md-5,.my-md-5 { + margin-bottom: 3rem !important + } + + .ml-md-5,.mx-md-5 { + margin-left: 3rem !important + } + + .p-md-0 { + padding: 0 !important + } + + .pt-md-0,.py-md-0 { + padding-top: 0 !important + } + + .pr-md-0,.px-md-0 { + padding-right: 0 !important + } + + .pb-md-0,.py-md-0 { + padding-bottom: 0 !important + } + + .pl-md-0,.px-md-0 { + padding-left: 0 !important + } + + .p-md-1 { + padding: 0.25rem !important + } + + .pt-md-1,.py-md-1 { + padding-top: 0.25rem !important + } + + .pr-md-1,.px-md-1 { + padding-right: 0.25rem !important + } + + .pb-md-1,.py-md-1 { + padding-bottom: 0.25rem !important + } + + .pl-md-1,.px-md-1 { + padding-left: 0.25rem !important + } + + .p-md-2 { + padding: 0.5rem !important + } + + .pt-md-2,.py-md-2 { + padding-top: 0.5rem !important + } + + .pr-md-2,.px-md-2 { + padding-right: 0.5rem !important + } + + .pb-md-2,.py-md-2 { + padding-bottom: 0.5rem !important + } + + .pl-md-2,.px-md-2 { + padding-left: 0.5rem !important + } + + .p-md-3 { + padding: 1rem !important + } + + .pt-md-3,.py-md-3 { + padding-top: 1rem !important + } + + .pr-md-3,.px-md-3 { + padding-right: 1rem !important + } + + .pb-md-3,.py-md-3 { + padding-bottom: 1rem !important + } + + .pl-md-3,.px-md-3 { + padding-left: 1rem !important + } + + .p-md-4 { + padding: 1.5rem !important + } + + .pt-md-4,.py-md-4 { + padding-top: 1.5rem !important + } + + .pr-md-4,.px-md-4 { + padding-right: 1.5rem !important + } + + .pb-md-4,.py-md-4 { + padding-bottom: 1.5rem !important + } + + .pl-md-4,.px-md-4 { + padding-left: 1.5rem !important + } + + .p-md-5 { + padding: 3rem !important + } + + .pt-md-5,.py-md-5 { + padding-top: 3rem !important + } + + .pr-md-5,.px-md-5 { + padding-right: 3rem !important + } + + .pb-md-5,.py-md-5 { + padding-bottom: 3rem !important + } + + .pl-md-5,.px-md-5 { + padding-left: 3rem !important + } + + .m-md-auto { + margin: auto !important + } + + .mt-md-auto,.my-md-auto { + margin-top: auto !important + } + + .mr-md-auto,.mx-md-auto { + margin-right: auto !important + } + + .mb-md-auto,.my-md-auto { + margin-bottom: auto !important + } + + .ml-md-auto,.mx-md-auto { + margin-left: auto !important + } +} + +@media (min-width: 992px) { + .m-lg-0 { + margin:0 !important + } + + .mt-lg-0,.my-lg-0 { + margin-top: 0 !important + } + + .mr-lg-0,.mx-lg-0 { + margin-right: 0 !important + } + + .mb-lg-0,.my-lg-0 { + margin-bottom: 0 !important + } + + .ml-lg-0,.mx-lg-0 { + margin-left: 0 !important + } + + .m-lg-1 { + margin: 0.25rem !important + } + + .mt-lg-1,.my-lg-1 { + margin-top: 0.25rem !important + } + + .mr-lg-1,.mx-lg-1 { + margin-right: 0.25rem !important + } + + .mb-lg-1,.my-lg-1 { + margin-bottom: 0.25rem !important + } + + .ml-lg-1,.mx-lg-1 { + margin-left: 0.25rem !important + } + + .m-lg-2 { + margin: 0.5rem !important + } + + .mt-lg-2,.my-lg-2 { + margin-top: 0.5rem !important + } + + .mr-lg-2,.mx-lg-2 { + margin-right: 0.5rem !important + } + + .mb-lg-2,.my-lg-2 { + margin-bottom: 0.5rem !important + } + + .ml-lg-2,.mx-lg-2 { + margin-left: 0.5rem !important + } + + .m-lg-3 { + margin: 1rem !important + } + + .mt-lg-3,.my-lg-3 { + margin-top: 1rem !important + } + + .mr-lg-3,.mx-lg-3 { + margin-right: 1rem !important + } + + .mb-lg-3,.my-lg-3 { + margin-bottom: 1rem !important + } + + .ml-lg-3,.mx-lg-3 { + margin-left: 1rem !important + } + + .m-lg-4 { + margin: 1.5rem !important + } + + .mt-lg-4,.my-lg-4 { + margin-top: 1.5rem !important + } + + .mr-lg-4,.mx-lg-4 { + margin-right: 1.5rem !important + } + + .mb-lg-4,.my-lg-4 { + margin-bottom: 1.5rem !important + } + + .ml-lg-4,.mx-lg-4 { + margin-left: 1.5rem !important + } + + .m-lg-5 { + margin: 3rem !important + } + + .mt-lg-5,.my-lg-5 { + margin-top: 3rem !important + } + + .mr-lg-5,.mx-lg-5 { + margin-right: 3rem !important + } + + .mb-lg-5,.my-lg-5 { + margin-bottom: 3rem !important + } + + .ml-lg-5,.mx-lg-5 { + margin-left: 3rem !important + } + + .p-lg-0 { + padding: 0 !important + } + + .pt-lg-0,.py-lg-0 { + padding-top: 0 !important + } + + .pr-lg-0,.px-lg-0 { + padding-right: 0 !important + } + + .pb-lg-0,.py-lg-0 { + padding-bottom: 0 !important + } + + .pl-lg-0,.px-lg-0 { + padding-left: 0 !important + } + + .p-lg-1 { + padding: 0.25rem !important + } + + .pt-lg-1,.py-lg-1 { + padding-top: 0.25rem !important + } + + .pr-lg-1,.px-lg-1 { + padding-right: 0.25rem !important + } + + .pb-lg-1,.py-lg-1 { + padding-bottom: 0.25rem !important + } + + .pl-lg-1,.px-lg-1 { + padding-left: 0.25rem !important + } + + .p-lg-2 { + padding: 0.5rem !important + } + + .pt-lg-2,.py-lg-2 { + padding-top: 0.5rem !important + } + + .pr-lg-2,.px-lg-2 { + padding-right: 0.5rem !important + } + + .pb-lg-2,.py-lg-2 { + padding-bottom: 0.5rem !important + } + + .pl-lg-2,.px-lg-2 { + padding-left: 0.5rem !important + } + + .p-lg-3 { + padding: 1rem !important + } + + .pt-lg-3,.py-lg-3 { + padding-top: 1rem !important + } + + .pr-lg-3,.px-lg-3 { + padding-right: 1rem !important + } + + .pb-lg-3,.py-lg-3 { + padding-bottom: 1rem !important + } + + .pl-lg-3,.px-lg-3 { + padding-left: 1rem !important + } + + .p-lg-4 { + padding: 1.5rem !important + } + + .pt-lg-4,.py-lg-4 { + padding-top: 1.5rem !important + } + + .pr-lg-4,.px-lg-4 { + padding-right: 1.5rem !important + } + + .pb-lg-4,.py-lg-4 { + padding-bottom: 1.5rem !important + } + + .pl-lg-4,.px-lg-4 { + padding-left: 1.5rem !important + } + + .p-lg-5 { + padding: 3rem !important + } + + .pt-lg-5,.py-lg-5 { + padding-top: 3rem !important + } + + .pr-lg-5,.px-lg-5 { + padding-right: 3rem !important + } + + .pb-lg-5,.py-lg-5 { + padding-bottom: 3rem !important + } + + .pl-lg-5,.px-lg-5 { + padding-left: 3rem !important + } + + .m-lg-auto { + margin: auto !important + } + + .mt-lg-auto,.my-lg-auto { + margin-top: auto !important + } + + .mr-lg-auto,.mx-lg-auto { + margin-right: auto !important + } + + .mb-lg-auto,.my-lg-auto { + margin-bottom: auto !important + } + + .ml-lg-auto,.mx-lg-auto { + margin-left: auto !important + } +} + +@media (min-width: 1200px) { + .m-xl-0 { + margin:0 !important + } + + .mt-xl-0,.my-xl-0 { + margin-top: 0 !important + } + + .mr-xl-0,.mx-xl-0 { + margin-right: 0 !important + } + + .mb-xl-0,.my-xl-0 { + margin-bottom: 0 !important + } + + .ml-xl-0,.mx-xl-0 { + margin-left: 0 !important + } + + .m-xl-1 { + margin: 0.25rem !important + } + + .mt-xl-1,.my-xl-1 { + margin-top: 0.25rem !important + } + + .mr-xl-1,.mx-xl-1 { + margin-right: 0.25rem !important + } + + .mb-xl-1,.my-xl-1 { + margin-bottom: 0.25rem !important + } + + .ml-xl-1,.mx-xl-1 { + margin-left: 0.25rem !important + } + + .m-xl-2 { + margin: 0.5rem !important + } + + .mt-xl-2,.my-xl-2 { + margin-top: 0.5rem !important + } + + .mr-xl-2,.mx-xl-2 { + margin-right: 0.5rem !important + } + + .mb-xl-2,.my-xl-2 { + margin-bottom: 0.5rem !important + } + + .ml-xl-2,.mx-xl-2 { + margin-left: 0.5rem !important + } + + .m-xl-3 { + margin: 1rem !important + } + + .mt-xl-3,.my-xl-3 { + margin-top: 1rem !important + } + + .mr-xl-3,.mx-xl-3 { + margin-right: 1rem !important + } + + .mb-xl-3,.my-xl-3 { + margin-bottom: 1rem !important + } + + .ml-xl-3,.mx-xl-3 { + margin-left: 1rem !important + } + + .m-xl-4 { + margin: 1.5rem !important + } + + .mt-xl-4,.my-xl-4 { + margin-top: 1.5rem !important + } + + .mr-xl-4,.mx-xl-4 { + margin-right: 1.5rem !important + } + + .mb-xl-4,.my-xl-4 { + margin-bottom: 1.5rem !important + } + + .ml-xl-4,.mx-xl-4 { + margin-left: 1.5rem !important + } + + .m-xl-5 { + margin: 3rem !important + } + + .mt-xl-5,.my-xl-5 { + margin-top: 3rem !important + } + + .mr-xl-5,.mx-xl-5 { + margin-right: 3rem !important + } + + .mb-xl-5,.my-xl-5 { + margin-bottom: 3rem !important + } + + .ml-xl-5,.mx-xl-5 { + margin-left: 3rem !important + } + + .p-xl-0 { + padding: 0 !important + } + + .pt-xl-0,.py-xl-0 { + padding-top: 0 !important + } + + .pr-xl-0,.px-xl-0 { + padding-right: 0 !important + } + + .pb-xl-0,.py-xl-0 { + padding-bottom: 0 !important + } + + .pl-xl-0,.px-xl-0 { + padding-left: 0 !important + } + + .p-xl-1 { + padding: 0.25rem !important + } + + .pt-xl-1,.py-xl-1 { + padding-top: 0.25rem !important + } + + .pr-xl-1,.px-xl-1 { + padding-right: 0.25rem !important + } + + .pb-xl-1,.py-xl-1 { + padding-bottom: 0.25rem !important + } + + .pl-xl-1,.px-xl-1 { + padding-left: 0.25rem !important + } + + .p-xl-2 { + padding: 0.5rem !important + } + + .pt-xl-2,.py-xl-2 { + padding-top: 0.5rem !important + } + + .pr-xl-2,.px-xl-2 { + padding-right: 0.5rem !important + } + + .pb-xl-2,.py-xl-2 { + padding-bottom: 0.5rem !important + } + + .pl-xl-2,.px-xl-2 { + padding-left: 0.5rem !important + } + + .p-xl-3 { + padding: 1rem !important + } + + .pt-xl-3,.py-xl-3 { + padding-top: 1rem !important + } + + .pr-xl-3,.px-xl-3 { + padding-right: 1rem !important + } + + .pb-xl-3,.py-xl-3 { + padding-bottom: 1rem !important + } + + .pl-xl-3,.px-xl-3 { + padding-left: 1rem !important + } + + .p-xl-4 { + padding: 1.5rem !important + } + + .pt-xl-4,.py-xl-4 { + padding-top: 1.5rem !important + } + + .pr-xl-4,.px-xl-4 { + padding-right: 1.5rem !important + } + + .pb-xl-4,.py-xl-4 { + padding-bottom: 1.5rem !important + } + + .pl-xl-4,.px-xl-4 { + padding-left: 1.5rem !important + } + + .p-xl-5 { + padding: 3rem !important + } + + .pt-xl-5,.py-xl-5 { + padding-top: 3rem !important + } + + .pr-xl-5,.px-xl-5 { + padding-right: 3rem !important + } + + .pb-xl-5,.py-xl-5 { + padding-bottom: 3rem !important + } + + .pl-xl-5,.px-xl-5 { + padding-left: 3rem !important + } + + .m-xl-auto { + margin: auto !important + } + + .mt-xl-auto,.my-xl-auto { + margin-top: auto !important + } + + .mr-xl-auto,.mx-xl-auto { + margin-right: auto !important + } + + .mb-xl-auto,.my-xl-auto { + margin-bottom: auto !important + } + + .ml-xl-auto,.mx-xl-auto { + margin-left: auto !important + } +} + +.text-monospace { + font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace +} + +.text-justify { + text-align: justify !important +} + +.text-nowrap { + white-space: nowrap !important +} + +.text-truncate { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap +} + +.text-left { + text-align: left !important +} + +.text-right { + text-align: right !important +} + +.text-center { + text-align: center !important +} + +@media (min-width: 576px) { + .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-light { + font-weight: 300 !important +} + +.font-weight-normal { + font-weight: 400 !important +} + +.font-weight-bold { + font-weight: 700 !important +} + +.font-italic { + font-style: italic !important +} + +.text-white { + color: #fff !important +} + +.text-primary { + color: #007bff !important +} + +a.text-primary:hover,a.text-primary:focus { + color: #0062cc !important +} + +.text-secondary { + color: #6c757d !important +} + +a.text-secondary:hover,a.text-secondary:focus { + color: #545b62 !important +} + +.text-success { + color: #28a745 !important +} + +a.text-success:hover,a.text-success:focus { + color: #1e7e34 !important +} + +.text-info { + color: #17a2b8 !important +} + +a.text-info:hover,a.text-info:focus { + color: #117a8b !important +} + +.text-warning { + color: #ffc107 !important +} + +a.text-warning:hover,a.text-warning:focus { + color: #d39e00 !important +} + +.text-danger { + color: #dc3545 !important +} + +a.text-danger:hover,a.text-danger:focus { + color: #bd2130 !important +} + +.text-light { + color: #f8f9fa !important +} + +a.text-light:hover,a.text-light:focus { + color: #dae0e5 !important +} + +.text-dark { + color: #343a40 !important +} + +a.text-dark:hover,a.text-dark:focus { + color: #1d2124 !important +} + +.text-body { + color: #212529 !important +} + +.text-muted { + color: #6c757d !important +} + +.text-black-50 { + color: rgba(0,0,0,0.5) !important +} + +.text-white-50 { + color: rgba(255,255,255,0.5) !important +} + +.text-hide { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0 +} + +.visible { + visibility: visible !important +} + +.invisible { + visibility: hidden !important +} + +@media print { + *,*::before,*::after { + text-shadow: none !important; + box-shadow: none !important + } + + a:not(.btn) { + text-decoration: underline + } + + abbr[title]::after { + content: " (" attr(title) ")" + } + + pre { + white-space: pre-wrap !important + } + + pre,blockquote { + border: 1px solid #adb5bd; + 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 + } + + @page { + size: a3 + } + + body { + min-width: 992px !important + } + + .container { + min-width: 992px !important + } + + .navbar { + display: none + } + + .badge { + 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 #dee2e6 !important + } + + .table-dark { + color: inherit + } + + .table-dark th,.table-dark td,.table-dark thead th,.table-dark tbody+tbody { + border-color: #dee2e6 + } + + .table .thead-dark th { + color: inherit; + border-color: #dee2e6 + } +} + +.user-votes__container { + margin-top: 2rem +} + +.user-votes__header { + color: black +} + +.works-votes__container { + margin-top: 2rem +} + +.works-votes__header { + color: black +} + +body,h1,h2,h3,h4,h5 { + font-family: "Gudea", sans-serif +} + +h1,h2,h3,h4,h5 { + font-weight: bold +} + +a,h2,h3 { + color: #26A69A +} + +a:hover { + color: #00796B; + text-decoration: none +} + +.alert { + margin: 0 +} + +.btn-primary { + background-color: #26A69A; + color: white; + border-color: #26A69A +} + +.btn:hover { + background-color: #00796B; + color: white +} + +.table td { + vertical-align: middle +} + +.app-header__nav { + display: flex; + flex-direction: row; + justify-content: space-between +} + +.app-header__nav_item { + margin-top: 1rem +} + +.app-header__nav_item .nav-link { + color: #00796B +} + +.app-header__site-nav-container .app-header__nav_item { + margin-right: 2rem +} + +.app-header__user-nav-container .nav-item { + margin-left: 2rem +} + +.list-group-item { + border: none +} + +.app-header__header { + max-width: 100%; + background-color: #B2DFDB; + margin-bottom: 0.5rem; + padding: 2rem 1rem 0.5rem 1rem +} + +.app-header__header h1 { + text-align: center; + margin: 25px auto 40px auto +} + +.app-header__header h1 a { + color: #FF5722; + padding-right: 25px; + margin-right: 15px; + border-right: white 2px solid +} + +.app-header__header h1 small { + color: white +} + +.app-header__header p { + margin-bottom: 5px +} + +.alert__container { + margin: 2rem 0 1rem 0 +} + +.spotlight { + padding: 0 2rem 2rem 2rem +} + +.spotlight__header { + color: #26A69A +} + +.spotlight__header--prefix { + color: #424242 +} + +.spotlight__header--prefix::after { + content: ":" +} + +.spotlight__link-to { + border-bottom: 2px solid +} + +.spotlight__description { + margin-bottom: 0 +} + +.root__hr { + margin: 0px auto 3rem auto; + color: #EEEEEE +} + +.top-ten__container { + display: grid; + grid-template-columns: 1fr 1fr 1fr; + grid-column-gap: 2em +} + +.top-ten__header { + color: #26A69A; + border-bottom: 2px solid; + border-bottom-color: #B2DFDB +} + +.top-ten__list { + list-style-type: none; + margin-left: 0; + padding-left: 0 +} + +.top-ten__creator { + color: slategrey +} + +main { + padding: 2rem +} diff --git a/app/assets/stylesheets/homepages.scss b/app/assets/stylesheets/homepages.scss new file mode 100644 index 0000000000..b9cdcd4fa4 --- /dev/null +++ b/app/assets/stylesheets/homepages.scss @@ -0,0 +1,4 @@ +// Place all the styles related to the Homepages controller here. +// They will automatically be included in application.css. +// You can use Sass (SCSS) here: https://sass-lang.com/ + diff --git a/app/assets/stylesheets/users.scss b/app/assets/stylesheets/users.scss new file mode 100644 index 0000000000..efc25261dd --- /dev/null +++ b/app/assets/stylesheets/users.scss @@ -0,0 +1,3 @@ +// Place all the styles related to the Users controller here. +// They will automatically be included in application.css. +// You can use Sass (SCSS) here: https://sass-lang.com/ diff --git a/app/assets/stylesheets/votes.scss b/app/assets/stylesheets/votes.scss new file mode 100644 index 0000000000..774d1e22b5 --- /dev/null +++ b/app/assets/stylesheets/votes.scss @@ -0,0 +1,3 @@ +// Place all the styles related to the Votes controller here. +// They will automatically be included in application.css. +// You can use Sass (SCSS) here: https://sass-lang.com/ diff --git a/app/assets/stylesheets/works.scss b/app/assets/stylesheets/works.scss new file mode 100644 index 0000000000..70b984da4a --- /dev/null +++ b/app/assets/stylesheets/works.scss @@ -0,0 +1,3 @@ +// Place all the styles related to the Works controller here. +// They will automatically be included in application.css. +// You can use Sass (SCSS) here: https://sass-lang.com/ diff --git a/app/channels/application_cable/channel.rb b/app/channels/application_cable/channel.rb new file mode 100644 index 0000000000..d672697283 --- /dev/null +++ b/app/channels/application_cable/channel.rb @@ -0,0 +1,4 @@ +module ApplicationCable + class Channel < ActionCable::Channel::Base + end +end diff --git a/app/channels/application_cable/connection.rb b/app/channels/application_cable/connection.rb new file mode 100644 index 0000000000..0ff5442f47 --- /dev/null +++ b/app/channels/application_cable/connection.rb @@ -0,0 +1,4 @@ +module ApplicationCable + class Connection < ActionCable::Connection::Base + end +end diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb new file mode 100644 index 0000000000..eb218db5de --- /dev/null +++ b/app/controllers/application_controller.rb @@ -0,0 +1,14 @@ +class ApplicationController < ActionController::Base + def current_user + if session[:user_id] + return User.find_by(id: session[:user_id]) + end + end + + def require_login + if current_user.nil? + flash[:error] = "Please log in to vote." + redirect_to login_path + end + end +end diff --git a/app/controllers/concerns/.keep b/app/controllers/concerns/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/app/controllers/homepages_controller.rb b/app/controllers/homepages_controller.rb new file mode 100644 index 0000000000..632028758c --- /dev/null +++ b/app/controllers/homepages_controller.rb @@ -0,0 +1,9 @@ +class HomepagesController < ApplicationController + def index + @works = Work.all.order(title: :asc) + @albums = Work.where(category: "album") + @books = Work.where(category: "book") + @movies = Work.where(category: "movie") + end + +end diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb new file mode 100644 index 0000000000..9c1fdce56e --- /dev/null +++ b/app/controllers/users_controller.rb @@ -0,0 +1,88 @@ +class UsersController < ApplicationController + before_action :require_login, only: [:logout] + def index + @users = User.all + end + + def show + user_id = params[:id] + @user = User.find_by(id: user_id) + if @user.nil? + redirect_to root_path + end + end + + def new + @user = User.new + end + + def create + @user = User.new(user_params) + if @user.save + redirect_to users_path(@user.id) + flash[:success] = "Welcome!" + return + else + flash.now[:error] = "Uh Oh. Please try again." + render :new, status: :bad_request + return + end + end + + def login_form + @user = User.new + end + + def login + user = User.find_by(username: params[:user][:username]) + + if user.nil? + # new user + user = User.new(username: params[:user][:username]) + if ! user.save + flash[:error] = "Unable to login" + redirect_to root_path + return + end + flash[:welcome] = "Welcome #{user.username}" + else + # existing user + flash[:welcome] = "Welcome back #{user.username}" + end + + session[:user_id] = user.id + redirect_to root_path + end + + def current + @user = User.find_by(id: session[:user_id]) + if @user.nil? + flash[:error] = "Please log in" + redirect_to root_path + return + end + end + + def logout + if session[:user_id] + user = User.find_by(id:session[:user_id]) + unless user.nil? + session[:user_id] = nil + flash[:notice] = "Goodbye #{user.username}" + else + session[:user_id] = nil + flash[:notice] = "Error Unknown User" + end + else + flash[:error] = "You must be logged in to log out" + end + redirect_to root_path + flash[:success] = "You have logged out!" + end + + private + + def user_params + return params.require(:user).permit(:user_name, :join_date) + end +end diff --git a/app/controllers/votes_controller.rb b/app/controllers/votes_controller.rb new file mode 100644 index 0000000000..68e4443aab --- /dev/null +++ b/app/controllers/votes_controller.rb @@ -0,0 +1,19 @@ +class VotesController < ApplicationController + before_action :require_login, only: [:create] + + def new + @vote = Vote.new + end + + def create + @vote = Vote.create(work_id: params[:id],user_id: session[:user_id]) + + if session[:user_id] && @vote.valid? + flash[:success] = "You have VOTED!" + redirect_to root_path + else + flash[:error] = "Only one vote per media, sorry!" + redirect_to root_path + end + end +end diff --git a/app/controllers/works_controller.rb b/app/controllers/works_controller.rb new file mode 100644 index 0000000000..353baef768 --- /dev/null +++ b/app/controllers/works_controller.rb @@ -0,0 +1,82 @@ +class WorksController < ApplicationController + + before_action :find_work, except: [:index, :new, :create] + + def index + @works = Work.all.order(title: :asc) + @albums = Work.where(category: "album") + @books = Work.where(category: "book") + @movies = Work.where(category: "movie") + end + + def show + if @work.nil? + redirect_to works_path + end + end + + def new + @work = Work.new + end + + def create + @work = Work.new(work_params) + + if @work.nil? # form will not allow user to save, but for some reason is not getting flash + flash[:error] = "Uh Oh! Could not create new work." + render :new, status: :bad_request + + else @work.save + flash[:success] = "#{@work.title} was successfully added!" + redirect_to work_path(@work.id) + return + end + end + + def edit + if @work.nil? + redirect_to root_path + flash[:error] = "Uh Oh! We couldn't find #{@work.title}" + return + end + end + + def update + if @work.nil? + redirect_to work_path + flash[:error] = "Uh Oh! We couldn't find #{@work.title}" + return + elsif @work.update(work_params) + flash[:success] = "Updated: #{@work.category}: #{@work.title}" + redirect_to work_path(@work.id) + return + else + flash.now[:error] = "Uh Oh! We couldn't update #{@work.title}" + render :edit + return + end + end + + def delete + if @work.nil? + redirect_to works_path + flash[:error] = "Uh Oh! We couldn't find #{@work.title}" + else + @work.delete + redirect_to works_path + flash[:success] = "POOF! You have deleted: #{@work.category}: #{@work.title}" + return + end + end +end + +private + +def find_work + @work = Work.find_by(id: params[:id]) +end + +def work_params + params.require(:work).permit(:category, :title, :creator, :publication_year, :description) +end + diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb new file mode 100644 index 0000000000..de6be7945c --- /dev/null +++ b/app/helpers/application_helper.rb @@ -0,0 +1,2 @@ +module ApplicationHelper +end diff --git a/app/helpers/homepages_helper.rb b/app/helpers/homepages_helper.rb new file mode 100644 index 0000000000..4bd8098f37 --- /dev/null +++ b/app/helpers/homepages_helper.rb @@ -0,0 +1,2 @@ +module HomepagesHelper +end diff --git a/app/helpers/users_helper.rb b/app/helpers/users_helper.rb new file mode 100644 index 0000000000..2310a240d7 --- /dev/null +++ b/app/helpers/users_helper.rb @@ -0,0 +1,2 @@ +module UsersHelper +end diff --git a/app/helpers/votes_helper.rb b/app/helpers/votes_helper.rb new file mode 100644 index 0000000000..5a82eed07d --- /dev/null +++ b/app/helpers/votes_helper.rb @@ -0,0 +1,2 @@ +module VotesHelper +end diff --git a/app/helpers/works_helper.rb b/app/helpers/works_helper.rb new file mode 100644 index 0000000000..ccb78c2b73 --- /dev/null +++ b/app/helpers/works_helper.rb @@ -0,0 +1,2 @@ +module WorksHelper +end diff --git a/app/javascript/channels/consumer.js b/app/javascript/channels/consumer.js new file mode 100644 index 0000000000..0eceb59b18 --- /dev/null +++ b/app/javascript/channels/consumer.js @@ -0,0 +1,6 @@ +// Action Cable provides the framework to deal with WebSockets in Rails. +// You can generate new channels where WebSocket features live using the `rails generate channel` command. + +import { createConsumer } from "@rails/actioncable" + +export default createConsumer() diff --git a/app/javascript/channels/index.js b/app/javascript/channels/index.js new file mode 100644 index 0000000000..0cfcf74919 --- /dev/null +++ b/app/javascript/channels/index.js @@ -0,0 +1,5 @@ +// Load all the channels within this directory and all subdirectories. +// Channel files must be named *_channel.js. + +const channels = require.context('.', true, /_channel\.js$/) +channels.keys().forEach(channels) diff --git a/app/javascript/packs/application.js b/app/javascript/packs/application.js new file mode 100644 index 0000000000..9cd55d4b9f --- /dev/null +++ b/app/javascript/packs/application.js @@ -0,0 +1,17 @@ +// This file is automatically compiled by Webpack, along with any other files +// present in this directory. You're encouraged to place your actual application logic in +// a relevant structure within app/javascript and only use these pack files to reference +// that code so it'll be compiled. + +require("@rails/ujs").start() +require("turbolinks").start() +require("@rails/activestorage").start() +require("channels") + + +// Uncomment to copy all static images under ../images to the output folder and reference +// them with the image_pack_tag helper in views (e.g <%= image_pack_tag 'rails.png' %>) +// or the `imagePath` JavaScript helper below. +// +// const images = require.context('../images', true) +// const imagePath = (name) => images(name, true) diff --git a/app/jobs/application_job.rb b/app/jobs/application_job.rb new file mode 100644 index 0000000000..d394c3d106 --- /dev/null +++ b/app/jobs/application_job.rb @@ -0,0 +1,7 @@ +class ApplicationJob < ActiveJob::Base + # Automatically retry jobs that encountered a deadlock + # retry_on ActiveRecord::Deadlocked + + # Most jobs are safe to ignore if the underlying records are no longer available + # discard_on ActiveJob::DeserializationError +end diff --git a/app/mailers/application_mailer.rb b/app/mailers/application_mailer.rb new file mode 100644 index 0000000000..286b2239d1 --- /dev/null +++ b/app/mailers/application_mailer.rb @@ -0,0 +1,4 @@ +class ApplicationMailer < ActionMailer::Base + default from: 'from@example.com' + layout 'mailer' +end diff --git a/app/models/application_record.rb b/app/models/application_record.rb new file mode 100644 index 0000000000..10a4cba84d --- /dev/null +++ b/app/models/application_record.rb @@ -0,0 +1,3 @@ +class ApplicationRecord < ActiveRecord::Base + self.abstract_class = true +end diff --git a/app/models/concerns/.keep b/app/models/concerns/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/app/models/user.rb b/app/models/user.rb new file mode 100644 index 0000000000..379658a509 --- /dev/null +++ b/app/models/user.rb @@ -0,0 +1,2 @@ +class User < ApplicationRecord +end diff --git a/app/models/vote.rb b/app/models/vote.rb new file mode 100644 index 0000000000..7e516a3d7d --- /dev/null +++ b/app/models/vote.rb @@ -0,0 +1,6 @@ +class Vote < ApplicationRecord + belongs_to :work + belongs_to :user + + validates :work_id, uniqueness: {scope: :user_id} +end diff --git a/app/models/work.rb b/app/models/work.rb new file mode 100644 index 0000000000..962b646df7 --- /dev/null +++ b/app/models/work.rb @@ -0,0 +1,22 @@ + +class Work < ApplicationRecord + + validates :title, presence: true, uniqueness: true + validates :category, presence: true + validates :creator, presence: true + + has_many :votes + + + + def self.spotlight + @works = Work.all + + max_votes = @works.max_by { |work| work.votes.count} + return max_votes + end + + def self.top_ten(works) + return works.sample(10) + end +end \ No newline at end of file diff --git a/app/views/homepages/index.html.erb b/app/views/homepages/index.html.erb new file mode 100644 index 0000000000..c09603c086 --- /dev/null +++ b/app/views/homepages/index.html.erb @@ -0,0 +1,69 @@ +
+ +
+

+ Media Spotlight + <% spotlight_work = Work.spotlight %> + <%= link_to spotlight_work.title, work_path(spotlight_work.id), class: "spotlight__link-to" %> + by <%= spotlight_work.creator %> +

+

+ <%= spotlight_work.description %> +

+
+ +
+
+
+

+ Top Albums +

+
    + <% @albums.each do |work| %> +
  • +

    + <%= link_to work.title, work_path(work.id) %> + by <%= work.creator %> +

    +

    <%= work.votes.count %>

    +
  • + <% end %> +
+
+ +
+

+ Top Books +

+
    + <% @books.each do |work| %> +
  • +

    + <%= link_to work.title, work_path(work.id) %> + by <%= work.creator %> +

    +

    <%= work.votes.count %>

    +
  • + <% end %> +
+
+ +
+

+ Top Movies +

+
    + <% @movies.each do |work| %> +
  • +

    + <%= link_to work.title, work_path(work.id) %> + by <%= work.creator %> +

    +

    <%= work.votes.count %>

    +
  • + <% end %> +
+
+ +
+
\ No newline at end of file diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb new file mode 100644 index 0000000000..3f53457c43 --- /dev/null +++ b/app/views/layouts/application.html.erb @@ -0,0 +1,58 @@ + + + + MediaRanker + <%= csrf_meta_tags %> + <%= csp_meta_tag %> + + <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %> + <%= javascript_pack_tag 'application', 'data-turbolinks-track': 'reload' %> + + + +
+

+ <%= link_to "Media Ranker", root_path %> + Ranking the Best of Everything +

+ + + + +
+ <% flash.each do |name, message| %> +
<%= message %>
+ <% end %> +
+
+
+ <%= yield %> +
+ + + diff --git a/app/views/layouts/mailer.html.erb b/app/views/layouts/mailer.html.erb new file mode 100644 index 0000000000..cbd34d2e9d --- /dev/null +++ b/app/views/layouts/mailer.html.erb @@ -0,0 +1,13 @@ + + + + + + + + + <%= yield %> + + diff --git a/app/views/layouts/mailer.text.erb b/app/views/layouts/mailer.text.erb new file mode 100644 index 0000000000..37f0bddbd7 --- /dev/null +++ b/app/views/layouts/mailer.text.erb @@ -0,0 +1 @@ +<%= yield %> diff --git a/app/views/users/current.html.erb b/app/views/users/current.html.erb new file mode 100644 index 0000000000..427c0f389e --- /dev/null +++ b/app/views/users/current.html.erb @@ -0,0 +1 @@ +

Current user is <%= @user.username %>

\ No newline at end of file diff --git a/app/views/users/index.html.erb b/app/views/users/index.html.erb new file mode 100644 index 0000000000..aa13aeedf1 --- /dev/null +++ b/app/views/users/index.html.erb @@ -0,0 +1,24 @@ +
+

All Users:

+ + + + + + + + + + + <% @users.each do |user| %> + + + + + + <% end %> + +
UsernameVotesDate Joined
<%= link_to user.username, users_path(user.id) %> <%= user.created_at.strftime("%b %d, %Y") %>
+ + <%= link_to 'Back to Media List', root_path, class: "btn btn-secondary" %> +
\ No newline at end of file diff --git a/app/views/users/login.html.erb b/app/views/users/login.html.erb new file mode 100644 index 0000000000..34d15e61aa --- /dev/null +++ b/app/views/users/login.html.erb @@ -0,0 +1,2 @@ +

Users#login

+

Find me in app/views/users/login.html.erb

diff --git a/app/views/users/login_form.html.erb b/app/views/users/login_form.html.erb new file mode 100644 index 0000000000..80c9ce4259 --- /dev/null +++ b/app/views/users/login_form.html.erb @@ -0,0 +1,8 @@ + +<%= form_with model: @user, class: 'login__form', url: login_path do |f| %> +
+ <%= f.label :username %> + <%= f.text_field :username %> +
+ <%= f.submit "Login", class: "btn btn-primary" %> +<% end %> \ No newline at end of file diff --git a/app/views/users/show.html.erb b/app/views/users/show.html.erb new file mode 100644 index 0000000000..6bb58fb2f7 --- /dev/null +++ b/app/views/users/show.html.erb @@ -0,0 +1 @@ +

show user details her

\ No newline at end of file diff --git a/app/views/users/user_form.html.erb b/app/views/users/user_form.html.erb new file mode 100644 index 0000000000..e69de29bb2 diff --git a/app/views/works/_form.html.erb b/app/views/works/_form.html.erb new file mode 100644 index 0000000000..4da9fbc252 --- /dev/null +++ b/app/views/works/_form.html.erb @@ -0,0 +1,45 @@ +
+ + <%= form_with model: @work, class: 'create-work' do |f| %> + + <% if @work.errors.any? %> + + <% end %> + +
+ <%= f.label :category %> + <%= f.select :category, %W[album book movie] %> +
+ +
+ <%= f.label :title %> + <%= f.text_area :title, class: "form-control" %> +
+ +
+ <%= f.label :creator %> + <%= f.text_area :creator, class: "form-control" %> +
+ +
+ <%= f.label :publication_year %> + <%= f.text_area :publication_year, class: "form-control" %> +
+ +
+ <%= f.label :description %> + <%= f.text_area :description, class: "form-control" %> +
+
+
+ <%= f.submit action_name, class: "btn btn-primary" %> +
+ <% end %> + +
\ No newline at end of file diff --git a/app/views/works/edit.html.erb b/app/views/works/edit.html.erb new file mode 100644 index 0000000000..218f026a59 --- /dev/null +++ b/app/views/works/edit.html.erb @@ -0,0 +1,2 @@ +

Edit <%= @work.category %>

+<%= render partial: "form", locals: { action_name: "Update Work" } %> \ No newline at end of file diff --git a/app/views/works/index.html.erb b/app/views/works/index.html.erb new file mode 100644 index 0000000000..e0385b469e --- /dev/null +++ b/app/views/works/index.html.erb @@ -0,0 +1,70 @@ + +
+

All Works

+
+

ALBUMS

+ + + + + + + + + <% @albums.each do |work| %> + + + + + + + + <% end %> +
VotesTitleCreated ByPublishedUpvote
<%= work.votes.count %><%= link_to work.title, work_path(work.id) %><%= work.creator %><%= work.publication_year %><%= link_to "VOTE", work_path(work.id), class: "btn btn-primary"%>
+
+ +
+

BOOKS

+ + + + + + + + + <% @books.each do |work| %> + + + + + + + + <% end %> +
VotesTitleCreated ByPublishedUpvote
<%= work.votes.count %><%= link_to work.title, work_path(work.id) %><%= work.creator %><%= work.publication_year %><%= link_to "VOTE", work_path(work.id), class: "btn btn-primary"%>
+
+ +
+

MOVIES

+ + + + + + + + + <% @movies.each do |work| %> + + + + + + + + <% end %> +
VotesTitleCreated ByPublishedUpvote
<%= work.votes.count %><%= link_to work.title, work_path(work.id) %><%= work.creator %><%= work.publication_year %><%= link_to "VOTE", work_path(work.id), class: "btn btn-primary"%>
+
+ +
\ No newline at end of file diff --git a/app/views/works/new.html.erb b/app/views/works/new.html.erb new file mode 100644 index 0000000000..58cd62007f --- /dev/null +++ b/app/views/works/new.html.erb @@ -0,0 +1,4 @@ +
+

Add a New Work

+ <%= render partial: "form", locals: {action_name: "Create Work" } %> +
\ No newline at end of file diff --git a/app/views/works/show.html.erb b/app/views/works/show.html.erb new file mode 100644 index 0000000000..f4b0162104 --- /dev/null +++ b/app/views/works/show.html.erb @@ -0,0 +1,21 @@ +
+
+

<%= @work.title %>

+

+ Created by: <%= @work.creator%> +

+

+ Published: <%= @work.publication_year%> +

+

+ <%= @work.description%> +

+
+ +
+ <%= link_to "MAIN", works_path, method: :get, class: "btn btn-primary"%> + <%= link_to "EDIT", edit_work_path, method: :get, class: "btn btn-primary"%> + <%= link_to "DELETE", delete_work_path, method: :delete, class: "btn btn-danger", data: {confirm: "Are you sure?"}%> + <%= link_to "UPVOTE", vote_path(@work.id), method: :post, class: "btn btn-warning", data: {confirm: "Are you sure you want to vote for this title?"}%> +
+
\ No newline at end of file diff --git a/babel.config.js b/babel.config.js new file mode 100644 index 0000000000..12f98da5af --- /dev/null +++ b/babel.config.js @@ -0,0 +1,72 @@ +module.exports = function(api) { + var validEnv = ['development', 'test', 'production'] + var currentEnv = api.env() + var isDevelopmentEnv = api.env('development') + var isProductionEnv = api.env('production') + var isTestEnv = api.env('test') + + if (!validEnv.includes(currentEnv)) { + throw new Error( + 'Please specify a valid `NODE_ENV` or ' + + '`BABEL_ENV` environment variables. Valid values are "development", ' + + '"test", and "production". Instead, received: ' + + JSON.stringify(currentEnv) + + '.' + ) + } + + return { + presets: [ + isTestEnv && [ + '@babel/preset-env', + { + targets: { + node: 'current' + } + } + ], + (isProductionEnv || isDevelopmentEnv) && [ + '@babel/preset-env', + { + forceAllTransforms: true, + useBuiltIns: 'entry', + corejs: 3, + modules: false, + exclude: ['transform-typeof-symbol'] + } + ] + ].filter(Boolean), + plugins: [ + 'babel-plugin-macros', + '@babel/plugin-syntax-dynamic-import', + isTestEnv && 'babel-plugin-dynamic-import-node', + '@babel/plugin-transform-destructuring', + [ + '@babel/plugin-proposal-class-properties', + { + loose: true + } + ], + [ + '@babel/plugin-proposal-object-rest-spread', + { + useBuiltIns: true + } + ], + [ + '@babel/plugin-transform-runtime', + { + helpers: false, + regenerator: true, + corejs: false + } + ], + [ + '@babel/plugin-transform-regenerator', + { + async: false + } + ] + ].filter(Boolean) + } +} diff --git a/bin/rails b/bin/rails new file mode 100755 index 0000000000..0739660237 --- /dev/null +++ b/bin/rails @@ -0,0 +1,4 @@ +#!/usr/bin/env ruby +APP_PATH = File.expand_path('../config/application', __dir__) +require_relative '../config/boot' +require 'rails/commands' diff --git a/bin/rake b/bin/rake new file mode 100755 index 0000000000..17240489f6 --- /dev/null +++ b/bin/rake @@ -0,0 +1,4 @@ +#!/usr/bin/env ruby +require_relative '../config/boot' +require 'rake' +Rake.application.run diff --git a/bin/setup b/bin/setup new file mode 100755 index 0000000000..5853b5ea87 --- /dev/null +++ b/bin/setup @@ -0,0 +1,36 @@ +#!/usr/bin/env ruby +require 'fileutils' + +# path to your application root. +APP_ROOT = File.expand_path('..', __dir__) + +def system!(*args) + system(*args) || abort("\n== Command #{args} failed ==") +end + +FileUtils.chdir APP_ROOT do + # This script is a way to setup or update your development environment automatically. + # This script is idempotent, so that you can run it at anytime and get an expectable outcome. + # Add necessary setup steps to this file. + + puts '== Installing dependencies ==' + system! 'gem install bundler --conservative' + system('bundle check') || system!('bundle install') + + # Install JavaScript dependencies + # system('bin/yarn') + + # puts "\n== Copying sample files ==" + # unless File.exist?('config/database.yml') + # FileUtils.cp 'config/database.yml.sample', 'config/database.yml' + # end + + puts "\n== Preparing database ==" + system! 'bin/rails db:prepare' + + puts "\n== Removing old logs and tempfiles ==" + system! 'bin/rails log:clear tmp:clear' + + puts "\n== Restarting application server ==" + system! 'bin/rails restart' +end diff --git a/bin/webpack b/bin/webpack new file mode 100755 index 0000000000..1031168d01 --- /dev/null +++ b/bin/webpack @@ -0,0 +1,18 @@ +#!/usr/bin/env ruby + +ENV["RAILS_ENV"] ||= ENV["RACK_ENV"] || "development" +ENV["NODE_ENV"] ||= "development" + +require "pathname" +ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile", + Pathname.new(__FILE__).realpath) + +require "bundler/setup" + +require "webpacker" +require "webpacker/webpack_runner" + +APP_ROOT = File.expand_path("..", __dir__) +Dir.chdir(APP_ROOT) do + Webpacker::WebpackRunner.run(ARGV) +end diff --git a/bin/webpack-dev-server b/bin/webpack-dev-server new file mode 100755 index 0000000000..dd9662737a --- /dev/null +++ b/bin/webpack-dev-server @@ -0,0 +1,18 @@ +#!/usr/bin/env ruby + +ENV["RAILS_ENV"] ||= ENV["RACK_ENV"] || "development" +ENV["NODE_ENV"] ||= "development" + +require "pathname" +ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile", + Pathname.new(__FILE__).realpath) + +require "bundler/setup" + +require "webpacker" +require "webpacker/dev_server_runner" + +APP_ROOT = File.expand_path("..", __dir__) +Dir.chdir(APP_ROOT) do + Webpacker::DevServerRunner.run(ARGV) +end diff --git a/bin/yarn b/bin/yarn new file mode 100755 index 0000000000..460dd565b4 --- /dev/null +++ b/bin/yarn @@ -0,0 +1,11 @@ +#!/usr/bin/env ruby +APP_ROOT = File.expand_path('..', __dir__) +Dir.chdir(APP_ROOT) do + begin + exec "yarnpkg", *ARGV + rescue Errno::ENOENT + $stderr.puts "Yarn executable was not detected in the system." + $stderr.puts "Download Yarn at https://yarnpkg.com/en/docs/install" + exit 1 + end +end diff --git a/config.ru b/config.ru new file mode 100644 index 0000000000..f7ba0b527b --- /dev/null +++ b/config.ru @@ -0,0 +1,5 @@ +# This file is used by Rack-based servers to start the application. + +require_relative 'config/environment' + +run Rails.application diff --git a/config/application.rb b/config/application.rb new file mode 100644 index 0000000000..8f4f8cac72 --- /dev/null +++ b/config/application.rb @@ -0,0 +1,19 @@ +require_relative 'boot' + +require 'rails/all' + +# Require the gems listed in Gemfile, including any gems +# you've limited to :test, :development, or :production. +Bundler.require(*Rails.groups) + +module MediaRanker + class Application < Rails::Application + # Initialize configuration defaults for originally generated Rails version. + config.load_defaults 6.0 + + # Settings in config/environments/* take precedence over those specified here. + # Application configuration can go into files in config/initializers + # -- all .rb files in that directory are automatically loaded after loading + # the framework and any gems in your application. + end +end diff --git a/config/boot.rb b/config/boot.rb new file mode 100644 index 0000000000..b9e460cef3 --- /dev/null +++ b/config/boot.rb @@ -0,0 +1,4 @@ +ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../Gemfile', __dir__) + +require 'bundler/setup' # Set up gems listed in the Gemfile. +require 'bootsnap/setup' # Speed up boot time by caching expensive operations. diff --git a/config/cable.yml b/config/cable.yml new file mode 100644 index 0000000000..67cc194424 --- /dev/null +++ b/config/cable.yml @@ -0,0 +1,10 @@ +development: + adapter: async + +test: + adapter: test + +production: + adapter: redis + url: <%= ENV.fetch("REDIS_URL") { "redis://localhost:6379/1" } %> + channel_prefix: media_ranker_production diff --git a/config/credentials.yml.enc b/config/credentials.yml.enc new file mode 100644 index 0000000000..e55538ccfd --- /dev/null +++ b/config/credentials.yml.enc @@ -0,0 +1 @@ +IMR+w/Ydkx4q3X/geT4+bAURBRm0wIWTMjKkAtZqUjiByQFKjanKciHLtKaIeH7yhjJoOPqn16IncVk0idJ/6JQjwIECUsvvM1e+0xC9c90IrrFh5Zi9Ck992WoGhqpZzS9kjqk5ZFr8HJkVi/woyncg5hp6A7iQDbbWA7Oin7PGEeRAYuAnkjxPc/R8bXjFRM6NRDjwZmF5ayBdWSX+j3IYNuVm02n766BBatpmPC87EvaSgnaniyKFLrSBQqxjOcBAumHaljIuyRy8nXy0AP4G+pHJt7lmS3mTsjA1yazMyfIG9SlLaak/1FDZ9z8vYM0YgT9uGYIsvqJVBVl/PxQ3Q/Qcx6WiWRNKzrbKZkEg4biQMOum2/MCu43BqV44Rh7g/CDauTrJ+bE3sX/kf2iWQGfdheRbfiGZ--VUzOTcVtjqzr2EFo--pMP2eMUTp3EKif1HE4vF+Q== \ No newline at end of file diff --git a/config/database.yml b/config/database.yml new file mode 100644 index 0000000000..3e129befad --- /dev/null +++ b/config/database.yml @@ -0,0 +1,85 @@ +# PostgreSQL. Versions 9.3 and up are supported. +# +# Install the pg driver: +# gem install pg +# On macOS with Homebrew: +# gem install pg -- --with-pg-config=/usr/local/bin/pg_config +# On macOS with MacPorts: +# gem install pg -- --with-pg-config=/opt/local/lib/postgresql84/bin/pg_config +# On Windows: +# gem install pg +# Choose the win32 build. +# Install PostgreSQL and put its /bin directory on your path. +# +# Configure Using Gemfile +# gem 'pg' +# +default: &default + adapter: postgresql + encoding: unicode + # For details on connection pooling, see Rails configuration guide + # https://guides.rubyonrails.org/configuring.html#database-pooling + pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> + +development: + <<: *default + database: media_ranker_development + + # The specified database role being used to connect to postgres. + # To create additional roles in postgres see `$ createuser --help`. + # When left blank, postgres will use the default role. This is + # the same name as the operating system user that initialized the database. + #username: media_ranker + + # The password associated with the postgres role (username). + #password: + + # Connect on a TCP socket. Omitted by default since the client uses a + # domain socket that doesn't need configuration. Windows does not have + # domain sockets, so uncomment these lines. + #host: localhost + + # The TCP port the server listens on. Defaults to 5432. + # If your server runs on a different port number, change accordingly. + #port: 5432 + + # Schema search path. The server defaults to $user,public + #schema_search_path: myapp,sharedapp,public + + # Minimum log levels, in increasing order: + # debug5, debug4, debug3, debug2, debug1, + # log, notice, warning, error, fatal, and panic + # Defaults to warning. + #min_messages: notice + +# Warning: The database defined as "test" will be erased and +# re-generated from your development database when you run "rake". +# Do not set this db to the same as development or production. +test: + <<: *default + database: media_ranker_test + +# As with config/credentials.yml, you never want to store sensitive information, +# like your database password, in your source code. If your source code is +# ever seen by anyone, they now have access to your database. +# +# Instead, provide the password as a unix environment variable when you boot +# the app. Read https://guides.rubyonrails.org/configuring.html#configuring-a-database +# for a full rundown on how to provide these environment variables in a +# production deployment. +# +# On Heroku and other platform providers, you may have a full connection URL +# available as an environment variable. For example: +# +# DATABASE_URL="postgres://myuser:mypass@localhost/somedatabase" +# +# You can use this database configuration with: +# +# production: +# url: <%= ENV['DATABASE_URL'] %> +# +production: + <<: *default + database: media_ranker_production + username: media_ranker + password: <%= ENV['MEDIA_RANKER_DATABASE_PASSWORD'] %> diff --git a/config/environment.rb b/config/environment.rb new file mode 100644 index 0000000000..426333bb46 --- /dev/null +++ b/config/environment.rb @@ -0,0 +1,5 @@ +# Load the Rails application. +require_relative 'application' + +# Initialize the Rails application. +Rails.application.initialize! diff --git a/config/environments/development.rb b/config/environments/development.rb new file mode 100644 index 0000000000..66df51f6fc --- /dev/null +++ b/config/environments/development.rb @@ -0,0 +1,62 @@ +Rails.application.configure do + # Settings specified here will take precedence over those in config/application.rb. + + # In the development environment your application's code is reloaded on + # every request. This slows down response time but is perfect for development + # since you don't have to restart the web server when you make code changes. + config.cache_classes = false + + # Do not eager load code on boot. + config.eager_load = false + + # Show full error reports. + config.consider_all_requests_local = true + + # Enable/disable caching. By default caching is disabled. + # Run rails dev:cache to toggle caching. + if Rails.root.join('tmp', 'caching-dev.txt').exist? + config.action_controller.perform_caching = true + config.action_controller.enable_fragment_cache_logging = true + + config.cache_store = :memory_store + config.public_file_server.headers = { + 'Cache-Control' => "public, max-age=#{2.days.to_i}" + } + else + config.action_controller.perform_caching = false + + config.cache_store = :null_store + end + + # Store uploaded files on the local file system (see config/storage.yml for options). + config.active_storage.service = :local + + # Don't care if the mailer can't send. + config.action_mailer.raise_delivery_errors = false + + config.action_mailer.perform_caching = false + + # Print deprecation notices to the Rails logger. + config.active_support.deprecation = :log + + # Raise an error on page load if there are pending migrations. + config.active_record.migration_error = :page_load + + # Highlight code that triggered database queries in logs. + config.active_record.verbose_query_logs = true + + # Debug mode disables concatenation and preprocessing of assets. + # This option may cause significant delays in view rendering with a large + # number of complex assets. + config.assets.debug = true + + # Suppress logger output for asset requests. + config.assets.quiet = true + + # Raises error for missing translations. + # config.action_view.raise_on_missing_translations = true + + # Use an evented file watcher to asynchronously detect changes in source code, + # routes, locales, etc. This feature depends on the listen gem. + config.file_watcher = ActiveSupport::EventedFileUpdateChecker +end diff --git a/config/environments/production.rb b/config/environments/production.rb new file mode 100644 index 0000000000..ba2eb34eb6 --- /dev/null +++ b/config/environments/production.rb @@ -0,0 +1,112 @@ +Rails.application.configure do + # Settings specified here will take precedence over those in config/application.rb. + + # Code is not reloaded between requests. + config.cache_classes = true + + # Eager load code on boot. This eager loads most of Rails and + # your application in memory, allowing both threaded web servers + # and those relying on copy on write to perform better. + # Rake tasks automatically ignore this option for performance. + config.eager_load = true + + # Full error reports are disabled and caching is turned on. + config.consider_all_requests_local = false + config.action_controller.perform_caching = true + + # Ensures that a master key has been made available in either ENV["RAILS_MASTER_KEY"] + # or in config/master.key. This key is used to decrypt credentials (and other encrypted files). + # config.require_master_key = true + + # Disable serving static files from the `/public` folder by default since + # Apache or NGINX already handles this. + config.public_file_server.enabled = ENV['RAILS_SERVE_STATIC_FILES'].present? + + # Compress CSS using a preprocessor. + # config.assets.css_compressor = :sass + + # Do not fallback to assets pipeline if a precompiled asset is missed. + config.assets.compile = false + + # Enable serving of images, stylesheets, and JavaScripts from an asset server. + # config.action_controller.asset_host = 'http://assets.example.com' + + # Specifies the header that your server uses for sending files. + # config.action_dispatch.x_sendfile_header = 'X-Sendfile' # for Apache + # config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' # for NGINX + + # Store uploaded files on the local file system (see config/storage.yml for options). + config.active_storage.service = :local + + # Mount Action Cable outside main process or domain. + # config.action_cable.mount_path = nil + # config.action_cable.url = 'wss://example.com/cable' + # config.action_cable.allowed_request_origins = [ 'http://example.com', /http:\/\/example.*/ ] + + # Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies. + # config.force_ssl = true + + # Use the lowest log level to ensure availability of diagnostic information + # when problems arise. + config.log_level = :debug + + # Prepend all log lines with the following tags. + config.log_tags = [ :request_id ] + + # Use a different cache store in production. + # config.cache_store = :mem_cache_store + + # Use a real queuing backend for Active Job (and separate queues per environment). + # config.active_job.queue_adapter = :resque + # config.active_job.queue_name_prefix = "media_ranker_production" + + config.action_mailer.perform_caching = false + + # Ignore bad email addresses and do not raise email delivery errors. + # Set this to true and configure the email server for immediate delivery to raise delivery errors. + # config.action_mailer.raise_delivery_errors = false + + # Enable locale fallbacks for I18n (makes lookups for any locale fall back to + # the I18n.default_locale when a translation cannot be found). + config.i18n.fallbacks = true + + # Send deprecation notices to registered listeners. + config.active_support.deprecation = :notify + + # Use default logging formatter so that PID and timestamp are not suppressed. + config.log_formatter = ::Logger::Formatter.new + + # Use a different logger for distributed setups. + # require 'syslog/logger' + # config.logger = ActiveSupport::TaggedLogging.new(Syslog::Logger.new 'app-name') + + if ENV["RAILS_LOG_TO_STDOUT"].present? + logger = ActiveSupport::Logger.new(STDOUT) + logger.formatter = config.log_formatter + config.logger = ActiveSupport::TaggedLogging.new(logger) + end + + # Do not dump schema after migrations. + config.active_record.dump_schema_after_migration = false + + # Inserts middleware to perform automatic connection switching. + # The `database_selector` hash is used to pass options to the DatabaseSelector + # middleware. The `delay` is used to determine how long to wait after a write + # to send a subsequent read to the primary. + # + # The `database_resolver` class is used by the middleware to determine which + # database is appropriate to use based on the time delay. + # + # The `database_resolver_context` class is used by the middleware to set + # timestamps for the last write to the primary. The resolver uses the context + # class timestamps to determine how long to wait before reading from the + # replica. + # + # By default Rails will store a last write timestamp in the session. The + # DatabaseSelector middleware is designed as such you can define your own + # strategy for connection switching and pass that into the middleware through + # these configuration options. + # config.active_record.database_selector = { delay: 2.seconds } + # config.active_record.database_resolver = ActiveRecord::Middleware::DatabaseSelector::Resolver + # config.active_record.database_resolver_context = ActiveRecord::Middleware::DatabaseSelector::Resolver::Session +end diff --git a/config/environments/test.rb b/config/environments/test.rb new file mode 100644 index 0000000000..0cb24249b5 --- /dev/null +++ b/config/environments/test.rb @@ -0,0 +1,49 @@ +# The test environment is used exclusively to run your application's +# test suite. You never need to work with it otherwise. Remember that +# your test database is "scratch space" for the test suite and is wiped +# and recreated between test runs. Don't rely on the data there! + +Rails.application.configure do + # Settings specified here will take precedence over those in config/application.rb. + + config.cache_classes = false + config.action_view.cache_template_loading = true + + # Do not eager load code on boot. This avoids loading your whole application + # just for the purpose of running a single test. If you are using a tool that + # preloads Rails for running tests, you may have to set it to true. + config.eager_load = false + + # Configure public file server for tests with Cache-Control for performance. + config.public_file_server.enabled = true + config.public_file_server.headers = { + 'Cache-Control' => "public, max-age=#{1.hour.to_i}" + } + + # Show full error reports and disable caching. + config.consider_all_requests_local = true + config.action_controller.perform_caching = false + config.cache_store = :null_store + + # Raise exceptions instead of rendering exception templates. + config.action_dispatch.show_exceptions = false + + # Disable request forgery protection in test environment. + config.action_controller.allow_forgery_protection = false + + # Store uploaded files on the local file system in a temporary directory. + config.active_storage.service = :test + + config.action_mailer.perform_caching = false + + # Tell Action Mailer not to deliver emails to the real world. + # The :test delivery method accumulates sent emails in the + # ActionMailer::Base.deliveries array. + config.action_mailer.delivery_method = :test + + # Print deprecation notices to the stderr. + config.active_support.deprecation = :stderr + + # Raises error for missing translations. + # config.action_view.raise_on_missing_translations = true +end diff --git a/config/initializers/application_controller_renderer.rb b/config/initializers/application_controller_renderer.rb new file mode 100644 index 0000000000..89d2efab2b --- /dev/null +++ b/config/initializers/application_controller_renderer.rb @@ -0,0 +1,8 @@ +# Be sure to restart your server when you modify this file. + +# ActiveSupport::Reloader.to_prepare do +# ApplicationController.renderer.defaults.merge!( +# http_host: 'example.org', +# https: false +# ) +# end diff --git a/config/initializers/assets.rb b/config/initializers/assets.rb new file mode 100644 index 0000000000..4b828e80cb --- /dev/null +++ b/config/initializers/assets.rb @@ -0,0 +1,14 @@ +# Be sure to restart your server when you modify this file. + +# Version of your assets, change this if you want to expire all your assets. +Rails.application.config.assets.version = '1.0' + +# Add additional assets to the asset load path. +# Rails.application.config.assets.paths << Emoji.images_path +# Add Yarn node_modules folder to the asset load path. +Rails.application.config.assets.paths << Rails.root.join('node_modules') + +# Precompile additional assets. +# application.js, application.css, and all non-JS/CSS in the app/assets +# folder are already added. +# Rails.application.config.assets.precompile += %w( admin.js admin.css ) diff --git a/config/initializers/backtrace_silencers.rb b/config/initializers/backtrace_silencers.rb new file mode 100644 index 0000000000..59385cdf37 --- /dev/null +++ b/config/initializers/backtrace_silencers.rb @@ -0,0 +1,7 @@ +# Be sure to restart your server when you modify this file. + +# You can add backtrace silencers for libraries that you're using but don't wish to see in your backtraces. +# Rails.backtrace_cleaner.add_silencer { |line| line =~ /my_noisy_library/ } + +# You can also remove all the silencers if you're trying to debug a problem that might stem from framework code. +# Rails.backtrace_cleaner.remove_silencers! diff --git a/config/initializers/content_security_policy.rb b/config/initializers/content_security_policy.rb new file mode 100644 index 0000000000..35d0f26fcd --- /dev/null +++ b/config/initializers/content_security_policy.rb @@ -0,0 +1,30 @@ +# Be sure to restart your server when you modify this file. + +# Define an application-wide content security policy +# For further information see the following documentation +# https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy + +# Rails.application.config.content_security_policy do |policy| +# policy.default_src :self, :https +# policy.font_src :self, :https, :data +# policy.img_src :self, :https, :data +# policy.object_src :none +# policy.script_src :self, :https +# policy.style_src :self, :https +# # If you are using webpack-dev-server then specify webpack-dev-server host +# policy.connect_src :self, :https, "http://localhost:3035", "ws://localhost:3035" if Rails.env.development? + +# # Specify URI for violation reports +# # policy.report_uri "/csp-violation-report-endpoint" +# end + +# If you are using UJS then enable automatic nonce generation +# Rails.application.config.content_security_policy_nonce_generator = -> request { SecureRandom.base64(16) } + +# Set the nonce only to specific directives +# Rails.application.config.content_security_policy_nonce_directives = %w(script-src) + +# Report CSP violations to a specified URI +# For further information see the following documentation: +# https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy-Report-Only +# Rails.application.config.content_security_policy_report_only = true diff --git a/config/initializers/cookies_serializer.rb b/config/initializers/cookies_serializer.rb new file mode 100644 index 0000000000..5a6a32d371 --- /dev/null +++ b/config/initializers/cookies_serializer.rb @@ -0,0 +1,5 @@ +# Be sure to restart your server when you modify this file. + +# Specify a serializer for the signed and encrypted cookie jars. +# Valid options are :json, :marshal, and :hybrid. +Rails.application.config.action_dispatch.cookies_serializer = :json diff --git a/config/initializers/filter_parameter_logging.rb b/config/initializers/filter_parameter_logging.rb new file mode 100644 index 0000000000..4a994e1e7b --- /dev/null +++ b/config/initializers/filter_parameter_logging.rb @@ -0,0 +1,4 @@ +# Be sure to restart your server when you modify this file. + +# Configure sensitive parameters which will be filtered from the log file. +Rails.application.config.filter_parameters += [:password] diff --git a/config/initializers/inflections.rb b/config/initializers/inflections.rb new file mode 100644 index 0000000000..ac033bf9dc --- /dev/null +++ b/config/initializers/inflections.rb @@ -0,0 +1,16 @@ +# Be sure to restart your server when you modify this file. + +# Add new inflection rules using the following format. Inflections +# are locale specific, and you may define rules for as many different +# locales as you wish. All of these examples are active by default: +# ActiveSupport::Inflector.inflections(:en) do |inflect| +# inflect.plural /^(ox)$/i, '\1en' +# inflect.singular /^(ox)en/i, '\1' +# inflect.irregular 'person', 'people' +# inflect.uncountable %w( fish sheep ) +# end + +# These inflection rules are supported but not enabled by default: +# ActiveSupport::Inflector.inflections(:en) do |inflect| +# inflect.acronym 'RESTful' +# end diff --git a/config/initializers/mime_types.rb b/config/initializers/mime_types.rb new file mode 100644 index 0000000000..dc1899682b --- /dev/null +++ b/config/initializers/mime_types.rb @@ -0,0 +1,4 @@ +# Be sure to restart your server when you modify this file. + +# Add new mime types for use in respond_to blocks: +# Mime::Type.register "text/richtext", :rtf diff --git a/config/initializers/wrap_parameters.rb b/config/initializers/wrap_parameters.rb new file mode 100644 index 0000000000..bbfc3961bf --- /dev/null +++ b/config/initializers/wrap_parameters.rb @@ -0,0 +1,14 @@ +# Be sure to restart your server when you modify this file. + +# This file contains settings for ActionController::ParamsWrapper which +# is enabled by default. + +# Enable parameter wrapping for JSON. You can disable this by setting :format to an empty array. +ActiveSupport.on_load(:action_controller) do + wrap_parameters format: [:json] +end + +# To enable root element in JSON for ActiveRecord objects. +# ActiveSupport.on_load(:active_record) do +# self.include_root_in_json = true +# end diff --git a/config/locales/en.yml b/config/locales/en.yml new file mode 100644 index 0000000000..cf9b342d0a --- /dev/null +++ b/config/locales/en.yml @@ -0,0 +1,33 @@ +# Files in the config/locales directory are used for internationalization +# and are automatically loaded by Rails. If you want to use locales other +# than English, add the necessary files in this directory. +# +# To use the locales, use `I18n.t`: +# +# I18n.t 'hello' +# +# In views, this is aliased to just `t`: +# +# <%= t('hello') %> +# +# To use a different locale, set it with `I18n.locale`: +# +# I18n.locale = :es +# +# This would use the information in config/locales/es.yml. +# +# The following keys must be escaped otherwise they will not be retrieved by +# the default I18n backend: +# +# true, false, on, off, yes, no +# +# Instead, surround them with single quotes. +# +# en: +# 'true': 'foo' +# +# To learn more, please read the Rails Internationalization guide +# available at https://guides.rubyonrails.org/i18n.html. + +en: + hello: "Hello world" diff --git a/config/puma.rb b/config/puma.rb new file mode 100644 index 0000000000..5ed4437744 --- /dev/null +++ b/config/puma.rb @@ -0,0 +1,38 @@ +# Puma can serve each request in a thread from an internal thread pool. +# The `threads` method setting takes two numbers: a minimum and maximum. +# Any libraries that use thread pools should be configured to match +# the maximum value specified for Puma. Default is set to 5 threads for minimum +# and maximum; this matches the default thread size of Active Record. +# +max_threads_count = ENV.fetch("RAILS_MAX_THREADS") { 5 } +min_threads_count = ENV.fetch("RAILS_MIN_THREADS") { max_threads_count } +threads min_threads_count, max_threads_count + +# Specifies the `port` that Puma will listen on to receive requests; default is 3000. +# +port ENV.fetch("PORT") { 3000 } + +# Specifies the `environment` that Puma will run in. +# +environment ENV.fetch("RAILS_ENV") { "development" } + +# Specifies the `pidfile` that Puma will use. +pidfile ENV.fetch("PIDFILE") { "tmp/pids/server.pid" } + +# Specifies the number of `workers` to boot in clustered mode. +# Workers are forked web server processes. If using threads and workers together +# the concurrency of the application would be max `threads` * `workers`. +# Workers do not work on JRuby or Windows (both of which do not support +# processes). +# +# workers ENV.fetch("WEB_CONCURRENCY") { 2 } + +# Use the `preload_app!` method when specifying a `workers` number. +# This directive tells Puma to first boot the application and load code +# before forking the application. This takes advantage of Copy On Write +# process behavior so workers use less memory. +# +# preload_app! + +# Allow puma to be restarted by `rails restart` command. +plugin :tmp_restart diff --git a/config/routes.rb b/config/routes.rb new file mode 100644 index 0000000000..44a0a97dfd --- /dev/null +++ b/config/routes.rb @@ -0,0 +1,29 @@ +Rails.application.routes.draw do + get 'users/login_form' + get '/login', to: "users#login_form", as:'login' + post '/login', to: "users#login" + post '/logout', to: "users#logout", as: 'logout' + + get '/users/current', to: 'users#current', as: 'current_user' + + # Routes for all works + get '/homepages', to: 'homepages#index' + get '/works', to: 'works#index', as: 'works' + get 'works/new', to: 'works#new', as: 'new_work' + post '/works', to: 'works#create' + get '/users', to: 'users#index', as: 'users' + get 'users/new', to: 'users#new', as: 'new_user' + post '/users', to: 'users#create' + + + + # Routes for using a specific task page + get '/works/:id', to: 'works#show', as: 'work' + get '/works/:id/edit', to: 'works#edit', as: 'edit_work' + patch '/works/:id', to: 'works#update' + get '/works/:id/confirm_delete', to: 'works#confirm', as: 'confirm_work' + delete '/works/:id', to: 'works#delete', as: 'delete_work' + patch '/works/:id/complete', to: 'works#complete', as: 'complete_work' + post "/works/:id/vote", to: "votes#create", as: "vote" + root to: 'homepages#index' +end diff --git a/config/spring.rb b/config/spring.rb new file mode 100644 index 0000000000..db5bf1307a --- /dev/null +++ b/config/spring.rb @@ -0,0 +1,6 @@ +Spring.watch( + ".ruby-version", + ".rbenv-vars", + "tmp/restart.txt", + "tmp/caching-dev.txt" +) diff --git a/config/storage.yml b/config/storage.yml new file mode 100644 index 0000000000..d32f76e8fb --- /dev/null +++ b/config/storage.yml @@ -0,0 +1,34 @@ +test: + service: Disk + root: <%= Rails.root.join("tmp/storage") %> + +local: + service: Disk + root: <%= Rails.root.join("storage") %> + +# Use rails credentials:edit to set the AWS secrets (as aws:access_key_id|secret_access_key) +# amazon: +# service: S3 +# access_key_id: <%= Rails.application.credentials.dig(:aws, :access_key_id) %> +# secret_access_key: <%= Rails.application.credentials.dig(:aws, :secret_access_key) %> +# region: us-east-1 +# bucket: your_own_bucket + +# Remember not to checkin your GCS keyfile to a repository +# google: +# service: GCS +# project: your_project +# credentials: <%= Rails.root.join("path/to/gcs.keyfile") %> +# bucket: your_own_bucket + +# Use rails credentials:edit to set the Azure Storage secret (as azure_storage:storage_access_key) +# microsoft: +# service: AzureStorage +# storage_account_name: your_account_name +# storage_access_key: <%= Rails.application.credentials.dig(:azure_storage, :storage_access_key) %> +# container: your_container_name + +# mirror: +# service: Mirror +# primary: local +# mirrors: [ amazon, google, microsoft ] diff --git a/config/webpack/development.js b/config/webpack/development.js new file mode 100644 index 0000000000..c5edff94ad --- /dev/null +++ b/config/webpack/development.js @@ -0,0 +1,5 @@ +process.env.NODE_ENV = process.env.NODE_ENV || 'development' + +const environment = require('./environment') + +module.exports = environment.toWebpackConfig() diff --git a/config/webpack/environment.js b/config/webpack/environment.js new file mode 100644 index 0000000000..d16d9af743 --- /dev/null +++ b/config/webpack/environment.js @@ -0,0 +1,3 @@ +const { environment } = require('@rails/webpacker') + +module.exports = environment diff --git a/config/webpack/production.js b/config/webpack/production.js new file mode 100644 index 0000000000..be0f53aacf --- /dev/null +++ b/config/webpack/production.js @@ -0,0 +1,5 @@ +process.env.NODE_ENV = process.env.NODE_ENV || 'production' + +const environment = require('./environment') + +module.exports = environment.toWebpackConfig() diff --git a/config/webpack/test.js b/config/webpack/test.js new file mode 100644 index 0000000000..c5edff94ad --- /dev/null +++ b/config/webpack/test.js @@ -0,0 +1,5 @@ +process.env.NODE_ENV = process.env.NODE_ENV || 'development' + +const environment = require('./environment') + +module.exports = environment.toWebpackConfig() diff --git a/config/webpacker.yml b/config/webpacker.yml new file mode 100644 index 0000000000..8581ac0472 --- /dev/null +++ b/config/webpacker.yml @@ -0,0 +1,96 @@ +# Note: You must restart bin/webpack-dev-server for changes to take effect + +default: &default + source_path: app/javascript + source_entry_path: packs + public_root_path: public + public_output_path: packs + cache_path: tmp/cache/webpacker + check_yarn_integrity: false + webpack_compile_output: true + + # Additional paths webpack should lookup modules + # ['app/assets', 'engine/foo/app/assets'] + resolved_paths: [] + + # Reload manifest.json on all requests so we reload latest compiled packs + cache_manifest: false + + # Extract and emit a css file + extract_css: false + + static_assets_extensions: + - .jpg + - .jpeg + - .png + - .gif + - .tiff + - .ico + - .svg + - .eot + - .otf + - .ttf + - .woff + - .woff2 + + extensions: + - .mjs + - .js + - .sass + - .scss + - .css + - .module.sass + - .module.scss + - .module.css + - .png + - .svg + - .gif + - .jpeg + - .jpg + +development: + <<: *default + compile: true + + # Verifies that correct packages and versions are installed by inspecting package.json, yarn.lock, and node_modules + check_yarn_integrity: true + + # Reference: https://webpack.js.org/configuration/dev-server/ + dev_server: + https: false + host: localhost + port: 3035 + public: localhost:3035 + hmr: false + # Inline should be set to true if using HMR + inline: true + overlay: true + compress: true + disable_host_check: true + use_local_ip: false + quiet: false + pretty: false + headers: + 'Access-Control-Allow-Origin': '*' + watch_options: + ignored: '**/node_modules/**' + + +test: + <<: *default + compile: true + + # Compile test packs to a separate directory + public_output_path: packs-test + +production: + <<: *default + + # Production depends on precompilation of packs prior to booting for performance. + compile: false + + # Extract and emit a css file + extract_css: true + + # Cache manifest.json for performance + cache_manifest: true diff --git a/db/migrate/20201116060957_create_works.rb b/db/migrate/20201116060957_create_works.rb new file mode 100644 index 0000000000..9836180308 --- /dev/null +++ b/db/migrate/20201116060957_create_works.rb @@ -0,0 +1,13 @@ +class CreateWorks < ActiveRecord::Migration[6.0] + def change + create_table :works do |t| + t.string :category + t.string :title + t.string :creator + t.string :publication_year + t.string :description + + t.timestamps + end + end +end diff --git a/db/migrate/20201201033230_create_users.rb b/db/migrate/20201201033230_create_users.rb new file mode 100644 index 0000000000..95263d6ac6 --- /dev/null +++ b/db/migrate/20201201033230_create_users.rb @@ -0,0 +1,9 @@ +class CreateUsers < ActiveRecord::Migration[6.0] + def change + create_table :users do |t| + t.string :username + + t.timestamps + end + end +end diff --git a/db/migrate/20201201092830_create_votes.rb b/db/migrate/20201201092830_create_votes.rb new file mode 100644 index 0000000000..ee8bba9679 --- /dev/null +++ b/db/migrate/20201201092830_create_votes.rb @@ -0,0 +1,8 @@ +class CreateVotes < ActiveRecord::Migration[6.0] + def change + create_table :votes do |t| + + t.timestamps + end + end +end diff --git a/db/migrate/20201201095335_relate_votes_to_users.rb b/db/migrate/20201201095335_relate_votes_to_users.rb new file mode 100644 index 0000000000..49f317602c --- /dev/null +++ b/db/migrate/20201201095335_relate_votes_to_users.rb @@ -0,0 +1,5 @@ +class RelateVotesToUsers < ActiveRecord::Migration[6.0] + def change + add_reference :votes, :user, index: true + end +end diff --git a/db/migrate/20201201095350_relate_votes_to_works.rb b/db/migrate/20201201095350_relate_votes_to_works.rb new file mode 100644 index 0000000000..bc385be067 --- /dev/null +++ b/db/migrate/20201201095350_relate_votes_to_works.rb @@ -0,0 +1,5 @@ +class RelateVotesToWorks < ActiveRecord::Migration[6.0] + def change + add_reference :votes, :work, index: true + end +end diff --git a/db/schema.rb b/db/schema.rb new file mode 100644 index 0000000000..c53a3e553a --- /dev/null +++ b/db/schema.rb @@ -0,0 +1,43 @@ +# This file is auto-generated from the current state of the database. Instead +# of editing this file, please use the migrations feature of Active Record to +# incrementally modify your database, and then regenerate this schema definition. +# +# This file is the source Rails uses to define your schema when running `rails +# db:schema:load`. When creating a new database, `rails db:schema:load` tends to +# be faster and is potentially less error prone than running all of your +# migrations from scratch. Old migrations may fail to apply correctly if those +# migrations use external dependencies or application code. +# +# It's strongly recommended that you check this file into your version control system. + +ActiveRecord::Schema.define(version: 2020_12_01_095350) do + + # These are extensions that must be enabled in order to support this database + enable_extension "plpgsql" + + create_table "users", force: :cascade do |t| + t.string "username" + t.datetime "created_at", precision: 6, null: false + t.datetime "updated_at", precision: 6, null: false + end + + create_table "votes", force: :cascade do |t| + t.datetime "created_at", precision: 6, null: false + t.datetime "updated_at", precision: 6, null: false + t.bigint "user_id" + t.bigint "work_id" + t.index ["user_id"], name: "index_votes_on_user_id" + t.index ["work_id"], name: "index_votes_on_work_id" + end + + create_table "works", force: :cascade do |t| + t.string "category" + t.string "title" + t.string "creator" + t.string "publication_year" + t.string "description" + t.datetime "created_at", precision: 6, null: false + t.datetime "updated_at", precision: 6, null: false + end + +end diff --git a/db/seeds.rb b/db/seeds.rb new file mode 100644 index 0000000000..35f3784a0d --- /dev/null +++ b/db/seeds.rb @@ -0,0 +1,33 @@ +# This file should contain all the record creation needed to seed the database with its default values. +# The data can then be loaded with the rails db:seed command (or created alongside the database with db:setup). +# +# Examples: +# +# movies = Movie.create([{ name: 'Star Wars' }, { name: 'Lord of the Rings' }]) +# Character.create(name: 'Luke', movie: movies.first) + +require 'csv' + +WORK_FILE = Rails.root.join('db', 'works-seeds.csv') +puts "Loading raw work data from #{WORK_FILE}" + +work_failures = [] +CSV.foreach(WORK_FILE, :headers => true) do |row| + work = Work.new + work.category = row['category'] + work.title = row['title'] + work.creator = row['creator'] + work.publication_year = row['publication_year'] + work.description = row['description'] + + successful = work.save + if !successful + work_failures << work + puts "Failed to save work: #{work.inspect}" + else + puts "Created work: #{work.inspect}" + end +end + +puts "Added #{Work.count} work records" +puts "#{work_failures.length} works failed to save" diff --git a/lib/assets/.keep b/lib/assets/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/lib/tasks/.keep b/lib/tasks/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/log/.keep b/log/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/package.json b/package.json new file mode 100644 index 0000000000..60e843123e --- /dev/null +++ b/package.json @@ -0,0 +1,15 @@ +{ + "name": "media_ranker", + "private": true, + "dependencies": { + "@rails/actioncable": "^6.0.0", + "@rails/activestorage": "^6.0.0", + "@rails/ujs": "^6.0.0", + "@rails/webpacker": "4.3.0", + "turbolinks": "^5.2.0" + }, + "version": "0.1.0", + "devDependencies": { + "webpack-dev-server": "^3.11.0" + } +} diff --git a/postcss.config.js b/postcss.config.js new file mode 100644 index 0000000000..aa5998a809 --- /dev/null +++ b/postcss.config.js @@ -0,0 +1,12 @@ +module.exports = { + plugins: [ + require('postcss-import'), + require('postcss-flexbugs-fixes'), + require('postcss-preset-env')({ + autoprefixer: { + flexbox: 'no-2009' + }, + stage: 3 + }) + ] +} diff --git a/public/404.html b/public/404.html new file mode 100644 index 0000000000..2be3af26fc --- /dev/null +++ b/public/404.html @@ -0,0 +1,67 @@ + + + + The page you were looking for doesn't exist (404) + + + + + + +
+
+

The page you were looking for doesn't exist.

+

You may have mistyped the address or the page may have moved.

+
+

If you are the application owner check the logs for more information.

+
+ + diff --git a/public/422.html b/public/422.html new file mode 100644 index 0000000000..c08eac0d1d --- /dev/null +++ b/public/422.html @@ -0,0 +1,67 @@ + + + + The change you wanted was rejected (422) + + + + + + +
+
+

The change you wanted was rejected.

+

Maybe you tried to change something you didn't have access to.

+
+

If you are the application owner check the logs for more information.

+
+ + diff --git a/public/500.html b/public/500.html new file mode 100644 index 0000000000..78a030af22 --- /dev/null +++ b/public/500.html @@ -0,0 +1,66 @@ + + + + We're sorry, but something went wrong (500) + + + + + + +
+
+

We're sorry, but something went wrong.

+
+

If you are the application owner check the logs for more information.

+
+ + diff --git a/public/apple-touch-icon-precomposed.png b/public/apple-touch-icon-precomposed.png new file mode 100644 index 0000000000..e69de29bb2 diff --git a/public/apple-touch-icon.png b/public/apple-touch-icon.png new file mode 100644 index 0000000000..e69de29bb2 diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000000..e69de29bb2 diff --git a/public/robots.txt b/public/robots.txt new file mode 100644 index 0000000000..c19f78ab68 --- /dev/null +++ b/public/robots.txt @@ -0,0 +1 @@ +# See https://www.robotstxt.org/robotstxt.html for documentation on how to use the robots.txt file diff --git a/storage/.keep b/storage/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/test/application_system_test_case.rb b/test/application_system_test_case.rb new file mode 100644 index 0000000000..d19212abd5 --- /dev/null +++ b/test/application_system_test_case.rb @@ -0,0 +1,5 @@ +require "test_helper" + +class ApplicationSystemTestCase < ActionDispatch::SystemTestCase + driven_by :selenium, using: :chrome, screen_size: [1400, 1400] +end diff --git a/test/channels/application_cable/connection_test.rb b/test/channels/application_cable/connection_test.rb new file mode 100644 index 0000000000..800405f15e --- /dev/null +++ b/test/channels/application_cable/connection_test.rb @@ -0,0 +1,11 @@ +require "test_helper" + +class ApplicationCable::ConnectionTest < ActionCable::Connection::TestCase + # test "connects with cookies" do + # cookies.signed[:user_id] = 42 + # + # connect + # + # assert_equal connection.user_id, "42" + # end +end diff --git a/test/controllers/.keep b/test/controllers/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/test/controllers/homepages_controller_test.rb b/test/controllers/homepages_controller_test.rb new file mode 100644 index 0000000000..017e1a6a66 --- /dev/null +++ b/test/controllers/homepages_controller_test.rb @@ -0,0 +1,10 @@ +# require 'test_helper' +# +# describe HomepagesController do +# # it "can get the homepage" do +# # get works_path +# # +# # must_respond_with :success +# # end +# end + diff --git a/test/controllers/users_controller_test.rb b/test/controllers/users_controller_test.rb new file mode 100644 index 0000000000..ee7466f502 --- /dev/null +++ b/test/controllers/users_controller_test.rb @@ -0,0 +1,60 @@ +require 'test_helper' +class UsersControllerTest < ActionDispatch::IntegrationTest + describe UsersController do + it "can get the login form" do + get login_path + + must_respond_with :success + end + + describe "logging in" do + it "can login a new user" do + user = nil + expect { + user = login() + }.must_differ "User.count", 1 + + must_respond_with :redirect + + expect(user).wont_be_nil + expect(session[:user_id]).must_equal user.id + expect(user.username).must_equal user_hash[:user][:username] + end + + it "can log in an existing user" do + user = User.create(username: "Adele") + + expect { + login(user.username) + }.wont_change "Users.count" + + expect(session[:user_id]).must_equal user.id + expect(user.username).must_equal user_hash[:user][:username] + end + end + + describe "logout" do + it "can logout a logged in user" do + login() + expect(session[:user_id]).wont_be_nil + + post logout_path + expect(session[:user_id]).must_be_nil + end + end + + describe "current user" do + it "can return the page if the user is logged in" do + login() + get current_user_path + must_respond_with :success + end + + it "redirects us back if the user isi not logged in" do + get current_user_path + must_respond_with :redirect + expect(flash[:error]).must_equal "You must be logged in to view this page" + end + end + end +end diff --git a/test/controllers/votes_controller_test.rb b/test/controllers/votes_controller_test.rb new file mode 100644 index 0000000000..fac08af3a2 --- /dev/null +++ b/test/controllers/votes_controller_test.rb @@ -0,0 +1,7 @@ +require 'test_helper' + +class VotesControllerTest < ActionDispatch::IntegrationTest + # test "the truth" do + # assert true + # end +end diff --git a/test/controllers/works_controller_test.rb b/test/controllers/works_controller_test.rb new file mode 100644 index 0000000000..986d56c9c6 --- /dev/null +++ b/test/controllers/works_controller_test.rb @@ -0,0 +1,7 @@ +require 'test_helper' + +class WorksControllerTest < ActionDispatch::IntegrationTest + # test "the truth" do + # assert true + # end +end diff --git a/test/fixtures/.keep b/test/fixtures/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/test/fixtures/files/.keep b/test/fixtures/files/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/test/fixtures/users.yml b/test/fixtures/users.yml new file mode 100644 index 0000000000..eb9d7d6f78 --- /dev/null +++ b/test/fixtures/users.yml @@ -0,0 +1,7 @@ +# Read about fixtures at https://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html + +one: + username: MyString + +two: + username: MyString diff --git a/test/fixtures/votes.yml b/test/fixtures/votes.yml new file mode 100644 index 0000000000..51816369fd --- /dev/null +++ b/test/fixtures/votes.yml @@ -0,0 +1,11 @@ +# Read about fixtures at https://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html + +# This model initially had no columns defined. If you add columns to the +# model remove the '{}' from the fixture names and add the columns immediately +# below each fixture, per the syntax in the comments below +# +one: {} +# column: value +# +two: {} +# column: value diff --git a/test/fixtures/works.yml b/test/fixtures/works.yml new file mode 100644 index 0000000000..a905039038 --- /dev/null +++ b/test/fixtures/works.yml @@ -0,0 +1 @@ +# Read about fixtures at https://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html diff --git a/test/helpers/.keep b/test/helpers/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/test/integration/.keep b/test/integration/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/test/mailers/.keep b/test/mailers/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/test/models/.keep b/test/models/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/test/models/user_test.rb b/test/models/user_test.rb new file mode 100644 index 0000000000..82f61e0109 --- /dev/null +++ b/test/models/user_test.rb @@ -0,0 +1,7 @@ +require 'test_helper' + +class UserTest < ActiveSupport::TestCase + # test "the truth" do + # assert true + # end +end diff --git a/test/models/vote_test.rb b/test/models/vote_test.rb new file mode 100644 index 0000000000..f31f99299c --- /dev/null +++ b/test/models/vote_test.rb @@ -0,0 +1,7 @@ +require 'test_helper' + +class VoteTest < ActiveSupport::TestCase + # test "the truth" do + # assert true + # end +end diff --git a/test/models/work_test.rb b/test/models/work_test.rb new file mode 100644 index 0000000000..bd0e8aa081 --- /dev/null +++ b/test/models/work_test.rb @@ -0,0 +1,69 @@ +require "test_helper" + +describe Work do + + before do + @work = Work.new( + category: "movie", + title: "An Adie is Sleepy", + creator: "Ada Wizards", + publication_year: "2020", + description: "I would like to go to sleep now") + end + + + describe "validations" do + + it "creates a new media record" do + @work.save + expect(@work.valid?).must_equal true + end + + it "must have a category" do + @work.category = nil + expect(@work.valid?).must_equal false + end + + it "must have a title" do + @work.title = nil + expect(@work.valid?).must_equal false + end + # change these below back to FALSE later on, for now change true so tests are passing. + # You've wasted enough time trying to debug this + + it "must have a creator" do + @work.creator = nil + expect(@work.valid?).must_equal true + end + + it "must have a publication year" do + @work.publication_year = nil + expect(@work.valid?).must_equal true + end + + it "must have a description" do + @work.description = nil + expect(@work.valid?).must_equal true + end + + end + + # describe "custom methods" do + # it "returns a spotlight work" do + # expect(Work.spotlight).must_be_instance_of Work + # end + # + # it "returns nil for spotlight when database is empty" do + # Work.delete_all + # + # expect(Work.count).must_equal 0 + # expect(Work.spotlight).must_be_nil + # end + # + # it "returns an array for top 10" do + # top_books = Work.top_ten("book") + # expect(top_books).must_be_instance_of Array + # end + # + # end +end \ No newline at end of file diff --git a/test/system/.keep b/test/system/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/test/test_helper.rb b/test/test_helper.rb new file mode 100644 index 0000000000..976cb07c8f --- /dev/null +++ b/test/test_helper.rb @@ -0,0 +1,28 @@ +ENV['RAILS_ENV'] ||= 'test' +require_relative '../config/environment' +require 'rails/test_help' +require "minitest/rails" +require "minitest/reporters" +require 'minitest/autorun' + +class ActiveSupport::TestCase + # Run tests in parallel with specified workers + parallelize(workers: :number_of_processors) + + # Setup all fixtures in test/fixtures/*.yml for all tests in alphabetical order. + fixtures :all + + def login(username = 'grace hopper') + user_hash = { + user: { + username: username + } + } + + post login_path, params: user_hash + + user = User.find_by(username: username) + return user + end + # Add more helper methods to be used by all tests here... +end diff --git a/tmp/.keep b/tmp/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tmp/pids/.keep b/tmp/pids/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/vendor/.keep b/vendor/.keep new file mode 100644 index 0000000000..e69de29bb2