flipflop 2.2.1 → 2.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (50) hide show
  1. checksums.yaml +5 -13
  2. data/.gitignore +0 -1
  3. data/.travis.yml +23 -27
  4. data/CHANGES.md +7 -0
  5. data/Gemfile +14 -8
  6. data/README.md +27 -1
  7. data/Rakefile +20 -8
  8. data/app/controllers/flipflop/features_controller.rb +20 -10
  9. data/app/controllers/flipflop/strategies_controller.rb +4 -4
  10. data/app/views/flipflop/features/index.html.erb +64 -41
  11. data/app/views/flipflop/stylesheets/_flipflop.css +1 -0
  12. data/app/views/layouts/flipflop.html.erb +8 -1
  13. data/config/features.rb +7 -0
  14. data/config/locales/en.yml +34 -0
  15. data/flipflop.gemspec +0 -5
  16. data/lib/flipflop/configurable.rb +10 -0
  17. data/lib/flipflop/engine.rb +10 -15
  18. data/lib/flipflop/feature_definition.rb +5 -6
  19. data/lib/flipflop/feature_loader.rb +40 -0
  20. data/lib/flipflop/feature_set.rb +7 -9
  21. data/lib/flipflop/group_definition.rb +11 -0
  22. data/lib/flipflop/strategies/abstract_strategy.rb +2 -1
  23. data/lib/flipflop/version.rb +1 -1
  24. data/lib/flipflop.rb +2 -0
  25. data/lib/test_engine/config/features.rb +3 -0
  26. data/lib/test_engine/test_engine.rb +7 -0
  27. data/src/stylesheets/_flipflop.scss +160 -0
  28. data/test/integration/app_test.rb +50 -21
  29. data/test/integration/dashboard_test.rb +395 -52
  30. data/test/templates/nl.yml +30 -0
  31. data/test/templates/test_app_features.rb +7 -0
  32. data/test/templates/test_engine.rb +7 -0
  33. data/test/templates/test_engine_features.rb +3 -0
  34. data/test/test_helper.rb +83 -10
  35. data/test/unit/configurable_test.rb +1 -1
  36. data/test/unit/feature_definition_test.rb +27 -2
  37. data/test/unit/feature_set_test.rb +7 -19
  38. data/test/unit/flipflop_test.rb +16 -11
  39. data/test/unit/group_definition_test.rb +21 -0
  40. data/test/unit/strategies/abstract_strategy_test.rb +14 -25
  41. data/test/unit/strategies/active_record_strategy_test.rb +4 -0
  42. data/test/unit/strategies/cookie_strategy_test.rb +4 -0
  43. data/test/unit/strategies/default_strategy_test.rb +10 -4
  44. data/test/unit/strategies/lambda_strategy_test.rb +11 -27
  45. data/test/unit/strategies/query_string_strategy_test.rb +4 -0
  46. data/test/unit/strategies/redis_strategy_test.rb +4 -0
  47. data/test/unit/strategies/session_strategy_test.rb +4 -0
  48. data/test/unit/strategies/test_strategy_test.rb +4 -0
  49. metadata +22 -9
  50. data/app/assets/stylesheets/flipflop.css +0 -1
checksums.yaml CHANGED
@@ -1,15 +1,7 @@
1
1
  ---
2
- !binary "U0hBMQ==":
3
- metadata.gz: !binary |-
4
- ZDQyZGU4ODNkZGVhNWMzYWM2OWZiNDYwM2ZmNDllNGY1YjZmOTM5NA==
5
- data.tar.gz: !binary |-
6
- ZDZkZjM2YTNhZDEwNjBjZDY3MDM0Y2FmZGQwNmIzMDY1MWRhOGE1OA==
2
+ SHA1:
3
+ metadata.gz: 0a2273ae05773bcf363232d55a5220c8da41f39a
4
+ data.tar.gz: 8fd2d51b80011ef69c993b389e15170f29f9d5eb
7
5
  SHA512:
8
- metadata.gz: !binary |-
9
- MTQ2MWIxZjBiNGMxY2VlMDgyMzVlNWQ1MjY2NmRjOTZhNjY2YmI5NWRiYzQy
10
- NTZlMzJhOWQ3MTliNTI3NjdiMjg1NDAwYzU0YWY2MzU1Mjc1YmQyZmQzNWZi
11
- YWI5YTQ0Y2I3M2E4MTFiYjYwODE3NThmZTVjZjFkODZlZTNjMDA=
12
- data.tar.gz: !binary |-
13
- Njc0NTFiMGEwNmEzMmQ1YjdlN2EzNjhjMWQyM2ZlNDJlY2E3MzI3Mjk0ZGMz
14
- ZmU5MTg3NTU1MzRmMzkxM2Y2ODkxODhkNWFkNDIyMjM1MGE2NThmNDI0MmY1
15
- MWNiZWNhZjdhZGM5MzRhYzRlNTlmNTMxNTI4NTFmZTdmNjFmNjE=
6
+ metadata.gz: 5aaab9397951347310618fce6c9e3223a4b0435f7bcbf9f34ce51785465d6d6bdbb0060c60563e4ef9bf6abf560c437551644a2eb9077c62b58746c451deac1d
7
+ data.tar.gz: c7c18fcb35fb1eb5adcd55ca6ae1c5c8fad679a1aa9a2612774f6ef27b969a2d784b0a3784cf9e1f6d5a3ac98f8d5013a0f860093afde5c1e7a911728bc2fc86
data/.gitignore CHANGED
@@ -1,5 +1,4 @@
1
1
  *.gem
2
- *.css
3
2
  .bundle
4
3
  Gemfile.lock
5
4
  pkg/*
data/.travis.yml CHANGED
@@ -1,39 +1,35 @@
1
1
  language: ruby
2
2
  rvm:
3
- - 2.0
4
- - 2.1
5
- - 2.2
3
+ - 2.4.0
6
4
  - 2.3.0
7
- - jruby-9.0.5.0
8
- - rbx-head
5
+ - jruby-9.1.2.0
9
6
  - ruby-head
10
7
  - jruby-head
11
8
  env:
12
- - RAILS_VERSION=4.0
13
- - RAILS_VERSION=4.1
14
- - RAILS_VERSION=4.2
15
- - RAILS_VERSION=5.0.0.beta3
16
9
  - RAILS_VERSION=master
10
+ - RAILS_VERSION=master RAILS_API_ONLY=1
11
+ - RAILS_VERSION=5.0
12
+ - RAILS_VERSION=5.0 RAILS_API_ONLY=1
17
13
  matrix:
18
- exclude:
19
- - rvm: 2.0
20
- env: RAILS_VERSION=5.0.0.beta3
21
- - rvm: 2.0
22
- env: RAILS_VERSION=master
23
- - rvm: 2.1
24
- env: RAILS_VERSION=5.0.0.beta3
25
- - rvm: 2.1
26
- env: RAILS_VERSION=master
27
- - rvm: 2.2
28
- env: RAILS_VERSION=5.0.0.beta3
29
- - rvm: 2.2
30
- env: RAILS_VERSION=master
14
+ include:
15
+ - rvm: 2.3.0
16
+ env: RAILS_VERSION=4.2
17
+ - rvm: 2.2.6
18
+ env: RAILS_VERSION=4.2
19
+ - rvm: 2.1.9
20
+ env: RAILS_VERSION=4.2
21
+ - rvm: 2.0.0
22
+ env: RAILS_VERSION=4.2
23
+ - rvm: 2.3.0
24
+ env: RAILS_VERSION=4.1
25
+ - rvm: 2.2.6
26
+ env: RAILS_VERSION=4.1
27
+ - rvm: 2.1.9
28
+ env: RAILS_VERSION=4.1
29
+ - rvm: 2.0.0
30
+ env: RAILS_VERSION=4.1
31
31
  allow_failures:
32
- - rvm: jruby-9.0.5.0
33
- env: RAILS_VERSION=5.0.0.beta3
34
- - rvm: jruby-9.0.5.0
35
- env: RAILS_VERSION=master
36
- - rvm: rbx-head
32
+ - rvm: jruby-9.1.2.0
37
33
  - rvm: ruby-head
38
34
  - rvm: jruby-head
39
35
  notifications:
data/CHANGES.md ADDED
@@ -0,0 +1,7 @@
1
+ ## 2.3.0
2
+
3
+ * Support for Rails API only apps.
4
+ * Features can now be grouped in the dashboard.
5
+ * Features can now be added to Rails engines and loaded with an initializer.
6
+ * The dashboard (including features and strategies) can be translated.
7
+ * Removed Rails asset pipeline dependency.
data/Gemfile CHANGED
@@ -1,25 +1,31 @@
1
1
  source "https://rubygems.org"
2
2
  gemspec
3
3
 
4
- if ENV["CONTINUOUS_INTEGRATION"]
5
- gem "bootstrap", "= 4.0.0.alpha3"
6
- end
7
-
8
4
  group :test do
9
5
  version = ENV["RAILS_VERSION"] || "master"
10
6
  if version == "master"
11
7
  gem "rails", github: "rails/rails"
8
+ gem "arel", github: "rails/arel"
12
9
  else
13
10
  gem "rails", "~> #{version}.0"
14
11
  end
15
12
 
13
+ gem "bootstrap", "= 4.0.0.alpha6", require: false
14
+
15
+ gem "fakeredis", require: false
16
16
  gem "sqlite3", ">= 1.3", platform: :ruby
17
- gem "fakeredis"
18
- gem "activerecord-jdbcsqlite3-adapter", platform: :jruby
17
+ gem "activerecord-jdbcsqlite3-adapter", platform: :jruby,
18
+ github: "jruby/activerecord-jdbc-adapter", branch: "rails-5"
19
+
19
20
  gem "minitest", ">= 4.2"
20
21
  gem "capybara", ">= 2.6"
21
22
 
22
- if ENV["RAILS_VERSION"] == "4.0"
23
- gem "minitest-rails", platform: :jruby
23
+ if Gem::Version.new(RUBY_VERSION) > Gem::Version.new("2.2.4")
24
+ gem "listen", ">= 3.0", require: false
25
+ end
26
+
27
+ if Gem::Version.new(RUBY_VERSION) < Gem::Version.new("2.1.0")
28
+ # Nokogiri 1.7+ requires Ruby 2.1+.
29
+ gem "nokogiri", "< 1.7"
24
30
  end
25
31
  end
data/README.md CHANGED
@@ -14,6 +14,9 @@ application functionality at run-time. It is originally based on
14
14
  * configuration in a fixed location (`config/features.rb`) that is usable even if you don't use the database strategy
15
15
  * dashboard is inaccessible in production by default, for safety in case of misconfiguration
16
16
  * removes controller filters and view helpers, to promote uniform semantics to check for features (facilitates project-wide searching)
17
+ * support for API only Rails apps
18
+ * support for loading features from Rails engines
19
+ * support for feature groups
17
20
 
18
21
  You can configure strategy layers that will evaluate if a feature is currently
19
22
  enabled or disabled. Available strategies are:
@@ -63,6 +66,12 @@ Flipflop.configure do
63
66
 
64
67
  # Enable features by default:
65
68
  feature :world_domination, default: true
69
+
70
+ # Group features together:
71
+ group :improved_design do
72
+ feature :improved_navigation
73
+ feature :improved_homepage
74
+ end
66
75
  end
67
76
  ```
68
77
 
@@ -73,7 +82,7 @@ your server after making changes.
73
82
 
74
83
  The following strategies are provided:
75
84
  * `:active_record` – Save feature settings in the database.
76
- * `:class` – Provide the feature model. `Flipflop::Feature` by default (which uses the table `features`). Honors `default_scope` when features are resolved or switched on/off.
85
+ * `:class` – Provide the feature model. `Flipflop::Feature` by default (which uses the table `flipflop_features`). Honors `default_scope` when features are resolved or switched on/off.
77
86
  * `:cookie` – Save feature settings in browser cookies for the current user.
78
87
  * `:prefix` – String prefix for all cookie names. Defaults to no prefix.
79
88
  * `:path` – The path for which the cookies apply. Defaults to the root of the application.
@@ -259,6 +268,23 @@ config.flipflop.dashboard_access_filter = -> {
259
268
  }
260
269
  ```
261
270
 
271
+ ## Features in Rails engines
272
+
273
+ You can use features in Rails engines. Simply tell Flipflop to load files from
274
+ an additional file in an initializer. You can define features and strategies.
275
+ Both will be merged with application features. You'll have to somewhat careful
276
+ with defining strategies in the engine to avoid conflicts.
277
+
278
+ ```ruby
279
+ class MyEngine < Rails::Engine
280
+ initializer "load_features" do
281
+ # Features from config/features.rb in your engine are merged with
282
+ # any application features.
283
+ Flipflop::FeatureLoader.current.append(self)
284
+ end
285
+ end
286
+ ```
287
+
262
288
  ## Testing
263
289
 
264
290
  In your test environment, you typically want to keep your features. But to make
data/Rakefile CHANGED
@@ -16,24 +16,36 @@ end
16
16
  task default: :test
17
17
 
18
18
  namespace :assets do
19
- stylesheets_path = "app/assets/stylesheets"
20
- stylesheet_file = "flipflop.css"
21
- stylesheet_path = stylesheets_path + "/" + stylesheet_file
19
+ stylesheets_src_path = "src/stylesheets"
20
+ stylesheets_dst_path = "app/views/flipflop/stylesheets"
21
+ stylesheet_file = "_flipflop.css"
22
+ stylesheet_dst_path = stylesheets_dst_path + "/" + stylesheet_file
22
23
 
23
- task :compile => :clean do
24
+ task :compile do
24
25
  require "bundler/setup"
25
26
  require "flipflop"
26
27
  require "sprockets"
27
28
  require "bootstrap"
28
29
 
29
30
  environment = Sprockets::Environment.new
30
- environment.append_path stylesheets_path
31
+ environment.append_path stylesheets_src_path
31
32
  environment.append_path Bootstrap.stylesheets_path
32
33
  environment.css_compressor = :scss
33
- File.write(stylesheet_path, environment[stylesheet_file])
34
+ File.write(stylesheet_dst_path, environment[stylesheet_file])
34
35
  end
35
36
 
36
- task :clean do
37
- FileUtils.rm(stylesheet_path) rescue nil
37
+ task :watch do
38
+ require "listen"
39
+
40
+ listener = Listen.to(stylesheets_src_path, only: /\.scss$/) do
41
+ Rake::Task["assets:compile"].execute
42
+ end
43
+
44
+ $stderr.puts("Watching #{stylesheets_src_path} for changes...")
45
+
46
+ listener.start
47
+
48
+ Rake::Task["assets:compile"].execute
49
+ sleep
38
50
  end
39
51
  end
@@ -1,36 +1,46 @@
1
1
  module Flipflop
2
2
  class FeaturesController < ApplicationController
3
+ include ActionController::RequestForgeryProtection
4
+ include ActionController::Rendering
5
+ include ActionView::Rendering
6
+ include ActionView::Layouts
7
+
8
+ # Allows overriding layout by inheriting from this controller.
3
9
  layout "flipflop"
4
10
 
5
11
  def index
6
12
  @feature_set = FeaturesPresenter.new(FeatureSet.current)
13
+ render
7
14
  end
8
15
 
9
16
  class FeaturesPresenter
10
17
  include Flipflop::Engine.routes.url_helpers
11
18
 
19
+ attr_reader :strategies, :grouped_features, :application_name
20
+
12
21
  def initialize(feature_set)
13
22
  @cache = {}
14
23
  @feature_set = feature_set
15
- end
16
24
 
17
- def strategies
18
- @feature_set.strategies.reject(&:hidden?)
25
+ @strategies = @feature_set.strategies.reject(&:hidden?)
26
+ @grouped_features = @feature_set.features.group_by(&:group)
27
+
28
+ @application_name = Rails.application.class.parent_name.underscore.titleize
19
29
  end
20
30
 
21
- def features
22
- @feature_set.features
31
+ def grouped?
32
+ grouped_features.keys != [nil]
23
33
  end
24
34
 
25
35
  def status(feature)
26
36
  cache(nil, feature) do
27
- status_to_s(@feature_set.enabled?(feature.key))
37
+ status_to_sym(@feature_set.enabled?(feature.key))
28
38
  end
29
39
  end
30
40
 
31
41
  def strategy_status(strategy, feature)
32
42
  cache(strategy, feature) do
33
- status_to_s(strategy.enabled?(feature.key))
43
+ status_to_sym(strategy.enabled?(feature.key))
34
44
  end
35
45
  end
36
46
 
@@ -46,9 +56,9 @@ module Flipflop
46
56
  @cache[key] = yield
47
57
  end
48
58
 
49
- def status_to_s(status)
50
- return "on" if status == true
51
- return "off" if status == false
59
+ def status_to_sym(status)
60
+ return :enabled if status == true
61
+ return :disabled if status == false
52
62
  end
53
63
  end
54
64
  end
@@ -1,21 +1,21 @@
1
1
  module Flipflop
2
2
  class StrategiesController < ApplicationController
3
- include Engine.routes.url_helpers
3
+ include ActionController::RequestForgeryProtection
4
4
 
5
5
  def update
6
6
  strategy.switch!(feature_key, enable?)
7
- redirect_to(flipflop.features_url)
7
+ redirect_to(features_url)
8
8
  end
9
9
 
10
10
  def destroy
11
11
  strategy.clear!(feature_key)
12
- redirect_to(flipflop.features_url)
12
+ redirect_to(features_url)
13
13
  end
14
14
 
15
15
  private
16
16
 
17
17
  def enable?
18
- params[:commit].to_s.downcase.include?("on")
18
+ params[:commit].to_s == "1"
19
19
  end
20
20
 
21
21
  def feature_key
@@ -1,60 +1,83 @@
1
+ <% provide(:title) { t(:title, scope: :flipflop, application: @feature_set.application_name) } -%>
1
2
  <section class="flipflop">
2
- <h1>Feature Flipflop</h1>
3
+ <h1><%= t(:title, scope: :flipflop, application: @feature_set.application_name) -%></h1>
3
4
  <table>
4
5
  <thead>
5
6
  <tr>
6
7
  <th></th>
7
- <th class="name">Feature</th>
8
- <th class="description">Description</th>
8
+ <th class="name"><%= t(:feature, scope: :flipflop) -%></th>
9
+ <th class="description"><%= t(:description, scope: :flipflop) -%></th>
9
10
  <% @feature_set.strategies.each do |strategy| -%>
10
11
  <th data-tooltip="<%= strategy.description -%>">
11
- <%= strategy.name.humanize -%>
12
+ <%= t(strategy.name, scope: [:flipflop, :strategies], default: strategy.title) -%>
12
13
  </th>
13
14
  <% end -%>
14
15
  </tr>
15
16
  </thead>
16
17
  <tbody>
17
- <% @feature_set.features.each do |feature| -%>
18
- <tr data-feature="<%= feature.name.dasherize.parameterize %>">
19
- <td class="status">
20
- <span class="<%= @feature_set.status(feature) -%>"><%= @feature_set.status(feature) -%></span>
21
- </td>
22
- <td class="name"><%= feature.name.humanize -%></td>
23
- <td class="description"><%= feature.description -%></td>
18
+ <% @feature_set.grouped_features.each do |group, features| -%>
19
+ <% if @feature_set.grouped? -%>
20
+ <tr class="group">
21
+ <td></td>
22
+ <td class="name" colspan="<%= 2 + @feature_set.strategies.size -%>">
23
+ <h2>
24
+ <%= t(group ? group.name : :default, scope: [:flipflop, :groups], default: group ? group.title : nil) -%>
25
+ </h2>
26
+ </td>
27
+ </tr>
28
+ <% end -%>
29
+ <% features.each do |feature| -%>
30
+ <tr data-feature="<%= feature.name.dasherize.parameterize -%>">
31
+ <td class="status">
32
+ <span class="<%= @feature_set.status(feature) -%>">
33
+ <span><%= t(@feature_set.status(feature), scope: [:flipflop, :feature_states]) -%></span>
34
+ </span>
35
+ </td>
36
+ <td class="name">
37
+ <%= title = t(feature.name, scope: [:flipflop, :features], default: feature.title) -%>
38
+ </td>
39
+ <td class="description">
40
+ <%= t(:"#{feature.name}_description", scope: [:flipflop, :features], default: feature.description || title + ".") -%>
41
+ </td>
24
42
 
25
- <% @feature_set.strategies.each do |strategy| -%>
26
- <td class="toggle" data-strategy="<%= strategy.name.dasherize.parameterize %>">
27
- <div class="toolbar">
28
- <%= form_tag(@feature_set.switch_url(strategy, feature), method: :put) do -%>
29
- <div class="group">
30
- <%= submit_tag "on",
31
- type: "submit",
32
- class: @feature_set.strategy_status(strategy, feature) == "on" ? "active" : nil,
33
- disabled: !strategy.switchable?
34
- -%>
43
+ <% @feature_set.strategies.each do |strategy| -%>
44
+ <td class="toggle" data-strategy="<%= strategy.name.dasherize.parameterize %>">
45
+ <div class="toolbar">
46
+ <%= form_tag(@feature_set.switch_url(strategy, feature), method: :put) do -%>
47
+ <div class="group">
48
+ <%= button_tag t(:enabled, scope: [:flipflop, :feature_states]),
49
+ type: "submit",
50
+ name: "commit",
51
+ value: "1",
52
+ class: @feature_set.strategy_status(strategy, feature) == :enabled ? "active" : nil,
53
+ disabled: !strategy.switchable?
54
+ -%>
35
55
 
36
- <%= submit_tag "off",
37
- type: "submit",
38
- class: @feature_set.strategy_status(strategy, feature) == "off" ? "active" : nil,
39
- disabled: !strategy.switchable?
40
- -%>
41
- </div>
42
- <% end -%>
56
+ <%= button_tag t(:disabled, scope: [:flipflop, :feature_states]),
57
+ type: "submit",
58
+ name: "commit",
59
+ value: "0",
60
+ class: @feature_set.strategy_status(strategy, feature) == :disabled ? "active" : nil,
61
+ disabled: !strategy.switchable?
62
+ -%>
63
+ </div>
64
+ <% end -%>
43
65
 
44
- <% if strategy.switchable? -%>
45
- <div class="group">
46
- <% unless @feature_set.strategy_status(strategy, feature).blank? -%>
47
- <%= form_tag(@feature_set.switch_url(strategy, feature), method: :delete) do -%>
48
- <%= submit_tag "clear", type: "submit" -%>
66
+ <% if strategy.switchable? -%>
67
+ <div class="group">
68
+ <% unless @feature_set.strategy_status(strategy, feature).blank? -%>
69
+ <%= form_tag(@feature_set.switch_url(strategy, feature), method: :delete) do -%>
70
+ <%= button_tag t(:clear, scope: :flipflop), type: "submit" -%>
71
+ <% end -%>
49
72
  <% end -%>
50
- <% end -%>
51
- </div>
52
- <% end -%>
53
- </div>
54
- </td>
55
- <% end -%>
56
- </tr>
73
+ </div>
74
+ <% end -%>
75
+ </div>
76
+ </td>
77
+ <% end -%>
78
+ </tr>
79
+ <% end -%>
57
80
  <% end -%>
58
81
  </tbody>
59
82
  </table>
60
- </div>
83
+ </section>
@@ -0,0 +1 @@
1
+ /*! normalize.css v5.0.0 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;line-height:1.15;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,footer,header,nav,section{display:block}h1{font-size:2em;margin:0.67em 0}figcaption,figure,main{display:block}figure{margin:1em 40px}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace, monospace;font-size:1em}a{background-color:transparent;-webkit-text-decoration-skip:objects}a:active,a:hover{outline-width:0}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:inherit}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace, monospace;font-size:1em}dfn{font-style:italic}mark{background-color:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-0.25em}sup{top:-0.5em}audio,video{display:inline-block}audio:not([controls]){display:none;height:0}img{border-style:none}svg:not(:root){overflow:hidden}button,input,optgroup,select,textarea{font-family:sans-serif;font-size:100%;line-height:1.15;margin:0}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{border-style:none;padding:0}button:-moz-focusring,[type="button"]:-moz-focusring,[type="reset"]:-moz-focusring,[type="submit"]:-moz-focusring{outline:1px dotted ButtonText}fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:0.35em 0.625em 0.75em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{display:inline-block;vertical-align:baseline}textarea{overflow:auto}[type="checkbox"],[type="radio"]{box-sizing:border-box;padding:0}[type="number"]::-webkit-inner-spin-button,[type="number"]::-webkit-outer-spin-button{height:auto}[type="search"]{-webkit-appearance:textfield;outline-offset:-2px}[type="search"]::-webkit-search-cancel-button,[type="search"]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details,menu{display:block}summary{display:list-item}canvas{display:inline-block}template{display:none}[hidden]{display:none}@media print{*,*::before,*::after,p::first-letter,div::first-letter,blockquote::first-letter,li::first-letter,p::first-line,div::first-line,blockquote::first-line,li::first-line{text-shadow:none !important;box-shadow:none !important}a,a:visited{text-decoration:underline}abbr[title]::after{content:" (" attr(title) ")"}pre{white-space:pre-wrap !important}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.badge,section.flipflop table tbody tr td.status span.enabled,section.flipflop table tbody tr td.status span.disabled{border:1px solid #000}.table,section.flipflop table{border-collapse:collapse !important}.table td,section.flipflop table td,.table th,section.flipflop table th{background-color:#fff !important}.table-bordered th,.table-bordered td{border:1px solid #ddd !important}}html{box-sizing:border-box}*,*::before,*::after{box-sizing:inherit}@-ms-viewport{width:device-width}html{-ms-overflow-style:scrollbar;-webkit-tap-highlight-color:transparent}body{font-family:-apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;font-size:1rem;font-weight:normal;line-height:1.5;color:#292b2c;background-color:#fff}[tabindex="-1"]:focus{outline:none !important}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[title],abbr[data-original-title]{cursor:help}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:bold}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}a{color:#0275d8;text-decoration:none}a:focus,a:hover{color:#014c8c;text-decoration:underline}a:not([href]):not([tabindex]){color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus,a:not([href]):not([tabindex]):hover{color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus{outline:0}pre{margin-top:0;margin-bottom:1rem;overflow:auto}figure{margin:0 0 1rem}img{vertical-align:middle}[role="button"]{cursor:pointer}a,area,button,[role="button"],input,label,select,summary,textarea{touch-action:manipulation}table{border-collapse:collapse;background-color:transparent}caption{padding-top:0.75rem;padding-bottom:0.75rem;color:#636c72;text-align:left;caption-side:bottom}th{text-align:left}label{display:inline-block;margin-bottom:.5rem}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}input,button,select,textarea{line-height:inherit}input[type="radio"]:disabled,input[type="checkbox"]:disabled{cursor:not-allowed}input[type="date"],input[type="time"],input[type="datetime-local"],input[type="month"]{-webkit-appearance:listbox}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit}input[type="search"]{-webkit-appearance:none}output{display:inline-block}[hidden]{display:none !important}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{margin-bottom:0.5rem;font-family:inherit;font-weight:500;line-height:1.1;color:inherit}h1,.h1{font-size:2.5rem}h2,.h2{font-size:2rem}h3,.h3{font-size:1.75rem}h4,.h4{font-size:1.5rem}h5,.h5{font-size:1.25rem}h6,.h6{font-size:1rem}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:6rem;font-weight:300;line-height:1.1}.display-2{font-size:5.5rem;font-weight:300;line-height:1.1}.display-3{font-size:4.5rem;font-weight:300;line-height:1.1}.display-4{font-size:3.5rem;font-weight:300;line-height:1.1}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:normal}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:5px}.initialism{font-size:90%;text-transform:uppercase}.blockquote{padding:0.5rem 1rem;margin-bottom:1rem;font-size:1.25rem;border-left:0.25rem solid #eceeef}.blockquote-footer{display:block;font-size:80%;color:#636c72}.blockquote-footer::before{content:"\2014 \00A0"}.blockquote-reverse{padding-right:1rem;padding-left:0;text-align:right;border-right:0.25rem solid #eceeef;border-left:0}.blockquote-reverse .blockquote-footer::before{content:""}.blockquote-reverse .blockquote-footer::after{content:"\00A0 \2014"}.table,section.flipflop table{width:100%;max-width:100%;margin-bottom:1rem}.table th,section.flipflop table th,.table td,section.flipflop table td{padding:0.75rem;vertical-align:top;border-top:1px solid #eceeef}.table thead th,section.flipflop table thead th{vertical-align:bottom;border-bottom:2px solid #eceeef}.table tbody+tbody,section.flipflop table tbody+tbody{border-top:2px solid #eceeef}.table .table,section.flipflop table .table,.table section.flipflop table,section.flipflop .table table,section.flipflop table table{background-color:#fff}.table-sm th,.table-sm td{padding:0.3rem}.table-bordered{border:1px solid #eceeef}.table-bordered th,.table-bordered td{border:1px solid #eceeef}.table-bordered thead th,.table-bordered thead td{border-bottom-width:2px}.table-striped tbody tr:nth-of-type(odd){background-color:rgba(0,0,0,0.05)}.table-hover tbody tr:hover{background-color:rgba(0,0,0,0.075)}.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-success,.table-success>th,.table-success>td{background-color:#dff0d8}.table-hover .table-success:hover{background-color:#d0e9c6}.table-hover .table-success:hover>td,.table-hover .table-success:hover>th{background-color:#d0e9c6}.table-info,.table-info>th,.table-info>td{background-color:#d9edf7}.table-hover .table-info:hover{background-color:#c4e3f3}.table-hover .table-info:hover>td,.table-hover .table-info:hover>th{background-color:#c4e3f3}.table-warning,.table-warning>th,.table-warning>td{background-color:#fcf8e3}.table-hover .table-warning:hover{background-color:#faf2cc}.table-hover .table-warning:hover>td,.table-hover .table-warning:hover>th{background-color:#faf2cc}.table-danger,.table-danger>th,.table-danger>td{background-color:#f2dede}.table-hover .table-danger:hover{background-color:#ebcccc}.table-hover .table-danger:hover>td,.table-hover .table-danger:hover>th{background-color:#ebcccc}.thead-inverse th,section.flipflop table thead th{color:#fff;background-color:#292b2c}.thead-default th{color:#464a4c;background-color:#eceeef}.table-inverse{color:#fff;background-color:#292b2c}.table-inverse th,.table-inverse td,.table-inverse thead th{border-color:#fff}.table-inverse.table-bordered{border:0}.table-responsive{display:block;width:100%;overflow-x:auto;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive.table-bordered{border:0}.btn,section.flipflop table tbody tr td.toggle div.toolbar div.group button{display:inline-block;font-weight:normal;line-height:1.25;text-align:center;white-space:nowrap;vertical-align:middle;user-select:none;border:1px solid transparent;padding:0.5rem 1rem;font-size:1rem;border-radius:0.25rem;transition:all 0.2s ease-in-out}.btn:focus,section.flipflop table tbody tr td.toggle div.toolbar div.group button:focus,.btn:hover,section.flipflop table tbody tr td.toggle div.toolbar div.group button:hover{text-decoration:none}.btn:focus,section.flipflop table tbody tr td.toggle div.toolbar div.group button:focus,.btn.focus,section.flipflop table tbody tr td.toggle div.toolbar div.group button.focus{outline:0;box-shadow:0 0 0 2px rgba(2,117,216,0.25)}.btn.disabled,section.flipflop table tbody tr td.toggle div.toolbar div.group button.disabled,.btn:disabled,section.flipflop table tbody tr td.toggle div.toolbar div.group button:disabled{cursor:not-allowed;opacity:.65}.btn:active,section.flipflop table tbody tr td.toggle div.toolbar div.group button:active,.btn.active,section.flipflop table tbody tr td.toggle div.toolbar div.group button.active{background-image:none}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-primary,section.flipflop table tbody tr td.toggle div.toolbar div.group button.active{color:#fff;background-color:#0275d8;border-color:#0275d8}.btn-primary:hover,section.flipflop table tbody tr td.toggle div.toolbar div.group button.active:hover{color:#fff;background-color:#025aa5;border-color:#01549b}.btn-primary:focus,section.flipflop table tbody tr td.toggle div.toolbar div.group button.active:focus,.btn-primary.focus,section.flipflop table tbody tr td.toggle div.toolbar div.group button.focus.active{box-shadow:0 0 0 2px rgba(2,117,216,0.5)}.btn-primary.disabled,section.flipflop table tbody tr td.toggle div.toolbar div.group button.disabled.active,.btn-primary:disabled,section.flipflop table tbody tr td.toggle div.toolbar div.group button.active:disabled{background-color:#0275d8;border-color:#0275d8}.btn-primary:active,section.flipflop table tbody tr td.toggle div.toolbar div.group button.active:active,.btn-primary.active,section.flipflop table tbody tr td.toggle div.toolbar div.group button.active,.show>.btn-primary.dropdown-toggle,section.flipflop table tbody tr td.toggle div.toolbar div.group .show>button.dropdown-toggle.active{color:#fff;background-color:#025aa5;background-image:none;border-color:#01549b}.btn-secondary,section.flipflop table tbody tr td.toggle div.toolbar div.group button:not(.active){color:#292b2c;background-color:#fff;border-color:#ccc}.btn-secondary:hover,section.flipflop table tbody tr td.toggle div.toolbar div.group button:hover:not(.active){color:#292b2c;background-color:#e6e6e6;border-color:#adadad}.btn-secondary:focus,section.flipflop table tbody tr td.toggle div.toolbar div.group button:focus:not(.active),.btn-secondary.focus,section.flipflop table tbody tr td.toggle div.toolbar div.group button.focus:not(.active){box-shadow:0 0 0 2px rgba(204,204,204,0.5)}.btn-secondary.disabled,section.flipflop table tbody tr td.toggle div.toolbar div.group button.disabled:not(.active),.btn-secondary:disabled,section.flipflop table tbody tr td.toggle div.toolbar div.group button:disabled:not(.active){background-color:#fff;border-color:#ccc}.btn-secondary:active,section.flipflop table tbody tr td.toggle div.toolbar div.group button:active:not(.active),.btn-secondary.active,section.flipflop table tbody tr td.toggle div.toolbar div.group button.active:not(.active),.show>.btn-secondary.dropdown-toggle,section.flipflop table tbody tr td.toggle div.toolbar div.group .show>button.dropdown-toggle:not(.active){color:#292b2c;background-color:#e6e6e6;background-image:none;border-color:#adadad}.btn-info{color:#fff;background-color:#5bc0de;border-color:#5bc0de}.btn-info:hover{color:#fff;background-color:#31b0d5;border-color:#2aabd2}.btn-info:focus,.btn-info.focus{box-shadow:0 0 0 2px rgba(91,192,222,0.5)}.btn-info.disabled,.btn-info:disabled{background-color:#5bc0de;border-color:#5bc0de}.btn-info:active,.btn-info.active,.show>.btn-info.dropdown-toggle{color:#fff;background-color:#31b0d5;background-image:none;border-color:#2aabd2}.btn-success{color:#fff;background-color:#5cb85c;border-color:#5cb85c}.btn-success:hover{color:#fff;background-color:#449d44;border-color:#419641}.btn-success:focus,.btn-success.focus{box-shadow:0 0 0 2px rgba(92,184,92,0.5)}.btn-success.disabled,.btn-success:disabled{background-color:#5cb85c;border-color:#5cb85c}.btn-success:active,.btn-success.active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#449d44;background-image:none;border-color:#419641}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#f0ad4e}.btn-warning:hover{color:#fff;background-color:#ec971f;border-color:#eb9316}.btn-warning:focus,.btn-warning.focus{box-shadow:0 0 0 2px rgba(240,173,78,0.5)}.btn-warning.disabled,.btn-warning:disabled{background-color:#f0ad4e;border-color:#f0ad4e}.btn-warning:active,.btn-warning.active,.show>.btn-warning.dropdown-toggle{color:#fff;background-color:#ec971f;background-image:none;border-color:#eb9316}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d9534f}.btn-danger:hover{color:#fff;background-color:#c9302c;border-color:#c12e2a}.btn-danger:focus,.btn-danger.focus{box-shadow:0 0 0 2px rgba(217,83,79,0.5)}.btn-danger.disabled,.btn-danger:disabled{background-color:#d9534f;border-color:#d9534f}.btn-danger:active,.btn-danger.active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#c9302c;background-image:none;border-color:#c12e2a}.btn-outline-primary{color:#0275d8;background-image:none;background-color:transparent;border-color:#0275d8}.btn-outline-primary:hover{color:#fff;background-color:#0275d8;border-color:#0275d8}.btn-outline-primary:focus,.btn-outline-primary.focus{box-shadow:0 0 0 2px rgba(2,117,216,0.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#0275d8;background-color:transparent}.btn-outline-primary:active,.btn-outline-primary.active,.show>.btn-outline-primary.dropdown-toggle{color:#fff;background-color:#0275d8;border-color:#0275d8}.btn-outline-secondary{color:#ccc;background-image:none;background-color:transparent;border-color:#ccc}.btn-outline-secondary:hover{color:#fff;background-color:#ccc;border-color:#ccc}.btn-outline-secondary:focus,.btn-outline-secondary.focus{box-shadow:0 0 0 2px rgba(204,204,204,0.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#ccc;background-color:transparent}.btn-outline-secondary:active,.btn-outline-secondary.active,.show>.btn-outline-secondary.dropdown-toggle{color:#fff;background-color:#ccc;border-color:#ccc}.btn-outline-info{color:#5bc0de;background-image:none;background-color:transparent;border-color:#5bc0de}.btn-outline-info:hover{color:#fff;background-color:#5bc0de;border-color:#5bc0de}.btn-outline-info:focus,.btn-outline-info.focus{box-shadow:0 0 0 2px rgba(91,192,222,0.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#5bc0de;background-color:transparent}.btn-outline-info:active,.btn-outline-info.active,.show>.btn-outline-info.dropdown-toggle{color:#fff;background-color:#5bc0de;border-color:#5bc0de}.btn-outline-success{color:#5cb85c;background-image:none;background-color:transparent;border-color:#5cb85c}.btn-outline-success:hover{color:#fff;background-color:#5cb85c;border-color:#5cb85c}.btn-outline-success:focus,.btn-outline-success.focus{box-shadow:0 0 0 2px rgba(92,184,92,0.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#5cb85c;background-color:transparent}.btn-outline-success:active,.btn-outline-success.active,.show>.btn-outline-success.dropdown-toggle{color:#fff;background-color:#5cb85c;border-color:#5cb85c}.btn-outline-warning{color:#f0ad4e;background-image:none;background-color:transparent;border-color:#f0ad4e}.btn-outline-warning:hover{color:#fff;background-color:#f0ad4e;border-color:#f0ad4e}.btn-outline-warning:focus,.btn-outline-warning.focus{box-shadow:0 0 0 2px rgba(240,173,78,0.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#f0ad4e;background-color:transparent}.btn-outline-warning:active,.btn-outline-warning.active,.show>.btn-outline-warning.dropdown-toggle{color:#fff;background-color:#f0ad4e;border-color:#f0ad4e}.btn-outline-danger{color:#d9534f;background-image:none;background-color:transparent;border-color:#d9534f}.btn-outline-danger:hover{color:#fff;background-color:#d9534f;border-color:#d9534f}.btn-outline-danger:focus,.btn-outline-danger.focus{box-shadow:0 0 0 2px rgba(217,83,79,0.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#d9534f;background-color:transparent}.btn-outline-danger:active,.btn-outline-danger.active,.show>.btn-outline-danger.dropdown-toggle{color:#fff;background-color:#d9534f;border-color:#d9534f}.btn-link{font-weight:normal;color:#0275d8;border-radius:0}.btn-link,.btn-link:active,.btn-link.active,.btn-link:disabled{background-color:transparent}.btn-link,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#014c8c;text-decoration:underline;background-color:transparent}.btn-link:disabled{color:#636c72}.btn-link:disabled:focus,.btn-link:disabled:hover{text-decoration:none}.btn-lg,.btn-group-lg>.btn,section.flipflop table tbody tr td.toggle div.toolbar div.group .btn-group-lg>button{padding:0.75rem 1.5rem;font-size:1.25rem;border-radius:0.3rem}.btn-sm,.btn-group-sm>.btn,section.flipflop table tbody tr td.toggle div.toolbar div.group>.btn,section.flipflop table tbody tr td.toggle div.toolbar div.group button{padding:0.25rem 0.5rem;font-size:0.875rem;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%}.btn-group,section.flipflop table tbody tr td.toggle div.toolbar div.group,.btn-group-vertical{position:relative;display:inline-flex;vertical-align:middle}.btn-group>.btn,section.flipflop table tbody tr td.toggle div.toolbar div.group>.btn,section.flipflop table tbody tr td.toggle div.toolbar div.group .btn-group>button,section.flipflop table tbody tr td.toggle div.toolbar div.group>button,.btn-group-vertical>.btn,section.flipflop table tbody tr td.toggle div.toolbar div.group .btn-group-vertical>button{position:relative;flex:0 1 auto}.btn-group>.btn:hover,section.flipflop table tbody tr td.toggle div.toolbar div.group>.btn:hover,section.flipflop table tbody tr td.toggle div.toolbar div.group .btn-group>button:hover,section.flipflop table tbody tr td.toggle div.toolbar div.group>button:hover,.btn-group-vertical>.btn:hover,section.flipflop table tbody tr td.toggle div.toolbar div.group .btn-group-vertical>button:hover{z-index:2}.btn-group>.btn:focus,section.flipflop table tbody tr td.toggle div.toolbar div.group>.btn:focus,section.flipflop table tbody tr td.toggle div.toolbar div.group .btn-group>button:focus,section.flipflop table tbody tr td.toggle div.toolbar div.group>button:focus,.btn-group>.btn:active,section.flipflop table tbody tr td.toggle div.toolbar div.group>.btn:active,section.flipflop table tbody tr td.toggle div.toolbar div.group .btn-group>button:active,section.flipflop table tbody tr td.toggle div.toolbar div.group>button:active,.btn-group>.btn.active,section.flipflop table tbody tr td.toggle div.toolbar div.group>.btn.active,section.flipflop table tbody tr td.toggle div.toolbar div.group .btn-group>button.active,section.flipflop table tbody tr td.toggle div.toolbar div.group>button.active,.btn-group-vertical>.btn:focus,section.flipflop table tbody tr td.toggle div.toolbar div.group .btn-group-vertical>button:focus,.btn-group-vertical>.btn:active,section.flipflop table tbody tr td.toggle div.toolbar div.group .btn-group-vertical>button:active,.btn-group-vertical>.btn.active,section.flipflop table tbody tr td.toggle div.toolbar div.group .btn-group-vertical>button.active{z-index:2}.btn-group .btn+.btn,section.flipflop table tbody tr td.toggle div.toolbar div.group .btn+.btn,section.flipflop table tbody tr td.toggle div.toolbar div.group .btn-group button+.btn,section.flipflop table tbody tr td.toggle div.toolbar div.group button+.btn,section.flipflop table tbody tr td.toggle div.toolbar div.group .btn-group .btn+button,section.flipflop table tbody tr td.toggle div.toolbar div.group .btn+button,section.flipflop table tbody tr td.toggle div.toolbar div.group .btn-group button+button,section.flipflop table tbody tr td.toggle div.toolbar div.group button+button,.btn-group .btn+.btn-group,section.flipflop table tbody tr td.toggle div.toolbar div.group .btn+.btn-group,section.flipflop table tbody tr td.toggle div.toolbar div.group .btn-group button+.btn-group,section.flipflop table tbody tr td.toggle div.toolbar div.group button+.btn-group,.btn-group section.flipflop table tbody tr td.toggle div.toolbar .btn+div.group,section.flipflop table tbody tr td.toggle div.toolbar .btn-group .btn+div.group,section.flipflop table tbody tr td.toggle div.toolbar div.group .btn+div.group,section.flipflop table tbody tr td.toggle div.toolbar div.group .btn-group button+div.group,section.flipflop table tbody tr td.toggle div.toolbar div.group button+div.group,.btn-group .btn-group+.btn,section.flipflop table tbody tr td.toggle div.toolbar div.group .btn-group+.btn,.btn-group section.flipflop table tbody tr td.toggle div.toolbar div.group+.btn,section.flipflop table tbody tr td.toggle div.toolbar .btn-group div.group+.btn,section.flipflop table tbody tr td.toggle div.toolbar div.group div.group+.btn,section.flipflop table tbody tr td.toggle div.toolbar div.group .btn-group .btn-group+button,section.flipflop table tbody tr td.toggle div.toolbar div.group .btn-group+button,section.flipflop table tbody tr td.toggle div.toolbar div.group .btn-group div.group+button,section.flipflop table tbody tr td.toggle div.toolbar div.group div.group+button,.btn-group .btn-group+.btn-group,section.flipflop table tbody tr td.toggle div.toolbar div.group .btn-group+.btn-group,.btn-group section.flipflop table tbody tr td.toggle div.toolbar div.group+.btn-group,section.flipflop table tbody tr td.toggle div.toolbar .btn-group div.group+.btn-group,section.flipflop table tbody tr td.toggle div.toolbar div.group div.group+.btn-group,.btn-group section.flipflop table tbody tr td.toggle div.toolbar .btn-group+div.group,section.flipflop table tbody tr td.toggle div.toolbar .btn-group .btn-group+div.group,section.flipflop table tbody tr td.toggle div.toolbar div.group .btn-group+div.group,.btn-group section.flipflop table tbody tr td.toggle div.toolbar div.group+div.group,section.flipflop table tbody tr td.toggle div.toolbar .btn-group div.group+div.group,section.flipflop table tbody tr td.toggle div.toolbar div.group div.group+div.group,.btn-group-vertical .btn+.btn,.btn-group-vertical section.flipflop table tbody tr td.toggle div.toolbar div.group button+.btn,section.flipflop table tbody tr td.toggle div.toolbar div.group .btn-group-vertical button+.btn,.btn-group-vertical section.flipflop table tbody tr td.toggle div.toolbar div.group .btn+button,section.flipflop table tbody tr td.toggle div.toolbar div.group .btn-group-vertical .btn+button,.btn-group-vertical section.flipflop table tbody tr td.toggle div.toolbar div.group button+button,section.flipflop table tbody tr td.toggle div.toolbar div.group .btn-group-vertical button+button,.btn-group-vertical .btn+.btn-group,.btn-group-vertical section.flipflop table tbody tr td.toggle div.toolbar div.group button+.btn-group,section.flipflop table tbody tr td.toggle div.toolbar div.group .btn-group-vertical button+.btn-group,.btn-group-vertical section.flipflop table tbody tr td.toggle div.toolbar .btn+div.group,section.flipflop table tbody tr td.toggle div.toolbar .btn-group-vertical .btn+div.group,.btn-group-vertical section.flipflop table tbody tr td.toggle div.toolbar div.group button+div.group,section.flipflop table tbody tr td.toggle div.toolbar div.group .btn-group-vertical button+div.group,.btn-group-vertical .btn-group+.btn,.btn-group-vertical section.flipflop table tbody tr td.toggle div.toolbar div.group+.btn,section.flipflop table tbody tr td.toggle div.toolbar .btn-group-vertical div.group+.btn,.btn-group-vertical section.flipflop table tbody tr td.toggle div.toolbar div.group .btn-group+button,section.flipflop table tbody tr td.toggle div.toolbar div.group .btn-group-vertical .btn-group+button,.btn-group-vertical section.flipflop table tbody tr td.toggle div.toolbar div.group div.group+button,section.flipflop table tbody tr td.toggle div.toolbar .btn-group-vertical div.group div.group+button,section.flipflop table tbody tr td.toggle div.toolbar div.group .btn-group-vertical div.group+button,.btn-group-vertical .btn-group+.btn-group,.btn-group-vertical section.flipflop table tbody tr td.toggle div.toolbar div.group+.btn-group,section.flipflop table tbody tr td.toggle div.toolbar .btn-group-vertical div.group+.btn-group,.btn-group-vertical section.flipflop table tbody tr td.toggle div.toolbar .btn-group+div.group,section.flipflop table tbody tr td.toggle div.toolbar .btn-group-vertical .btn-group+div.group,.btn-group-vertical section.flipflop table tbody tr td.toggle div.toolbar div.group+div.group,section.flipflop table tbody tr td.toggle div.toolbar .btn-group-vertical div.group+div.group{margin-left:-1px}.btn-toolbar,section.flipflop table tbody tr td.toggle div.toolbar{display:flex;justify-content:flex-start}.btn-toolbar .input-group,section.flipflop table tbody tr td.toggle div.toolbar .input-group{width:auto}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle),section.flipflop table tbody tr td.toggle div.toolbar div.group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle),section.flipflop table tbody tr td.toggle div.toolbar div.group .btn-group>button:not(:first-child):not(:last-child):not(.dropdown-toggle),section.flipflop table tbody tr td.toggle div.toolbar div.group>button:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child,section.flipflop table tbody tr td.toggle div.toolbar div.group>.btn:first-child,section.flipflop table tbody tr td.toggle div.toolbar div.group .btn-group>button:first-child,section.flipflop table tbody tr td.toggle div.toolbar div.group>button:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle),section.flipflop table tbody tr td.toggle div.toolbar div.group>.btn:first-child:not(:last-child):not(.dropdown-toggle),section.flipflop table tbody tr td.toggle div.toolbar div.group .btn-group>button:first-child:not(:last-child):not(.dropdown-toggle),section.flipflop table tbody tr td.toggle div.toolbar div.group>button:first-child:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn:last-child:not(:first-child),section.flipflop table tbody tr td.toggle div.toolbar div.group>.btn:last-child:not(:first-child),section.flipflop table tbody tr td.toggle div.toolbar div.group .btn-group>button:last-child:not(:first-child),section.flipflop table tbody tr td.toggle div.toolbar div.group>button:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child),section.flipflop table tbody tr td.toggle div.toolbar div.group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.btn-group>.btn-group,section.flipflop table tbody tr td.toggle div.toolbar div.group>.btn-group,section.flipflop table tbody tr td.toggle div.toolbar .btn-group>div.group,section.flipflop table tbody tr td.toggle div.toolbar div.group>div.group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn,section.flipflop table tbody tr td.toggle div.toolbar div.group>.btn-group:not(:first-child):not(:last-child)>.btn,section.flipflop table tbody tr td.toggle div.toolbar .btn-group>div.group:not(:first-child):not(:last-child)>.btn,section.flipflop table tbody tr td.toggle div.toolbar div.group>div.group:not(:first-child):not(:last-child)>.btn,section.flipflop table tbody tr td.toggle div.toolbar div.group .btn-group>.btn-group:not(:first-child):not(:last-child)>button,section.flipflop table tbody tr td.toggle div.toolbar div.group>.btn-group:not(:first-child):not(:last-child)>button,section.flipflop table tbody tr td.toggle div.toolbar .btn-group>div.group:not(:first-child):not(:last-child)>button,section.flipflop table tbody tr td.toggle div.toolbar div.group>div.group:not(:first-child):not(:last-child)>button{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,section.flipflop table tbody tr td.toggle div.toolbar div.group>.btn-group:first-child:not(:last-child)>.btn:last-child,section.flipflop table tbody tr td.toggle div.toolbar .btn-group>div.group:first-child:not(:last-child)>.btn:last-child,section.flipflop table tbody tr td.toggle div.toolbar div.group>div.group:first-child:not(:last-child)>.btn:last-child,section.flipflop table tbody tr td.toggle div.toolbar div.group .btn-group>.btn-group:first-child:not(:last-child)>button:last-child,section.flipflop table tbody tr td.toggle div.toolbar div.group>.btn-group:first-child:not(:last-child)>button:last-child,section.flipflop table tbody tr td.toggle div.toolbar .btn-group>div.group:first-child:not(:last-child)>button:last-child,section.flipflop table tbody tr td.toggle div.toolbar div.group>div.group:first-child:not(:last-child)>button:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle,section.flipflop table tbody tr td.toggle div.toolbar div.group>.btn-group:first-child:not(:last-child)>.dropdown-toggle,section.flipflop table tbody tr td.toggle div.toolbar .btn-group>div.group:first-child:not(:last-child)>.dropdown-toggle,section.flipflop table tbody tr td.toggle div.toolbar div.group>div.group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child,section.flipflop table tbody tr td.toggle div.toolbar div.group>.btn-group:last-child:not(:first-child)>.btn:first-child,section.flipflop table tbody tr td.toggle div.toolbar .btn-group>div.group:last-child:not(:first-child)>.btn:first-child,section.flipflop table tbody tr td.toggle div.toolbar div.group>div.group:last-child:not(:first-child)>.btn:first-child,section.flipflop table tbody tr td.toggle div.toolbar div.group .btn-group>.btn-group:last-child:not(:first-child)>button:first-child,section.flipflop table tbody tr td.toggle div.toolbar div.group>.btn-group:last-child:not(:first-child)>button:first-child,section.flipflop table tbody tr td.toggle div.toolbar .btn-group>div.group:last-child:not(:first-child)>button:first-child,section.flipflop table tbody tr td.toggle div.toolbar div.group>div.group:last-child:not(:first-child)>button:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.btn-group .dropdown-toggle:active,section.flipflop table tbody tr td.toggle div.toolbar div.group .dropdown-toggle:active,.btn-group.open .dropdown-toggle,section.flipflop table tbody tr td.toggle div.toolbar div.open.group .dropdown-toggle{outline:0}.btn+.dropdown-toggle-split,section.flipflop table tbody tr td.toggle div.toolbar div.group button+.dropdown-toggle-split{padding-right:0.75rem;padding-left:0.75rem}.btn+.dropdown-toggle-split::after,section.flipflop table tbody tr td.toggle div.toolbar div.group button+.dropdown-toggle-split::after{margin-left:0}.btn-sm+.dropdown-toggle-split,.btn-group-sm>.btn+.dropdown-toggle-split,section.flipflop table tbody tr td.toggle div.toolbar div.group>.btn+.dropdown-toggle-split,section.flipflop table tbody tr td.toggle div.toolbar div.group .btn-group-sm>button+.dropdown-toggle-split,section.flipflop table tbody tr td.toggle div.toolbar div.group button+.dropdown-toggle-split{padding-right:0.375rem;padding-left:0.375rem}.btn-lg+.dropdown-toggle-split,.btn-group-lg>.btn+.dropdown-toggle-split,section.flipflop table tbody tr td.toggle div.toolbar div.group .btn-group-lg>button+.dropdown-toggle-split{padding-right:1.125rem;padding-left:1.125rem}.btn-group-vertical{display:inline-flex;flex-direction:column;align-items:flex-start;justify-content:center}.btn-group-vertical .btn,.btn-group-vertical section.flipflop table tbody tr td.toggle div.toolbar div.group button,section.flipflop table tbody tr td.toggle div.toolbar div.group .btn-group-vertical button,.btn-group-vertical .btn-group,.btn-group-vertical section.flipflop table tbody tr td.toggle div.toolbar div.group,section.flipflop table tbody tr td.toggle div.toolbar .btn-group-vertical div.group{width:100%}.btn-group-vertical>.btn+.btn,section.flipflop table tbody tr td.toggle div.toolbar div.group .btn-group-vertical>button+.btn,section.flipflop table tbody tr td.toggle div.toolbar div.group .btn-group-vertical>.btn+button,section.flipflop table tbody tr td.toggle div.toolbar div.group .btn-group-vertical>button+button,.btn-group-vertical>.btn+.btn-group,section.flipflop table tbody tr td.toggle div.toolbar div.group .btn-group-vertical>button+.btn-group,section.flipflop table tbody tr td.toggle div.toolbar .btn-group-vertical>.btn+div.group,section.flipflop table tbody tr td.toggle div.toolbar div.group .btn-group-vertical>button+div.group,.btn-group-vertical>.btn-group+.btn,section.flipflop table tbody tr td.toggle div.toolbar .btn-group-vertical>div.group+.btn,section.flipflop table tbody tr td.toggle div.toolbar div.group .btn-group-vertical>.btn-group+button,section.flipflop table tbody tr td.toggle div.toolbar div.group .btn-group-vertical>div.group+button,.btn-group-vertical>.btn-group+.btn-group,section.flipflop table tbody tr td.toggle div.toolbar .btn-group-vertical>div.group+.btn-group,section.flipflop table tbody tr td.toggle div.toolbar .btn-group-vertical>.btn-group+div.group,section.flipflop table tbody tr td.toggle div.toolbar .btn-group-vertical>div.group+div.group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child),section.flipflop table tbody tr td.toggle div.toolbar div.group .btn-group-vertical>button:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child),section.flipflop table tbody tr td.toggle div.toolbar div.group .btn-group-vertical>button:first-child:not(:last-child){border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child),section.flipflop table tbody tr td.toggle div.toolbar div.group .btn-group-vertical>button:last-child:not(:first-child){border-top-right-radius:0;border-top-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn,section.flipflop table tbody tr td.toggle div.toolbar .btn-group-vertical>div.group:not(:first-child):not(:last-child)>.btn,section.flipflop table tbody tr td.toggle div.toolbar div.group .btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>button,section.flipflop table tbody tr td.toggle div.toolbar .btn-group-vertical>div.group:not(:first-child):not(:last-child)>button{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,section.flipflop table tbody tr td.toggle div.toolbar .btn-group-vertical>div.group:first-child:not(:last-child)>.btn:last-child,section.flipflop table tbody tr td.toggle div.toolbar div.group .btn-group-vertical>.btn-group:first-child:not(:last-child)>button:last-child,section.flipflop table tbody tr td.toggle div.toolbar .btn-group-vertical>div.group:first-child:not(:last-child)>button:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle,section.flipflop table tbody tr td.toggle div.toolbar .btn-group-vertical>div.group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child,section.flipflop table tbody tr td.toggle div.toolbar .btn-group-vertical>div.group:last-child:not(:first-child)>.btn:first-child,section.flipflop table tbody tr td.toggle div.toolbar div.group .btn-group-vertical>.btn-group:last-child:not(:first-child)>button:first-child,section.flipflop table tbody tr td.toggle div.toolbar .btn-group-vertical>div.group:last-child:not(:first-child)>button:first-child{border-top-right-radius:0;border-top-left-radius:0}[data-toggle="buttons"]>.btn input[type="radio"],section.flipflop table tbody tr td.toggle div.toolbar div.group [data-toggle="buttons"]>button input[type="radio"],[data-toggle="buttons"]>.btn input[type="checkbox"],section.flipflop table tbody tr td.toggle div.toolbar div.group [data-toggle="buttons"]>button input[type="checkbox"],[data-toggle="buttons"]>.btn-group>.btn input[type="radio"],section.flipflop table tbody tr td.toggle div.toolbar [data-toggle="buttons"]>div.group>.btn input[type="radio"],section.flipflop table tbody tr td.toggle div.toolbar div.group [data-toggle="buttons"]>.btn-group>button input[type="radio"],section.flipflop table tbody tr td.toggle div.toolbar [data-toggle="buttons"]>div.group>button input[type="radio"],[data-toggle="buttons"]>.btn-group>.btn input[type="checkbox"],section.flipflop table tbody tr td.toggle div.toolbar [data-toggle="buttons"]>div.group>.btn input[type="checkbox"],section.flipflop table tbody tr td.toggle div.toolbar div.group [data-toggle="buttons"]>.btn-group>button input[type="checkbox"],section.flipflop table tbody tr td.toggle div.toolbar [data-toggle="buttons"]>div.group>button input[type="checkbox"]{position:absolute;clip:rect(0, 0, 0, 0);pointer-events:none}.badge,section.flipflop table tbody tr td.status span.enabled,section.flipflop table tbody tr td.status span.disabled{display:inline-block;padding:0.25em 0.4em;font-size:75%;font-weight:bold;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:0.25rem}.badge:empty,section.flipflop table tbody tr td.status span.enabled:empty,section.flipflop table tbody tr td.status span.disabled:empty{display:none}.btn .badge,section.flipflop table tbody tr td.toggle div.toolbar div.group button .badge,.btn section.flipflop table tbody tr td.status span.enabled,section.flipflop table tbody tr td.status .btn span.enabled,section.flipflop table tbody tr td.toggle div.toolbar div.group button td.status span.enabled,section.flipflop table tbody tr td.status td.toggle div.toolbar div.group button span.enabled,.btn section.flipflop table tbody tr td.status span.disabled,section.flipflop table tbody tr td.status .btn span.disabled,section.flipflop table tbody tr td.toggle div.toolbar div.group button td.status span.disabled,section.flipflop table tbody tr td.status td.toggle div.toolbar div.group button span.disabled{position:relative;top:-1px}a.badge:focus,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.badge-pill,section.flipflop table tbody tr td.status span.enabled,section.flipflop table tbody tr td.status span.disabled{padding-right:0.6em;padding-left:0.6em;border-radius:10rem}.badge-default,section.flipflop table tbody tr td.status span.disabled{background-color:#636c72}.badge-default[href]:focus,section.flipflop table tbody tr td.status span[href].disabled:focus,.badge-default[href]:hover,section.flipflop table tbody tr td.status span[href].disabled:hover{background-color:#4b5257}.badge-primary{background-color:#0275d8}.badge-primary[href]:focus,.badge-primary[href]:hover{background-color:#025aa5}.badge-success,section.flipflop table tbody tr td.status span.enabled{background-color:#5cb85c}.badge-success[href]:focus,section.flipflop table tbody tr td.status span[href].enabled:focus,.badge-success[href]:hover,section.flipflop table tbody tr td.status span[href].enabled:hover{background-color:#449d44}.badge-info{background-color:#5bc0de}.badge-info[href]:focus,.badge-info[href]:hover{background-color:#31b0d5}.badge-warning{background-color:#f0ad4e}.badge-warning[href]:focus,.badge-warning[href]:hover{background-color:#ec971f}.badge-danger{background-color:#d9534f}.badge-danger[href]:focus,.badge-danger[href]:hover{background-color:#c9302c}.m-0{margin:0 0 !important}.mt-0{margin-top:0 !important}.mr-0{margin-right:0 !important}.mb-0{margin-bottom:0 !important}.ml-0{margin-left:0 !important}.mx-0{margin-right:0 !important;margin-left:0 !important}.my-0{margin-top:0 !important;margin-bottom:0 !important}.m-1{margin:0.25rem 0.25rem !important}.mt-1{margin-top:0.25rem !important}.mr-1{margin-right:0.25rem !important}.mb-1{margin-bottom:0.25rem !important}.ml-1{margin-left:0.25rem !important}.mx-1{margin-right:0.25rem !important;margin-left:0.25rem !important}.my-1{margin-top:0.25rem !important;margin-bottom:0.25rem !important}.m-2{margin:0.5rem 0.5rem !important}.mt-2{margin-top:0.5rem !important}.mr-2,section.flipflop table tbody tr td.toggle div.toolbar div.group{margin-right:0.5rem !important}.mb-2{margin-bottom:0.5rem !important}.ml-2{margin-left:0.5rem !important}.mx-2{margin-right:0.5rem !important;margin-left:0.5rem !important}.my-2{margin-top:0.5rem !important;margin-bottom:0.5rem !important}.m-3{margin:1rem 1rem !important}.mt-3{margin-top:1rem !important}.mr-3{margin-right:1rem !important}.mb-3{margin-bottom:1rem !important}.ml-3{margin-left:1rem !important}.mx-3{margin-right:1rem !important;margin-left:1rem !important}.my-3{margin-top:1rem !important;margin-bottom:1rem !important}.m-4{margin:1.5rem 1.5rem !important}.mt-4{margin-top:1.5rem !important}.mr-4{margin-right:1.5rem !important}.mb-4{margin-bottom:1.5rem !important}.ml-4{margin-left:1.5rem !important}.mx-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.my-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.m-5{margin:3rem 3rem !important}.mt-5{margin-top:3rem !important}.mr-5{margin-right:3rem !important}.mb-5{margin-bottom:3rem !important}.ml-5{margin-left:3rem !important}.mx-5{margin-right:3rem !important;margin-left:3rem !important}.my-5{margin-top:3rem !important;margin-bottom:3rem !important}.p-0{padding:0 0 !important}.pt-0{padding-top:0 !important}.pr-0{padding-right:0 !important}.pb-0{padding-bottom:0 !important}.pl-0{padding-left:0 !important}.px-0{padding-right:0 !important;padding-left:0 !important}.py-0{padding-top:0 !important;padding-bottom:0 !important}.p-1{padding:0.25rem 0.25rem !important}.pt-1{padding-top:0.25rem !important}.pr-1{padding-right:0.25rem !important}.pb-1{padding-bottom:0.25rem !important}.pl-1{padding-left:0.25rem !important}.px-1{padding-right:0.25rem !important;padding-left:0.25rem !important}.py-1{padding-top:0.25rem !important;padding-bottom:0.25rem !important}.p-2{padding:0.5rem 0.5rem !important}.pt-2{padding-top:0.5rem !important}.pr-2{padding-right:0.5rem !important}.pb-2{padding-bottom:0.5rem !important}.pl-2{padding-left:0.5rem !important}.px-2{padding-right:0.5rem !important;padding-left:0.5rem !important}.py-2{padding-top:0.5rem !important;padding-bottom:0.5rem !important}.p-3{padding:1rem 1rem !important}.pt-3{padding-top:1rem !important}.pr-3{padding-right:1rem !important}.pb-3{padding-bottom:1rem !important}.pl-3{padding-left:1rem !important}.px-3{padding-right:1rem !important;padding-left:1rem !important}.py-3{padding-top:1rem !important;padding-bottom:1rem !important}.p-4{padding:1.5rem 1.5rem !important}.pt-4{padding-top:1.5rem !important}.pr-4{padding-right:1.5rem !important}.pb-4{padding-bottom:1.5rem !important}.pl-4{padding-left:1.5rem !important}.px-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.py-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.p-5{padding:3rem 3rem !important}.pt-5{padding-top:3rem !important}.pr-5{padding-right:3rem !important}.pb-5{padding-bottom:3rem !important}.pl-5{padding-left:3rem !important}.px-5{padding-right:3rem !important;padding-left:3rem !important}.py-5{padding-top:3rem !important;padding-bottom:3rem !important}.m-auto{margin:auto !important}.mt-auto{margin-top:auto !important}.mr-auto{margin-right:auto !important}.mb-auto{margin-bottom:auto !important}.ml-auto{margin-left:auto !important}.mx-auto{margin-right:auto !important;margin-left:auto !important}.my-auto{margin-top:auto !important;margin-bottom:auto !important}@media (min-width: 576px){.m-sm-0{margin:0 0 !important}.mt-sm-0{margin-top:0 !important}.mr-sm-0{margin-right:0 !important}.mb-sm-0{margin-bottom:0 !important}.ml-sm-0{margin-left:0 !important}.mx-sm-0{margin-right:0 !important;margin-left:0 !important}.my-sm-0{margin-top:0 !important;margin-bottom:0 !important}.m-sm-1{margin:0.25rem 0.25rem !important}.mt-sm-1{margin-top:0.25rem !important}.mr-sm-1{margin-right:0.25rem !important}.mb-sm-1{margin-bottom:0.25rem !important}.ml-sm-1{margin-left:0.25rem !important}.mx-sm-1{margin-right:0.25rem !important;margin-left:0.25rem !important}.my-sm-1{margin-top:0.25rem !important;margin-bottom:0.25rem !important}.m-sm-2{margin:0.5rem 0.5rem !important}.mt-sm-2{margin-top:0.5rem !important}.mr-sm-2{margin-right:0.5rem !important}.mb-sm-2{margin-bottom:0.5rem !important}.ml-sm-2{margin-left:0.5rem !important}.mx-sm-2{margin-right:0.5rem !important;margin-left:0.5rem !important}.my-sm-2{margin-top:0.5rem !important;margin-bottom:0.5rem !important}.m-sm-3{margin:1rem 1rem !important}.mt-sm-3{margin-top:1rem !important}.mr-sm-3{margin-right:1rem !important}.mb-sm-3{margin-bottom:1rem !important}.ml-sm-3{margin-left:1rem !important}.mx-sm-3{margin-right:1rem !important;margin-left:1rem !important}.my-sm-3{margin-top:1rem !important;margin-bottom:1rem !important}.m-sm-4{margin:1.5rem 1.5rem !important}.mt-sm-4{margin-top:1.5rem !important}.mr-sm-4{margin-right:1.5rem !important}.mb-sm-4{margin-bottom:1.5rem !important}.ml-sm-4{margin-left:1.5rem !important}.mx-sm-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.my-sm-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.m-sm-5{margin:3rem 3rem !important}.mt-sm-5{margin-top:3rem !important}.mr-sm-5{margin-right:3rem !important}.mb-sm-5{margin-bottom:3rem !important}.ml-sm-5{margin-left:3rem !important}.mx-sm-5{margin-right:3rem !important;margin-left:3rem !important}.my-sm-5{margin-top:3rem !important;margin-bottom:3rem !important}.p-sm-0{padding:0 0 !important}.pt-sm-0{padding-top:0 !important}.pr-sm-0{padding-right:0 !important}.pb-sm-0{padding-bottom:0 !important}.pl-sm-0{padding-left:0 !important}.px-sm-0{padding-right:0 !important;padding-left:0 !important}.py-sm-0{padding-top:0 !important;padding-bottom:0 !important}.p-sm-1{padding:0.25rem 0.25rem !important}.pt-sm-1{padding-top:0.25rem !important}.pr-sm-1{padding-right:0.25rem !important}.pb-sm-1{padding-bottom:0.25rem !important}.pl-sm-1{padding-left:0.25rem !important}.px-sm-1{padding-right:0.25rem !important;padding-left:0.25rem !important}.py-sm-1{padding-top:0.25rem !important;padding-bottom:0.25rem !important}.p-sm-2{padding:0.5rem 0.5rem !important}.pt-sm-2{padding-top:0.5rem !important}.pr-sm-2{padding-right:0.5rem !important}.pb-sm-2{padding-bottom:0.5rem !important}.pl-sm-2{padding-left:0.5rem !important}.px-sm-2{padding-right:0.5rem !important;padding-left:0.5rem !important}.py-sm-2{padding-top:0.5rem !important;padding-bottom:0.5rem !important}.p-sm-3{padding:1rem 1rem !important}.pt-sm-3{padding-top:1rem !important}.pr-sm-3{padding-right:1rem !important}.pb-sm-3{padding-bottom:1rem !important}.pl-sm-3{padding-left:1rem !important}.px-sm-3{padding-right:1rem !important;padding-left:1rem !important}.py-sm-3{padding-top:1rem !important;padding-bottom:1rem !important}.p-sm-4{padding:1.5rem 1.5rem !important}.pt-sm-4{padding-top:1.5rem !important}.pr-sm-4{padding-right:1.5rem !important}.pb-sm-4{padding-bottom:1.5rem !important}.pl-sm-4{padding-left:1.5rem !important}.px-sm-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.py-sm-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.p-sm-5{padding:3rem 3rem !important}.pt-sm-5{padding-top:3rem !important}.pr-sm-5{padding-right:3rem !important}.pb-sm-5{padding-bottom:3rem !important}.pl-sm-5{padding-left:3rem !important}.px-sm-5{padding-right:3rem !important;padding-left:3rem !important}.py-sm-5{padding-top:3rem !important;padding-bottom:3rem !important}.m-sm-auto{margin:auto !important}.mt-sm-auto{margin-top:auto !important}.mr-sm-auto{margin-right:auto !important}.mb-sm-auto{margin-bottom:auto !important}.ml-sm-auto{margin-left:auto !important}.mx-sm-auto{margin-right:auto !important;margin-left:auto !important}.my-sm-auto{margin-top:auto !important;margin-bottom:auto !important}}@media (min-width: 768px){.m-md-0{margin:0 0 !important}.mt-md-0{margin-top:0 !important}.mr-md-0{margin-right:0 !important}.mb-md-0{margin-bottom:0 !important}.ml-md-0{margin-left:0 !important}.mx-md-0{margin-right:0 !important;margin-left:0 !important}.my-md-0{margin-top:0 !important;margin-bottom:0 !important}.m-md-1{margin:0.25rem 0.25rem !important}.mt-md-1{margin-top:0.25rem !important}.mr-md-1{margin-right:0.25rem !important}.mb-md-1{margin-bottom:0.25rem !important}.ml-md-1{margin-left:0.25rem !important}.mx-md-1{margin-right:0.25rem !important;margin-left:0.25rem !important}.my-md-1{margin-top:0.25rem !important;margin-bottom:0.25rem !important}.m-md-2{margin:0.5rem 0.5rem !important}.mt-md-2{margin-top:0.5rem !important}.mr-md-2{margin-right:0.5rem !important}.mb-md-2{margin-bottom:0.5rem !important}.ml-md-2{margin-left:0.5rem !important}.mx-md-2{margin-right:0.5rem !important;margin-left:0.5rem !important}.my-md-2{margin-top:0.5rem !important;margin-bottom:0.5rem !important}.m-md-3{margin:1rem 1rem !important}.mt-md-3{margin-top:1rem !important}.mr-md-3{margin-right:1rem !important}.mb-md-3{margin-bottom:1rem !important}.ml-md-3{margin-left:1rem !important}.mx-md-3{margin-right:1rem !important;margin-left:1rem !important}.my-md-3{margin-top:1rem !important;margin-bottom:1rem !important}.m-md-4{margin:1.5rem 1.5rem !important}.mt-md-4{margin-top:1.5rem !important}.mr-md-4{margin-right:1.5rem !important}.mb-md-4{margin-bottom:1.5rem !important}.ml-md-4{margin-left:1.5rem !important}.mx-md-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.my-md-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.m-md-5{margin:3rem 3rem !important}.mt-md-5{margin-top:3rem !important}.mr-md-5{margin-right:3rem !important}.mb-md-5{margin-bottom:3rem !important}.ml-md-5{margin-left:3rem !important}.mx-md-5{margin-right:3rem !important;margin-left:3rem !important}.my-md-5{margin-top:3rem !important;margin-bottom:3rem !important}.p-md-0{padding:0 0 !important}.pt-md-0{padding-top:0 !important}.pr-md-0{padding-right:0 !important}.pb-md-0{padding-bottom:0 !important}.pl-md-0{padding-left:0 !important}.px-md-0{padding-right:0 !important;padding-left:0 !important}.py-md-0{padding-top:0 !important;padding-bottom:0 !important}.p-md-1{padding:0.25rem 0.25rem !important}.pt-md-1{padding-top:0.25rem !important}.pr-md-1{padding-right:0.25rem !important}.pb-md-1{padding-bottom:0.25rem !important}.pl-md-1{padding-left:0.25rem !important}.px-md-1{padding-right:0.25rem !important;padding-left:0.25rem !important}.py-md-1{padding-top:0.25rem !important;padding-bottom:0.25rem !important}.p-md-2{padding:0.5rem 0.5rem !important}.pt-md-2{padding-top:0.5rem !important}.pr-md-2{padding-right:0.5rem !important}.pb-md-2{padding-bottom:0.5rem !important}.pl-md-2{padding-left:0.5rem !important}.px-md-2{padding-right:0.5rem !important;padding-left:0.5rem !important}.py-md-2{padding-top:0.5rem !important;padding-bottom:0.5rem !important}.p-md-3{padding:1rem 1rem !important}.pt-md-3{padding-top:1rem !important}.pr-md-3{padding-right:1rem !important}.pb-md-3{padding-bottom:1rem !important}.pl-md-3{padding-left:1rem !important}.px-md-3{padding-right:1rem !important;padding-left:1rem !important}.py-md-3{padding-top:1rem !important;padding-bottom:1rem !important}.p-md-4{padding:1.5rem 1.5rem !important}.pt-md-4{padding-top:1.5rem !important}.pr-md-4{padding-right:1.5rem !important}.pb-md-4{padding-bottom:1.5rem !important}.pl-md-4{padding-left:1.5rem !important}.px-md-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.py-md-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.p-md-5{padding:3rem 3rem !important}.pt-md-5{padding-top:3rem !important}.pr-md-5{padding-right:3rem !important}.pb-md-5{padding-bottom:3rem !important}.pl-md-5{padding-left:3rem !important}.px-md-5{padding-right:3rem !important;padding-left:3rem !important}.py-md-5{padding-top:3rem !important;padding-bottom:3rem !important}.m-md-auto{margin:auto !important}.mt-md-auto{margin-top:auto !important}.mr-md-auto{margin-right:auto !important}.mb-md-auto{margin-bottom:auto !important}.ml-md-auto{margin-left:auto !important}.mx-md-auto{margin-right:auto !important;margin-left:auto !important}.my-md-auto{margin-top:auto !important;margin-bottom:auto !important}}@media (min-width: 992px){.m-lg-0{margin:0 0 !important}.mt-lg-0{margin-top:0 !important}.mr-lg-0{margin-right:0 !important}.mb-lg-0{margin-bottom:0 !important}.ml-lg-0{margin-left:0 !important}.mx-lg-0{margin-right:0 !important;margin-left:0 !important}.my-lg-0{margin-top:0 !important;margin-bottom:0 !important}.m-lg-1{margin:0.25rem 0.25rem !important}.mt-lg-1{margin-top:0.25rem !important}.mr-lg-1{margin-right:0.25rem !important}.mb-lg-1{margin-bottom:0.25rem !important}.ml-lg-1{margin-left:0.25rem !important}.mx-lg-1{margin-right:0.25rem !important;margin-left:0.25rem !important}.my-lg-1{margin-top:0.25rem !important;margin-bottom:0.25rem !important}.m-lg-2{margin:0.5rem 0.5rem !important}.mt-lg-2{margin-top:0.5rem !important}.mr-lg-2{margin-right:0.5rem !important}.mb-lg-2{margin-bottom:0.5rem !important}.ml-lg-2{margin-left:0.5rem !important}.mx-lg-2{margin-right:0.5rem !important;margin-left:0.5rem !important}.my-lg-2{margin-top:0.5rem !important;margin-bottom:0.5rem !important}.m-lg-3{margin:1rem 1rem !important}.mt-lg-3{margin-top:1rem !important}.mr-lg-3{margin-right:1rem !important}.mb-lg-3{margin-bottom:1rem !important}.ml-lg-3{margin-left:1rem !important}.mx-lg-3{margin-right:1rem !important;margin-left:1rem !important}.my-lg-3{margin-top:1rem !important;margin-bottom:1rem !important}.m-lg-4{margin:1.5rem 1.5rem !important}.mt-lg-4{margin-top:1.5rem !important}.mr-lg-4{margin-right:1.5rem !important}.mb-lg-4{margin-bottom:1.5rem !important}.ml-lg-4{margin-left:1.5rem !important}.mx-lg-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.my-lg-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.m-lg-5{margin:3rem 3rem !important}.mt-lg-5{margin-top:3rem !important}.mr-lg-5{margin-right:3rem !important}.mb-lg-5{margin-bottom:3rem !important}.ml-lg-5{margin-left:3rem !important}.mx-lg-5{margin-right:3rem !important;margin-left:3rem !important}.my-lg-5{margin-top:3rem !important;margin-bottom:3rem !important}.p-lg-0{padding:0 0 !important}.pt-lg-0{padding-top:0 !important}.pr-lg-0{padding-right:0 !important}.pb-lg-0{padding-bottom:0 !important}.pl-lg-0{padding-left:0 !important}.px-lg-0{padding-right:0 !important;padding-left:0 !important}.py-lg-0{padding-top:0 !important;padding-bottom:0 !important}.p-lg-1{padding:0.25rem 0.25rem !important}.pt-lg-1{padding-top:0.25rem !important}.pr-lg-1{padding-right:0.25rem !important}.pb-lg-1{padding-bottom:0.25rem !important}.pl-lg-1{padding-left:0.25rem !important}.px-lg-1{padding-right:0.25rem !important;padding-left:0.25rem !important}.py-lg-1{padding-top:0.25rem !important;padding-bottom:0.25rem !important}.p-lg-2{padding:0.5rem 0.5rem !important}.pt-lg-2{padding-top:0.5rem !important}.pr-lg-2{padding-right:0.5rem !important}.pb-lg-2{padding-bottom:0.5rem !important}.pl-lg-2{padding-left:0.5rem !important}.px-lg-2{padding-right:0.5rem !important;padding-left:0.5rem !important}.py-lg-2{padding-top:0.5rem !important;padding-bottom:0.5rem !important}.p-lg-3{padding:1rem 1rem !important}.pt-lg-3{padding-top:1rem !important}.pr-lg-3{padding-right:1rem !important}.pb-lg-3{padding-bottom:1rem !important}.pl-lg-3{padding-left:1rem !important}.px-lg-3{padding-right:1rem !important;padding-left:1rem !important}.py-lg-3{padding-top:1rem !important;padding-bottom:1rem !important}.p-lg-4{padding:1.5rem 1.5rem !important}.pt-lg-4{padding-top:1.5rem !important}.pr-lg-4{padding-right:1.5rem !important}.pb-lg-4{padding-bottom:1.5rem !important}.pl-lg-4{padding-left:1.5rem !important}.px-lg-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.py-lg-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.p-lg-5{padding:3rem 3rem !important}.pt-lg-5{padding-top:3rem !important}.pr-lg-5{padding-right:3rem !important}.pb-lg-5{padding-bottom:3rem !important}.pl-lg-5{padding-left:3rem !important}.px-lg-5{padding-right:3rem !important;padding-left:3rem !important}.py-lg-5{padding-top:3rem !important;padding-bottom:3rem !important}.m-lg-auto{margin:auto !important}.mt-lg-auto{margin-top:auto !important}.mr-lg-auto{margin-right:auto !important}.mb-lg-auto{margin-bottom:auto !important}.ml-lg-auto{margin-left:auto !important}.mx-lg-auto{margin-right:auto !important;margin-left:auto !important}.my-lg-auto{margin-top:auto !important;margin-bottom:auto !important}}@media (min-width: 1200px){.m-xl-0{margin:0 0 !important}.mt-xl-0{margin-top:0 !important}.mr-xl-0{margin-right:0 !important}.mb-xl-0{margin-bottom:0 !important}.ml-xl-0{margin-left:0 !important}.mx-xl-0{margin-right:0 !important;margin-left:0 !important}.my-xl-0{margin-top:0 !important;margin-bottom:0 !important}.m-xl-1{margin:0.25rem 0.25rem !important}.mt-xl-1{margin-top:0.25rem !important}.mr-xl-1{margin-right:0.25rem !important}.mb-xl-1{margin-bottom:0.25rem !important}.ml-xl-1{margin-left:0.25rem !important}.mx-xl-1{margin-right:0.25rem !important;margin-left:0.25rem !important}.my-xl-1{margin-top:0.25rem !important;margin-bottom:0.25rem !important}.m-xl-2{margin:0.5rem 0.5rem !important}.mt-xl-2{margin-top:0.5rem !important}.mr-xl-2{margin-right:0.5rem !important}.mb-xl-2{margin-bottom:0.5rem !important}.ml-xl-2{margin-left:0.5rem !important}.mx-xl-2{margin-right:0.5rem !important;margin-left:0.5rem !important}.my-xl-2{margin-top:0.5rem !important;margin-bottom:0.5rem !important}.m-xl-3{margin:1rem 1rem !important}.mt-xl-3{margin-top:1rem !important}.mr-xl-3{margin-right:1rem !important}.mb-xl-3{margin-bottom:1rem !important}.ml-xl-3{margin-left:1rem !important}.mx-xl-3{margin-right:1rem !important;margin-left:1rem !important}.my-xl-3{margin-top:1rem !important;margin-bottom:1rem !important}.m-xl-4{margin:1.5rem 1.5rem !important}.mt-xl-4{margin-top:1.5rem !important}.mr-xl-4{margin-right:1.5rem !important}.mb-xl-4{margin-bottom:1.5rem !important}.ml-xl-4{margin-left:1.5rem !important}.mx-xl-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.my-xl-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.m-xl-5{margin:3rem 3rem !important}.mt-xl-5{margin-top:3rem !important}.mr-xl-5{margin-right:3rem !important}.mb-xl-5{margin-bottom:3rem !important}.ml-xl-5{margin-left:3rem !important}.mx-xl-5{margin-right:3rem !important;margin-left:3rem !important}.my-xl-5{margin-top:3rem !important;margin-bottom:3rem !important}.p-xl-0{padding:0 0 !important}.pt-xl-0{padding-top:0 !important}.pr-xl-0{padding-right:0 !important}.pb-xl-0{padding-bottom:0 !important}.pl-xl-0{padding-left:0 !important}.px-xl-0{padding-right:0 !important;padding-left:0 !important}.py-xl-0{padding-top:0 !important;padding-bottom:0 !important}.p-xl-1{padding:0.25rem 0.25rem !important}.pt-xl-1{padding-top:0.25rem !important}.pr-xl-1{padding-right:0.25rem !important}.pb-xl-1{padding-bottom:0.25rem !important}.pl-xl-1{padding-left:0.25rem !important}.px-xl-1{padding-right:0.25rem !important;padding-left:0.25rem !important}.py-xl-1{padding-top:0.25rem !important;padding-bottom:0.25rem !important}.p-xl-2{padding:0.5rem 0.5rem !important}.pt-xl-2{padding-top:0.5rem !important}.pr-xl-2{padding-right:0.5rem !important}.pb-xl-2{padding-bottom:0.5rem !important}.pl-xl-2{padding-left:0.5rem !important}.px-xl-2{padding-right:0.5rem !important;padding-left:0.5rem !important}.py-xl-2{padding-top:0.5rem !important;padding-bottom:0.5rem !important}.p-xl-3{padding:1rem 1rem !important}.pt-xl-3{padding-top:1rem !important}.pr-xl-3{padding-right:1rem !important}.pb-xl-3{padding-bottom:1rem !important}.pl-xl-3{padding-left:1rem !important}.px-xl-3{padding-right:1rem !important;padding-left:1rem !important}.py-xl-3{padding-top:1rem !important;padding-bottom:1rem !important}.p-xl-4{padding:1.5rem 1.5rem !important}.pt-xl-4{padding-top:1.5rem !important}.pr-xl-4{padding-right:1.5rem !important}.pb-xl-4{padding-bottom:1.5rem !important}.pl-xl-4{padding-left:1.5rem !important}.px-xl-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.py-xl-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.p-xl-5{padding:3rem 3rem !important}.pt-xl-5{padding-top:3rem !important}.pr-xl-5{padding-right:3rem !important}.pb-xl-5{padding-bottom:3rem !important}.pl-xl-5{padding-left:3rem !important}.px-xl-5{padding-right:3rem !important;padding-left:3rem !important}.py-xl-5{padding-top:3rem !important;padding-bottom:3rem !important}.m-xl-auto{margin:auto !important}.mt-xl-auto{margin-top:auto !important}.mr-xl-auto{margin-right:auto !important}.mb-xl-auto{margin-bottom:auto !important}.ml-xl-auto{margin-left:auto !important}.mx-xl-auto{margin-right:auto !important;margin-left:auto !important}.my-xl-auto{margin-top:auto !important;margin-bottom:auto !important}}section.flipflop{position:relative;margin-left:auto;margin-right:auto;padding-right:0;padding-left:0;margin:5rem 0 0}@media (min-width: 576px){section.flipflop{padding-right:0;padding-left:0}}@media (min-width: 768px){section.flipflop{padding-right:0;padding-left:0}}@media (min-width: 992px){section.flipflop{padding-right:0;padding-left:0}}@media (min-width: 1200px){section.flipflop{padding-right:0;padding-left:0}}section.flipflop h1{padding:0 1.4rem}section.flipflop table td:first-child{padding-left:1.5rem}section.flipflop table td:last-child{padding-right:1.5rem}section.flipflop table thead tr th{position:relative;cursor:default}section.flipflop table thead tr th[data-tooltip]:before,section.flipflop table thead tr th[data-tooltip]:after{transition:all 0.2s ease-out;transform:translateY(0.2rem) translateZ(0);opacity:0;display:block;position:absolute}section.flipflop table thead tr th[data-tooltip]:before{content:attr(data-tooltip);width:98%;left:0;bottom:3.75rem;margin:0;padding:0.5rem 0.75rem;background:#464a4c;border-radius:0.2rem;font-size:0.875rem;font-weight:normal;pointer-events:none}section.flipflop table thead tr th[data-tooltip]:after{content:" ";width:0;height:0;left:1rem;bottom:3.25rem;border-left:solid transparent 0.5rem;border-right:solid transparent 0.5rem;border-top:solid #464a4c 0.5rem}section.flipflop table thead tr th:hover[data-tooltip]:before,section.flipflop table thead tr th:hover[data-tooltip]:after{transform:translateY(0) translateZ(0);opacity:1}section.flipflop table tbody tr td.status{width:2.2rem;font-size:1.1rem}section.flipflop table tbody tr td.status span.enabled,section.flipflop table tbody tr td.status span.disabled{width:2rem}section.flipflop table tbody tr td.status span.enabled span,section.flipflop table tbody tr td.status span.disabled span{width:auto;text-align:center;margin:0 -2rem}section.flipflop table tbody tr td.name{min-width:12rem;padding-top:0.9rem;font-weight:bold}section.flipflop table tbody tr td.description{min-width:12rem;padding-top:0.9rem}section.flipflop table tbody tr td.toggle{min-width:10rem}section.flipflop table tbody tr td.toggle div.toolbar{margin-left:0}section.flipflop table tbody tr td.toggle div.toolbar div.group button{cursor:pointer}section.flipflop table tbody tr.group{background-color:rgba(0,0,0,0.05)}section.flipflop table tbody tr.group td h2{margin:0;line-height:inherit;font-size:1.4rem;font-weight:bold}
@@ -1 +1,8 @@
1
- <!doctype html><head><title></title><%= stylesheet_link_tag :flipflop -%></head><body><%= yield %></body>
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title><%= yield :title -%></title>
5
+ <style><%= render partial: "flipflop/stylesheets/flipflop.css" %></style>
6
+ </head>
7
+ <body><%= yield -%></body>
8
+ </html>
@@ -0,0 +1,7 @@
1
+ Flipflop.configure do
2
+ strategy :cookie
3
+ strategy :active_record
4
+ strategy :default
5
+
6
+ feature :application_feature
7
+ end