[tor-commits] [tpo/staging] Update assets

emmapeel at torproject.org emmapeel at torproject.org
Wed Jul 31 09:57:28 UTC 2019


commit 253ab2fc0b693ee7e1cc8143c2f3b16c0a177f85
Author: hiro <hiro at torproject.org>
Date:   Tue Jun 25 14:30:50 2019 +0200

    Update assets
---
 assets/javascript                             |    1 +
 assets/javascript/src/alert.js                |  194 -
 assets/javascript/src/button.js               |  187 -
 assets/javascript/src/carousel.js             |  524 --
 assets/javascript/src/collapse.js             |  409 --
 assets/javascript/src/dropdown.js             |  450 --
 assets/javascript/src/index.js                |   50 -
 assets/javascript/src/modal.js                |  590 --
 assets/javascript/src/popover.js              |  194 -
 assets/javascript/src/scrollspy.js            |  340 --
 assets/javascript/src/tab.js                  |  287 -
 assets/javascript/src/tooltip.js              |  733 ---
 assets/javascript/src/util.js                 |  166 -
 assets/javascript/tests/.eslintrc.json        |   46 -
 assets/javascript/tests/README.md             |   61 -
 assets/javascript/tests/index.html            |  129 -
 assets/javascript/tests/unit/alert.js         |   79 -
 assets/javascript/tests/unit/button.js        |  176 -
 assets/javascript/tests/unit/carousel.js      |  921 ---
 assets/javascript/tests/unit/collapse.js      |  745 ---
 assets/javascript/tests/unit/dropdown.js      |  652 ---
 assets/javascript/tests/unit/modal.js         |  692 ---
 assets/javascript/tests/unit/popover.js       |  413 --
 assets/javascript/tests/unit/scrollspy.js     |  659 ---
 assets/javascript/tests/unit/tab.js           |  385 --
 assets/javascript/tests/unit/tooltip.js       |  851 ---
 assets/javascript/tests/vendor/qunit.css      |  436 --
 assets/javascript/tests/vendor/qunit.js       | 5048 -----------------
 assets/javascript/tests/visual/alert.html     |   51 -
 assets/javascript/tests/visual/button.html    |   51 -
 assets/javascript/tests/visual/carousel.html  |   56 -
 assets/javascript/tests/visual/collapse.html  |   64 -
 assets/javascript/tests/visual/dropdown.html  |  126 -
 assets/javascript/tests/visual/modal.html     |  231 -
 assets/javascript/tests/visual/popover.html   |   47 -
 assets/javascript/tests/visual/scrollspy.html |   96 -
 assets/javascript/tests/visual/tab.html       |  233 -
 assets/javascript/tests/visual/tooltip.html   |   71 -
 assets/scss                                   |    1 +
 assets/scss/_alert.scss                       |   49 -
 assets/scss/_badge.scss                       |   47 -
 assets/scss/_breadcrumb.scss                  |   38 -
 assets/scss/_button-group.scss                |  207 -
 assets/scss/_buttons.scss                     |  136 -
 assets/scss/_card.scss                        |  259 -
 assets/scss/_carousel.scss                    |  191 -
 assets/scss/_close.scss                       |   29 -
 assets/scss/_code.scss                        |   64 -
 assets/scss/_component-examples.scss          |  438 --
 assets/scss/_custom-forms.scss                |  257 -
 assets/scss/_dropdown.scss                    |  103 -
 assets/scss/_forms.scss                       |  358 --
 assets/scss/_functions.scss                   |   86 -
 assets/scss/_grid.scss                        |   52 -
 assets/scss/_icons.scss                       |  237 -
 assets/scss/_illos.scss                       |   15 -
 assets/scss/_images.scss                      |   43 -
 assets/scss/_input-group.scss                 |  186 -
 assets/scss/_jumbotron.scss                   |   16 -
 assets/scss/_list-group.scss                  |  114 -
 assets/scss/_media.scss                       |    8 -
 assets/scss/_mixins.scss                      |   42 -
 assets/scss/_modal.scss                       |  153 -
 assets/scss/_nav.scss                         |  118 -
 assets/scss/_navbar.scss                      |  306 -
 assets/scss/_pagination.scss                  |   64 -
 assets/scss/_popover.scss                     |  194 -
 assets/scss/_portal.scss                      |  136 -
 assets/scss/_print.scss                       |  110 -
 assets/scss/_progress.scss                    |   30 -
 assets/scss/_reboot.scss                      |  504 --
 assets/scss/_root.scss                        |   19 -
 assets/scss/_sidebar.scss                     |  166 -
 assets/scss/_tables.scss                      |  180 -
 assets/scss/_tooltip.scss                     |  107 -
 assets/scss/_tor-variables.scss               |   62 -
 assets/scss/_tor.scss                         |  738 ---
 assets/scss/_tpo.scss                         |  145 -
 assets/scss/_transitions.scss                 |   36 -
 assets/scss/_type.scss                        |  125 -
 assets/scss/_utilities.scss                   |   14 -
 assets/scss/_variables.scss                   |  828 ---
 assets/scss/bootstrap-grid.css                | 1168 ----
 assets/scss/bootstrap-grid.css.map            |    7 -
 assets/scss/bootstrap-grid.scss               |   35 -
 assets/scss/bootstrap-reboot.css              |  279 -
 assets/scss/bootstrap-reboot.css.map          |    7 -
 assets/scss/bootstrap-reboot.scss             |   12 -
 assets/scss/bootstrap.css                     | 7392 -------------------------
 assets/scss/bootstrap.css.map                 |    7 -
 assets/scss/bootstrap.scss                    |   49 -
 assets/scss/mixins/_alert.scss                |   13 -
 assets/scss/mixins/_background-variant.scss   |   20 -
 assets/scss/mixins/_badge.scss                |   12 -
 assets/scss/mixins/_border-radius.scss        |   35 -
 assets/scss/mixins/_box-shadow.scss           |    5 -
 assets/scss/mixins/_breakpoints.scss          |  119 -
 assets/scss/mixins/_buttons.scss              |   94 -
 assets/scss/mixins/_caret.scss                |   35 -
 assets/scss/mixins/_clearfix.scss             |    7 -
 assets/scss/mixins/_float.scss                |   11 -
 assets/scss/mixins/_forms.scss                |  108 -
 assets/scss/mixins/_gradients.scss            |   45 -
 assets/scss/mixins/_grid-framework.scss       |   69 -
 assets/scss/mixins/_grid.scss                 |   52 -
 assets/scss/mixins/_hover.scss                |   61 -
 assets/scss/mixins/_image.scss                |   36 -
 assets/scss/mixins/_list-group.scss           |   24 -
 assets/scss/mixins/_lists.scss                |    7 -
 assets/scss/mixins/_nav-divider.scss          |   10 -
 assets/scss/mixins/_navbar-align.scss         |   10 -
 assets/scss/mixins/_pagination.scss           |   22 -
 assets/scss/mixins/_reset-text.scss           |   17 -
 assets/scss/mixins/_resize.scss               |    6 -
 assets/scss/mixins/_screen-reader.scss        |   35 -
 assets/scss/mixins/_size.scss                 |    6 -
 assets/scss/mixins/_table-row.scss            |   30 -
 assets/scss/mixins/_text-emphasis.scss        |   14 -
 assets/scss/mixins/_text-hide.scss            |    8 -
 assets/scss/mixins/_text-truncate.scss        |    8 -
 assets/scss/mixins/_transition.scss           |    9 -
 assets/scss/mixins/_visibility.scss           |    7 -
 assets/scss/utilities/_align.scss             |    8 -
 assets/scss/utilities/_background.scss        |   19 -
 assets/scss/utilities/_borders.scss           |   54 -
 assets/scss/utilities/_clearfix.scss          |    3 -
 assets/scss/utilities/_display.scss           |   56 -
 assets/scss/utilities/_embed.scss             |   52 -
 assets/scss/utilities/_flex.scss              |   46 -
 assets/scss/utilities/_float.scss             |    9 -
 assets/scss/utilities/_position.scss          |   36 -
 assets/scss/utilities/_screenreaders.scss     |   11 -
 assets/scss/utilities/_sizing.scss            |   12 -
 assets/scss/utilities/_spacing.scss           |   51 -
 assets/scss/utilities/_text.scss              |   52 -
 assets/scss/utilities/_visibility.scss        |   11 -
 136 files changed, 2 insertions(+), 33764 deletions(-)

diff --git a/assets/javascript b/assets/javascript
new file mode 120000
index 0000000..c8db05e
--- /dev/null
+++ b/assets/javascript
@@ -0,0 +1 @@
+../lego/assests/javascript
\ No newline at end of file
diff --git a/assets/javascript/src/alert.js b/assets/javascript/src/alert.js
deleted file mode 100644
index 420aa84..0000000
--- a/assets/javascript/src/alert.js
+++ /dev/null
@@ -1,194 +0,0 @@
-import $ from 'jquery'
-import Util from './util'
-
-
-/**
- * --------------------------------------------------------------------------
- * Bootstrap (v4.0.0-beta.2): alert.js
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- * --------------------------------------------------------------------------
- */
-
-const Alert = (() => {
-
-
-  /**
-   * ------------------------------------------------------------------------
-   * Constants
-   * ------------------------------------------------------------------------
-   */
-
-  const NAME                = 'alert'
-  const VERSION             = '4.0.0-beta.2'
-  const DATA_KEY            = 'bs.alert'
-  const EVENT_KEY           = `.${DATA_KEY}`
-  const DATA_API_KEY        = '.data-api'
-  const JQUERY_NO_CONFLICT  = $.fn[NAME]
-  const TRANSITION_DURATION = 150
-
-  const Selector = {
-    DISMISS : '[data-dismiss="alert"]'
-  }
-
-  const Event = {
-    CLOSE          : `close${EVENT_KEY}`,
-    CLOSED         : `closed${EVENT_KEY}`,
-    CLICK_DATA_API : `click${EVENT_KEY}${DATA_API_KEY}`
-  }
-
-  const ClassName = {
-    ALERT : 'alert',
-    FADE  : 'fade',
-    SHOW  : 'show'
-  }
-
-
-  /**
-   * ------------------------------------------------------------------------
-   * Class Definition
-   * ------------------------------------------------------------------------
-   */
-
-  class Alert {
-
-    constructor(element) {
-      this._element = element
-    }
-
-
-    // getters
-
-    static get VERSION() {
-      return VERSION
-    }
-
-
-    // public
-
-    close(element) {
-      element = element || this._element
-
-      const rootElement = this._getRootElement(element)
-      const customEvent = this._triggerCloseEvent(rootElement)
-
-      if (customEvent.isDefaultPrevented()) {
-        return
-      }
-
-      this._removeElement(rootElement)
-    }
-
-    dispose() {
-      $.removeData(this._element, DATA_KEY)
-      this._element = null
-    }
-
-
-    // private
-
-    _getRootElement(element) {
-      const selector = Util.getSelectorFromElement(element)
-      let parent     = false
-
-      if (selector) {
-        parent = $(selector)[0]
-      }
-
-      if (!parent) {
-        parent = $(element).closest(`.${ClassName.ALERT}`)[0]
-      }
-
-      return parent
-    }
-
-    _triggerCloseEvent(element) {
-      const closeEvent = $.Event(Event.CLOSE)
-
-      $(element).trigger(closeEvent)
-      return closeEvent
-    }
-
-    _removeElement(element) {
-      $(element).removeClass(ClassName.SHOW)
-
-      if (!Util.supportsTransitionEnd() ||
-          !$(element).hasClass(ClassName.FADE)) {
-        this._destroyElement(element)
-        return
-      }
-
-      $(element)
-        .one(Util.TRANSITION_END, (event) => this._destroyElement(element, event))
-        .emulateTransitionEnd(TRANSITION_DURATION)
-    }
-
-    _destroyElement(element) {
-      $(element)
-        .detach()
-        .trigger(Event.CLOSED)
-        .remove()
-    }
-
-
-    // static
-
-    static _jQueryInterface(config) {
-      return this.each(function () {
-        const $element = $(this)
-        let data       = $element.data(DATA_KEY)
-
-        if (!data) {
-          data = new Alert(this)
-          $element.data(DATA_KEY, data)
-        }
-
-        if (config === 'close') {
-          data[config](this)
-        }
-      })
-    }
-
-    static _handleDismiss(alertInstance) {
-      return function (event) {
-        if (event) {
-          event.preventDefault()
-        }
-
-        alertInstance.close(this)
-      }
-    }
-
-  }
-
-
-  /**
-   * ------------------------------------------------------------------------
-   * Data Api implementation
-   * ------------------------------------------------------------------------
-   */
-
-  $(document).on(
-    Event.CLICK_DATA_API,
-    Selector.DISMISS,
-    Alert._handleDismiss(new Alert())
-  )
-
-
-  /**
-   * ------------------------------------------------------------------------
-   * jQuery
-   * ------------------------------------------------------------------------
-   */
-
-  $.fn[NAME]             = Alert._jQueryInterface
-  $.fn[NAME].Constructor = Alert
-  $.fn[NAME].noConflict  = function () {
-    $.fn[NAME] = JQUERY_NO_CONFLICT
-    return Alert._jQueryInterface
-  }
-
-  return Alert
-
-})($)
-
-export default Alert
diff --git a/assets/javascript/src/button.js b/assets/javascript/src/button.js
deleted file mode 100644
index 9227da9..0000000
--- a/assets/javascript/src/button.js
+++ /dev/null
@@ -1,187 +0,0 @@
-import $ from 'jquery'
-/**
- * --------------------------------------------------------------------------
- * Bootstrap (v4.0.0-beta.2): button.js
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- * --------------------------------------------------------------------------
- */
-
-const Button = (() => {
-
-
-  /**
-   * ------------------------------------------------------------------------
-   * Constants
-   * ------------------------------------------------------------------------
-   */
-
-  const NAME                = 'button'
-  const VERSION             = '4.0.0-beta.2'
-  const DATA_KEY            = 'bs.button'
-  const EVENT_KEY           = `.${DATA_KEY}`
-  const DATA_API_KEY        = '.data-api'
-  const JQUERY_NO_CONFLICT  = $.fn[NAME]
-
-  const ClassName = {
-    ACTIVE : 'active',
-    BUTTON : 'btn',
-    FOCUS  : 'focus'
-  }
-
-  const Selector = {
-    DATA_TOGGLE_CARROT : '[data-toggle^="button"]',
-    DATA_TOGGLE        : '[data-toggle="buttons"]',
-    INPUT              : 'input',
-    ACTIVE             : '.active',
-    BUTTON             : '.btn'
-  }
-
-  const Event = {
-    CLICK_DATA_API      : `click${EVENT_KEY}${DATA_API_KEY}`,
-    FOCUS_BLUR_DATA_API : `focus${EVENT_KEY}${DATA_API_KEY} `
-                        + `blur${EVENT_KEY}${DATA_API_KEY}`
-  }
-
-
-  /**
-   * ------------------------------------------------------------------------
-   * Class Definition
-   * ------------------------------------------------------------------------
-   */
-
-  class Button {
-
-    constructor(element) {
-      this._element = element
-    }
-
-
-    // getters
-
-    static get VERSION() {
-      return VERSION
-    }
-
-
-    // public
-
-    toggle() {
-      let triggerChangeEvent = true
-      let addAriaPressed = true
-      const rootElement      = $(this._element).closest(
-        Selector.DATA_TOGGLE
-      )[0]
-
-      if (rootElement) {
-        const input = $(this._element).find(Selector.INPUT)[0]
-
-        if (input) {
-          if (input.type === 'radio') {
-            if (input.checked &&
-              $(this._element).hasClass(ClassName.ACTIVE)) {
-              triggerChangeEvent = false
-
-            } else {
-              const activeElement = $(rootElement).find(Selector.ACTIVE)[0]
-
-              if (activeElement) {
-                $(activeElement).removeClass(ClassName.ACTIVE)
-              }
-            }
-          }
-
-          if (triggerChangeEvent) {
-            if (input.hasAttribute('disabled') ||
-              rootElement.hasAttribute('disabled') ||
-              input.classList.contains('disabled') ||
-              rootElement.classList.contains('disabled')) {
-              return
-            }
-            input.checked = !$(this._element).hasClass(ClassName.ACTIVE)
-            $(input).trigger('change')
-          }
-
-          input.focus()
-          addAriaPressed = false
-        }
-
-      }
-
-      if (addAriaPressed) {
-        this._element.setAttribute('aria-pressed',
-          !$(this._element).hasClass(ClassName.ACTIVE))
-      }
-
-      if (triggerChangeEvent) {
-        $(this._element).toggleClass(ClassName.ACTIVE)
-      }
-    }
-
-    dispose() {
-      $.removeData(this._element, DATA_KEY)
-      this._element = null
-    }
-
-
-    // static
-
-    static _jQueryInterface(config) {
-      return this.each(function () {
-        let data = $(this).data(DATA_KEY)
-
-        if (!data) {
-          data = new Button(this)
-          $(this).data(DATA_KEY, data)
-        }
-
-        if (config === 'toggle') {
-          data[config]()
-        }
-      })
-    }
-
-  }
-
-
-  /**
-   * ------------------------------------------------------------------------
-   * Data Api implementation
-   * ------------------------------------------------------------------------
-   */
-
-  $(document)
-    .on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE_CARROT, (event) => {
-      event.preventDefault()
-
-      let button = event.target
-
-      if (!$(button).hasClass(ClassName.BUTTON)) {
-        button = $(button).closest(Selector.BUTTON)
-      }
-
-      Button._jQueryInterface.call($(button), 'toggle')
-    })
-    .on(Event.FOCUS_BLUR_DATA_API, Selector.DATA_TOGGLE_CARROT, (event) => {
-      const button = $(event.target).closest(Selector.BUTTON)[0]
-      $(button).toggleClass(ClassName.FOCUS, /^focus(in)?$/.test(event.type))
-    })
-
-
-  /**
-   * ------------------------------------------------------------------------
-   * jQuery
-   * ------------------------------------------------------------------------
-   */
-
-  $.fn[NAME]             = Button._jQueryInterface
-  $.fn[NAME].Constructor = Button
-  $.fn[NAME].noConflict  = function () {
-    $.fn[NAME] = JQUERY_NO_CONFLICT
-    return Button._jQueryInterface
-  }
-
-  return Button
-
-})($)
-
-export default Button
diff --git a/assets/javascript/src/carousel.js b/assets/javascript/src/carousel.js
deleted file mode 100644
index 964f7fd..0000000
--- a/assets/javascript/src/carousel.js
+++ /dev/null
@@ -1,524 +0,0 @@
-import $ from 'jquery'
-import Util from './util'
-
-
-/**
- * --------------------------------------------------------------------------
- * Bootstrap (v4.0.0-beta.2): carousel.js
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- * --------------------------------------------------------------------------
- */
-
-const Carousel = (() => {
-
-
-  /**
-   * ------------------------------------------------------------------------
-   * Constants
-   * ------------------------------------------------------------------------
-   */
-
-  const NAME                   = 'carousel'
-  const VERSION                = '4.0.0-beta.2'
-  const DATA_KEY               = 'bs.carousel'
-  const EVENT_KEY              = `.${DATA_KEY}`
-  const DATA_API_KEY           = '.data-api'
-  const JQUERY_NO_CONFLICT     = $.fn[NAME]
-  const TRANSITION_DURATION    = 600
-  const ARROW_LEFT_KEYCODE     = 37 // KeyboardEvent.which value for left arrow key
-  const ARROW_RIGHT_KEYCODE    = 39 // KeyboardEvent.which value for right arrow key
-  const TOUCHEVENT_COMPAT_WAIT = 500 // Time for mouse compat events to fire after touch
-
-  const Default = {
-    interval : 5000,
-    keyboard : true,
-    slide    : false,
-    pause    : 'hover',
-    wrap     : true
-  }
-
-  const DefaultType = {
-    interval : '(number|boolean)',
-    keyboard : 'boolean',
-    slide    : '(boolean|string)',
-    pause    : '(string|boolean)',
-    wrap     : 'boolean'
-  }
-
-  const Direction = {
-    NEXT     : 'next',
-    PREV     : 'prev',
-    LEFT     : 'left',
-    RIGHT    : 'right'
-  }
-
-  const Event = {
-    SLIDE          : `slide${EVENT_KEY}`,
-    SLID           : `slid${EVENT_KEY}`,
-    KEYDOWN        : `keydown${EVENT_KEY}`,
-    MOUSEENTER     : `mouseenter${EVENT_KEY}`,
-    MOUSELEAVE     : `mouseleave${EVENT_KEY}`,
-    TOUCHEND       : `touchend${EVENT_KEY}`,
-    LOAD_DATA_API  : `load${EVENT_KEY}${DATA_API_KEY}`,
-    CLICK_DATA_API : `click${EVENT_KEY}${DATA_API_KEY}`
-  }
-
-  const ClassName = {
-    CAROUSEL : 'carousel',
-    ACTIVE   : 'active',
-    SLIDE    : 'slide',
-    RIGHT    : 'carousel-item-right',
-    LEFT     : 'carousel-item-left',
-    NEXT     : 'carousel-item-next',
-    PREV     : 'carousel-item-prev',
-    ITEM     : 'carousel-item'
-  }
-
-  const Selector = {
-    ACTIVE      : '.active',
-    ACTIVE_ITEM : '.active.carousel-item',
-    ITEM        : '.carousel-item',
-    NEXT_PREV   : '.carousel-item-next, .carousel-item-prev',
-    INDICATORS  : '.carousel-indicators',
-    DATA_SLIDE  : '[data-slide], [data-slide-to]',
-    DATA_RIDE   : '[data-ride="carousel"]'
-  }
-
-
-  /**
-   * ------------------------------------------------------------------------
-   * Class Definition
-   * ------------------------------------------------------------------------
-   */
-
-  class Carousel {
-
-    constructor(element, config) {
-      this._items             = null
-      this._interval          = null
-      this._activeElement     = null
-
-      this._isPaused          = false
-      this._isSliding         = false
-
-      this.touchTimeout       = null
-
-      this._config            = this._getConfig(config)
-      this._element           = $(element)[0]
-      this._indicatorsElement = $(this._element).find(Selector.INDICATORS)[0]
-
-      this._addEventListeners()
-    }
-
-
-    // getters
-
-    static get VERSION() {
-      return VERSION
-    }
-
-    static get Default() {
-      return Default
-    }
-
-
-    // public
-
-    next() {
-      if (!this._isSliding) {
-        this._slide(Direction.NEXT)
-      }
-    }
-
-    nextWhenVisible() {
-      // Don't call next when the page isn't visible
-      // or the carousel or its parent isn't visible
-      if (!document.hidden &&
-        ($(this._element).is(':visible') && $(this._element).css('visibility') !== 'hidden')) {
-        this.next()
-      }
-    }
-
-    prev() {
-      if (!this._isSliding) {
-        this._slide(Direction.PREV)
-      }
-    }
-
-    pause(event) {
-      if (!event) {
-        this._isPaused = true
-      }
-
-      if ($(this._element).find(Selector.NEXT_PREV)[0] &&
-        Util.supportsTransitionEnd()) {
-        Util.triggerTransitionEnd(this._element)
-        this.cycle(true)
-      }
-
-      clearInterval(this._interval)
-      this._interval = null
-    }
-
-    cycle(event) {
-      if (!event) {
-        this._isPaused = false
-      }
-
-      if (this._interval) {
-        clearInterval(this._interval)
-        this._interval = null
-      }
-
-      if (this._config.interval && !this._isPaused) {
-        this._interval = setInterval(
-          (document.visibilityState ? this.nextWhenVisible : this.next).bind(this),
-          this._config.interval
-        )
-      }
-    }
-
-    to(index) {
-      this._activeElement = $(this._element).find(Selector.ACTIVE_ITEM)[0]
-
-      const activeIndex = this._getItemIndex(this._activeElement)
-
-      if (index > this._items.length - 1 || index < 0) {
-        return
-      }
-
-      if (this._isSliding) {
-        $(this._element).one(Event.SLID, () => this.to(index))
-        return
-      }
-
-      if (activeIndex === index) {
-        this.pause()
-        this.cycle()
-        return
-      }
-
-      const direction = index > activeIndex ?
-        Direction.NEXT :
-        Direction.PREV
-
-      this._slide(direction, this._items[index])
-    }
-
-    dispose() {
-      $(this._element).off(EVENT_KEY)
-      $.removeData(this._element, DATA_KEY)
-
-      this._items             = null
-      this._config            = null
-      this._element           = null
-      this._interval          = null
-      this._isPaused          = null
-      this._isSliding         = null
-      this._activeElement     = null
-      this._indicatorsElement = null
-    }
-
-
-    // private
-
-    _getConfig(config) {
-      config = $.extend({}, Default, config)
-      Util.typeCheckConfig(NAME, config, DefaultType)
-      return config
-    }
-
-    _addEventListeners() {
-      if (this._config.keyboard) {
-        $(this._element)
-          .on(Event.KEYDOWN, (event) => this._keydown(event))
-      }
-
-      if (this._config.pause === 'hover') {
-        $(this._element)
-          .on(Event.MOUSEENTER, (event) => this.pause(event))
-          .on(Event.MOUSELEAVE, (event) => this.cycle(event))
-        if ('ontouchstart' in document.documentElement) {
-          // if it's a touch-enabled device, mouseenter/leave are fired as
-          // part of the mouse compatibility events on first tap - the carousel
-          // would stop cycling until user tapped out of it;
-          // here, we listen for touchend, explicitly pause the carousel
-          // (as if it's the second time we tap on it, mouseenter compat event
-          // is NOT fired) and after a timeout (to allow for mouse compatibility
-          // events to fire) we explicitly restart cycling
-          $(this._element).on(Event.TOUCHEND, () => {
-            this.pause()
-            if (this.touchTimeout) {
-              clearTimeout(this.touchTimeout)
-            }
-            this.touchTimeout = setTimeout((event) => this.cycle(event), TOUCHEVENT_COMPAT_WAIT + this._config.interval)
-          })
-        }
-      }
-    }
-
-    _keydown(event) {
-      if (/input|textarea/i.test(event.target.tagName)) {
-        return
-      }
-
-      switch (event.which) {
-        case ARROW_LEFT_KEYCODE:
-          event.preventDefault()
-          this.prev()
-          break
-        case ARROW_RIGHT_KEYCODE:
-          event.preventDefault()
-          this.next()
-          break
-        default:
-          return
-      }
-    }
-
-    _getItemIndex(element) {
-      this._items = $.makeArray($(element).parent().find(Selector.ITEM))
-      return this._items.indexOf(element)
-    }
-
-    _getItemByDirection(direction, activeElement) {
-      const isNextDirection = direction === Direction.NEXT
-      const isPrevDirection = direction === Direction.PREV
-      const activeIndex     = this._getItemIndex(activeElement)
-      const lastItemIndex   = this._items.length - 1
-      const isGoingToWrap   = isPrevDirection && activeIndex === 0 ||
-                              isNextDirection && activeIndex === lastItemIndex
-
-      if (isGoingToWrap && !this._config.wrap) {
-        return activeElement
-      }
-
-      const delta     = direction === Direction.PREV ? -1 : 1
-      const itemIndex = (activeIndex + delta) % this._items.length
-
-      return itemIndex === -1 ?
-        this._items[this._items.length - 1] : this._items[itemIndex]
-    }
-
-
-    _triggerSlideEvent(relatedTarget, eventDirectionName) {
-      const targetIndex = this._getItemIndex(relatedTarget)
-      const fromIndex = this._getItemIndex($(this._element).find(Selector.ACTIVE_ITEM)[0])
-      const slideEvent = $.Event(Event.SLIDE, {
-        relatedTarget,
-        direction: eventDirectionName,
-        from: fromIndex,
-        to: targetIndex
-      })
-
-      $(this._element).trigger(slideEvent)
-
-      return slideEvent
-    }
-
-    _setActiveIndicatorElement(element) {
-      if (this._indicatorsElement) {
-        $(this._indicatorsElement)
-          .find(Selector.ACTIVE)
-          .removeClass(ClassName.ACTIVE)
-
-        const nextIndicator = this._indicatorsElement.children[
-          this._getItemIndex(element)
-        ]
-
-        if (nextIndicator) {
-          $(nextIndicator).addClass(ClassName.ACTIVE)
-        }
-      }
-    }
-
-    _slide(direction, element) {
-      const activeElement = $(this._element).find(Selector.ACTIVE_ITEM)[0]
-      const activeElementIndex = this._getItemIndex(activeElement)
-      const nextElement   = element || activeElement &&
-        this._getItemByDirection(direction, activeElement)
-      const nextElementIndex = this._getItemIndex(nextElement)
-      const isCycling = Boolean(this._interval)
-
-      let directionalClassName
-      let orderClassName
-      let eventDirectionName
-
-      if (direction === Direction.NEXT) {
-        directionalClassName = ClassName.LEFT
-        orderClassName = ClassName.NEXT
-        eventDirectionName = Direction.LEFT
-      } else {
-        directionalClassName = ClassName.RIGHT
-        orderClassName = ClassName.PREV
-        eventDirectionName = Direction.RIGHT
-      }
-
-      if (nextElement && $(nextElement).hasClass(ClassName.ACTIVE)) {
-        this._isSliding = false
-        return
-      }
-
-      const slideEvent = this._triggerSlideEvent(nextElement, eventDirectionName)
-      if (slideEvent.isDefaultPrevented()) {
-        return
-      }
-
-      if (!activeElement || !nextElement) {
-        // some weirdness is happening, so we bail
-        return
-      }
-
-      this._isSliding = true
-
-      if (isCycling) {
-        this.pause()
-      }
-
-      this._setActiveIndicatorElement(nextElement)
-
-      const slidEvent = $.Event(Event.SLID, {
-        relatedTarget: nextElement,
-        direction: eventDirectionName,
-        from: activeElementIndex,
-        to: nextElementIndex
-      })
-
-      if (Util.supportsTransitionEnd() &&
-        $(this._element).hasClass(ClassName.SLIDE)) {
-
-        $(nextElement).addClass(orderClassName)
-
-        Util.reflow(nextElement)
-
-        $(activeElement).addClass(directionalClassName)
-        $(nextElement).addClass(directionalClassName)
-
-        $(activeElement)
-          .one(Util.TRANSITION_END, () => {
-            $(nextElement)
-              .removeClass(`${directionalClassName} ${orderClassName}`)
-              .addClass(ClassName.ACTIVE)
-
-            $(activeElement).removeClass(`${ClassName.ACTIVE} ${orderClassName} ${directionalClassName}`)
-
-            this._isSliding = false
-
-            setTimeout(() => $(this._element).trigger(slidEvent), 0)
-
-          })
-          .emulateTransitionEnd(TRANSITION_DURATION)
-
-      } else {
-        $(activeElement).removeClass(ClassName.ACTIVE)
-        $(nextElement).addClass(ClassName.ACTIVE)
-
-        this._isSliding = false
-        $(this._element).trigger(slidEvent)
-      }
-
-      if (isCycling) {
-        this.cycle()
-      }
-    }
-
-
-    // static
-
-    static _jQueryInterface(config) {
-      return this.each(function () {
-        let data      = $(this).data(DATA_KEY)
-        const _config = $.extend({}, Default, $(this).data())
-
-        if (typeof config === 'object') {
-          $.extend(_config, config)
-        }
-
-        const action = typeof config === 'string' ? config : _config.slide
-
-        if (!data) {
-          data = new Carousel(this, _config)
-          $(this).data(DATA_KEY, data)
-        }
-
-        if (typeof config === 'number') {
-          data.to(config)
-        } else if (typeof action === 'string') {
-          if (typeof data[action] === 'undefined') {
-            throw new Error(`No method named "${action}"`)
-          }
-          data[action]()
-        } else if (_config.interval) {
-          data.pause()
-          data.cycle()
-        }
-      })
-    }
-
-    static _dataApiClickHandler(event) {
-      const selector = Util.getSelectorFromElement(this)
-
-      if (!selector) {
-        return
-      }
-
-      const target = $(selector)[0]
-
-      if (!target || !$(target).hasClass(ClassName.CAROUSEL)) {
-        return
-      }
-
-      const config     = $.extend({}, $(target).data(), $(this).data())
-      const slideIndex = this.getAttribute('data-slide-to')
-
-      if (slideIndex) {
-        config.interval = false
-      }
-
-      Carousel._jQueryInterface.call($(target), config)
-
-      if (slideIndex) {
-        $(target).data(DATA_KEY).to(slideIndex)
-      }
-
-      event.preventDefault()
-    }
-
-  }
-
-
-  /**
-   * ------------------------------------------------------------------------
-   * Data Api implementation
-   * ------------------------------------------------------------------------
-   */
-
-  $(document)
-    .on(Event.CLICK_DATA_API, Selector.DATA_SLIDE, Carousel._dataApiClickHandler)
-
-  $(window).on(Event.LOAD_DATA_API, () => {
-    $(Selector.DATA_RIDE).each(function () {
-      const $carousel = $(this)
-      Carousel._jQueryInterface.call($carousel, $carousel.data())
-    })
-  })
-
-
-  /**
-   * ------------------------------------------------------------------------
-   * jQuery
-   * ------------------------------------------------------------------------
-   */
-
-  $.fn[NAME]             = Carousel._jQueryInterface
-  $.fn[NAME].Constructor = Carousel
-  $.fn[NAME].noConflict  = function () {
-    $.fn[NAME] = JQUERY_NO_CONFLICT
-    return Carousel._jQueryInterface
-  }
-
-  return Carousel
-
-})($)
-
-export default Carousel
diff --git a/assets/javascript/src/collapse.js b/assets/javascript/src/collapse.js
deleted file mode 100644
index 8e84d7b..0000000
--- a/assets/javascript/src/collapse.js
+++ /dev/null
@@ -1,409 +0,0 @@
-import $ from 'jquery'
-import Util from './util'
-
-
-/**
- * --------------------------------------------------------------------------
- * Bootstrap (v4.0.0-beta.2): collapse.js
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- * --------------------------------------------------------------------------
- */
-
-const Collapse = (() => {
-
-
-  /**
-   * ------------------------------------------------------------------------
-   * Constants
-   * ------------------------------------------------------------------------
-   */
-
-  const NAME                = 'collapse'
-  const VERSION             = '4.0.0-beta.2'
-  const DATA_KEY            = 'bs.collapse'
-  const EVENT_KEY           = `.${DATA_KEY}`
-  const DATA_API_KEY        = '.data-api'
-  const JQUERY_NO_CONFLICT  = $.fn[NAME]
-  const TRANSITION_DURATION = 600
-
-  const Default = {
-    toggle : true,
-    parent : ''
-  }
-
-  const DefaultType = {
-    toggle : 'boolean',
-    parent : '(string|element)'
-  }
-
-  const Event = {
-    SHOW           : `show${EVENT_KEY}`,
-    SHOWN          : `shown${EVENT_KEY}`,
-    HIDE           : `hide${EVENT_KEY}`,
-    HIDDEN         : `hidden${EVENT_KEY}`,
-    CLICK_DATA_API : `click${EVENT_KEY}${DATA_API_KEY}`
-  }
-
-  const ClassName = {
-    SHOW       : 'show',
-    COLLAPSE   : 'collapse',
-    COLLAPSING : 'collapsing',
-    COLLAPSED  : 'collapsed'
-  }
-
-  const Dimension = {
-    WIDTH  : 'width',
-    HEIGHT : 'height'
-  }
-
-  const Selector = {
-    ACTIVES     : '.show, .collapsing',
-    DATA_TOGGLE : '[data-toggle="collapse"]'
-  }
-
-
-  /**
-   * ------------------------------------------------------------------------
-   * Class Definition
-   * ------------------------------------------------------------------------
-   */
-
-  class Collapse {
-
-    constructor(element, config) {
-      this._isTransitioning = false
-      this._element         = element
-      this._config          = this._getConfig(config)
-      this._triggerArray    = $.makeArray($(
-        `[data-toggle="collapse"][href="#${element.id}"],` +
-        `[data-toggle="collapse"][data-target="#${element.id}"]`
-      ))
-      const tabToggles = $(Selector.DATA_TOGGLE)
-      for (let i = 0; i < tabToggles.length; i++) {
-        const elem = tabToggles[i]
-        const selector = Util.getSelectorFromElement(elem)
-        if (selector !== null && $(selector).filter(element).length > 0) {
-          this._triggerArray.push(elem)
-        }
-      }
-
-      this._parent = this._config.parent ? this._getParent() : null
-
-      if (!this._config.parent) {
-        this._addAriaAndCollapsedClass(this._element, this._triggerArray)
-      }
-
-      if (this._config.toggle) {
-        this.toggle()
-      }
-    }
-
-
-    // getters
-
-    static get VERSION() {
-      return VERSION
-    }
-
-    static get Default() {
-      return Default
-    }
-
-
-    // public
-
-    toggle() {
-      if ($(this._element).hasClass(ClassName.SHOW)) {
-        this.hide()
-      } else {
-        this.show()
-      }
-    }
-
-    show() {
-      if (this._isTransitioning ||
-        $(this._element).hasClass(ClassName.SHOW)) {
-        return
-      }
-
-      let actives
-      let activesData
-
-      if (this._parent) {
-        actives = $.makeArray($(this._parent).children().children(Selector.ACTIVES))
-        if (!actives.length) {
-          actives = null
-        }
-      }
-
-      if (actives) {
-        activesData = $(actives).data(DATA_KEY)
-        if (activesData && activesData._isTransitioning) {
-          return
-        }
-      }
-
-      const startEvent = $.Event(Event.SHOW)
-      $(this._element).trigger(startEvent)
-      if (startEvent.isDefaultPrevented()) {
-        return
-      }
-
-      if (actives) {
-        Collapse._jQueryInterface.call($(actives), 'hide')
-        if (!activesData) {
-          $(actives).data(DATA_KEY, null)
-        }
-      }
-
-      const dimension = this._getDimension()
-
-      $(this._element)
-        .removeClass(ClassName.COLLAPSE)
-        .addClass(ClassName.COLLAPSING)
-
-      this._element.style[dimension] = 0
-
-      if (this._triggerArray.length) {
-        $(this._triggerArray)
-          .removeClass(ClassName.COLLAPSED)
-          .attr('aria-expanded', true)
-      }
-
-      this.setTransitioning(true)
-
-      const complete = () => {
-        $(this._element)
-          .removeClass(ClassName.COLLAPSING)
-          .addClass(ClassName.COLLAPSE)
-          .addClass(ClassName.SHOW)
-
-        this._element.style[dimension] = ''
-
-        this.setTransitioning(false)
-
-        $(this._element).trigger(Event.SHOWN)
-      }
-
-      if (!Util.supportsTransitionEnd()) {
-        complete()
-        return
-      }
-
-      const capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1)
-      const scrollSize           = `scroll${capitalizedDimension}`
-
-      $(this._element)
-        .one(Util.TRANSITION_END, complete)
-        .emulateTransitionEnd(TRANSITION_DURATION)
-
-      this._element.style[dimension] = `${this._element[scrollSize]}px`
-    }
-
-    hide() {
-      if (this._isTransitioning ||
-        !$(this._element).hasClass(ClassName.SHOW)) {
-        return
-      }
-
-      const startEvent = $.Event(Event.HIDE)
-      $(this._element).trigger(startEvent)
-      if (startEvent.isDefaultPrevented()) {
-        return
-      }
-
-      const dimension       = this._getDimension()
-
-      this._element.style[dimension] = `${this._element.getBoundingClientRect()[dimension]}px`
-
-      Util.reflow(this._element)
-
-      $(this._element)
-        .addClass(ClassName.COLLAPSING)
-        .removeClass(ClassName.COLLAPSE)
-        .removeClass(ClassName.SHOW)
-
-      if (this._triggerArray.length) {
-        for (let i = 0; i < this._triggerArray.length; i++) {
-          const trigger = this._triggerArray[i]
-          const selector = Util.getSelectorFromElement(trigger)
-          if (selector !== null) {
-            const $elem = $(selector)
-            if (!$elem.hasClass(ClassName.SHOW)) {
-              $(trigger).addClass(ClassName.COLLAPSED)
-                   .attr('aria-expanded', false)
-            }
-          }
-        }
-      }
-
-      this.setTransitioning(true)
-
-      const complete = () => {
-        this.setTransitioning(false)
-        $(this._element)
-          .removeClass(ClassName.COLLAPSING)
-          .addClass(ClassName.COLLAPSE)
-          .trigger(Event.HIDDEN)
-      }
-
-      this._element.style[dimension] = ''
-
-      if (!Util.supportsTransitionEnd()) {
-        complete()
-        return
-      }
-
-      $(this._element)
-        .one(Util.TRANSITION_END, complete)
-        .emulateTransitionEnd(TRANSITION_DURATION)
-    }
-
-    setTransitioning(isTransitioning) {
-      this._isTransitioning = isTransitioning
-    }
-
-    dispose() {
-      $.removeData(this._element, DATA_KEY)
-
-      this._config          = null
-      this._parent          = null
-      this._element         = null
-      this._triggerArray    = null
-      this._isTransitioning = null
-    }
-
-
-    // private
-
-    _getConfig(config) {
-      config = $.extend({}, Default, config)
-      config.toggle = Boolean(config.toggle) // coerce string values
-      Util.typeCheckConfig(NAME, config, DefaultType)
-      return config
-    }
-
-    _getDimension() {
-      const hasWidth = $(this._element).hasClass(Dimension.WIDTH)
-      return hasWidth ? Dimension.WIDTH : Dimension.HEIGHT
-    }
-
-    _getParent() {
-      let parent = null
-      if (Util.isElement(this._config.parent)) {
-        parent = this._config.parent
-
-        // it's a jQuery object
-        if (typeof this._config.parent.jquery !== 'undefined') {
-          parent = this._config.parent[0]
-        }
-      } else {
-        parent = $(this._config.parent)[0]
-      }
-
-      const selector =
-        `[data-toggle="collapse"][data-parent="${this._config.parent}"]`
-
-      $(parent).find(selector).each((i, element) => {
-        this._addAriaAndCollapsedClass(
-          Collapse._getTargetFromElement(element),
-          [element]
-        )
-      })
-
-      return parent
-    }
-
-    _addAriaAndCollapsedClass(element, triggerArray) {
-      if (element) {
-        const isOpen = $(element).hasClass(ClassName.SHOW)
-
-        if (triggerArray.length) {
-          $(triggerArray)
-            .toggleClass(ClassName.COLLAPSED, !isOpen)
-            .attr('aria-expanded', isOpen)
-        }
-      }
-    }
-
-
-    // static
-
-    static _getTargetFromElement(element) {
-      const selector = Util.getSelectorFromElement(element)
-      return selector ? $(selector)[0] : null
-    }
-
-    static _jQueryInterface(config) {
-      return this.each(function () {
-        const $this   = $(this)
-        let data      = $this.data(DATA_KEY)
-        const _config = $.extend(
-          {},
-          Default,
-          $this.data(),
-          typeof config === 'object' && config
-        )
-
-        if (!data && _config.toggle && /show|hide/.test(config)) {
-          _config.toggle = false
-        }
-
-        if (!data) {
-          data = new Collapse(this, _config)
-          $this.data(DATA_KEY, data)
-        }
-
-        if (typeof config === 'string') {
-          if (typeof data[config] === 'undefined') {
-            throw new Error(`No method named "${config}"`)
-          }
-          data[config]()
-        }
-      })
-    }
-
-  }
-
-
-  /**
-   * ------------------------------------------------------------------------
-   * Data Api implementation
-   * ------------------------------------------------------------------------
-   */
-
-  $(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {
-    // preventDefault only for <a> elements (which change the URL) not inside the collapsible element
-    if (event.currentTarget.tagName === 'A') {
-      event.preventDefault()
-    }
-
-    const $trigger = $(this)
-    const selector = Util.getSelectorFromElement(this)
-    $(selector).each(function () {
-      const $target = $(this)
-      const data    = $target.data(DATA_KEY)
-      const config  = data ? 'toggle' : $trigger.data()
-      Collapse._jQueryInterface.call($target, config)
-    })
-  })
-
-
-  /**
-   * ------------------------------------------------------------------------
-   * jQuery
-   * ------------------------------------------------------------------------
-   */
-
-  $.fn[NAME]             = Collapse._jQueryInterface
-  $.fn[NAME].Constructor = Collapse
-  $.fn[NAME].noConflict  = function () {
-    $.fn[NAME] = JQUERY_NO_CONFLICT
-    return Collapse._jQueryInterface
-  }
-
-  return Collapse
-
-})($)
-
-export default Collapse
diff --git a/assets/javascript/src/dropdown.js b/assets/javascript/src/dropdown.js
deleted file mode 100644
index 8fdddd6..0000000
--- a/assets/javascript/src/dropdown.js
+++ /dev/null
@@ -1,450 +0,0 @@
-import $ from 'jquery'
-import Popper from 'popper.js'
-import Util from './util'
-
-
-/**
- * --------------------------------------------------------------------------
- * Bootstrap (v4.0.0-beta.2): dropdown.js
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- * --------------------------------------------------------------------------
- */
-
-const Dropdown = (() => {
-
-  /**
-   * Check for Popper dependency
-   * Popper - https://popper.js.org
-   */
-  if (typeof Popper === 'undefined') {
-    throw new Error('Bootstrap dropdown require Popper.js (https://popper.js.org)')
-  }
-
-  /**
-   * ------------------------------------------------------------------------
-   * Constants
-   * ------------------------------------------------------------------------
-   */
-
-  const NAME                     = 'dropdown'
-  const VERSION                  = '4.0.0-beta.2'
-  const DATA_KEY                 = 'bs.dropdown'
-  const EVENT_KEY                = `.${DATA_KEY}`
-  const DATA_API_KEY             = '.data-api'
-  const JQUERY_NO_CONFLICT       = $.fn[NAME]
-  const ESCAPE_KEYCODE           = 27 // KeyboardEvent.which value for Escape (Esc) key
-  const SPACE_KEYCODE            = 32 // KeyboardEvent.which value for space key
-  const TAB_KEYCODE              = 9 // KeyboardEvent.which value for tab key
-  const ARROW_UP_KEYCODE         = 38 // KeyboardEvent.which value for up arrow key
-  const ARROW_DOWN_KEYCODE       = 40 // KeyboardEvent.which value for down arrow key
-  const RIGHT_MOUSE_BUTTON_WHICH = 3 // MouseEvent.which value for the right button (assuming a right-handed mouse)
-  const REGEXP_KEYDOWN           = new RegExp(`${ARROW_UP_KEYCODE}|${ARROW_DOWN_KEYCODE}|${ESCAPE_KEYCODE}`)
-
-  const Event = {
-    HIDE             : `hide${EVENT_KEY}`,
-    HIDDEN           : `hidden${EVENT_KEY}`,
-    SHOW             : `show${EVENT_KEY}`,
-    SHOWN            : `shown${EVENT_KEY}`,
-    CLICK            : `click${EVENT_KEY}`,
-    CLICK_DATA_API   : `click${EVENT_KEY}${DATA_API_KEY}`,
-    KEYDOWN_DATA_API : `keydown${EVENT_KEY}${DATA_API_KEY}`,
-    KEYUP_DATA_API   : `keyup${EVENT_KEY}${DATA_API_KEY}`
-  }
-
-  const ClassName = {
-    DISABLED  : 'disabled',
-    SHOW      : 'show',
-    DROPUP    : 'dropup',
-    MENURIGHT : 'dropdown-menu-right',
-    MENULEFT  : 'dropdown-menu-left'
-  }
-
-  const Selector = {
-    DATA_TOGGLE   : '[data-toggle="dropdown"]',
-    FORM_CHILD    : '.dropdown form',
-    MENU          : '.dropdown-menu',
-    NAVBAR_NAV    : '.navbar-nav',
-    VISIBLE_ITEMS : '.dropdown-menu .dropdown-item:not(.disabled)'
-  }
-
-  const AttachmentMap = {
-    TOP       : 'top-start',
-    TOPEND    : 'top-end',
-    BOTTOM    : 'bottom-start',
-    BOTTOMEND : 'bottom-end'
-  }
-
-  const Default = {
-    offset      : 0,
-    flip        : true
-  }
-
-  const DefaultType = {
-    offset      : '(number|string|function)',
-    flip        : 'boolean'
-  }
-
-
-  /**
-   * ------------------------------------------------------------------------
-   * Class Definition
-   * ------------------------------------------------------------------------
-   */
-
-  class Dropdown {
-
-    constructor(element, config) {
-      this._element  = element
-      this._popper   = null
-      this._config   = this._getConfig(config)
-      this._menu     = this._getMenuElement()
-      this._inNavbar = this._detectNavbar()
-
-      this._addEventListeners()
-    }
-
-
-    // getters
-
-    static get VERSION() {
-      return VERSION
-    }
-
-    static get Default() {
-      return Default
-    }
-
-    static get DefaultType() {
-      return DefaultType
-    }
-
-    // public
-
-    toggle() {
-      if (this._element.disabled || $(this._element).hasClass(ClassName.DISABLED)) {
-        return
-      }
-
-      const parent   = Dropdown._getParentFromElement(this._element)
-      const isActive = $(this._menu).hasClass(ClassName.SHOW)
-
-      Dropdown._clearMenus()
-
-      if (isActive) {
-        return
-      }
-
-      const relatedTarget = {
-        relatedTarget : this._element
-      }
-      const showEvent = $.Event(Event.SHOW, relatedTarget)
-
-      $(parent).trigger(showEvent)
-
-      if (showEvent.isDefaultPrevented()) {
-        return
-      }
-
-      let element = this._element
-      // for dropup with alignment we use the parent as popper container
-      if ($(parent).hasClass(ClassName.DROPUP)) {
-        if ($(this._menu).hasClass(ClassName.MENULEFT) || $(this._menu).hasClass(ClassName.MENURIGHT)) {
-          element = parent
-        }
-      }
-      this._popper = new Popper(element, this._menu, this._getPopperConfig())
-
-      // if this is a touch-enabled device we add extra
-      // empty mouseover listeners to the body's immediate children;
-      // only needed because of broken event delegation on iOS
-      // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html
-      if ('ontouchstart' in document.documentElement &&
-         !$(parent).closest(Selector.NAVBAR_NAV).length) {
-        $('body').children().on('mouseover', null, $.noop)
-      }
-
-      this._element.focus()
-      this._element.setAttribute('aria-expanded', true)
-
-      $(this._menu).toggleClass(ClassName.SHOW)
-      $(parent)
-        .toggleClass(ClassName.SHOW)
-        .trigger($.Event(Event.SHOWN, relatedTarget))
-    }
-
-    dispose() {
-      $.removeData(this._element, DATA_KEY)
-      $(this._element).off(EVENT_KEY)
-      this._element = null
-      this._menu = null
-      if (this._popper !== null) {
-        this._popper.destroy()
-      }
-      this._popper = null
-    }
-
-    update() {
-      this._inNavbar = this._detectNavbar()
-      if (this._popper !== null) {
-        this._popper.scheduleUpdate()
-      }
-    }
-
-    // private
-
-    _addEventListeners() {
-      $(this._element).on(Event.CLICK, (event) => {
-        event.preventDefault()
-        event.stopPropagation()
-        this.toggle()
-      })
-    }
-
-    _getConfig(config) {
-      config = $.extend(
-        {},
-        this.constructor.Default,
-        $(this._element).data(),
-        config
-      )
-
-      Util.typeCheckConfig(
-        NAME,
-        config,
-        this.constructor.DefaultType
-      )
-
-      return config
-    }
-
-    _getMenuElement() {
-      if (!this._menu) {
-        const parent = Dropdown._getParentFromElement(this._element)
-        this._menu = $(parent).find(Selector.MENU)[0]
-      }
-      return this._menu
-    }
-
-    _getPlacement() {
-      const $parentDropdown = $(this._element).parent()
-      let placement = AttachmentMap.BOTTOM
-
-      // Handle dropup
-      if ($parentDropdown.hasClass(ClassName.DROPUP)) {
-        placement = AttachmentMap.TOP
-        if ($(this._menu).hasClass(ClassName.MENURIGHT)) {
-          placement = AttachmentMap.TOPEND
-        }
-      } else if ($(this._menu).hasClass(ClassName.MENURIGHT)) {
-        placement = AttachmentMap.BOTTOMEND
-      }
-      return placement
-    }
-
-    _detectNavbar() {
-      return $(this._element).closest('.navbar').length > 0
-    }
-
-    _getPopperConfig() {
-      const offsetConf = {}
-      if (typeof this._config.offset === 'function') {
-        offsetConf.fn = (data) => {
-          data.offsets = $.extend({}, data.offsets, this._config.offset(data.offsets) || {})
-          return data
-        }
-      } else {
-        offsetConf.offset = this._config.offset
-      }
-      const popperConfig = {
-        placement : this._getPlacement(),
-        modifiers : {
-          offset : offsetConf,
-          flip : {
-            enabled : this._config.flip
-          }
-        }
-      }
-
-      // Disable Popper.js for Dropdown in Navbar
-      if (this._inNavbar) {
-        popperConfig.modifiers.applyStyle = {
-          enabled: !this._inNavbar
-        }
-      }
-      return popperConfig
-    }
-
-    // static
-
-    static _jQueryInterface(config) {
-      return this.each(function () {
-        let data = $(this).data(DATA_KEY)
-        const _config = typeof config === 'object' ? config : null
-
-        if (!data) {
-          data = new Dropdown(this, _config)
-          $(this).data(DATA_KEY, data)
-        }
-
-        if (typeof config === 'string') {
-          if (typeof data[config] === 'undefined') {
-            throw new Error(`No method named "${config}"`)
-          }
-          data[config]()
-        }
-      })
-    }
-
-    static _clearMenus(event) {
-      if (event && (event.which === RIGHT_MOUSE_BUTTON_WHICH ||
-        event.type === 'keyup' && event.which !== TAB_KEYCODE)) {
-        return
-      }
-
-      const toggles = $.makeArray($(Selector.DATA_TOGGLE))
-      for (let i = 0; i < toggles.length; i++) {
-        const parent        = Dropdown._getParentFromElement(toggles[i])
-        const context       = $(toggles[i]).data(DATA_KEY)
-        const relatedTarget = {
-          relatedTarget : toggles[i]
-        }
-
-        if (!context) {
-          continue
-        }
-
-        const dropdownMenu = context._menu
-        if (!$(parent).hasClass(ClassName.SHOW)) {
-          continue
-        }
-
-        if (event && (event.type === 'click' &&
-            /input|textarea/i.test(event.target.tagName) || event.type === 'keyup' && event.which === TAB_KEYCODE)
-            && $.contains(parent, event.target)) {
-          continue
-        }
-
-        const hideEvent = $.Event(Event.HIDE, relatedTarget)
-        $(parent).trigger(hideEvent)
-        if (hideEvent.isDefaultPrevented()) {
-          continue
-        }
-
-        // if this is a touch-enabled device we remove the extra
-        // empty mouseover listeners we added for iOS support
-        if ('ontouchstart' in document.documentElement) {
-          $('body').children().off('mouseover', null, $.noop)
-        }
-
-        toggles[i].setAttribute('aria-expanded', 'false')
-
-        $(dropdownMenu).removeClass(ClassName.SHOW)
-        $(parent)
-          .removeClass(ClassName.SHOW)
-          .trigger($.Event(Event.HIDDEN, relatedTarget))
-      }
-    }
-
-    static _getParentFromElement(element) {
-      let parent
-      const selector = Util.getSelectorFromElement(element)
-
-      if (selector) {
-        parent = $(selector)[0]
-      }
-
-      return parent || element.parentNode
-    }
-
-    static _dataApiKeydownHandler(event) {
-      if (!REGEXP_KEYDOWN.test(event.which) || /button/i.test(event.target.tagName) && event.which === SPACE_KEYCODE ||
-         /input|textarea/i.test(event.target.tagName)) {
-        return
-      }
-
-      event.preventDefault()
-      event.stopPropagation()
-
-      if (this.disabled || $(this).hasClass(ClassName.DISABLED)) {
-        return
-      }
-
-      const parent   = Dropdown._getParentFromElement(this)
-      const isActive = $(parent).hasClass(ClassName.SHOW)
-
-      if (!isActive && (event.which !== ESCAPE_KEYCODE || event.which !== SPACE_KEYCODE) ||
-           isActive && (event.which === ESCAPE_KEYCODE || event.which === SPACE_KEYCODE)) {
-
-        if (event.which === ESCAPE_KEYCODE) {
-          const toggle = $(parent).find(Selector.DATA_TOGGLE)[0]
-          $(toggle).trigger('focus')
-        }
-
-        $(this).trigger('click')
-        return
-      }
-
-      const items = $(parent).find(Selector.VISIBLE_ITEMS).get()
-
-      if (!items.length) {
-        return
-      }
-
-      let index = items.indexOf(event.target)
-
-      if (event.which === ARROW_UP_KEYCODE && index > 0) { // up
-        index--
-      }
-
-      if (event.which === ARROW_DOWN_KEYCODE && index < items.length - 1) { // down
-        index++
-      }
-
-      if (index < 0) {
-        index = 0
-      }
-
-      items[index].focus()
-    }
-
-  }
-
-
-  /**
-   * ------------------------------------------------------------------------
-   * Data Api implementation
-   * ------------------------------------------------------------------------
-   */
-
-  $(document)
-    .on(Event.KEYDOWN_DATA_API, Selector.DATA_TOGGLE,  Dropdown._dataApiKeydownHandler)
-    .on(Event.KEYDOWN_DATA_API, Selector.MENU, Dropdown._dataApiKeydownHandler)
-    .on(`${Event.CLICK_DATA_API} ${Event.KEYUP_DATA_API}`, Dropdown._clearMenus)
-    .on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {
-      event.preventDefault()
-      event.stopPropagation()
-      Dropdown._jQueryInterface.call($(this), 'toggle')
-    })
-    .on(Event.CLICK_DATA_API, Selector.FORM_CHILD, (e) => {
-      e.stopPropagation()
-    })
-
-
-  /**
-   * ------------------------------------------------------------------------
-   * jQuery
-   * ------------------------------------------------------------------------
-   */
-
-  $.fn[NAME]             = Dropdown._jQueryInterface
-  $.fn[NAME].Constructor = Dropdown
-  $.fn[NAME].noConflict  = function () {
-    $.fn[NAME] = JQUERY_NO_CONFLICT
-    return Dropdown._jQueryInterface
-  }
-
-  return Dropdown
-
-})($, Popper)
-
-export default Dropdown
diff --git a/assets/javascript/src/index.js b/assets/javascript/src/index.js
deleted file mode 100644
index f30b94c..0000000
--- a/assets/javascript/src/index.js
+++ /dev/null
@@ -1,50 +0,0 @@
-import $ from 'jquery'
-import Alert from './alert'
-import Button from './button'
-import Carousel from './carousel'
-import Collapse from './collapse'
-import Dropdown from './dropdown'
-import Modal from './modal'
-import Popover from './popover'
-import Scrollspy from './scrollspy'
-import Tab from './tab'
-import Tooltip from './tooltip'
-import Util from './util'
-
-/**
- * --------------------------------------------------------------------------
- * Bootstrap (v4.0.0-alpha.6): index.js
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- * --------------------------------------------------------------------------
- */
-
-(() => {
-  if (typeof $ === 'undefined') {
-    throw new Error('Bootstrap\'s JavaScript requires jQuery. jQuery must be included before Bootstrap\'s JavaScript.')
-  }
-
-  const version = $.fn.jquery.split(' ')[0].split('.')
-  const minMajor = 1
-  const ltMajor  = 2
-  const minMinor = 9
-  const minPatch = 1
-  const maxMajor = 4
-
-  if (version[0] < ltMajor && version[1] < minMinor || version[0] === minMajor && version[1] === minMinor && version[2] < minPatch || version[0] >= maxMajor) {
-    throw new Error('Bootstrap\'s JavaScript requires at least jQuery v1.9.1 but less than v4.0.0')
-  }
-})($)
-
-export {
-  Util,
-  Alert,
-  Button,
-  Carousel,
-  Collapse,
-  Dropdown,
-  Modal,
-  Popover,
-  Scrollspy,
-  Tab,
-  Tooltip
-}
diff --git a/assets/javascript/src/modal.js b/assets/javascript/src/modal.js
deleted file mode 100644
index 07fdc9f..0000000
--- a/assets/javascript/src/modal.js
+++ /dev/null
@@ -1,590 +0,0 @@
-import $ from 'jquery'
-import Util from './util'
-
-
-/**
- * --------------------------------------------------------------------------
- * Bootstrap (v4.0.0-beta.2): modal.js
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- * --------------------------------------------------------------------------
- */
-
-const Modal = (() => {
-
-
-  /**
-   * ------------------------------------------------------------------------
-   * Constants
-   * ------------------------------------------------------------------------
-   */
-
-  const NAME                         = 'modal'
-  const VERSION                      = '4.0.0-beta.2'
-  const DATA_KEY                     = 'bs.modal'
-  const EVENT_KEY                    = `.${DATA_KEY}`
-  const DATA_API_KEY                 = '.data-api'
-  const JQUERY_NO_CONFLICT           = $.fn[NAME]
-  const TRANSITION_DURATION          = 300
-  const BACKDROP_TRANSITION_DURATION = 150
-  const ESCAPE_KEYCODE               = 27 // KeyboardEvent.which value for Escape (Esc) key
-
-  const Default = {
-    backdrop : true,
-    keyboard : true,
-    focus    : true,
-    show     : true
-  }
-
-  const DefaultType = {
-    backdrop : '(boolean|string)',
-    keyboard : 'boolean',
-    focus    : 'boolean',
-    show     : 'boolean'
-  }
-
-  const Event = {
-    HIDE              : `hide${EVENT_KEY}`,
-    HIDDEN            : `hidden${EVENT_KEY}`,
-    SHOW              : `show${EVENT_KEY}`,
-    SHOWN             : `shown${EVENT_KEY}`,
-    FOCUSIN           : `focusin${EVENT_KEY}`,
-    RESIZE            : `resize${EVENT_KEY}`,
-    CLICK_DISMISS     : `click.dismiss${EVENT_KEY}`,
-    KEYDOWN_DISMISS   : `keydown.dismiss${EVENT_KEY}`,
-    MOUSEUP_DISMISS   : `mouseup.dismiss${EVENT_KEY}`,
-    MOUSEDOWN_DISMISS : `mousedown.dismiss${EVENT_KEY}`,
-    CLICK_DATA_API    : `click${EVENT_KEY}${DATA_API_KEY}`
-  }
-
-  const ClassName = {
-    SCROLLBAR_MEASURER : 'modal-scrollbar-measure',
-    BACKDROP           : 'modal-backdrop',
-    OPEN               : 'modal-open',
-    FADE               : 'fade',
-    SHOW               : 'show'
-  }
-
-  const Selector = {
-    DIALOG             : '.modal-dialog',
-    DATA_TOGGLE        : '[data-toggle="modal"]',
-    DATA_DISMISS       : '[data-dismiss="modal"]',
-    FIXED_CONTENT      : '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top',
-    STICKY_CONTENT     : '.sticky-top',
-    NAVBAR_TOGGLER     : '.navbar-toggler'
-  }
-
-
-  /**
-   * ------------------------------------------------------------------------
-   * Class Definition
-   * ------------------------------------------------------------------------
-   */
-
-  class Modal {
-
-    constructor(element, config) {
-      this._config              = this._getConfig(config)
-      this._element             = element
-      this._dialog              = $(element).find(Selector.DIALOG)[0]
-      this._backdrop            = null
-      this._isShown             = false
-      this._isBodyOverflowing   = false
-      this._ignoreBackdropClick = false
-      this._originalBodyPadding = 0
-      this._scrollbarWidth      = 0
-    }
-
-
-    // getters
-
-    static get VERSION() {
-      return VERSION
-    }
-
-    static get Default() {
-      return Default
-    }
-
-
-    // public
-
-    toggle(relatedTarget) {
-      return this._isShown ? this.hide() : this.show(relatedTarget)
-    }
-
-    show(relatedTarget) {
-      if (this._isTransitioning || this._isShown) {
-        return
-      }
-
-      if (Util.supportsTransitionEnd() && $(this._element).hasClass(ClassName.FADE)) {
-        this._isTransitioning = true
-      }
-
-      const showEvent = $.Event(Event.SHOW, {
-        relatedTarget
-      })
-
-      $(this._element).trigger(showEvent)
-
-      if (this._isShown || showEvent.isDefaultPrevented()) {
-        return
-      }
-
-      this._isShown = true
-
-      this._checkScrollbar()
-      this._setScrollbar()
-
-      this._adjustDialog()
-
-      $(document.body).addClass(ClassName.OPEN)
-
-      this._setEscapeEvent()
-      this._setResizeEvent()
-
-      $(this._element).on(
-        Event.CLICK_DISMISS,
-        Selector.DATA_DISMISS,
-        (event) => this.hide(event)
-      )
-
-      $(this._dialog).on(Event.MOUSEDOWN_DISMISS, () => {
-        $(this._element).one(Event.MOUSEUP_DISMISS, (event) => {
-          if ($(event.target).is(this._element)) {
-            this._ignoreBackdropClick = true
-          }
-        })
-      })
-
-      this._showBackdrop(() => this._showElement(relatedTarget))
-    }
-
-    hide(event) {
-      if (event) {
-        event.preventDefault()
-      }
-
-      if (this._isTransitioning || !this._isShown) {
-        return
-      }
-
-      const hideEvent = $.Event(Event.HIDE)
-
-      $(this._element).trigger(hideEvent)
-
-      if (!this._isShown || hideEvent.isDefaultPrevented()) {
-        return
-      }
-
-      this._isShown = false
-
-      const transition = Util.supportsTransitionEnd() && $(this._element).hasClass(ClassName.FADE)
-
-      if (transition) {
-        this._isTransitioning = true
-      }
-
-      this._setEscapeEvent()
-      this._setResizeEvent()
-
-      $(document).off(Event.FOCUSIN)
-
-      $(this._element).removeClass(ClassName.SHOW)
-
-      $(this._element).off(Event.CLICK_DISMISS)
-      $(this._dialog).off(Event.MOUSEDOWN_DISMISS)
-
-      if (transition) {
-
-        $(this._element)
-          .one(Util.TRANSITION_END, (event) => this._hideModal(event))
-          .emulateTransitionEnd(TRANSITION_DURATION)
-      } else {
-        this._hideModal()
-      }
-    }
-
-    dispose() {
-      $.removeData(this._element, DATA_KEY)
-
-      $(window, document, this._element, this._backdrop).off(EVENT_KEY)
-
-      this._config              = null
-      this._element             = null
-      this._dialog              = null
-      this._backdrop            = null
-      this._isShown             = null
-      this._isBodyOverflowing   = null
-      this._ignoreBackdropClick = null
-      this._scrollbarWidth      = null
-    }
-
-    handleUpdate() {
-      this._adjustDialog()
-    }
-
-    // private
-
-    _getConfig(config) {
-      config = $.extend({}, Default, config)
-      Util.typeCheckConfig(NAME, config, DefaultType)
-      return config
-    }
-
-    _showElement(relatedTarget) {
-      const transition = Util.supportsTransitionEnd() &&
-        $(this._element).hasClass(ClassName.FADE)
-
-      if (!this._element.parentNode ||
-         this._element.parentNode.nodeType !== Node.ELEMENT_NODE) {
-        // don't move modals dom position
-        document.body.appendChild(this._element)
-      }
-
-      this._element.style.display = 'block'
-      this._element.removeAttribute('aria-hidden')
-      this._element.scrollTop = 0
-
-      if (transition) {
-        Util.reflow(this._element)
-      }
-
-      $(this._element).addClass(ClassName.SHOW)
-
-      if (this._config.focus) {
-        this._enforceFocus()
-      }
-
-      const shownEvent = $.Event(Event.SHOWN, {
-        relatedTarget
-      })
-
-      const transitionComplete = () => {
-        if (this._config.focus) {
-          this._element.focus()
-        }
-        this._isTransitioning = false
-        $(this._element).trigger(shownEvent)
-      }
-
-      if (transition) {
-        $(this._dialog)
-          .one(Util.TRANSITION_END, transitionComplete)
-          .emulateTransitionEnd(TRANSITION_DURATION)
-      } else {
-        transitionComplete()
-      }
-    }
-
-    _enforceFocus() {
-      $(document)
-        .off(Event.FOCUSIN) // guard against infinite focus loop
-        .on(Event.FOCUSIN, (event) => {
-          if (document !== event.target &&
-              this._element !== event.target &&
-              !$(this._element).has(event.target).length) {
-            this._element.focus()
-          }
-        })
-    }
-
-    _setEscapeEvent() {
-      if (this._isShown && this._config.keyboard) {
-        $(this._element).on(Event.KEYDOWN_DISMISS, (event) => {
-          if (event.which === ESCAPE_KEYCODE) {
-            event.preventDefault()
-            this.hide()
-          }
-        })
-
-      } else if (!this._isShown) {
-        $(this._element).off(Event.KEYDOWN_DISMISS)
-      }
-    }
-
-    _setResizeEvent() {
-      if (this._isShown) {
-        $(window).on(Event.RESIZE, (event) => this.handleUpdate(event))
-      } else {
-        $(window).off(Event.RESIZE)
-      }
-    }
-
-    _hideModal() {
-      this._element.style.display = 'none'
-      this._element.setAttribute('aria-hidden', true)
-      this._isTransitioning = false
-      this._showBackdrop(() => {
-        $(document.body).removeClass(ClassName.OPEN)
-        this._resetAdjustments()
-        this._resetScrollbar()
-        $(this._element).trigger(Event.HIDDEN)
-      })
-    }
-
-    _removeBackdrop() {
-      if (this._backdrop) {
-        $(this._backdrop).remove()
-        this._backdrop = null
-      }
-    }
-
-    _showBackdrop(callback) {
-      const animate = $(this._element).hasClass(ClassName.FADE) ?
-        ClassName.FADE : ''
-
-      if (this._isShown && this._config.backdrop) {
-        const doAnimate = Util.supportsTransitionEnd() && animate
-
-        this._backdrop = document.createElement('div')
-        this._backdrop.className = ClassName.BACKDROP
-
-        if (animate) {
-          $(this._backdrop).addClass(animate)
-        }
-
-        $(this._backdrop).appendTo(document.body)
-
-        $(this._element).on(Event.CLICK_DISMISS, (event) => {
-          if (this._ignoreBackdropClick) {
-            this._ignoreBackdropClick = false
-            return
-          }
-          if (event.target !== event.currentTarget) {
-            return
-          }
-          if (this._config.backdrop === 'static') {
-            this._element.focus()
-          } else {
-            this.hide()
-          }
-        })
-
-        if (doAnimate) {
-          Util.reflow(this._backdrop)
-        }
-
-        $(this._backdrop).addClass(ClassName.SHOW)
-
-        if (!callback) {
-          return
-        }
-
-        if (!doAnimate) {
-          callback()
-          return
-        }
-
-        $(this._backdrop)
-          .one(Util.TRANSITION_END, callback)
-          .emulateTransitionEnd(BACKDROP_TRANSITION_DURATION)
-
-      } else if (!this._isShown && this._backdrop) {
-        $(this._backdrop).removeClass(ClassName.SHOW)
-
-        const callbackRemove = () => {
-          this._removeBackdrop()
-          if (callback) {
-            callback()
-          }
-        }
-
-        if (Util.supportsTransitionEnd() &&
-           $(this._element).hasClass(ClassName.FADE)) {
-          $(this._backdrop)
-            .one(Util.TRANSITION_END, callbackRemove)
-            .emulateTransitionEnd(BACKDROP_TRANSITION_DURATION)
-        } else {
-          callbackRemove()
-        }
-
-      } else if (callback) {
-        callback()
-      }
-    }
-
-
-    // ----------------------------------------------------------------------
-    // the following methods are used to handle overflowing modals
-    // todo (fat): these should probably be refactored out of modal.js
-    // ----------------------------------------------------------------------
-
-    _adjustDialog() {
-      const isModalOverflowing =
-        this._element.scrollHeight > document.documentElement.clientHeight
-
-      if (!this._isBodyOverflowing && isModalOverflowing) {
-        this._element.style.paddingLeft = `${this._scrollbarWidth}px`
-      }
-
-      if (this._isBodyOverflowing && !isModalOverflowing) {
-        this._element.style.paddingRight = `${this._scrollbarWidth}px`
-      }
-    }
-
-    _resetAdjustments() {
-      this._element.style.paddingLeft = ''
-      this._element.style.paddingRight = ''
-    }
-
-    _checkScrollbar() {
-      const rect = document.body.getBoundingClientRect()
-      this._isBodyOverflowing = rect.left + rect.right < window.innerWidth
-      this._scrollbarWidth = this._getScrollbarWidth()
-    }
-
-    _setScrollbar() {
-      if (this._isBodyOverflowing) {
-        // Note: DOMNode.style.paddingRight returns the actual value or '' if not set
-        //   while $(DOMNode).css('padding-right') returns the calculated value or 0 if not set
-
-        // Adjust fixed content padding
-        $(Selector.FIXED_CONTENT).each((index, element) => {
-          const actualPadding = $(element)[0].style.paddingRight
-          const calculatedPadding = $(element).css('padding-right')
-          $(element).data('padding-right', actualPadding).css('padding-right', `${parseFloat(calculatedPadding) + this._scrollbarWidth}px`)
-        })
-
-        // Adjust sticky content margin
-        $(Selector.STICKY_CONTENT).each((index, element) => {
-          const actualMargin = $(element)[0].style.marginRight
-          const calculatedMargin = $(element).css('margin-right')
-          $(element).data('margin-right', actualMargin).css('margin-right', `${parseFloat(calculatedMargin) - this._scrollbarWidth}px`)
-        })
-
-        // Adjust navbar-toggler margin
-        $(Selector.NAVBAR_TOGGLER).each((index, element) => {
-          const actualMargin = $(element)[0].style.marginRight
-          const calculatedMargin = $(element).css('margin-right')
-          $(element).data('margin-right', actualMargin).css('margin-right', `${parseFloat(calculatedMargin) + this._scrollbarWidth}px`)
-        })
-
-        // Adjust body padding
-        const actualPadding = document.body.style.paddingRight
-        const calculatedPadding = $('body').css('padding-right')
-        $('body').data('padding-right', actualPadding).css('padding-right', `${parseFloat(calculatedPadding) + this._scrollbarWidth}px`)
-      }
-    }
-
-    _resetScrollbar() {
-      // Restore fixed content padding
-      $(Selector.FIXED_CONTENT).each((index, element) => {
-        const padding = $(element).data('padding-right')
-        if (typeof padding !== 'undefined') {
-          $(element).css('padding-right', padding).removeData('padding-right')
-        }
-      })
-
-      // Restore sticky content and navbar-toggler margin
-      $(`${Selector.STICKY_CONTENT}, ${Selector.NAVBAR_TOGGLER}`).each((index, element) => {
-        const margin = $(element).data('margin-right')
-        if (typeof margin !== 'undefined') {
-          $(element).css('margin-right', margin).removeData('margin-right')
-        }
-      })
-
-      // Restore body padding
-      const padding = $('body').data('padding-right')
-      if (typeof padding !== 'undefined') {
-        $('body').css('padding-right', padding).removeData('padding-right')
-      }
-    }
-
-    _getScrollbarWidth() { // thx d.walsh
-      const scrollDiv = document.createElement('div')
-      scrollDiv.className = ClassName.SCROLLBAR_MEASURER
-      document.body.appendChild(scrollDiv)
-      const scrollbarWidth = scrollDiv.getBoundingClientRect().width - scrollDiv.clientWidth
-      document.body.removeChild(scrollDiv)
-      return scrollbarWidth
-    }
-
-
-    // static
-
-    static _jQueryInterface(config, relatedTarget) {
-      return this.each(function () {
-        let data      = $(this).data(DATA_KEY)
-        const _config = $.extend(
-          {},
-          Modal.Default,
-          $(this).data(),
-          typeof config === 'object' && config
-        )
-
-        if (!data) {
-          data = new Modal(this, _config)
-          $(this).data(DATA_KEY, data)
-        }
-
-        if (typeof config === 'string') {
-          if (typeof data[config] === 'undefined') {
-            throw new Error(`No method named "${config}"`)
-          }
-          data[config](relatedTarget)
-        } else if (_config.show) {
-          data.show(relatedTarget)
-        }
-      })
-    }
-
-  }
-
-
-  /**
-   * ------------------------------------------------------------------------
-   * Data Api implementation
-   * ------------------------------------------------------------------------
-   */
-
-  $(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {
-    let target
-    const selector = Util.getSelectorFromElement(this)
-
-    if (selector) {
-      target = $(selector)[0]
-    }
-
-    const config = $(target).data(DATA_KEY) ?
-      'toggle' : $.extend({}, $(target).data(), $(this).data())
-
-    if (this.tagName === 'A' || this.tagName === 'AREA') {
-      event.preventDefault()
-    }
-
-    const $target = $(target).one(Event.SHOW, (showEvent) => {
-      if (showEvent.isDefaultPrevented()) {
-        // only register focus restorer if modal will actually get shown
-        return
-      }
-
-      $target.one(Event.HIDDEN, () => {
-        if ($(this).is(':visible')) {
-          this.focus()
-        }
-      })
-    })
-
-    Modal._jQueryInterface.call($(target), config, this)
-  })
-
-
-  /**
-   * ------------------------------------------------------------------------
-   * jQuery
-   * ------------------------------------------------------------------------
-   */
-
-  $.fn[NAME]             = Modal._jQueryInterface
-  $.fn[NAME].Constructor = Modal
-  $.fn[NAME].noConflict  = function () {
-    $.fn[NAME] = JQUERY_NO_CONFLICT
-    return Modal._jQueryInterface
-  }
-
-  return Modal
-
-})($)
-
-export default Modal
diff --git a/assets/javascript/src/popover.js b/assets/javascript/src/popover.js
deleted file mode 100644
index ff697d8..0000000
--- a/assets/javascript/src/popover.js
+++ /dev/null
@@ -1,194 +0,0 @@
-import $ from 'jquery'
-import Tooltip from './tooltip'
-
-
-/**
- * --------------------------------------------------------------------------
- * Bootstrap (v4.0.0-beta.2): popover.js
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- * --------------------------------------------------------------------------
- */
-
-const Popover = (() => {
-
-
-  /**
-   * ------------------------------------------------------------------------
-   * Constants
-   * ------------------------------------------------------------------------
-   */
-
-  const NAME                = 'popover'
-  const VERSION             = '4.0.0-beta.2'
-  const DATA_KEY            = 'bs.popover'
-  const EVENT_KEY           = `.${DATA_KEY}`
-  const JQUERY_NO_CONFLICT  = $.fn[NAME]
-  const CLASS_PREFIX        = 'bs-popover'
-  const BSCLS_PREFIX_REGEX  = new RegExp(`(^|\\s)${CLASS_PREFIX}\\S+`, 'g')
-
-  const Default = $.extend({}, Tooltip.Default, {
-    placement : 'right',
-    trigger   : 'click',
-    content   : '',
-    template  : '<div class="popover" role="tooltip">'
-              + '<div class="arrow"></div>'
-              + '<h3 class="popover-header"></h3>'
-              + '<div class="popover-body"></div></div>'
-  })
-
-  const DefaultType = $.extend({}, Tooltip.DefaultType, {
-    content : '(string|element|function)'
-  })
-
-  const ClassName = {
-    FADE : 'fade',
-    SHOW : 'show'
-  }
-
-  const Selector = {
-    TITLE   : '.popover-header',
-    CONTENT : '.popover-body'
-  }
-
-  const Event = {
-    HIDE       : `hide${EVENT_KEY}`,
-    HIDDEN     : `hidden${EVENT_KEY}`,
-    SHOW       : `show${EVENT_KEY}`,
-    SHOWN      : `shown${EVENT_KEY}`,
-    INSERTED   : `inserted${EVENT_KEY}`,
-    CLICK      : `click${EVENT_KEY}`,
-    FOCUSIN    : `focusin${EVENT_KEY}`,
-    FOCUSOUT   : `focusout${EVENT_KEY}`,
-    MOUSEENTER : `mouseenter${EVENT_KEY}`,
-    MOUSELEAVE : `mouseleave${EVENT_KEY}`
-  }
-
-
-  /**
-   * ------------------------------------------------------------------------
-   * Class Definition
-   * ------------------------------------------------------------------------
-   */
-
-  class Popover extends Tooltip {
-
-
-    // getters
-
-    static get VERSION() {
-      return VERSION
-    }
-
-    static get Default() {
-      return Default
-    }
-
-    static get NAME() {
-      return NAME
-    }
-
-    static get DATA_KEY() {
-      return DATA_KEY
-    }
-
-    static get Event() {
-      return Event
-    }
-
-    static get EVENT_KEY() {
-      return EVENT_KEY
-    }
-
-    static get DefaultType() {
-      return DefaultType
-    }
-
-
-    // overrides
-
-    isWithContent() {
-      return this.getTitle() || this._getContent()
-    }
-
-    addAttachmentClass(attachment) {
-      $(this.getTipElement()).addClass(`${CLASS_PREFIX}-${attachment}`)
-    }
-
-    getTipElement() {
-      this.tip = this.tip || $(this.config.template)[0]
-      return this.tip
-    }
-
-    setContent() {
-      const $tip = $(this.getTipElement())
-
-      // we use append for html objects to maintain js events
-      this.setElementContent($tip.find(Selector.TITLE), this.getTitle())
-      this.setElementContent($tip.find(Selector.CONTENT), this._getContent())
-
-      $tip.removeClass(`${ClassName.FADE} ${ClassName.SHOW}`)
-    }
-
-    // private
-
-    _getContent() {
-      return this.element.getAttribute('data-content')
-        || (typeof this.config.content === 'function' ?
-              this.config.content.call(this.element) :
-              this.config.content)
-    }
-
-    _cleanTipClass() {
-      const $tip = $(this.getTipElement())
-      const tabClass = $tip.attr('class').match(BSCLS_PREFIX_REGEX)
-      if (tabClass !== null && tabClass.length > 0) {
-        $tip.removeClass(tabClass.join(''))
-      }
-    }
-
-
-    // static
-
-    static _jQueryInterface(config) {
-      return this.each(function () {
-        let data      = $(this).data(DATA_KEY)
-        const _config = typeof config === 'object' ? config : null
-
-        if (!data && /destroy|hide/.test(config)) {
-          return
-        }
-
-        if (!data) {
-          data = new Popover(this, _config)
-          $(this).data(DATA_KEY, data)
-        }
-
-        if (typeof config === 'string') {
-          if (typeof data[config] === 'undefined') {
-            throw new Error(`No method named "${config}"`)
-          }
-          data[config]()
-        }
-      })
-    }
-  }
-
-
-  /**
-   * ------------------------------------------------------------------------
-   * jQuery
-   * ------------------------------------------------------------------------
-   */
-
-  $.fn[NAME]             = Popover._jQueryInterface
-  $.fn[NAME].Constructor = Popover
-  $.fn[NAME].noConflict  = function () {
-    $.fn[NAME] = JQUERY_NO_CONFLICT
-    return Popover._jQueryInterface
-  }
-
-  return Popover
-
-})($)
-
-export default Popover
diff --git a/assets/javascript/src/scrollspy.js b/assets/javascript/src/scrollspy.js
deleted file mode 100644
index a0e24dd..0000000
--- a/assets/javascript/src/scrollspy.js
+++ /dev/null
@@ -1,340 +0,0 @@
-import $ from 'jquery'
-import Util from './util'
-
-
-/**
- * --------------------------------------------------------------------------
- * Bootstrap (v4.0.0-beta.2): scrollspy.js
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- * --------------------------------------------------------------------------
- */
-
-const ScrollSpy = (() => {
-
-
-  /**
-   * ------------------------------------------------------------------------
-   * Constants
-   * ------------------------------------------------------------------------
-   */
-
-  const NAME               = 'scrollspy'
-  const VERSION            = '4.0.0-beta.2'
-  const DATA_KEY           = 'bs.scrollspy'
-  const EVENT_KEY          = `.${DATA_KEY}`
-  const DATA_API_KEY       = '.data-api'
-  const JQUERY_NO_CONFLICT = $.fn[NAME]
-
-  const Default = {
-    offset : 10,
-    method : 'auto',
-    target : ''
-  }
-
-  const DefaultType = {
-    offset : 'number',
-    method : 'string',
-    target : '(string|element)'
-  }
-
-  const Event = {
-    ACTIVATE      : `activate${EVENT_KEY}`,
-    SCROLL        : `scroll${EVENT_KEY}`,
-    LOAD_DATA_API : `load${EVENT_KEY}${DATA_API_KEY}`
-  }
-
-  const ClassName = {
-    DROPDOWN_ITEM : 'dropdown-item',
-    DROPDOWN_MENU : 'dropdown-menu',
-    ACTIVE        : 'active'
-  }
-
-  const Selector = {
-    DATA_SPY        : '[data-spy="scroll"]',
-    ACTIVE          : '.active',
-    NAV_LIST_GROUP  : '.nav, .list-group',
-    NAV_LINKS       : '.nav-link',
-    NAV_ITEMS       : '.nav-item',
-    LIST_ITEMS      : '.list-group-item',
-    DROPDOWN        : '.dropdown',
-    DROPDOWN_ITEMS  : '.dropdown-item',
-    DROPDOWN_TOGGLE : '.dropdown-toggle'
-  }
-
-  const OffsetMethod = {
-    OFFSET   : 'offset',
-    POSITION : 'position'
-  }
-
-
-  /**
-   * ------------------------------------------------------------------------
-   * Class Definition
-   * ------------------------------------------------------------------------
-   */
-
-  class ScrollSpy {
-
-    constructor(element, config) {
-      this._element       = element
-      this._scrollElement = element.tagName === 'BODY' ? window : element
-      this._config        = this._getConfig(config)
-      this._selector      = `${this._config.target} ${Selector.NAV_LINKS},`
-                          + `${this._config.target} ${Selector.LIST_ITEMS},`
-                          + `${this._config.target} ${Selector.DROPDOWN_ITEMS}`
-      this._offsets       = []
-      this._targets       = []
-      this._activeTarget  = null
-      this._scrollHeight  = 0
-
-      $(this._scrollElement).on(Event.SCROLL, (event) => this._process(event))
-
-      this.refresh()
-      this._process()
-    }
-
-
-    // getters
-
-    static get VERSION() {
-      return VERSION
-    }
-
-    static get Default() {
-      return Default
-    }
-
-
-    // public
-
-    refresh() {
-      const autoMethod = this._scrollElement !== this._scrollElement.window ?
-        OffsetMethod.POSITION : OffsetMethod.OFFSET
-
-      const offsetMethod = this._config.method === 'auto' ?
-        autoMethod : this._config.method
-
-      const offsetBase = offsetMethod === OffsetMethod.POSITION ?
-        this._getScrollTop() : 0
-
-      this._offsets = []
-      this._targets = []
-
-      this._scrollHeight = this._getScrollHeight()
-
-      const targets = $.makeArray($(this._selector))
-
-      targets
-        .map((element) => {
-          let target
-          const targetSelector = Util.getSelectorFromElement(element)
-
-          if (targetSelector) {
-            target = $(targetSelector)[0]
-          }
-
-          if (target) {
-            const targetBCR = target.getBoundingClientRect()
-            if (targetBCR.width || targetBCR.height) {
-              // todo (fat): remove sketch reliance on jQuery position/offset
-              return [
-                $(target)[offsetMethod]().top + offsetBase,
-                targetSelector
-              ]
-            }
-          }
-          return null
-        })
-        .filter((item)  => item)
-        .sort((a, b)    => a[0] - b[0])
-        .forEach((item) => {
-          this._offsets.push(item[0])
-          this._targets.push(item[1])
-        })
-    }
-
-    dispose() {
-      $.removeData(this._element, DATA_KEY)
-      $(this._scrollElement).off(EVENT_KEY)
-
-      this._element       = null
-      this._scrollElement = null
-      this._config        = null
-      this._selector      = null
-      this._offsets       = null
-      this._targets       = null
-      this._activeTarget  = null
-      this._scrollHeight  = null
-    }
-
-
-    // private
-
-    _getConfig(config) {
-      config = $.extend({}, Default, config)
-
-      if (typeof config.target !== 'string') {
-        let id = $(config.target).attr('id')
-        if (!id) {
-          id = Util.getUID(NAME)
-          $(config.target).attr('id', id)
-        }
-        config.target = `#${id}`
-      }
-
-      Util.typeCheckConfig(NAME, config, DefaultType)
-
-      return config
-    }
-
-    _getScrollTop() {
-      return this._scrollElement === window ?
-          this._scrollElement.pageYOffset : this._scrollElement.scrollTop
-    }
-
-    _getScrollHeight() {
-      return this._scrollElement.scrollHeight || Math.max(
-        document.body.scrollHeight,
-        document.documentElement.scrollHeight
-      )
-    }
-
-    _getOffsetHeight() {
-      return this._scrollElement === window ?
-          window.innerHeight : this._scrollElement.getBoundingClientRect().height
-    }
-
-    _process() {
-      const scrollTop    = this._getScrollTop() + this._config.offset
-      const scrollHeight = this._getScrollHeight()
-      const maxScroll    = this._config.offset
-        + scrollHeight
-        - this._getOffsetHeight()
-
-      if (this._scrollHeight !== scrollHeight) {
-        this.refresh()
-      }
-
-      if (scrollTop >= maxScroll) {
-        const target = this._targets[this._targets.length - 1]
-
-        if (this._activeTarget !== target) {
-          this._activate(target)
-        }
-        return
-      }
-
-      if (this._activeTarget && scrollTop < this._offsets[0] && this._offsets[0] > 0) {
-        this._activeTarget = null
-        this._clear()
-        return
-      }
-
-      for (let i = this._offsets.length; i--;) {
-        const isActiveTarget = this._activeTarget !== this._targets[i]
-            && scrollTop >= this._offsets[i]
-            && (typeof this._offsets[i + 1] === 'undefined' ||
-                scrollTop < this._offsets[i + 1])
-
-        if (isActiveTarget) {
-          this._activate(this._targets[i])
-        }
-      }
-    }
-
-    _activate(target) {
-      this._activeTarget = target
-
-      this._clear()
-
-      let queries = this._selector.split(',')
-      // eslint-disable-next-line arrow-body-style
-      queries     = queries.map((selector) => {
-        return `${selector}[data-target="${target}"],` +
-               `${selector}[href="${target}"]`
-      })
-
-      const $link = $(queries.join(','))
-
-      if ($link.hasClass(ClassName.DROPDOWN_ITEM)) {
-        $link.closest(Selector.DROPDOWN).find(Selector.DROPDOWN_TOGGLE).addClass(ClassName.ACTIVE)
-        $link.addClass(ClassName.ACTIVE)
-      } else {
-        // Set triggered link as active
-        $link.addClass(ClassName.ACTIVE)
-        // Set triggered links parents as active
-        // With both <ul> and <nav> markup a parent is the previous sibling of any nav ancestor
-        $link.parents(Selector.NAV_LIST_GROUP).prev(`${Selector.NAV_LINKS}, ${Selector.LIST_ITEMS}`).addClass(ClassName.ACTIVE)
-        // Handle special case when .nav-link is inside .nav-item
-        $link.parents(Selector.NAV_LIST_GROUP).prev(Selector.NAV_ITEMS).children(Selector.NAV_LINKS).addClass(ClassName.ACTIVE)
-      }
-
-      $(this._scrollElement).trigger(Event.ACTIVATE, {
-        relatedTarget: target
-      })
-    }
-
-    _clear() {
-      $(this._selector).filter(Selector.ACTIVE).removeClass(ClassName.ACTIVE)
-    }
-
-
-    // static
-
-    static _jQueryInterface(config) {
-      return this.each(function () {
-        let data      = $(this).data(DATA_KEY)
-        const _config = typeof config === 'object' && config
-
-        if (!data) {
-          data = new ScrollSpy(this, _config)
-          $(this).data(DATA_KEY, data)
-        }
-
-        if (typeof config === 'string') {
-          if (typeof data[config] === 'undefined') {
-            throw new Error(`No method named "${config}"`)
-          }
-          data[config]()
-        }
-      })
-    }
-
-
-  }
-
-
-  /**
-   * ------------------------------------------------------------------------
-   * Data Api implementation
-   * ------------------------------------------------------------------------
-   */
-
-  $(window).on(Event.LOAD_DATA_API, () => {
-    const scrollSpys = $.makeArray($(Selector.DATA_SPY))
-
-    for (let i = scrollSpys.length; i--;) {
-      const $spy = $(scrollSpys[i])
-      ScrollSpy._jQueryInterface.call($spy, $spy.data())
-    }
-  })
-
-
-  /**
-   * ------------------------------------------------------------------------
-   * jQuery
-   * ------------------------------------------------------------------------
-   */
-
-  $.fn[NAME]             = ScrollSpy._jQueryInterface
-  $.fn[NAME].Constructor = ScrollSpy
-  $.fn[NAME].noConflict  = function () {
-    $.fn[NAME] = JQUERY_NO_CONFLICT
-    return ScrollSpy._jQueryInterface
-  }
-
-  return ScrollSpy
-
-})($)
-
-export default ScrollSpy
diff --git a/assets/javascript/src/tab.js b/assets/javascript/src/tab.js
deleted file mode 100644
index 982121c..0000000
--- a/assets/javascript/src/tab.js
+++ /dev/null
@@ -1,287 +0,0 @@
-import $ from 'jquery'
-import Util from './util'
-
-
-/**
- * --------------------------------------------------------------------------
- * Bootstrap (v4.0.0-beta.2): tab.js
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- * --------------------------------------------------------------------------
- */
-
-const Tab = (() => {
-
-
-  /**
-   * ------------------------------------------------------------------------
-   * Constants
-   * ------------------------------------------------------------------------
-   */
-
-  const NAME                = 'tab'
-  const VERSION             = '4.0.0-beta.2'
-  const DATA_KEY            = 'bs.tab'
-  const EVENT_KEY           = `.${DATA_KEY}`
-  const DATA_API_KEY        = '.data-api'
-  const JQUERY_NO_CONFLICT  = $.fn[NAME]
-  const TRANSITION_DURATION = 150
-
-  const Event = {
-    HIDE           : `hide${EVENT_KEY}`,
-    HIDDEN         : `hidden${EVENT_KEY}`,
-    SHOW           : `show${EVENT_KEY}`,
-    SHOWN          : `shown${EVENT_KEY}`,
-    CLICK_DATA_API : `click${EVENT_KEY}${DATA_API_KEY}`
-  }
-
-  const ClassName = {
-    DROPDOWN_MENU : 'dropdown-menu',
-    ACTIVE        : 'active',
-    DISABLED      : 'disabled',
-    FADE          : 'fade',
-    SHOW          : 'show'
-  }
-
-  const Selector = {
-    DROPDOWN              : '.dropdown',
-    NAV_LIST_GROUP        : '.nav, .list-group',
-    ACTIVE                : '.active',
-    ACTIVE_UL             : '> li > .active',
-    DATA_TOGGLE           : '[data-toggle="tab"], [data-toggle="pill"], [data-toggle="list"]',
-    DROPDOWN_TOGGLE       : '.dropdown-toggle',
-    DROPDOWN_ACTIVE_CHILD : '> .dropdown-menu .active'
-  }
-
-
-  /**
-   * ------------------------------------------------------------------------
-   * Class Definition
-   * ------------------------------------------------------------------------
-   */
-
-  class Tab {
-
-    constructor(element) {
-      this._element = element
-    }
-
-
-    // getters
-
-    static get VERSION() {
-      return VERSION
-    }
-
-
-    // public
-
-    show() {
-      if (this._element.parentNode &&
-          this._element.parentNode.nodeType === Node.ELEMENT_NODE &&
-          $(this._element).hasClass(ClassName.ACTIVE) ||
-          $(this._element).hasClass(ClassName.DISABLED)) {
-        return
-      }
-
-      let target
-      let previous
-      const listElement = $(this._element).closest(Selector.NAV_LIST_GROUP)[0]
-      const selector    = Util.getSelectorFromElement(this._element)
-
-      if (listElement) {
-        const itemSelector = listElement.nodeName === 'UL' ? Selector.ACTIVE_UL : Selector.ACTIVE
-        previous = $.makeArray($(listElement).find(itemSelector))
-        previous = previous[previous.length - 1]
-      }
-
-      const hideEvent = $.Event(Event.HIDE, {
-        relatedTarget: this._element
-      })
-
-      const showEvent = $.Event(Event.SHOW, {
-        relatedTarget: previous
-      })
-
-      if (previous) {
-        $(previous).trigger(hideEvent)
-      }
-
-      $(this._element).trigger(showEvent)
-
-      if (showEvent.isDefaultPrevented() ||
-         hideEvent.isDefaultPrevented()) {
-        return
-      }
-
-      if (selector) {
-        target = $(selector)[0]
-      }
-
-      this._activate(
-        this._element,
-        listElement
-      )
-
-      const complete = () => {
-        const hiddenEvent = $.Event(Event.HIDDEN, {
-          relatedTarget: this._element
-        })
-
-        const shownEvent = $.Event(Event.SHOWN, {
-          relatedTarget: previous
-        })
-
-        $(previous).trigger(hiddenEvent)
-        $(this._element).trigger(shownEvent)
-      }
-
-      if (target) {
-        this._activate(target, target.parentNode, complete)
-      } else {
-        complete()
-      }
-    }
-
-    dispose() {
-      $.removeData(this._element, DATA_KEY)
-      this._element = null
-    }
-
-
-    // private
-
-    _activate(element, container, callback) {
-      let activeElements
-      if (container.nodeName === 'UL') {
-        activeElements = $(container).find(Selector.ACTIVE_UL)
-      } else {
-        activeElements = $(container).children(Selector.ACTIVE)
-      }
-
-      const active          = activeElements[0]
-      const isTransitioning = callback
-        && Util.supportsTransitionEnd()
-        && (active && $(active).hasClass(ClassName.FADE))
-
-      const complete = () => this._transitionComplete(
-        element,
-        active,
-        isTransitioning,
-        callback
-      )
-
-      if (active && isTransitioning) {
-        $(active)
-          .one(Util.TRANSITION_END, complete)
-          .emulateTransitionEnd(TRANSITION_DURATION)
-
-      } else {
-        complete()
-      }
-
-      if (active) {
-        $(active).removeClass(ClassName.SHOW)
-      }
-    }
-
-    _transitionComplete(element, active, isTransitioning, callback) {
-      if (active) {
-        $(active).removeClass(ClassName.ACTIVE)
-
-        const dropdownChild = $(active.parentNode).find(
-          Selector.DROPDOWN_ACTIVE_CHILD
-        )[0]
-
-        if (dropdownChild) {
-          $(dropdownChild).removeClass(ClassName.ACTIVE)
-        }
-
-        if (active.getAttribute('role') === 'tab') {
-          active.setAttribute('aria-selected', false)
-        }
-      }
-
-      $(element).addClass(ClassName.ACTIVE)
-      if (element.getAttribute('role') === 'tab') {
-        element.setAttribute('aria-selected', true)
-      }
-
-      if (isTransitioning) {
-        Util.reflow(element)
-        $(element).addClass(ClassName.SHOW)
-      } else {
-        $(element).removeClass(ClassName.FADE)
-      }
-
-      if (element.parentNode &&
-          $(element.parentNode).hasClass(ClassName.DROPDOWN_MENU)) {
-
-        const dropdownElement = $(element).closest(Selector.DROPDOWN)[0]
-        if (dropdownElement) {
-          $(dropdownElement).find(Selector.DROPDOWN_TOGGLE).addClass(ClassName.ACTIVE)
-        }
-
-        element.setAttribute('aria-expanded', true)
-      }
-
-      if (callback) {
-        callback()
-      }
-    }
-
-
-    // static
-
-    static _jQueryInterface(config) {
-      return this.each(function () {
-        const $this = $(this)
-        let data    = $this.data(DATA_KEY)
-
-        if (!data) {
-          data = new Tab(this)
-          $this.data(DATA_KEY, data)
-        }
-
-        if (typeof config === 'string') {
-          if (typeof data[config] === 'undefined') {
-            throw new Error(`No method named "${config}"`)
-          }
-          data[config]()
-        }
-      })
-    }
-
-  }
-
-
-  /**
-   * ------------------------------------------------------------------------
-   * Data Api implementation
-   * ------------------------------------------------------------------------
-   */
-
-  $(document)
-    .on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {
-      event.preventDefault()
-      Tab._jQueryInterface.call($(this), 'show')
-    })
-
-
-  /**
-   * ------------------------------------------------------------------------
-   * jQuery
-   * ------------------------------------------------------------------------
-   */
-
-  $.fn[NAME]             = Tab._jQueryInterface
-  $.fn[NAME].Constructor = Tab
-  $.fn[NAME].noConflict  = function () {
-    $.fn[NAME] = JQUERY_NO_CONFLICT
-    return Tab._jQueryInterface
-  }
-
-  return Tab
-
-})($)
-
-export default Tab
diff --git a/assets/javascript/src/tooltip.js b/assets/javascript/src/tooltip.js
deleted file mode 100644
index ee721a1..0000000
--- a/assets/javascript/src/tooltip.js
+++ /dev/null
@@ -1,733 +0,0 @@
-import $ from 'jquery'
-import Popper from 'popper.js'
-import Util from './util'
-
-
-/**
- * --------------------------------------------------------------------------
- * Bootstrap (v4.0.0-beta.2): tooltip.js
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- * --------------------------------------------------------------------------
- */
-
-const Tooltip = (() => {
-
-  /**
-   * Check for Popper dependency
-   * Popper - https://popper.js.org
-   */
-  if (typeof Popper === 'undefined') {
-    throw new Error('Bootstrap tooltips require Popper.js (https://popper.js.org)')
-  }
-
-
-  /**
-   * ------------------------------------------------------------------------
-   * Constants
-   * ------------------------------------------------------------------------
-   */
-
-  const NAME                = 'tooltip'
-  const VERSION             = '4.0.0-beta.2'
-  const DATA_KEY            = 'bs.tooltip'
-  const EVENT_KEY           = `.${DATA_KEY}`
-  const JQUERY_NO_CONFLICT  = $.fn[NAME]
-  const TRANSITION_DURATION = 150
-  const CLASS_PREFIX        = 'bs-tooltip'
-  const BSCLS_PREFIX_REGEX = new RegExp(`(^|\\s)${CLASS_PREFIX}\\S+`, 'g')
-
-  const DefaultType = {
-    animation           : 'boolean',
-    template            : 'string',
-    title               : '(string|element|function)',
-    trigger             : 'string',
-    delay               : '(number|object)',
-    html                : 'boolean',
-    selector            : '(string|boolean)',
-    placement           : '(string|function)',
-    offset              : '(number|string)',
-    container           : '(string|element|boolean)',
-    fallbackPlacement   : '(string|array)'
-  }
-
-  const AttachmentMap = {
-    AUTO   : 'auto',
-    TOP    : 'top',
-    RIGHT  : 'right',
-    BOTTOM : 'bottom',
-    LEFT   : 'left'
-  }
-
-  const Default = {
-    animation           : true,
-    template            : '<div class="tooltip" role="tooltip">'
-                        + '<div class="arrow"></div>'
-                        + '<div class="tooltip-inner"></div></div>',
-    trigger             : 'hover focus',
-    title               : '',
-    delay               : 0,
-    html                : false,
-    selector            : false,
-    placement           : 'top',
-    offset              : 0,
-    container           : false,
-    fallbackPlacement   : 'flip'
-  }
-
-  const HoverState = {
-    SHOW : 'show',
-    OUT  : 'out'
-  }
-
-  const Event = {
-    HIDE       : `hide${EVENT_KEY}`,
-    HIDDEN     : `hidden${EVENT_KEY}`,
-    SHOW       : `show${EVENT_KEY}`,
-    SHOWN      : `shown${EVENT_KEY}`,
-    INSERTED   : `inserted${EVENT_KEY}`,
-    CLICK      : `click${EVENT_KEY}`,
-    FOCUSIN    : `focusin${EVENT_KEY}`,
-    FOCUSOUT   : `focusout${EVENT_KEY}`,
-    MOUSEENTER : `mouseenter${EVENT_KEY}`,
-    MOUSELEAVE : `mouseleave${EVENT_KEY}`
-  }
-
-  const ClassName = {
-    FADE : 'fade',
-    SHOW : 'show'
-  }
-
-  const Selector = {
-    TOOLTIP       : '.tooltip',
-    TOOLTIP_INNER : '.tooltip-inner',
-    ARROW         : '.arrow'
-  }
-
-  const Trigger = {
-    HOVER  : 'hover',
-    FOCUS  : 'focus',
-    CLICK  : 'click',
-    MANUAL : 'manual'
-  }
-
-
-  /**
-   * ------------------------------------------------------------------------
-   * Class Definition
-   * ------------------------------------------------------------------------
-   */
-
-  class Tooltip {
-
-    constructor(element, config) {
-
-      // private
-      this._isEnabled     = true
-      this._timeout       = 0
-      this._hoverState    = ''
-      this._activeTrigger = {}
-      this._popper        = null
-
-      // protected
-      this.element = element
-      this.config  = this._getConfig(config)
-      this.tip     = null
-
-      this._setListeners()
-
-    }
-
-
-    // getters
-
-    static get VERSION() {
-      return VERSION
-    }
-
-    static get Default() {
-      return Default
-    }
-
-    static get NAME() {
-      return NAME
-    }
-
-    static get DATA_KEY() {
-      return DATA_KEY
-    }
-
-    static get Event() {
-      return Event
-    }
-
-    static get EVENT_KEY() {
-      return EVENT_KEY
-    }
-
-    static get DefaultType() {
-      return DefaultType
-    }
-
-
-    // public
-
-    enable() {
-      this._isEnabled = true
-    }
-
-    disable() {
-      this._isEnabled = false
-    }
-
-    toggleEnabled() {
-      this._isEnabled = !this._isEnabled
-    }
-
-    toggle(event) {
-      if (!this._isEnabled) {
-        return
-      }
-
-      if (event) {
-        const dataKey = this.constructor.DATA_KEY
-        let context = $(event.currentTarget).data(dataKey)
-
-        if (!context) {
-          context = new this.constructor(
-            event.currentTarget,
-            this._getDelegateConfig()
-          )
-          $(event.currentTarget).data(dataKey, context)
-        }
-
-        context._activeTrigger.click = !context._activeTrigger.click
-
-        if (context._isWithActiveTrigger()) {
-          context._enter(null, context)
-        } else {
-          context._leave(null, context)
-        }
-
-      } else {
-
-        if ($(this.getTipElement()).hasClass(ClassName.SHOW)) {
-          this._leave(null, this)
-          return
-        }
-
-        this._enter(null, this)
-      }
-    }
-
-    dispose() {
-      clearTimeout(this._timeout)
-
-      $.removeData(this.element, this.constructor.DATA_KEY)
-
-      $(this.element).off(this.constructor.EVENT_KEY)
-      $(this.element).closest('.modal').off('hide.bs.modal')
-
-      if (this.tip) {
-        $(this.tip).remove()
-      }
-
-      this._isEnabled     = null
-      this._timeout       = null
-      this._hoverState    = null
-      this._activeTrigger = null
-      if (this._popper !== null) {
-        this._popper.destroy()
-      }
-
-      this._popper = null
-      this.element = null
-      this.config  = null
-      this.tip     = null
-    }
-
-    show() {
-      if ($(this.element).css('display') === 'none') {
-        throw new Error('Please use show on visible elements')
-      }
-
-      const showEvent = $.Event(this.constructor.Event.SHOW)
-      if (this.isWithContent() && this._isEnabled) {
-        $(this.element).trigger(showEvent)
-
-        const isInTheDom = $.contains(
-          this.element.ownerDocument.documentElement,
-          this.element
-        )
-
-        if (showEvent.isDefaultPrevented() || !isInTheDom) {
-          return
-        }
-
-        const tip   = this.getTipElement()
-        const tipId = Util.getUID(this.constructor.NAME)
-
-        tip.setAttribute('id', tipId)
-        this.element.setAttribute('aria-describedby', tipId)
-
-        this.setContent()
-
-        if (this.config.animation) {
-          $(tip).addClass(ClassName.FADE)
-        }
-
-        const placement  = typeof this.config.placement === 'function' ?
-          this.config.placement.call(this, tip, this.element) :
-          this.config.placement
-
-        const attachment = this._getAttachment(placement)
-        this.addAttachmentClass(attachment)
-
-        const container = this.config.container === false ? document.body : $(this.config.container)
-
-        $(tip).data(this.constructor.DATA_KEY, this)
-
-        if (!$.contains(this.element.ownerDocument.documentElement, this.tip)) {
-          $(tip).appendTo(container)
-        }
-
-        $(this.element).trigger(this.constructor.Event.INSERTED)
-
-        this._popper = new Popper(this.element, tip, {
-          placement: attachment,
-          modifiers: {
-            offset: {
-              offset: this.config.offset
-            },
-            flip: {
-              behavior: this.config.fallbackPlacement
-            },
-            arrow: {
-              element: Selector.ARROW
-            }
-          },
-          onCreate: (data) => {
-            if (data.originalPlacement !== data.placement) {
-              this._handlePopperPlacementChange(data)
-            }
-          },
-          onUpdate : (data) => {
-            this._handlePopperPlacementChange(data)
-          }
-        })
-
-        $(tip).addClass(ClassName.SHOW)
-
-        // if this is a touch-enabled device we add extra
-        // empty mouseover listeners to the body's immediate children;
-        // only needed because of broken event delegation on iOS
-        // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html
-        if ('ontouchstart' in document.documentElement) {
-          $('body').children().on('mouseover', null, $.noop)
-        }
-
-        const complete = () => {
-          if (this.config.animation) {
-            this._fixTransition()
-          }
-          const prevHoverState = this._hoverState
-          this._hoverState     = null
-
-          $(this.element).trigger(this.constructor.Event.SHOWN)
-
-          if (prevHoverState === HoverState.OUT) {
-            this._leave(null, this)
-          }
-        }
-
-        if (Util.supportsTransitionEnd() && $(this.tip).hasClass(ClassName.FADE)) {
-          $(this.tip)
-            .one(Util.TRANSITION_END, complete)
-            .emulateTransitionEnd(Tooltip._TRANSITION_DURATION)
-        } else {
-          complete()
-        }
-      }
-    }
-
-    hide(callback) {
-      const tip       = this.getTipElement()
-      const hideEvent = $.Event(this.constructor.Event.HIDE)
-      const complete  = () => {
-        if (this._hoverState !== HoverState.SHOW && tip.parentNode) {
-          tip.parentNode.removeChild(tip)
-        }
-
-        this._cleanTipClass()
-        this.element.removeAttribute('aria-describedby')
-        $(this.element).trigger(this.constructor.Event.HIDDEN)
-        if (this._popper !== null) {
-          this._popper.destroy()
-        }
-
-        if (callback) {
-          callback()
-        }
-      }
-
-      $(this.element).trigger(hideEvent)
-
-      if (hideEvent.isDefaultPrevented()) {
-        return
-      }
-
-      $(tip).removeClass(ClassName.SHOW)
-
-      // if this is a touch-enabled device we remove the extra
-      // empty mouseover listeners we added for iOS support
-      if ('ontouchstart' in document.documentElement) {
-        $('body').children().off('mouseover', null, $.noop)
-      }
-
-      this._activeTrigger[Trigger.CLICK] = false
-      this._activeTrigger[Trigger.FOCUS] = false
-      this._activeTrigger[Trigger.HOVER] = false
-
-      if (Util.supportsTransitionEnd() &&
-          $(this.tip).hasClass(ClassName.FADE)) {
-
-        $(tip)
-          .one(Util.TRANSITION_END, complete)
-          .emulateTransitionEnd(TRANSITION_DURATION)
-
-      } else {
-        complete()
-      }
-
-      this._hoverState = ''
-
-    }
-
-    update() {
-      if (this._popper !== null) {
-        this._popper.scheduleUpdate()
-      }
-    }
-
-    // protected
-
-    isWithContent() {
-      return Boolean(this.getTitle())
-    }
-
-    addAttachmentClass(attachment) {
-      $(this.getTipElement()).addClass(`${CLASS_PREFIX}-${attachment}`)
-    }
-
-    getTipElement() {
-      this.tip = this.tip || $(this.config.template)[0]
-      return this.tip
-    }
-
-    setContent() {
-      const $tip = $(this.getTipElement())
-      this.setElementContent($tip.find(Selector.TOOLTIP_INNER), this.getTitle())
-      $tip.removeClass(`${ClassName.FADE} ${ClassName.SHOW}`)
-    }
-
-    setElementContent($element, content) {
-      const html = this.config.html
-      if (typeof content === 'object' && (content.nodeType || content.jquery)) {
-        // content is a DOM node or a jQuery
-        if (html) {
-          if (!$(content).parent().is($element)) {
-            $element.empty().append(content)
-          }
-        } else {
-          $element.text($(content).text())
-        }
-      } else {
-        $element[html ? 'html' : 'text'](content)
-      }
-    }
-
-    getTitle() {
-      let title = this.element.getAttribute('data-original-title')
-
-      if (!title) {
-        title = typeof this.config.title === 'function' ?
-          this.config.title.call(this.element) :
-          this.config.title
-      }
-
-      return title
-    }
-
-
-    // private
-
-    _getAttachment(placement) {
-      return AttachmentMap[placement.toUpperCase()]
-    }
-
-    _setListeners() {
-      const triggers = this.config.trigger.split(' ')
-
-      triggers.forEach((trigger) => {
-        if (trigger === 'click') {
-          $(this.element).on(
-            this.constructor.Event.CLICK,
-            this.config.selector,
-            (event) => this.toggle(event)
-          )
-
-        } else if (trigger !== Trigger.MANUAL) {
-          const eventIn  = trigger === Trigger.HOVER ?
-            this.constructor.Event.MOUSEENTER :
-            this.constructor.Event.FOCUSIN
-          const eventOut = trigger === Trigger.HOVER ?
-            this.constructor.Event.MOUSELEAVE :
-            this.constructor.Event.FOCUSOUT
-
-          $(this.element)
-            .on(
-              eventIn,
-              this.config.selector,
-              (event) => this._enter(event)
-            )
-            .on(
-              eventOut,
-              this.config.selector,
-              (event) => this._leave(event)
-            )
-        }
-
-        $(this.element).closest('.modal').on(
-          'hide.bs.modal',
-          () => this.hide()
-        )
-      })
-
-      if (this.config.selector) {
-        this.config = $.extend({}, this.config, {
-          trigger  : 'manual',
-          selector : ''
-        })
-      } else {
-        this._fixTitle()
-      }
-    }
-
-    _fixTitle() {
-      const titleType = typeof this.element.getAttribute('data-original-title')
-      if (this.element.getAttribute('title') ||
-         titleType !== 'string') {
-        this.element.setAttribute(
-          'data-original-title',
-          this.element.getAttribute('title') || ''
-        )
-        this.element.setAttribute('title', '')
-      }
-    }
-
-    _enter(event, context) {
-      const dataKey = this.constructor.DATA_KEY
-
-      context = context || $(event.currentTarget).data(dataKey)
-
-      if (!context) {
-        context = new this.constructor(
-          event.currentTarget,
-          this._getDelegateConfig()
-        )
-        $(event.currentTarget).data(dataKey, context)
-      }
-
-      if (event) {
-        context._activeTrigger[
-          event.type === 'focusin' ? Trigger.FOCUS : Trigger.HOVER
-        ] = true
-      }
-
-      if ($(context.getTipElement()).hasClass(ClassName.SHOW) ||
-         context._hoverState === HoverState.SHOW) {
-        context._hoverState = HoverState.SHOW
-        return
-      }
-
-      clearTimeout(context._timeout)
-
-      context._hoverState = HoverState.SHOW
-
-      if (!context.config.delay || !context.config.delay.show) {
-        context.show()
-        return
-      }
-
-      context._timeout = setTimeout(() => {
-        if (context._hoverState === HoverState.SHOW) {
-          context.show()
-        }
-      }, context.config.delay.show)
-    }
-
-    _leave(event, context) {
-      const dataKey = this.constructor.DATA_KEY
-
-      context = context || $(event.currentTarget).data(dataKey)
-
-      if (!context) {
-        context = new this.constructor(
-          event.currentTarget,
-          this._getDelegateConfig()
-        )
-        $(event.currentTarget).data(dataKey, context)
-      }
-
-      if (event) {
-        context._activeTrigger[
-          event.type === 'focusout' ? Trigger.FOCUS : Trigger.HOVER
-        ] = false
-      }
-
-      if (context._isWithActiveTrigger()) {
-        return
-      }
-
-      clearTimeout(context._timeout)
-
-      context._hoverState = HoverState.OUT
-
-      if (!context.config.delay || !context.config.delay.hide) {
-        context.hide()
-        return
-      }
-
-      context._timeout = setTimeout(() => {
-        if (context._hoverState === HoverState.OUT) {
-          context.hide()
-        }
-      }, context.config.delay.hide)
-    }
-
-    _isWithActiveTrigger() {
-      for (const trigger in this._activeTrigger) {
-        if (this._activeTrigger[trigger]) {
-          return true
-        }
-      }
-
-      return false
-    }
-
-    _getConfig(config) {
-      config = $.extend(
-        {},
-        this.constructor.Default,
-        $(this.element).data(),
-        config
-      )
-
-      if (typeof config.delay === 'number') {
-        config.delay = {
-          show : config.delay,
-          hide : config.delay
-        }
-      }
-
-      if (typeof config.title === 'number') {
-        config.title = config.title.toString()
-      }
-
-      if (typeof config.content === 'number') {
-        config.content = config.content.toString()
-      }
-
-      Util.typeCheckConfig(
-        NAME,
-        config,
-        this.constructor.DefaultType
-      )
-
-      return config
-    }
-
-    _getDelegateConfig() {
-      const config = {}
-
-      if (this.config) {
-        for (const key in this.config) {
-          if (this.constructor.Default[key] !== this.config[key]) {
-            config[key] = this.config[key]
-          }
-        }
-      }
-
-      return config
-    }
-
-    _cleanTipClass() {
-      const $tip = $(this.getTipElement())
-      const tabClass = $tip.attr('class').match(BSCLS_PREFIX_REGEX)
-      if (tabClass !== null && tabClass.length > 0) {
-        $tip.removeClass(tabClass.join(''))
-      }
-    }
-
-    _handlePopperPlacementChange(data) {
-      this._cleanTipClass()
-      this.addAttachmentClass(this._getAttachment(data.placement))
-    }
-
-    _fixTransition() {
-      const tip                 = this.getTipElement()
-      const initConfigAnimation = this.config.animation
-      if (tip.getAttribute('x-placement') !== null) {
-        return
-      }
-      $(tip).removeClass(ClassName.FADE)
-      this.config.animation = false
-      this.hide()
-      this.show()
-      this.config.animation = initConfigAnimation
-    }
-
-    // static
-
-    static _jQueryInterface(config) {
-      return this.each(function () {
-        let data      = $(this).data(DATA_KEY)
-        const _config = typeof config === 'object' && config
-
-        if (!data && /dispose|hide/.test(config)) {
-          return
-        }
-
-        if (!data) {
-          data = new Tooltip(this, _config)
-          $(this).data(DATA_KEY, data)
-        }
-
-        if (typeof config === 'string') {
-          if (typeof data[config] === 'undefined') {
-            throw new Error(`No method named "${config}"`)
-          }
-          data[config]()
-        }
-      })
-    }
-  }
-
-
-  /**
-   * ------------------------------------------------------------------------
-   * jQuery
-   * ------------------------------------------------------------------------
-   */
-
-  $.fn[NAME]             = Tooltip._jQueryInterface
-  $.fn[NAME].Constructor = Tooltip
-  $.fn[NAME].noConflict  = function () {
-    $.fn[NAME] = JQUERY_NO_CONFLICT
-    return Tooltip._jQueryInterface
-  }
-
-  return Tooltip
-
-})($, Popper)
-
-export default Tooltip
diff --git a/assets/javascript/src/util.js b/assets/javascript/src/util.js
deleted file mode 100644
index 16d114b..0000000
--- a/assets/javascript/src/util.js
+++ /dev/null
@@ -1,166 +0,0 @@
-import $ from 'jquery'
-
-/**
- * --------------------------------------------------------------------------
- * Bootstrap (v4.0.0-beta.2): util.js
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- * --------------------------------------------------------------------------
- */
-
-const Util = (() => {
-
-
-  /**
-   * ------------------------------------------------------------------------
-   * Private TransitionEnd Helpers
-   * ------------------------------------------------------------------------
-   */
-
-  let transition = false
-
-  const MAX_UID = 1000000
-
-  const TransitionEndEvent = {
-    WebkitTransition : 'webkitTransitionEnd',
-    MozTransition    : 'transitionend',
-    OTransition      : 'oTransitionEnd otransitionend',
-    transition       : 'transitionend'
-  }
-
-  // shoutout AngusCroll (https://goo.gl/pxwQGp)
-  function toType(obj) {
-    return {}.toString.call(obj).match(/\s([a-zA-Z]+)/)[1].toLowerCase()
-  }
-
-  function getSpecialTransitionEndEvent() {
-    return {
-      bindType: transition.end,
-      delegateType: transition.end,
-      handle(event) {
-        if ($(event.target).is(this)) {
-          return event.handleObj.handler.apply(this, arguments) // eslint-disable-line prefer-rest-params
-        }
-        return undefined // eslint-disable-line no-undefined
-      }
-    }
-  }
-
-  function transitionEndTest() {
-    if (window.QUnit) {
-      return false
-    }
-
-    const el = document.createElement('bootstrap')
-
-    for (const name in TransitionEndEvent) {
-      if (typeof el.style[name] !== 'undefined') {
-        return {
-          end: TransitionEndEvent[name]
-        }
-      }
-    }
-
-    return false
-  }
-
-  function transitionEndEmulator(duration) {
-    let called = false
-
-    $(this).one(Util.TRANSITION_END, () => {
-      called = true
-    })
-
-    setTimeout(() => {
-      if (!called) {
-        Util.triggerTransitionEnd(this)
-      }
-    }, duration)
-
-    return this
-  }
-
-  function setTransitionEndSupport() {
-    transition = transitionEndTest()
-
-    $.fn.emulateTransitionEnd = transitionEndEmulator
-
-    if (Util.supportsTransitionEnd()) {
-      $.event.special[Util.TRANSITION_END] = getSpecialTransitionEndEvent()
-    }
-  }
-
-
-  /**
-   * --------------------------------------------------------------------------
-   * Public Util Api
-   * --------------------------------------------------------------------------
-   */
-
-  const Util = {
-
-    TRANSITION_END: 'bsTransitionEnd',
-
-    getUID(prefix) {
-      do {
-        // eslint-disable-next-line no-bitwise
-        prefix += ~~(Math.random() * MAX_UID) // "~~" acts like a faster Math.floor() here
-      } while (document.getElementById(prefix))
-      return prefix
-    },
-
-    getSelectorFromElement(element) {
-      let selector = element.getAttribute('data-target')
-      if (!selector || selector === '#') {
-        selector = element.getAttribute('href') || ''
-      }
-
-      try {
-        const $selector = $(document).find(selector)
-        return $selector.length > 0 ? selector : null
-      } catch (error) {
-        return null
-      }
-    },
-
-    reflow(element) {
-      return element.offsetHeight
-    },
-
-    triggerTransitionEnd(element) {
-      $(element).trigger(transition.end)
-    },
-
-    supportsTransitionEnd() {
-      return Boolean(transition)
-    },
-
-    isElement(obj) {
-      return (obj[0] || obj).nodeType
-    },
-
-    typeCheckConfig(componentName, config, configTypes) {
-      for (const property in configTypes) {
-        if (Object.prototype.hasOwnProperty.call(configTypes, property)) {
-          const expectedTypes = configTypes[property]
-          const value         = config[property]
-          const valueType     = value && Util.isElement(value) ?
-                                'element' : toType(value)
-
-          if (!new RegExp(expectedTypes).test(valueType)) {
-            throw new Error(
-              `${componentName.toUpperCase()}: ` +
-              `Option "${property}" provided type "${valueType}" ` +
-              `but expected type "${expectedTypes}".`)
-          }
-        }
-      }
-    }
-  }
-
-  setTransitionEndSupport()
-
-  return Util
-
-})($)
-
-export default Util
diff --git a/assets/javascript/tests/.eslintrc.json b/assets/javascript/tests/.eslintrc.json
deleted file mode 100644
index 1452045..0000000
--- a/assets/javascript/tests/.eslintrc.json
+++ /dev/null
@@ -1,46 +0,0 @@
-{
-  "env": {
-    "es6": false,
-    "qunit": true,
-    "jquery": true
-  },
-  "globals": {
-    "Util": false
-  },
-  "parserOptions": {
-    "ecmaVersion": 5,
-    "sourceType": "script"
-  },
-  "extends": "../.eslintrc.json",
-  "rules": {
-    // Best Practices
-    "consistent-return": "off",
-    "no-alert": "off",
-    "no-console": "off",
-    "no-empty-function": "off",
-    "no-extend-native": "off",
-    "no-magic-numbers": "off",
-    "vars-on-top": "off",
-
-    // NodeJS and CommonJS
-    "global-require": "off",
-    "no-process-env": "off",
-    "no-process-exit": "off",
-    "no-sync": "off",
-
-    // Stylistic Issues
-    "brace-style": "off",
-    "func-style": "off",
-    "max-statements-per-line": "off",
-    "object-curly-newline": "off",
-    "object-property-newline": "off",
-    "spaced-comment": "off",
-
-    // ECMAScript 6
-    "no-var": "off",
-    "object-shorthand": "off",
-    "prefer-arrow-callback": "off",
-    "prefer-template": "off",
-    "prefer-rest-params": "off"
-  }
-}
diff --git a/assets/javascript/tests/README.md b/assets/javascript/tests/README.md
deleted file mode 100644
index 8c8c2f1..0000000
--- a/assets/javascript/tests/README.md
+++ /dev/null
@@ -1,61 +0,0 @@
-## How does Bootstrap's test suite work?
-
-Bootstrap uses [QUnit](https://qunitjs.com/), a powerful, easy-to-use JavaScript unit test framework. Each plugin has a file dedicated to its tests in `unit/<plugin-name>.js`.
-
-* `unit/` contains the unit test files for each Bootstrap plugin.
-* `vendor/` contains third-party testing-related code (QUnit and jQuery).
-* `visual/` contains "visual" tests which are run interactively in real browsers and require manual verification by humans.
-
-To run the unit test suite via [PhantomJS](http://phantomjs.org/), run `npm run js-test`.
-
-To run the unit test suite via a real web browser, open `index.html` in the browser.
-
-
-## How do I add a new unit test?
-
-1. Locate and open the file dedicated to the plugin which you need to add tests to (`unit/<plugin-name>.js`).
-2. Review the [QUnit API Documentation](https://api.qunitjs.com/) and use the existing tests as references for how to structure your new tests.
-3. Write the necessary unit test(s) for the new or revised functionality.
-4. Run `npm run js-test` to see the results of your newly-added test(s).
-
-**Note:** Your new unit tests should fail before your changes are applied to the plugin, and should pass after your changes are applied to the plugin.
-
-## What should a unit test look like?
-
-* Each test should have a unique name clearly stating what unit is being tested.
-* Each test should test only one unit per test, although one test can include several assertions. Create multiple tests for multiple units of functionality.
-* Each test should begin with [`assert.expect`](https://api.qunitjs.com/assert/expect/) to ensure that the expected assertions are run.
-* Each test should follow the project's [JavaScript Code Guidelines](https://github.com/twbs/bootstrap/blob/master/CONTRIBUTING.md#js)
-
-### Example tests
-
-```javascript
-// Synchronous test
-QUnit.test('should describe the unit being tested', function (assert) {
-  assert.expect(1)
-  var templateHTML = '<div class="alert alert-danger fade show">'
-      + '<a class="close" href="#" data-dismiss="alert">×</a>'
-      + '<p><strong>Template necessary for the test.</p>'
-      + '</div>'
-  var $alert = $(templateHTML).appendTo('#qunit-fixture').bootstrapAlert()
-
-  $alert.find('.close').trigger('click')
-
-  // Make assertion
-  assert.strictEqual($alert.hasClass('show'), false, 'remove .show class on .close click')
-})
-
-// Asynchronous test
-QUnit.test('should describe the unit being tested', function (assert) {
-  assert.expect(1)
-  var done = assert.async()
-
-  $('<div title="tooltip title"></div>')
-    .appendTo('#qunit-fixture')
-    .on('shown.bs.tooltip', function () {
-      assert.ok(true, '"shown" event was fired after calling "show"')
-      done()
-    })
-    .bootstrapTooltip('show')
-})
-```
diff --git a/assets/javascript/tests/index.html b/assets/javascript/tests/index.html
deleted file mode 100644
index ad5b643..0000000
--- a/assets/javascript/tests/index.html
+++ /dev/null
@@ -1,129 +0,0 @@
-<!doctype html>
-<html>
-  <head>
-    <meta charset="utf-8">
-    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
-    <title>Bootstrap Plugin Test Suite</title>
-
-    <!-- jQuery -->
-    <script src="../../assets/js/vendor/jquery-slim.min.js"></script>
-    <script src="../../assets/js/vendor/popper.min.js"></script>
-
-    <!-- QUnit -->
-    <link rel="stylesheet" href="vendor/qunit.css" media="screen">
-    <script src="vendor/qunit.js"></script>
-
-    <script>
-      // Disable jQuery event aliases to ensure we don't accidentally use any of them
-      [
-        'blur',
-        'focus',
-        'focusin',
-        'focusout',
-        'resize',
-        'scroll',
-        'click',
-        'dblclick',
-        'mousedown',
-        'mouseup',
-        'mousemove',
-        'mouseover',
-        'mouseout',
-        'mouseenter',
-        'mouseleave',
-        'change',
-        'select',
-        'submit',
-        'keydown',
-        'keypress',
-        'keyup',
-        'contextmenu'
-      ].forEach(function(eventAlias) {
-        $.fn[eventAlias] = function() {
-          throw new Error('Using the ".' + eventAlias + '()" method is not allowed, so that Bootstrap can be compatible with custom jQuery builds which exclude the "event aliases" module that defines said method. See https://github.com/twbs/bootstrap/blob/master/CONTRIBUTING.md#js')
-        }
-      })
-
-      // Require assert.expect in each test
-      QUnit.config.requireExpects = true
-
-      // See https://github.com/axemclion/grunt-saucelabs#test-result-details-with-qunit
-      var log = []
-      var testName
-
-      QUnit.done(function(testResults) {
-        var tests = []
-        for (var i = 0; i < log.length; i++) {
-          var details = log[i]
-          tests.push({
-            name: details.name,
-            result: details.result,
-            expected: details.expected,
-            actual: details.actual,
-            source: details.source
-          })
-        }
-        testResults.tests = tests
-
-        window.global_test_results = testResults
-      })
-
-      QUnit.testStart(function(testDetails) {
-        QUnit.log(function(details) {
-          if (!details.result) {
-            details.name = testDetails.name
-            log.push(details)
-          }
-        })
-      })
-
-      // Cleanup
-      QUnit.testDone(function () {
-        $('#modal-test, .modal-backdrop').remove()
-      })
-
-      // Display fixture on-screen on iOS to avoid false positives
-      // See https://github.com/twbs/bootstrap/pull/15955
-      if (/iPhone|iPad|iPod/.test(navigator.userAgent)) {
-        QUnit.begin(function() {
-          $('#qunit-fixture').css({ top: 0, left: 0 })
-        })
-
-        QUnit.done(function() {
-          $('#qunit-fixture').css({ top: '', left: '' })
-        })
-      }
-    </script>
-
-    <!-- Transpiled Plugins -->
-    <script src="../dist/util.js"></script>
-    <script src="../dist/alert.js"></script>
-    <script src="../dist/button.js"></script>
-    <script src="../dist/carousel.js"></script>
-    <script src="../dist/collapse.js"></script>
-    <script src="../dist/dropdown.js"></script>
-    <script src="../dist/modal.js"></script>
-    <script src="../dist/scrollspy.js"></script>
-    <script src="../dist/tab.js"></script>
-    <script src="../dist/tooltip.js"></script>
-    <script src="../dist/popover.js"></script>
-
-    <!-- Unit Tests -->
-    <script src="unit/alert.js"></script>
-    <script src="unit/button.js"></script>
-    <script src="unit/carousel.js"></script>
-    <script src="unit/collapse.js"></script>
-    <script src="unit/dropdown.js"></script>
-    <script src="unit/modal.js"></script>
-    <script src="unit/scrollspy.js"></script>
-    <script src="unit/tab.js"></script>
-    <script src="unit/tooltip.js"></script>
-    <script src="unit/popover.js"></script>
-  </head>
-  <body>
-    <div id="qunit-container">
-      <div id="qunit"></div>
-      <div id="qunit-fixture"></div>
-    </div>
-  </body>
-</html>
diff --git a/assets/javascript/tests/unit/alert.js b/assets/javascript/tests/unit/alert.js
deleted file mode 100644
index aee2b70..0000000
--- a/assets/javascript/tests/unit/alert.js
+++ /dev/null
@@ -1,79 +0,0 @@
-$(function () {
-  'use strict'
-
-  QUnit.module('alert plugin')
-
-  QUnit.test('should be defined on jquery object', function (assert) {
-    assert.expect(1)
-    assert.ok($(document.body).alert, 'alert method is defined')
-  })
-
-  QUnit.module('alert', {
-    beforeEach: function () {
-      // Run all tests in noConflict mode -- it's the only way to ensure that the plugin works in noConflict mode
-      $.fn.bootstrapAlert = $.fn.alert.noConflict()
-    },
-    afterEach: function () {
-      $.fn.alert = $.fn.bootstrapAlert
-      delete $.fn.bootstrapAlert
-    }
-  })
-
-  QUnit.test('should provide no conflict', function (assert) {
-    assert.expect(1)
-    assert.strictEqual(typeof $.fn.alert, 'undefined', 'alert was set back to undefined (org value)')
-  })
-
-  QUnit.test('should return jquery collection containing the element', function (assert) {
-    assert.expect(2)
-    var $el = $('<div/>')
-    var $alert = $el.bootstrapAlert()
-    assert.ok($alert instanceof $, 'returns jquery collection')
-    assert.strictEqual($alert[0], $el[0], 'collection contains element')
-  })
-
-  QUnit.test('should fade element out on clicking .close', function (assert) {
-    assert.expect(1)
-    var alertHTML = '<div class="alert alert-danger fade show">'
-        + '<a class="close" href="#" data-dismiss="alert">×</a>'
-        + '<p><strong>Holy guacamole!</strong> Best check yo self, you\'re not looking too good.</p>'
-        + '</div>'
-
-    var $alert = $(alertHTML).bootstrapAlert().appendTo($('#qunit-fixture'))
-
-    $alert.find('.close').trigger('click')
-
-    assert.strictEqual($alert.hasClass('show'), false, 'remove .show class on .close click')
-  })
-
-  QUnit.test('should remove element when clicking .close', function (assert) {
-    assert.expect(2)
-    var alertHTML = '<div class="alert alert-danger fade show">'
-        + '<a class="close" href="#" data-dismiss="alert">×</a>'
-        + '<p><strong>Holy guacamole!</strong> Best check yo self, you\'re not looking too good.</p>'
-        + '</div>'
-    var $alert = $(alertHTML).appendTo('#qunit-fixture').bootstrapAlert()
-
-    assert.notEqual($('#qunit-fixture').find('.alert').length, 0, 'element added to dom')
-
-    $alert.find('.close').trigger('click')
-
-    assert.strictEqual($('#qunit-fixture').find('.alert').length, 0, 'element removed from dom')
-  })
-
-  QUnit.test('should not fire closed when close is prevented', function (assert) {
-    assert.expect(1)
-    var done = assert.async()
-    $('<div class="alert"/>')
-      .on('close.bs.alert', function (e) {
-        e.preventDefault()
-        assert.ok(true, 'close event fired')
-        done()
-      })
-      .on('closed.bs.alert', function () {
-        assert.ok(false, 'closed event fired')
-      })
-      .bootstrapAlert('close')
-  })
-
-})
diff --git a/assets/javascript/tests/unit/button.js b/assets/javascript/tests/unit/button.js
deleted file mode 100644
index e2a51bb..0000000
--- a/assets/javascript/tests/unit/button.js
+++ /dev/null
@@ -1,176 +0,0 @@
-$(function () {
-  'use strict'
-
-  QUnit.module('button plugin')
-
-  QUnit.test('should be defined on jquery object', function (assert) {
-    assert.expect(1)
-    assert.ok($(document.body).button, 'button method is defined')
-  })
-
-  QUnit.module('button', {
-    beforeEach: function () {
-      // Run all tests in noConflict mode -- it's the only way to ensure that the plugin works in noConflict mode
-      $.fn.bootstrapButton = $.fn.button.noConflict()
-    },
-    afterEach: function () {
-      $.fn.button = $.fn.bootstrapButton
-      delete $.fn.bootstrapButton
-    }
-  })
-
-  QUnit.test('should provide no conflict', function (assert) {
-    assert.expect(1)
-    assert.strictEqual(typeof $.fn.button, 'undefined', 'button was set back to undefined (org value)')
-  })
-
-  QUnit.test('should return jquery collection containing the element', function (assert) {
-    assert.expect(2)
-    var $el = $('<div/>')
-    var $button = $el.bootstrapButton()
-    assert.ok($button instanceof $, 'returns jquery collection')
-    assert.strictEqual($button[0], $el[0], 'collection contains element')
-  })
-
-  QUnit.test('should toggle active', function (assert) {
-    assert.expect(2)
-    var $btn = $('<button class="btn" data-toggle="button">mdo</button>')
-    assert.ok(!$btn.hasClass('active'), 'btn does not have active class')
-    $btn.bootstrapButton('toggle')
-    assert.ok($btn.hasClass('active'), 'btn has class active')
-  })
-
-  QUnit.test('should toggle active when btn children are clicked', function (assert) {
-    assert.expect(2)
-    var $btn = $('<button class="btn" data-toggle="button">mdo</button>')
-    var $inner = $('<i/>')
-    $btn
-      .append($inner)
-      .appendTo('#qunit-fixture')
-    assert.ok(!$btn.hasClass('active'), 'btn does not have active class')
-    $inner.trigger('click')
-    assert.ok($btn.hasClass('active'), 'btn has class active')
-  })
-
-  QUnit.test('should toggle aria-pressed', function (assert) {
-    assert.expect(2)
-    var $btn = $('<button class="btn" data-toggle="button" aria-pressed="false">redux</button>')
-    assert.strictEqual($btn.attr('aria-pressed'), 'false', 'btn aria-pressed state is false')
-    $btn.bootstrapButton('toggle')
-    assert.strictEqual($btn.attr('aria-pressed'), 'true', 'btn aria-pressed state is true')
-  })
-
-  QUnit.test('should toggle aria-pressed on buttons with container', function (assert) {
-    assert.expect(1)
-    var groupHTML = '<div class="btn-group" data-toggle="buttons">' +
-        '<button id="btn1" class="btn btn-secondary" type="button">One</button>' +
-        '<button class="btn btn-secondary" type="button">Two</button>' +
-      '</div>'
-    $('#qunit-fixture').append(groupHTML)
-    $('#btn1').bootstrapButton('toggle')
-    assert.strictEqual($('#btn1').attr('aria-pressed'), 'true')
-  })
-
-  QUnit.test('should toggle aria-pressed when btn children are clicked', function (assert) {
-    assert.expect(2)
-    var $btn = $('<button class="btn" data-toggle="button" aria-pressed="false">redux</button>')
-    var $inner = $('<i/>')
-    $btn
-      .append($inner)
-      .appendTo('#qunit-fixture')
-    assert.strictEqual($btn.attr('aria-pressed'), 'false', 'btn aria-pressed state is false')
-    $inner.trigger('click')
-    assert.strictEqual($btn.attr('aria-pressed'), 'true', 'btn aria-pressed state is true')
-  })
-
-  QUnit.test('should trigger input change event when toggled button has input field', function (assert) {
-    assert.expect(1)
-    var done = assert.async()
-
-    var groupHTML = '<div class="btn-group" data-toggle="buttons">'
-      + '<label class="btn btn-primary">'
-      + '<input type="radio" id="radio" autocomplete="off">Radio'
-      + '</label>'
-      + '</div>'
-    var $group = $(groupHTML).appendTo('#qunit-fixture')
-
-    $group.find('input').on('change', function (e) {
-      e.preventDefault()
-      assert.ok(true, 'change event fired')
-      done()
-    })
-
-    $group.find('label').trigger('click')
-  })
-
-  QUnit.test('should check for closest matching toggle', function (assert) {
-    assert.expect(12)
-    var groupHTML = '<div class="btn-group" data-toggle="buttons">'
-      + '<label class="btn btn-primary active">'
-      + '<input type="radio" name="options" id="option1" checked="true"> Option 1'
-      + '</label>'
-      + '<label class="btn btn-primary">'
-      + '<input type="radio" name="options" id="option2"> Option 2'
-      + '</label>'
-      + '<label class="btn btn-primary">'
-      + '<input type="radio" name="options" id="option3"> Option 3'
-      + '</label>'
-      + '</div>'
-    var $group = $(groupHTML).appendTo('#qunit-fixture')
-
-    var $btn1 = $group.children().eq(0)
-    var $btn2 = $group.children().eq(1)
-
-    assert.ok($btn1.hasClass('active'), 'btn1 has active class')
-    assert.ok($btn1.find('input').prop('checked'), 'btn1 is checked')
-    assert.ok(!$btn2.hasClass('active'), 'btn2 does not have active class')
-    assert.ok(!$btn2.find('input').prop('checked'), 'btn2 is not checked')
-    $btn2.find('input').trigger('click')
-    assert.ok(!$btn1.hasClass('active'), 'btn1 does not have active class')
-    assert.ok(!$btn1.find('input').prop('checked'), 'btn1 is not checked')
-    assert.ok($btn2.hasClass('active'), 'btn2 has active class')
-    assert.ok($btn2.find('input').prop('checked'), 'btn2 is checked')
-
-    $btn2.find('input').trigger('click') // clicking an already checked radio should not un-check it
-    assert.ok(!$btn1.hasClass('active'), 'btn1 does not have active class')
-    assert.ok(!$btn1.find('input').prop('checked'), 'btn1 is not checked')
-    assert.ok($btn2.hasClass('active'), 'btn2 has active class')
-    assert.ok($btn2.find('input').prop('checked'), 'btn2 is checked')
-  })
-
-  QUnit.test('should not add aria-pressed on labels for radio/checkbox inputs in a data-toggle="buttons" group', function (assert) {
-    assert.expect(2)
-    var groupHTML = '<div class="btn-group" data-toggle="buttons">'
-      + '<label class="btn btn-primary"><input type="checkbox" autocomplete="off"> Checkbox</label>'
-      + '<label class="btn btn-primary"><input type="radio" name="options" autocomplete="off"> Radio</label>'
-      + '</div>'
-    var $group = $(groupHTML).appendTo('#qunit-fixture')
-
-    var $btn1 = $group.children().eq(0)
-    var $btn2 = $group.children().eq(1)
-
-    $btn1.find('input').trigger('click')
-    assert.ok($btn1.is(':not([aria-pressed])'), 'label for nested checkbox input has not been given an aria-pressed attribute')
-
-    $btn2.find('input').trigger('click')
-    assert.ok($btn2.is(':not([aria-pressed])'), 'label for nested radio input has not been given an aria-pressed attribute')
-  })
-
-  QUnit.test('should handle disabled attribute on non-button elements', function (assert) {
-    assert.expect(2)
-    var groupHTML = '  <div class="btn-group disabled" data-toggle="buttons" aria-disabled="true" disabled>'
-      + '<label class="btn btn-danger disabled" aria-disabled="true" disabled>'
-      + '<input type="checkbox" aria-disabled="true" autocomplete="off" disabled class="disabled"/>'
-      + '</label>'
-      + '</div>'
-    var $group = $(groupHTML).appendTo('#qunit-fixture')
-
-    var $btn = $group.children().eq(0)
-    var $input = $btn.children().eq(0)
-
-    $btn.trigger('click')
-    assert.ok($btn.is(':not(.active)'), 'button did not become active')
-    assert.ok(!$input.is(':checked'), 'checkbox did not get checked')
-  })
-
-})
diff --git a/assets/javascript/tests/unit/carousel.js b/assets/javascript/tests/unit/carousel.js
deleted file mode 100644
index 521b24c..0000000
--- a/assets/javascript/tests/unit/carousel.js
+++ /dev/null
@@ -1,921 +0,0 @@
-$(function () {
-  'use strict'
-
-  QUnit.module('carousel plugin')
-
-  QUnit.test('should be defined on jQuery object', function (assert) {
-    assert.expect(1)
-    assert.ok($(document.body).carousel, 'carousel method is defined')
-  })
-
-  QUnit.module('carousel', {
-    beforeEach: function () {
-      // Run all tests in noConflict mode -- it's the only way to ensure that the plugin works in noConflict mode
-      $.fn.bootstrapCarousel = $.fn.carousel.noConflict()
-    },
-    afterEach: function () {
-      $.fn.carousel = $.fn.bootstrapCarousel
-      delete $.fn.bootstrapCarousel
-    }
-  })
-
-  QUnit.test('should provide no conflict', function (assert) {
-    assert.expect(1)
-    assert.strictEqual(typeof $.fn.carousel, 'undefined', 'carousel was set back to undefined (orig value)')
-  })
-
-  QUnit.test('should throw explicit error on undefined method', function (assert) {
-    assert.expect(1)
-    var $el = $('<div/>')
-    $el.bootstrapCarousel()
-    try {
-      $el.bootstrapCarousel('noMethod')
-    }
-    catch (err) {
-      assert.strictEqual(err.message, 'No method named "noMethod"')
-    }
-  })
-
-  QUnit.test('should return jquery collection containing the element', function (assert) {
-    assert.expect(2)
-    var $el = $('<div/>')
-    var $carousel = $el.bootstrapCarousel()
-    assert.ok($carousel instanceof $, 'returns jquery collection')
-    assert.strictEqual($carousel[0], $el[0], 'collection contains element')
-  })
-
-  QUnit.test('should type check config options', function (assert) {
-    assert.expect(2)
-
-    var message
-    var expectedMessage = 'CAROUSEL: Option "interval" provided type "string" but expected type "(number|boolean)".'
-    var config = {
-      interval: 'fat sux'
-    }
-
-    try {
-      $('<div/>').bootstrapCarousel(config)
-    } catch (e) {
-      message = e.message
-    }
-
-    assert.ok(message === expectedMessage, 'correct error message')
-
-    config = {
-      keyboard: document.createElement('div')
-    }
-    expectedMessage = 'CAROUSEL: Option "keyboard" provided type "element" but expected type "boolean".'
-
-    try {
-      $('<div/>').bootstrapCarousel(config)
-    } catch (e) {
-      message = e.message
-    }
-
-    assert.ok(message === expectedMessage, 'correct error message')
-  })
-
-
-  QUnit.test('should not fire slid when slide is prevented', function (assert) {
-    assert.expect(1)
-    var done = assert.async()
-    $('<div class="carousel"/>')
-      .on('slide.bs.carousel', function (e) {
-        e.preventDefault()
-        assert.ok(true, 'slide event fired')
-        done()
-      })
-      .on('slid.bs.carousel', function () {
-        assert.ok(false, 'slid event fired')
-      })
-      .bootstrapCarousel('next')
-  })
-
-  QUnit.test('should reset when slide is prevented', function (assert) {
-    assert.expect(6)
-    var carouselHTML = '<div id="carousel-example-generic" class="carousel slide">'
-        + '<ol class="carousel-indicators">'
-        + '<li data-target="#carousel-example-generic" data-slide-to="0" class="active"/>'
-        + '<li data-target="#carousel-example-generic" data-slide-to="1"/>'
-        + '<li data-target="#carousel-example-generic" data-slide-to="2"/>'
-        + '</ol>'
-        + '<div class="carousel-inner">'
-        + '<div class="carousel-item active">'
-        + '<div class="carousel-caption"/>'
-        + '</div>'
-        + '<div class="carousel-item">'
-        + '<div class="carousel-caption"/>'
-        + '</div>'
-        + '<div class="carousel-item">'
-        + '<div class="carousel-caption"/>'
-        + '</div>'
-        + '</div>'
-        + '<a class="left carousel-control" href="#carousel-example-generic" data-slide="prev"/>'
-        + '<a class="right carousel-control" href="#carousel-example-generic" data-slide="next"/>'
-        + '</div>'
-    var $carousel = $(carouselHTML)
-
-    var done = assert.async()
-    $carousel
-      .one('slide.bs.carousel', function (e) {
-        e.preventDefault()
-        setTimeout(function () {
-          assert.ok($carousel.find('.carousel-item:eq(0)').is('.active'), 'first item still active')
-          assert.ok($carousel.find('.carousel-indicators li:eq(0)').is('.active'), 'first indicator still active')
-          $carousel.bootstrapCarousel('next')
-        }, 0)
-      })
-      .one('slid.bs.carousel', function () {
-        setTimeout(function () {
-          assert.ok(!$carousel.find('.carousel-item:eq(0)').is('.active'), 'first item still active')
-          assert.ok(!$carousel.find('.carousel-indicators li:eq(0)').is('.active'), 'first indicator still active')
-          assert.ok($carousel.find('.carousel-item:eq(1)').is('.active'), 'second item active')
-          assert.ok($carousel.find('.carousel-indicators li:eq(1)').is('.active'), 'second indicator active')
-          done()
-        }, 0)
-      })
-      .bootstrapCarousel('next')
-  })
-
-  QUnit.test('should fire slide event with direction', function (assert) {
-    assert.expect(4)
-    var carouselHTML = '<div id="myCarousel" class="carousel slide">'
-        + '<div class="carousel-inner">'
-        + '<div class="carousel-item active">'
-        + '<img alt="">'
-        + '<div class="carousel-caption">'
-        + '<h4>First Thumbnail label</h4>'
-        + '<p>Cras justo odio, dapibus ac facilisis in, egestas eget quam. Donec '
-        + 'id elit non mi porta gravida at eget metus. Nullam id dolor id nibh '
-        + 'ultricies vehicula ut id elit.</p>'
-        + '</div>'
-        + '</div>'
-        + '<div class="carousel-item">'
-        + '<img alt="">'
-        + '<div class="carousel-caption">'
-        + '<h4>Second Thumbnail label</h4>'
-        + '<p>Cras justo odio, dapibus ac facilisis in, egestas eget quam. Donec '
-        + 'id elit non mi porta gravida at eget metus. Nullam id dolor id nibh '
-        + 'ultricies vehicula ut id elit.</p>'
-        + '</div>'
-        + '</div>'
-        + '<div class="carousel-item">'
-        + '<img alt="">'
-        + '<div class="carousel-caption">'
-        + '<h4>Third Thumbnail label</h4>'
-        + '<p>Cras justo odio, dapibus ac facilisis in, egestas eget quam. Donec '
-        + 'id elit non mi porta gravida at eget metus. Nullam id dolor id nibh '
-        + 'ultricies vehicula ut id elit.</p>'
-        + '</div>'
-        + '</div>'
-        + '</div>'
-        + '<a class="left carousel-control" href="#myCarousel" data-slide="prev">‹</a>'
-        + '<a class="right carousel-control" href="#myCarousel" data-slide="next">›</a>'
-        + '</div>'
-    var $carousel = $(carouselHTML)
-
-    var done = assert.async()
-
-    $carousel
-      .one('slide.bs.carousel', function (e) {
-        assert.ok(e.direction, 'direction present on next')
-        assert.strictEqual(e.direction, 'left', 'direction is left on next')
-
-        $carousel
-          .one('slide.bs.carousel', function (e) {
-            assert.ok(e.direction, 'direction present on prev')
-            assert.strictEqual(e.direction, 'right', 'direction is right on prev')
-            done()
-          })
-          .bootstrapCarousel('prev')
-      })
-      .bootstrapCarousel('next')
-  })
-
-  QUnit.test('should fire slid event with direction', function (assert) {
-    assert.expect(4)
-    var carouselHTML = '<div id="myCarousel" class="carousel slide">'
-        + '<div class="carousel-inner">'
-        + '<div class="carousel-item active">'
-        + '<img alt="">'
-        + '<div class="carousel-caption">'
-        + '<h4>First Thumbnail label</h4>'
-        + '<p>Cras justo odio, dapibus ac facilisis in, egestas eget quam. Donec '
-        + 'id elit non mi porta gravida at eget metus. Nullam id dolor id nibh '
-        + 'ultricies vehicula ut id elit.</p>'
-        + '</div>'
-        + '</div>'
-        + '<div class="carousel-item">'
-        + '<img alt="">'
-        + '<div class="carousel-caption">'
-        + '<h4>Second Thumbnail label</h4>'
-        + '<p>Cras justo odio, dapibus ac facilisis in, egestas eget quam. Donec '
-        + 'id elit non mi porta gravida at eget metus. Nullam id dolor id nibh '
-        + 'ultricies vehicula ut id elit.</p>'
-        + '</div>'
-        + '</div>'
-        + '<div class="carousel-item">'
-        + '<img alt="">'
-        + '<div class="carousel-caption">'
-        + '<h4>Third Thumbnail label</h4>'
-        + '<p>Cras justo odio, dapibus ac facilisis in, egestas eget quam. Donec '
-        + 'id elit non mi porta gravida at eget metus. Nullam id dolor id nibh '
-        + 'ultricies vehicula ut id elit.</p>'
-        + '</div>'
-        + '</div>'
-        + '</div>'
-        + '<a class="left carousel-control" href="#myCarousel" data-slide="prev">‹</a>'
-        + '<a class="right carousel-control" href="#myCarousel" data-slide="next">›</a>'
-        + '</div>'
-    var $carousel = $(carouselHTML)
-
-    var done = assert.async()
-
-    $carousel
-      .one('slid.bs.carousel', function (e) {
-        assert.ok(e.direction, 'direction present on next')
-        assert.strictEqual(e.direction, 'left', 'direction is left on next')
-
-        $carousel
-          .one('slid.bs.carousel', function (e) {
-            assert.ok(e.direction, 'direction present on prev')
-            assert.strictEqual(e.direction, 'right', 'direction is right on prev')
-            done()
-          })
-          .bootstrapCarousel('prev')
-      })
-      .bootstrapCarousel('next')
-  })
-
-  QUnit.test('should fire slide event with relatedTarget', function (assert) {
-    assert.expect(2)
-    var template = '<div id="myCarousel" class="carousel slide">'
-        + '<div class="carousel-inner">'
-        + '<div class="carousel-item active">'
-        + '<img alt="">'
-        + '<div class="carousel-caption">'
-        + '<h4>First Thumbnail label</h4>'
-        + '<p>Cras justo odio, dapibus ac facilisis in, egestas eget quam. Donec '
-        + 'id elit non mi porta gravida at eget metus. Nullam id dolor id nibh '
-        + 'ultricies vehicula ut id elit.</p>'
-        + '</div>'
-        + '</div>'
-        + '<div class="carousel-item">'
-        + '<img alt="">'
-        + '<div class="carousel-caption">'
-        + '<h4>Second Thumbnail label</h4>'
-        + '<p>Cras justo odio, dapibus ac facilisis in, egestas eget quam. Donec '
-        + 'id elit non mi porta gravida at eget metus. Nullam id dolor id nibh '
-        + 'ultricies vehicula ut id elit.</p>'
-        + '</div>'
-        + '</div>'
-        + '<div class="carousel-item">'
-        + '<img alt="">'
-        + '<div class="carousel-caption">'
-        + '<h4>Third Thumbnail label</h4>'
-        + '<p>Cras justo odio, dapibus ac facilisis in, egestas eget quam. Donec '
-        + 'id elit non mi porta gravida at eget metus. Nullam id dolor id nibh '
-        + 'ultricies vehicula ut id elit.</p>'
-        + '</div>'
-        + '</div>'
-        + '</div>'
-        + '<a class="left carousel-control" href="#myCarousel" data-slide="prev">‹</a>'
-        + '<a class="right carousel-control" href="#myCarousel" data-slide="next">›</a>'
-        + '</div>'
-
-    var done = assert.async()
-
-    $(template)
-      .on('slide.bs.carousel', function (e) {
-        assert.ok(e.relatedTarget, 'relatedTarget present')
-        assert.ok($(e.relatedTarget).hasClass('carousel-item'), 'relatedTarget has class "item"')
-        done()
-      })
-      .bootstrapCarousel('next')
-  })
-
-  QUnit.test('should fire slid event with relatedTarget', function (assert) {
-    assert.expect(2)
-    var template = '<div id="myCarousel" class="carousel slide">'
-        + '<div class="carousel-inner">'
-        + '<div class="carousel-item active">'
-        + '<img alt="">'
-        + '<div class="carousel-caption">'
-        + '<h4>First Thumbnail label</h4>'
-        + '<p>Cras justo odio, dapibus ac facilisis in, egestas eget quam. Donec '
-        + 'id elit non mi porta gravida at eget metus. Nullam id dolor id nibh '
-        + 'ultricies vehicula ut id elit.</p>'
-        + '</div>'
-        + '</div>'
-        + '<div class="carousel-item">'
-        + '<img alt="">'
-        + '<div class="carousel-caption">'
-        + '<h4>Second Thumbnail label</h4>'
-        + '<p>Cras justo odio, dapibus ac facilisis in, egestas eget quam. Donec '
-        + 'id elit non mi porta gravida at eget metus. Nullam id dolor id nibh '
-        + 'ultricies vehicula ut id elit.</p>'
-        + '</div>'
-        + '</div>'
-        + '<div class="carousel-item">'
-        + '<img alt="">'
-        + '<div class="carousel-caption">'
-        + '<h4>Third Thumbnail label</h4>'
-        + '<p>Cras justo odio, dapibus ac facilisis in, egestas eget quam. Donec '
-        + 'id elit non mi porta gravida at eget metus. Nullam id dolor id nibh '
-        + 'ultricies vehicula ut id elit.</p>'
-        + '</div>'
-        + '</div>'
-        + '</div>'
-        + '<a class="left carousel-control" href="#myCarousel" data-slide="prev">‹</a>'
-        + '<a class="right carousel-control" href="#myCarousel" data-slide="next">›</a>'
-        + '</div>'
-
-    var done = assert.async()
-
-    $(template)
-      .on('slid.bs.carousel', function (e) {
-        assert.ok(e.relatedTarget, 'relatedTarget present')
-        assert.ok($(e.relatedTarget).hasClass('carousel-item'), 'relatedTarget has class "item"')
-        done()
-      })
-      .bootstrapCarousel('next')
-  })
-
-  QUnit.test('should fire slid and slide events with from and to', function (assert) {
-    assert.expect(4)
-    var template = '<div id="myCarousel" class="carousel slide">'
-        + '<div class="carousel-inner">'
-        + '<div class="carousel-item active">'
-        + '<img alt="">'
-        + '<div class="carousel-caption">'
-        + '<h4>First Thumbnail label</h4>'
-        + '</div>'
-        + '</div>'
-        + '<div class="carousel-item">'
-        + '<img alt="">'
-        + '<div class="carousel-caption">'
-        + '<h4>Second Thumbnail label</h4>'
-        + '</div>'
-        + '</div>'
-        + '<div class="carousel-item">'
-        + '<img alt="">'
-        + '<div class="carousel-caption">'
-        + '<h4>Third Thumbnail label</h4>'
-        + '</div>'
-        + '</div>'
-        + '</div>'
-        + '<a class="left carousel-control" href="#myCarousel" data-slide="prev">‹</a>'
-        + '<a class="right carousel-control" href="#myCarousel" data-slide="next">›</a>'
-        + '</div>'
-
-    var done = assert.async()
-    $(template)
-      .on('slid.bs.carousel', function (e) {
-        assert.ok(typeof e.from !== 'undefined', 'from present')
-        assert.ok(typeof e.to !== 'undefined', 'to present')
-        $(this).off()
-        done()
-      })
-      .on('slide.bs.carousel', function (e) {
-        assert.ok(typeof e.from !== 'undefined', 'from present')
-        assert.ok(typeof e.to !== 'undefined', 'to present')
-        $(this).off('slide.bs.carousel')
-      })
-      .bootstrapCarousel('next')
-  })
-
-  QUnit.test('should set interval from data attribute', function (assert) {
-    assert.expect(4)
-    var templateHTML = '<div id="myCarousel" class="carousel slide">'
-        + '<div class="carousel-inner">'
-        + '<div class="carousel-item active">'
-        + '<img alt="">'
-        + '<div class="carousel-caption">'
-        + '<h4>First Thumbnail label</h4>'
-        + '<p>Cras justo odio, dapibus ac facilisis in, egestas eget quam. Donec '
-        + 'id elit non mi porta gravida at eget metus. Nullam id dolor id nibh '
-        + 'ultricies vehicula ut id elit.</p>'
-        + '</div>'
-        + '</div>'
-        + '<div class="carousel-item">'
-        + '<img alt="">'
-        + '<div class="carousel-caption">'
-        + '<h4>Second Thumbnail label</h4>'
-        + '<p>Cras justo odio, dapibus ac facilisis in, egestas eget quam. Donec '
-        + 'id elit non mi porta gravida at eget metus. Nullam id dolor id nibh '
-        + 'ultricies vehicula ut id elit.</p>'
-        + '</div>'
-        + '</div>'
-        + '<div class="carousel-item">'
-        + '<img alt="">'
-        + '<div class="carousel-caption">'
-        + '<h4>Third Thumbnail label</h4>'
-        + '<p>Cras justo odio, dapibus ac facilisis in, egestas eget quam. Donec '
-        + 'id elit non mi porta gravida at eget metus. Nullam id dolor id nibh '
-        + 'ultricies vehicula ut id elit.</p>'
-        + '</div>'
-        + '</div>'
-        + '</div>'
-        + '<a class="left carousel-control" href="#myCarousel" data-slide="prev">‹</a>'
-        + '<a class="right carousel-control" href="#myCarousel" data-slide="next">›</a>'
-        + '</div>'
-    var $carousel = $(templateHTML)
-    $carousel.attr('data-interval', 1814)
-
-    $carousel.appendTo('body')
-    $('[data-slide]').first().trigger('click')
-    assert.strictEqual($carousel.data('bs.carousel')._config.interval, 1814)
-    $carousel.remove()
-
-    $carousel.appendTo('body').attr('data-modal', 'foobar')
-    $('[data-slide]').first().trigger('click')
-    assert.strictEqual($carousel.data('bs.carousel')._config.interval, 1814, 'even if there is an data-modal attribute set')
-    $carousel.remove()
-
-    $carousel.appendTo('body')
-    $('[data-slide]').first().trigger('click')
-    $carousel.attr('data-interval', 1860)
-    $('[data-slide]').first().trigger('click')
-    assert.strictEqual($carousel.data('bs.carousel')._config.interval, 1814, 'attributes should be read only on initialization')
-    $carousel.remove()
-
-    $carousel.attr('data-interval', false)
-    $carousel.appendTo('body')
-    $carousel.bootstrapCarousel(1)
-    assert.strictEqual($carousel.data('bs.carousel')._config.interval, false, 'data attribute has higher priority than default options')
-    $carousel.remove()
-  })
-
-  QUnit.test('should skip over non-items when using item indices', function (assert) {
-    assert.expect(2)
-    var templateHTML = '<div id="myCarousel" class="carousel" data-interval="1814">'
-        + '<div class="carousel-inner">'
-        + '<div class="carousel-item active">'
-        + '<img alt="">'
-        + '</div>'
-        + '<script type="text/x-metamorph" id="thingy"/>'
-        + '<div class="carousel-item">'
-        + '<img alt="">'
-        + '</div>'
-        + '<div class="carousel-item">'
-        + '</div>'
-        + '</div>'
-        + '</div>'
-    var $template = $(templateHTML)
-
-    $template.bootstrapCarousel()
-
-    assert.strictEqual($template.find('.carousel-item')[0], $template.find('.active')[0], 'first item active')
-
-    $template.bootstrapCarousel(1)
-
-    assert.strictEqual($template.find('.carousel-item')[1], $template.find('.active')[0], 'second item active')
-  })
-
-  QUnit.test('should skip over non-items when using next/prev methods', function (assert) {
-    assert.expect(2)
-    var templateHTML = '<div id="myCarousel" class="carousel" data-interval="1814">'
-        + '<div class="carousel-inner">'
-        + '<div class="carousel-item active">'
-        + '<img alt="">'
-        + '</div>'
-        + '<script type="text/x-metamorph" id="thingy"/>'
-        + '<div class="carousel-item">'
-        + '<img alt="">'
-        + '</div>'
-        + '<div class="carousel-item">'
-        + '</div>'
-        + '</div>'
-        + '</div>'
-    var $template = $(templateHTML)
-
-    $template.bootstrapCarousel()
-
-    assert.strictEqual($template.find('.carousel-item')[0], $template.find('.active')[0], 'first item active')
-
-    $template.bootstrapCarousel('next')
-
-    assert.strictEqual($template.find('.carousel-item')[1], $template.find('.active')[0], 'second item active')
-  })
-
-  QUnit.test('should go to previous item if left arrow key is pressed', function (assert) {
-    assert.expect(2)
-    var templateHTML = '<div id="myCarousel" class="carousel" data-interval="false">'
-        + '<div class="carousel-inner">'
-        + '<div id="first" class="carousel-item">'
-        + '<img alt="">'
-        + '</div>'
-        + '<div id="second" class="carousel-item active">'
-        + '<img alt="">'
-        + '</div>'
-        + '<div id="third" class="carousel-item">'
-        + '<img alt="">'
-        + '</div>'
-        + '</div>'
-        + '</div>'
-    var $template = $(templateHTML)
-
-    $template.bootstrapCarousel()
-
-    assert.strictEqual($template.find('.carousel-item')[1], $template.find('.active')[0], 'second item active')
-
-    $template.trigger($.Event('keydown', { which: 37 }))
-
-    assert.strictEqual($template.find('.carousel-item')[0], $template.find('.active')[0], 'first item active')
-  })
-
-  QUnit.test('should go to next item if right arrow key is pressed', function (assert) {
-    assert.expect(2)
-    var templateHTML = '<div id="myCarousel" class="carousel" data-interval="false">'
-        + '<div class="carousel-inner">'
-        + '<div id="first" class="carousel-item active">'
-        + '<img alt="">'
-        + '</div>'
-        + '<div id="second" class="carousel-item">'
-        + '<img alt="">'
-        + '</div>'
-        + '<div id="third" class="carousel-item">'
-        + '<img alt="">'
-        + '</div>'
-        + '</div>'
-        + '</div>'
-    var $template = $(templateHTML)
-
-    $template.bootstrapCarousel()
-
-    assert.strictEqual($template.find('.carousel-item')[0], $template.find('.active')[0], 'first item active')
-
-    $template.trigger($.Event('keydown', { which: 39 }))
-
-    assert.strictEqual($template.find('.carousel-item')[1], $template.find('.active')[0], 'second item active')
-  })
-
-  QUnit.test('should not prevent keydown if key is not ARROW_LEFT or ARROW_RIGHT', function (assert) {
-    assert.expect(2)
-    var templateHTML = '<div id="myCarousel" class="carousel" data-interval="false">'
-        + '<div class="carousel-inner">'
-        + '<div id="first" class="carousel-item active">'
-        + '<img alt="">'
-        + '</div>'
-        + '</div>'
-        + '</div>'
-    var $template = $(templateHTML)
-
-    $template.bootstrapCarousel()
-    var done = assert.async()
-
-    var eventArrowDown = $.Event('keydown', { which: 40 })
-    var eventArrowUp   = $.Event('keydown', { which: 38 })
-
-    $template.one('keydown', function (event) {
-      assert.strictEqual(event.isDefaultPrevented(), false)
-    })
-
-    $template.trigger(eventArrowDown)
-
-    $template.one('keydown', function (event) {
-      assert.strictEqual(event.isDefaultPrevented(), false)
-      done()
-    })
-
-    $template.trigger(eventArrowUp)
-  })
-
-  QUnit.test('should support disabling the keyboard navigation', function (assert) {
-    assert.expect(3)
-    var templateHTML = '<div id="myCarousel" class="carousel" data-interval="false" data-keyboard="false">'
-        + '<div class="carousel-inner">'
-        + '<div id="first" class="carousel-item active">'
-        + '<img alt="">'
-        + '</div>'
-        + '<div id="second" class="carousel-item">'
-        + '<img alt="">'
-        + '</div>'
-        + '<div id="third" class="carousel-item">'
-        + '<img alt="">'
-        + '</div>'
-        + '</div>'
-        + '</div>'
-    var $template = $(templateHTML)
-
-    $template.bootstrapCarousel()
-
-    assert.strictEqual($template.find('.carousel-item')[0], $template.find('.active')[0], 'first item active')
-
-    $template.trigger($.Event('keydown', { which: 39 }))
-
-    assert.strictEqual($template.find('.carousel-item')[0], $template.find('.active')[0], 'first item still active after right arrow press')
-
-    $template.trigger($.Event('keydown', { which: 37 }))
-
-    assert.strictEqual($template.find('.carousel-item')[0], $template.find('.active')[0], 'first item still active after left arrow press')
-  })
-
-  QUnit.test('should ignore keyboard events within <input>s and <textarea>s', function (assert) {
-    assert.expect(7)
-    var templateHTML = '<div id="myCarousel" class="carousel" data-interval="false">'
-        + '<div class="carousel-inner">'
-        + '<div id="first" class="carousel-item active">'
-        + '<img alt="">'
-        + '<input type="text" id="in-put">'
-        + '<textarea id="text-area"></textarea>'
-        + '</div>'
-        + '<div id="second" class="carousel-item">'
-        + '<img alt="">'
-        + '</div>'
-        + '<div id="third" class="carousel-item">'
-        + '<img alt="">'
-        + '</div>'
-        + '</div>'
-        + '</div>'
-    var $template = $(templateHTML)
-    var $input = $template.find('#in-put')
-    var $textarea = $template.find('#text-area')
-
-    assert.strictEqual($input.length, 1, 'found <input>')
-    assert.strictEqual($textarea.length, 1, 'found <textarea>')
-
-    $template.bootstrapCarousel()
-
-    assert.strictEqual($template.find('.carousel-item')[0], $template.find('.active')[0], 'first item active')
-
-
-    $input.trigger($.Event('keydown', { which: 39 }))
-    assert.strictEqual($template.find('.carousel-item')[0], $template.find('.active')[0], 'first item still active after right arrow press in <input>')
-
-    $input.trigger($.Event('keydown', { which: 37 }))
-    assert.strictEqual($template.find('.carousel-item')[0], $template.find('.active')[0], 'first item still active after left arrow press in <input>')
-
-
-    $textarea.trigger($.Event('keydown', { which: 39 }))
-    assert.strictEqual($template.find('.carousel-item')[0], $template.find('.active')[0], 'first item still active after right arrow press in <textarea>')
-
-    $textarea.trigger($.Event('keydown', { which: 37 }))
-    assert.strictEqual($template.find('.carousel-item')[0], $template.find('.active')[0], 'first item still active after left arrow press in <textarea>')
-  })
-
-  QUnit.test('should wrap around from end to start when wrap option is true', function (assert) {
-    assert.expect(3)
-    var carouselHTML = '<div id="carousel-example-generic" class="carousel slide" data-wrap="true">'
-        + '<ol class="carousel-indicators">'
-        + '<li data-target="#carousel-example-generic" data-slide-to="0" class="active"/>'
-        + '<li data-target="#carousel-example-generic" data-slide-to="1"/>'
-        + '<li data-target="#carousel-example-generic" data-slide-to="2"/>'
-        + '</ol>'
-        + '<div class="carousel-inner">'
-        + '<div class="carousel-item active" id="one">'
-        + '<div class="carousel-caption"/>'
-        + '</div>'
-        + '<div class="carousel-item" id="two">'
-        + '<div class="carousel-caption"/>'
-        + '</div>'
-        + '<div class="carousel-item" id="three">'
-        + '<div class="carousel-caption"/>'
-        + '</div>'
-        + '</div>'
-        + '<a class="left carousel-control" href="#carousel-example-generic" data-slide="prev"/>'
-        + '<a class="right carousel-control" href="#carousel-example-generic" data-slide="next"/>'
-        + '</div>'
-    var $carousel = $(carouselHTML)
-    var getActiveId = function () { return $carousel.find('.carousel-item.active').attr('id') }
-
-    var done = assert.async()
-
-    $carousel
-      .one('slid.bs.carousel', function () {
-        assert.strictEqual(getActiveId(), 'two', 'carousel slid from 1st to 2nd slide')
-        $carousel
-          .one('slid.bs.carousel', function () {
-            assert.strictEqual(getActiveId(), 'three', 'carousel slid from 2nd to 3rd slide')
-            $carousel
-              .one('slid.bs.carousel', function () {
-                assert.strictEqual(getActiveId(), 'one', 'carousel wrapped around and slid from 3rd to 1st slide')
-                done()
-              })
-              .bootstrapCarousel('next')
-          })
-          .bootstrapCarousel('next')
-      })
-      .bootstrapCarousel('next')
-  })
-
-  QUnit.test('should wrap around from start to end when wrap option is true', function (assert) {
-    assert.expect(1)
-    var carouselHTML = '<div id="carousel-example-generic" class="carousel slide" data-wrap="true">'
-        + '<ol class="carousel-indicators">'
-        + '<li data-target="#carousel-example-generic" data-slide-to="0" class="active"/>'
-        + '<li data-target="#carousel-example-generic" data-slide-to="1"/>'
-        + '<li data-target="#carousel-example-generic" data-slide-to="2"/>'
-        + '</ol>'
-        + '<div class="carousel-inner">'
-        + '<div class="carousel-item active" id="one">'
-        + '<div class="carousel-caption"/>'
-        + '</div>'
-        + '<div class="carousel-item" id="two">'
-        + '<div class="carousel-caption"/>'
-        + '</div>'
-        + '<div class="carousel-item" id="three">'
-        + '<div class="carousel-caption"/>'
-        + '</div>'
-        + '</div>'
-        + '<a class="left carousel-control" href="#carousel-example-generic" data-slide="prev"/>'
-        + '<a class="right carousel-control" href="#carousel-example-generic" data-slide="next"/>'
-        + '</div>'
-    var $carousel = $(carouselHTML)
-
-    var done = assert.async()
-
-    $carousel
-      .on('slid.bs.carousel', function () {
-        assert.strictEqual($carousel.find('.carousel-item.active').attr('id'), 'three', 'carousel wrapped around and slid from 1st to 3rd slide')
-        done()
-      })
-      .bootstrapCarousel('prev')
-  })
-
-  QUnit.test('should stay at the end when the next method is called and wrap is false', function (assert) {
-    assert.expect(3)
-    var carouselHTML = '<div id="carousel-example-generic" class="carousel slide" data-wrap="false">'
-        + '<ol class="carousel-indicators">'
-        + '<li data-target="#carousel-example-generic" data-slide-to="0" class="active"/>'
-        + '<li data-target="#carousel-example-generic" data-slide-to="1"/>'
-        + '<li data-target="#carousel-example-generic" data-slide-to="2"/>'
-        + '</ol>'
-        + '<div class="carousel-inner">'
-        + '<div class="carousel-item active" id="one">'
-        + '<div class="carousel-caption"/>'
-        + '</div>'
-        + '<div class="carousel-item" id="two">'
-        + '<div class="carousel-caption"/>'
-        + '</div>'
-        + '<div class="carousel-item" id="three">'
-        + '<div class="carousel-caption"/>'
-        + '</div>'
-        + '</div>'
-        + '<a class="left carousel-control" href="#carousel-example-generic" data-slide="prev"/>'
-        + '<a class="right carousel-control" href="#carousel-example-generic" data-slide="next"/>'
-        + '</div>'
-    var $carousel = $(carouselHTML)
-    var getActiveId = function () { return $carousel.find('.carousel-item.active').attr('id') }
-
-    var done = assert.async()
-
-    $carousel
-      .one('slid.bs.carousel', function () {
-        assert.strictEqual(getActiveId(), 'two', 'carousel slid from 1st to 2nd slide')
-        $carousel
-          .one('slid.bs.carousel', function () {
-            assert.strictEqual(getActiveId(), 'three', 'carousel slid from 2nd to 3rd slide')
-            $carousel
-              .one('slid.bs.carousel', function () {
-                assert.ok(false, 'carousel slid when it should not have slid')
-              })
-              .bootstrapCarousel('next')
-            assert.strictEqual(getActiveId(), 'three', 'carousel did not wrap around and stayed on 3rd slide')
-            done()
-          })
-          .bootstrapCarousel('next')
-      })
-      .bootstrapCarousel('next')
-  })
-
-  QUnit.test('should stay at the start when the prev method is called and wrap is false', function (assert) {
-    assert.expect(1)
-    var carouselHTML = '<div id="carousel-example-generic" class="carousel slide" data-wrap="false">'
-        + '<ol class="carousel-indicators">'
-        + '<li data-target="#carousel-example-generic" data-slide-to="0" class="active"/>'
-        + '<li data-target="#carousel-example-generic" data-slide-to="1"/>'
-        + '<li data-target="#carousel-example-generic" data-slide-to="2"/>'
-        + '</ol>'
-        + '<div class="carousel-inner">'
-        + '<div class="carousel-item active" id="one">'
-        + '<div class="carousel-caption"/>'
-        + '</div>'
-        + '<div class="carousel-item" id="two">'
-        + '<div class="carousel-caption"/>'
-        + '</div>'
-        + '<div class="carousel-item" id="three">'
-        + '<div class="carousel-caption"/>'
-        + '</div>'
-        + '</div>'
-        + '<a class="left carousel-control" href="#carousel-example-generic" data-slide="prev"/>'
-        + '<a class="right carousel-control" href="#carousel-example-generic" data-slide="next"/>'
-        + '</div>'
-    var $carousel = $(carouselHTML)
-
-    $carousel
-      .on('slid.bs.carousel', function () {
-        assert.ok(false, 'carousel slid when it should not have slid')
-      })
-      .bootstrapCarousel('prev')
-    assert.strictEqual($carousel.find('.carousel-item.active').attr('id'), 'one', 'carousel did not wrap around and stayed on 1st slide')
-  })
-
-  QUnit.test('should not prevent keydown for inputs and textareas', function (assert) {
-    assert.expect(2)
-    var templateHTML = '<div id="myCarousel" class="carousel" data-interval="false">'
-        + '<div class="carousel-inner">'
-          + '<div id="first" class="carousel-item">'
-            + '<input type="text" id="inputText" />'
-          + '</div>'
-          + '<div id="second" class="carousel-item active">'
-            + '<textarea id="txtArea"></textarea>'
-          + '</div>'
-        + '</div>'
-        + '</div>'
-    var $template = $(templateHTML)
-    var done = assert.async()
-    $template.appendTo('#qunit-fixture')
-    var $inputText = $template.find('#inputText')
-    var $textArea = $template.find('#txtArea')
-    $template.bootstrapCarousel()
-
-    var eventKeyDown = $.Event('keydown', { which: 65 }) // 65 for "a"
-    $inputText.on('keydown', function (event) {
-      assert.strictEqual(event.isDefaultPrevented(), false)
-    })
-    $inputText.trigger(eventKeyDown)
-
-    $textArea.on('keydown', function (event) {
-      assert.strictEqual(event.isDefaultPrevented(), false)
-      done()
-    })
-    $textArea.trigger(eventKeyDown)
-  })
-
-  QUnit.test('Should not go to the next item when the carousel is not visible', function (assert) {
-    assert.expect(2)
-    var done = assert.async()
-    var html = '<div id="myCarousel" class="carousel slide" data-interval="50" style="display: none;">'
-             + '  <div class="carousel-inner">'
-             + '    <div id="firstItem" class="carousel-item active">'
-             + '      <img alt="">'
-             + '    </div>'
-             + '    <div class="carousel-item">'
-             + '      <img alt="">'
-             + '    </div>'
-             + '    <div class="carousel-item">'
-             + '      <img alt="">'
-             + '    </div>'
-             + '  <a class="left carousel-control" href="#myCarousel" data-slide="prev">‹</a>'
-             + '  <a class="right carousel-control" href="#myCarousel" data-slide="next">›</a>'
-             + '</div>'
-    var $html = $(html)
-    $html
-      .appendTo('#qunit-fixture')
-      .bootstrapCarousel()
-
-    var $firstItem = $('#firstItem')
-    setTimeout(function () {
-      assert.ok($firstItem.hasClass('active'))
-      $html
-        .bootstrapCarousel('dispose')
-        .attr('style', 'visibility: hidden;')
-        .bootstrapCarousel()
-
-      setTimeout(function () {
-        assert.ok($firstItem.hasClass('active'))
-        done()
-      }, 80)
-    }, 80)
-  })
-
-  QUnit.test('Should not go to the next item when the parent of the carousel is not visible', function (assert) {
-    assert.expect(2)
-    var done = assert.async()
-    var html = '<div id="parent" style="display: none;">'
-             + '  <div id="myCarousel" class="carousel slide" data-interval="50" style="display: none;">'
-             + '    <div class="carousel-inner">'
-             + '      <div id="firstItem" class="carousel-item active">'
-             + '        <img alt="">'
-             + '      </div>'
-             + '      <div class="carousel-item">'
-             + '        <img alt="">'
-             + '      </div>'
-             + '      <div class="carousel-item">'
-             + '        <img alt="">'
-             + '      </div>'
-             + '    <a class="left carousel-control" href="#myCarousel" data-slide="prev">‹</a>'
-             + '    <a class="right carousel-control" href="#myCarousel" data-slide="next">›</a>'
-             + '  </div>'
-             + '</div>'
-    var $html = $(html)
-    $html.appendTo('#qunit-fixture')
-    var $parent = $html.find('#parent')
-    var $carousel = $html.find('#myCarousel')
-    $carousel.bootstrapCarousel()
-    var $firstItem = $('#firstItem')
-
-    setTimeout(function () {
-      assert.ok($firstItem.hasClass('active'))
-      $carousel.bootstrapCarousel('dispose')
-      $parent.attr('style', 'visibility: hidden;')
-      $carousel.bootstrapCarousel()
-
-      setTimeout(function () {
-        assert.ok($firstItem.hasClass('active'))
-        done()
-      }, 80)
-    }, 80)
-  })
-})
diff --git a/assets/javascript/tests/unit/collapse.js b/assets/javascript/tests/unit/collapse.js
deleted file mode 100644
index c36fe25..0000000
--- a/assets/javascript/tests/unit/collapse.js
+++ /dev/null
@@ -1,745 +0,0 @@
-$(function () {
-  'use strict'
-
-  QUnit.module('collapse plugin')
-
-  QUnit.test('should be defined on jquery object', function (assert) {
-    assert.expect(1)
-    assert.ok($(document.body).collapse, 'collapse method is defined')
-  })
-
-  QUnit.module('collapse', {
-    beforeEach: function () {
-      // Run all tests in noConflict mode -- it's the only way to ensure that the plugin works in noConflict mode
-      $.fn.bootstrapCollapse = $.fn.collapse.noConflict()
-    },
-    afterEach: function () {
-      $.fn.collapse = $.fn.bootstrapCollapse
-      delete $.fn.bootstrapCollapse
-    }
-  })
-
-  QUnit.test('should provide no conflict', function (assert) {
-    assert.expect(1)
-    assert.strictEqual(typeof $.fn.collapse, 'undefined', 'collapse was set back to undefined (org value)')
-  })
-
-  QUnit.test('should throw explicit error on undefined method', function (assert) {
-    assert.expect(1)
-    var $el = $('<div/>')
-    $el.bootstrapCollapse()
-    try {
-      $el.bootstrapCollapse('noMethod')
-    }
-    catch (err) {
-      assert.strictEqual(err.message, 'No method named "noMethod"')
-    }
-  })
-
-  QUnit.test('should return jquery collection containing the element', function (assert) {
-    assert.expect(2)
-    var $el = $('<div/>')
-    var $collapse = $el.bootstrapCollapse()
-    assert.ok($collapse instanceof $, 'returns jquery collection')
-    assert.strictEqual($collapse[0], $el[0], 'collection contains element')
-  })
-
-  QUnit.test('should show a collapsed element', function (assert) {
-    assert.expect(2)
-    var $el = $('<div class="collapse"/>').bootstrapCollapse('show')
-
-    assert.ok($el.hasClass('show'), 'has class "show"')
-    assert.ok(!/height/i.test($el.attr('style')), 'has height reset')
-  })
-
-
-  QUnit.test('should show multiple collapsed elements', function (assert) {
-    assert.expect(4)
-    var done = assert.async()
-    var $target = $('<a role="button" data-toggle="collapse" class="collapsed" href=".multi"/>').appendTo('#qunit-fixture')
-    var $el = $('<div class="collapse multi"/>').appendTo('#qunit-fixture')
-    var $el2 = $('<div class="collapse multi"/>').appendTo('#qunit-fixture')
-    $el.one('shown.bs.collapse', function () {
-      assert.ok($el.hasClass('show'), 'has class "show"')
-      assert.ok(!/height/i.test($el.attr('style')), 'has height reset')
-    })
-    $el2.one('shown.bs.collapse', function () {
-      assert.ok($el2.hasClass('show'), 'has class "show"')
-      assert.ok(!/height/i.test($el2.attr('style')), 'has height reset')
-      done()
-    })
-    $target.trigger('click')
-  })
-
-  QUnit.test('should collapse only the first collapse', function (assert) {
-    assert.expect(2)
-    var done = assert.async()
-    var html = [
-      '<div class="panel-group" id="accordion1">',
-      '<div class="panel">',
-      '<div id="collapse1" class="collapse"/>',
-      '</div>',
-      '</div>',
-      '<div class="panel-group" id="accordion2">',
-      '<div class="panel">',
-      '<div id="collapse2" class="collapse show"/>',
-      '</div>',
-      '</div>'
-    ].join('')
-    $(html).appendTo('#qunit-fixture')
-    var $el1 = $('#collapse1')
-    var $el2 = $('#collapse2')
-    $el1.one('shown.bs.collapse', function () {
-      assert.ok($el1.hasClass('show'))
-      assert.ok($el2.hasClass('show'))
-      done()
-    }).bootstrapCollapse('show')
-  })
-
-  QUnit.test('should hide a collapsed element', function (assert) {
-    assert.expect(1)
-    var $el = $('<div class="collapse"/>').bootstrapCollapse('hide')
-
-    assert.ok(!$el.hasClass('show'), 'does not have class "show"')
-  })
-
-  QUnit.test('should not fire shown when show is prevented', function (assert) {
-    assert.expect(1)
-    var done = assert.async()
-
-    $('<div class="collapse"/>')
-      .on('show.bs.collapse', function (e) {
-        e.preventDefault()
-        assert.ok(true, 'show event fired')
-        done()
-      })
-      .on('shown.bs.collapse', function () {
-        assert.ok(false, 'shown event fired')
-      })
-      .bootstrapCollapse('show')
-  })
-
-  QUnit.test('should reset style to auto after finishing opening collapse', function (assert) {
-    assert.expect(2)
-    var done = assert.async()
-
-    $('<div class="collapse" style="height: 0px"/>')
-      .on('show.bs.collapse', function () {
-        assert.strictEqual(this.style.height, '0px', 'height is 0px')
-      })
-      .on('shown.bs.collapse', function () {
-        assert.strictEqual(this.style.height, '', 'height is auto')
-        done()
-      })
-      .bootstrapCollapse('show')
-  })
-
-  QUnit.test('should reset style to auto after finishing closing collapse', function (assert) {
-    assert.expect(1)
-    var done = assert.async()
-
-    $('<div class="collapse"/>')
-      .on('shown.bs.collapse', function () {
-        $(this).bootstrapCollapse('hide')
-      })
-      .on('hidden.bs.collapse', function () {
-        assert.strictEqual(this.style.height, '', 'height is auto')
-        done()
-      })
-      .bootstrapCollapse('show')
-  })
-
-  QUnit.test('should remove "collapsed" class from target when collapse is shown', function (assert) {
-    assert.expect(1)
-    var done = assert.async()
-
-    var $target = $('<a role="button" data-toggle="collapse" class="collapsed" href="#test1"/>').appendTo('#qunit-fixture')
-
-    $('<div id="test1"/>')
-      .appendTo('#qunit-fixture')
-      .on('shown.bs.collapse', function () {
-        assert.ok(!$target.hasClass('collapsed'), 'target does not have collapsed class')
-        done()
-      })
-
-    $target.trigger('click')
-  })
-
-  QUnit.test('should add "collapsed" class to target when collapse is hidden', function (assert) {
-    assert.expect(1)
-    var done = assert.async()
-
-    var $target = $('<a role="button" data-toggle="collapse" href="#test1"/>').appendTo('#qunit-fixture')
-
-    $('<div id="test1" class="show"/>')
-      .appendTo('#qunit-fixture')
-      .on('hidden.bs.collapse', function () {
-        assert.ok($target.hasClass('collapsed'), 'target has collapsed class')
-        done()
-      })
-
-    $target.trigger('click')
-  })
-
-  QUnit.test('should remove "collapsed" class from all triggers targeting the collapse when the collapse is shown', function (assert) {
-    assert.expect(2)
-    var done = assert.async()
-
-    var $target = $('<a role="button" data-toggle="collapse" class="collapsed" href="#test1"/>').appendTo('#qunit-fixture')
-    var $alt = $('<a role="button" data-toggle="collapse" class="collapsed" href="#test1"/>').appendTo('#qunit-fixture')
-
-    $('<div id="test1"/>')
-      .appendTo('#qunit-fixture')
-      .on('shown.bs.collapse', function () {
-        assert.ok(!$target.hasClass('collapsed'), 'target trigger does not have collapsed class')
-        assert.ok(!$alt.hasClass('collapsed'), 'alt trigger does not have collapsed class')
-        done()
-      })
-
-    $target.trigger('click')
-  })
-
-  QUnit.test('should add "collapsed" class to all triggers targeting the collapse when the collapse is hidden', function (assert) {
-    assert.expect(2)
-    var done = assert.async()
-
-    var $target = $('<a role="button" data-toggle="collapse" href="#test1"/>').appendTo('#qunit-fixture')
-    var $alt = $('<a role="button" data-toggle="collapse" href="#test1"/>').appendTo('#qunit-fixture')
-
-    $('<div id="test1" class="show"/>')
-      .appendTo('#qunit-fixture')
-      .on('hidden.bs.collapse', function () {
-        assert.ok($target.hasClass('collapsed'), 'target has collapsed class')
-        assert.ok($alt.hasClass('collapsed'), 'alt trigger has collapsed class')
-        done()
-      })
-
-    $target.trigger('click')
-  })
-
-  QUnit.test('should not close a collapse when initialized with "show" option if already shown', function (assert) {
-    assert.expect(0)
-    var done = assert.async()
-
-    var $test = $('<div id="test1" class="show"/>')
-      .appendTo('#qunit-fixture')
-      .on('hide.bs.collapse', function () {
-        assert.ok(false)
-      })
-
-    $test.bootstrapCollapse('show')
-
-    setTimeout(done, 0)
-  })
-
-  QUnit.test('should open a collapse when initialized with "show" option if not already shown', function (assert) {
-    assert.expect(1)
-    var done = assert.async()
-
-    var $test = $('<div id="test1" />')
-      .appendTo('#qunit-fixture')
-      .on('show.bs.collapse', function () {
-        assert.ok(true)
-      })
-
-    $test.bootstrapCollapse('show')
-
-    setTimeout(done, 0)
-  })
-
-  QUnit.test('should not show a collapse when initialized with "hide" option if already hidden', function (assert) {
-    assert.expect(0)
-    var done = assert.async()
-
-    $('<div class="collapse"></div>')
-      .appendTo('#qunit-fixture')
-      .on('show.bs.collapse', function () {
-        assert.ok(false, 'showing a previously-uninitialized hidden collapse when the "hide" method is called')
-      })
-      .bootstrapCollapse('hide')
-
-    setTimeout(done, 0)
-  })
-
-  QUnit.test('should hide a collapse when initialized with "hide" option if not already hidden', function (assert) {
-    assert.expect(1)
-    var done = assert.async()
-
-    $('<div class="collapse show"></div>')
-      .appendTo('#qunit-fixture')
-      .on('hide.bs.collapse', function () {
-        assert.ok(true, 'hiding a previously-uninitialized shown collapse when the "hide" method is called')
-      })
-      .bootstrapCollapse('hide')
-
-    setTimeout(done, 0)
-  })
-
-  QUnit.test('should remove "collapsed" class from active accordion target', function (assert) {
-    assert.expect(3)
-    var done = assert.async()
-
-    var accordionHTML = '<div id="accordion">'
-        + '<div class="card"/>'
-        + '<div class="card"/>'
-        + '<div class="card"/>'
-        + '</div>'
-    var $groups = $(accordionHTML).appendTo('#qunit-fixture').find('.card')
-
-    var $target1 = $('<a role="button" data-toggle="collapse" href="#body1" />').appendTo($groups.eq(0))
-
-    $('<div id="body1" class="show" data-parent="#accordion"/>').appendTo($groups.eq(0))
-
-    var $target2 = $('<a class="collapsed" data-toggle="collapse" role="button" href="#body2" />').appendTo($groups.eq(1))
-
-    $('<div id="body2" data-parent="#accordion"/>').appendTo($groups.eq(1))
-
-    var $target3 = $('<a class="collapsed" data-toggle="collapse" role="button" href="#body3" />').appendTo($groups.eq(2))
-
-    $('<div id="body3" data-parent="#accordion"/>')
-      .appendTo($groups.eq(2))
-      .on('shown.bs.collapse', function () {
-        assert.ok($target1.hasClass('collapsed'), 'inactive target 1 does have class "collapsed"')
-        assert.ok($target2.hasClass('collapsed'), 'inactive target 2 does have class "collapsed"')
-        assert.ok(!$target3.hasClass('collapsed'), 'active target 3 does not have class "collapsed"')
-
-        done()
-      })
-
-    $target3.trigger('click')
-  })
-
-  QUnit.test('should allow dots in data-parent', function (assert) {
-    assert.expect(3)
-    var done = assert.async()
-
-    var accordionHTML = '<div class="accordion">'
-        + '<div class="card"/>'
-        + '<div class="card"/>'
-        + '<div class="card"/>'
-        + '</div>'
-    var $groups = $(accordionHTML).appendTo('#qunit-fixture').find('.card')
-
-    var $target1 = $('<a role="button" data-toggle="collapse" href="#body1"/>').appendTo($groups.eq(0))
-
-    $('<div id="body1" class="show" data-parent=".accordion"/>').appendTo($groups.eq(0))
-
-    var $target2 = $('<a class="collapsed" data-toggle="collapse" role="button" href="#body2"/>').appendTo($groups.eq(1))
-
-    $('<div id="body2" data-parent=".accordion"/>').appendTo($groups.eq(1))
-
-    var $target3 = $('<a class="collapsed" data-toggle="collapse" role="button" href="#body3"/>').appendTo($groups.eq(2))
-
-    $('<div id="body3" data-parent=".accordion"/>')
-      .appendTo($groups.eq(2))
-      .on('shown.bs.collapse', function () {
-        assert.ok($target1.hasClass('collapsed'), 'inactive target 1 does have class "collapsed"')
-        assert.ok($target2.hasClass('collapsed'), 'inactive target 2 does have class "collapsed"')
-        assert.ok(!$target3.hasClass('collapsed'), 'active target 3 does not have class "collapsed"')
-
-        done()
-      })
-
-    $target3.trigger('click')
-  })
-
-  QUnit.test('should set aria-expanded="true" on trigger/control when collapse is shown', function (assert) {
-    assert.expect(1)
-    var done = assert.async()
-
-    var $target = $('<a role="button" data-toggle="collapse" class="collapsed" href="#test1" aria-expanded="false"/>').appendTo('#qunit-fixture')
-
-    $('<div id="test1"/>')
-      .appendTo('#qunit-fixture')
-      .on('shown.bs.collapse', function () {
-        assert.strictEqual($target.attr('aria-expanded'), 'true', 'aria-expanded on target is "true"')
-        done()
-      })
-
-    $target.trigger('click')
-  })
-
-  QUnit.test('should set aria-expanded="false" on trigger/control when collapse is hidden', function (assert) {
-    assert.expect(1)
-    var done = assert.async()
-
-    var $target = $('<a role="button" data-toggle="collapse" href="#test1" aria-expanded="true"/>').appendTo('#qunit-fixture')
-
-    $('<div id="test1" class="show"/>')
-      .appendTo('#qunit-fixture')
-      .on('hidden.bs.collapse', function () {
-        assert.strictEqual($target.attr('aria-expanded'), 'false', 'aria-expanded on target is "false"')
-        done()
-      })
-
-    $target.trigger('click')
-  })
-
-  QUnit.test('should set aria-expanded="true" on all triggers targeting the collapse when the collapse is shown', function (assert) {
-    assert.expect(2)
-    var done = assert.async()
-
-    var $target = $('<a role="button" data-toggle="collapse" class="collapsed" href="#test1" aria-expanded="false"/>').appendTo('#qunit-fixture')
-    var $alt = $('<a role="button" data-toggle="collapse" class="collapsed" href="#test1" aria-expanded="false"/>').appendTo('#qunit-fixture')
-
-    $('<div id="test1"/>')
-      .appendTo('#qunit-fixture')
-      .on('shown.bs.collapse', function () {
-        assert.strictEqual($target.attr('aria-expanded'), 'true', 'aria-expanded on trigger/control is "true"')
-        assert.strictEqual($alt.attr('aria-expanded'), 'true', 'aria-expanded on alternative trigger/control is "true"')
-        done()
-      })
-
-    $target.trigger('click')
-  })
-
-  QUnit.test('should set aria-expanded="false" on all triggers targeting the collapse when the collapse is hidden', function (assert) {
-    assert.expect(2)
-    var done = assert.async()
-
-    var $target = $('<a role="button" data-toggle="collapse" href="#test1" aria-expanded="true"/>').appendTo('#qunit-fixture')
-    var $alt = $('<a role="button" data-toggle="collapse" href="#test1" aria-expanded="true"/>').appendTo('#qunit-fixture')
-
-    $('<div id="test1" class="show"/>')
-      .appendTo('#qunit-fixture')
-      .on('hidden.bs.collapse', function () {
-        assert.strictEqual($target.attr('aria-expanded'), 'false', 'aria-expanded on trigger/control is "false"')
-        assert.strictEqual($alt.attr('aria-expanded'), 'false', 'aria-expanded on alternative trigger/control is "false"')
-        done()
-      })
-
-    $target.trigger('click')
-  })
-
-  QUnit.test('should change aria-expanded from active accordion trigger/control to "false" and set the trigger/control for the newly active one to "true"', function (assert) {
-    assert.expect(3)
-    var done = assert.async()
-
-    var accordionHTML = '<div id="accordion">'
-        + '<div class="card"/>'
-        + '<div class="card"/>'
-        + '<div class="card"/>'
-        + '</div>'
-    var $groups = $(accordionHTML).appendTo('#qunit-fixture').find('.card')
-
-    var $target1 = $('<a role="button" data-toggle="collapse" aria-expanded="true" href="#body1"/>').appendTo($groups.eq(0))
-
-    $('<div id="body1" class="show" data-parent="#accordion"/>').appendTo($groups.eq(0))
-
-    var $target2 = $('<a role="button" data-toggle="collapse" aria-expanded="false" href="#body2" class="collapsed" aria-expanded="false" />').appendTo($groups.eq(1))
-
-    $('<div id="body2" data-parent="#accordion"/>').appendTo($groups.eq(1))
-
-    var $target3 = $('<a class="collapsed" data-toggle="collapse" aria-expanded="false" role="button" href="#body3"/>').appendTo($groups.eq(2))
-
-    $('<div id="body3" data-parent="#accordion"/>')
-      .appendTo($groups.eq(2))
-      .on('shown.bs.collapse', function () {
-        assert.strictEqual($target1.attr('aria-expanded'), 'false', 'inactive trigger/control 1 has aria-expanded="false"')
-        assert.strictEqual($target2.attr('aria-expanded'), 'false', 'inactive trigger/control 2 has aria-expanded="false"')
-        assert.strictEqual($target3.attr('aria-expanded'), 'true', 'active trigger/control 3 has aria-expanded="true"')
-
-        done()
-      })
-
-    $target3.trigger('click')
-  })
-
-  QUnit.test('should not fire show event if show is prevented because other element is still transitioning', function (assert) {
-    assert.expect(1)
-    var done = assert.async()
-
-    var accordionHTML = '<div id="accordion">'
-        + '<div class="card"/>'
-        + '<div class="card"/>'
-        + '</div>'
-    var showFired = false
-    var $groups   = $(accordionHTML).appendTo('#qunit-fixture').find('.card')
-
-    var $target1 = $('<a role="button" data-toggle="collapse" href="#body1"/>').appendTo($groups.eq(0))
-
-    $('<div id="body1" class="collapse" data-parent="#accordion"/>')
-      .appendTo($groups.eq(0))
-      .on('show.bs.collapse', function () {
-        showFired = true
-      })
-
-    var $target2 = $('<a role="button" data-toggle="collapse" href="#body2"/>').appendTo($groups.eq(1))
-    var $body2   = $('<div id="body2" class="collapse" data-parent="#accordion"/>').appendTo($groups.eq(1))
-
-    $target2.trigger('click')
-
-    $body2
-      .toggleClass('show collapsing')
-      .data('bs.collapse')._isTransitioning = 1
-
-    $target1.trigger('click')
-
-    setTimeout(function () {
-      assert.ok(!showFired, 'show event did not fire')
-      done()
-    }, 1)
-  })
-
-  QUnit.test('should add "collapsed" class to target when collapse is hidden via manual invocation', function (assert) {
-    assert.expect(1)
-    var done = assert.async()
-
-    var $target = $('<a role="button" data-toggle="collapse" href="#test1"/>').appendTo('#qunit-fixture')
-
-    $('<div id="test1" class="show"/>')
-      .appendTo('#qunit-fixture')
-      .on('hidden.bs.collapse', function () {
-        assert.ok($target.hasClass('collapsed'))
-        done()
-      })
-      .bootstrapCollapse('hide')
-  })
-
-  QUnit.test('should remove "collapsed" class from target when collapse is shown via manual invocation', function (assert) {
-    assert.expect(1)
-    var done = assert.async()
-
-    var $target = $('<a role="button" data-toggle="collapse" class="collapsed" href="#test1"/>').appendTo('#qunit-fixture')
-
-    $('<div id="test1"/>')
-      .appendTo('#qunit-fixture')
-      .on('shown.bs.collapse', function () {
-        assert.ok(!$target.hasClass('collapsed'))
-        done()
-      })
-      .bootstrapCollapse('show')
-  })
-
-  QUnit.test('should allow accordion to use children other than card', function (assert) {
-    assert.expect(4)
-    var done = assert.async()
-    var accordionHTML = '<div id="accordion">'
-        + '<div class="item">'
-        + '<a id="linkTrigger" data-parent="#accordion" data-toggle="collapse" href="#collapseOne" aria-expanded="false" aria-controls="collapseOne"></a>'
-        + '<div id="collapseOne" class="collapse" role="tabpanel" aria-labelledby="headingThree"></div>'
-        + '</div>'
-        + '<div class="item">'
-        + '<a id="linkTriggerTwo" data-toggle="collapse" data-parent="#accordion" href="#collapseTwo" aria-expanded="false" aria-controls="collapseTwo"></a>'
-        + '<div id="collapseTwo" class="collapse show" role="tabpanel" aria-labelledby="headingTwo"></div>'
-        + '</div>'
-        + '</div>'
-
-    $(accordionHTML).appendTo('#qunit-fixture')
-    var $trigger = $('#linkTrigger')
-    var $triggerTwo = $('#linkTriggerTwo')
-    var $collapseOne = $('#collapseOne')
-    var $collapseTwo = $('#collapseTwo')
-    $collapseOne.on('shown.bs.collapse', function () {
-      assert.ok($collapseOne.hasClass('show'), '#collapseOne is shown')
-      assert.ok(!$collapseTwo.hasClass('show'), '#collapseTwo is not shown')
-      $collapseTwo.on('shown.bs.collapse', function () {
-        assert.ok(!$collapseOne.hasClass('show'), '#collapseOne is not shown')
-        assert.ok($collapseTwo.hasClass('show'), '#collapseTwo is shown')
-        done()
-      })
-      $triggerTwo.trigger($.Event('click'))
-    })
-    $trigger.trigger($.Event('click'))
-  })
-
-  QUnit.test('should collapse accordion children but not nested accordion children', function (assert) {
-    assert.expect(9)
-    var done = assert.async()
-    $('<div id="accordion">'
-        + '<div class="item">'
-        + '<a id="linkTrigger" data-parent="#accordion" data-toggle="collapse" href="#collapseOne" aria-expanded="false" aria-controls="collapseOne"></a>'
-        + '<div id="collapseOne" class="collapse" role="tabpanel" aria-labelledby="headingThree">'
-        + '<div id="nestedAccordion">'
-        + '<div class="item">'
-        + '<a id="nestedLinkTrigger" data-parent="#nestedAccordion" data-toggle="collapse" href="#nestedCollapseOne" aria-expanded="false" aria-controls="nestedCollapseOne"></a>'
-        + '<div id="nestedCollapseOne" class="collapse" role="tabpanel" aria-labelledby="headingThree">'
-        + '</div>'
-        + '</div>'
-        + '</div>'
-        + '</div>'
-        + '</div>'
-        + '<div class="item">'
-        + '<a id="linkTriggerTwo" data-toggle="collapse" data-parent="#accordion" href="#collapseTwo" aria-expanded="false" aria-controls="collapseTwo"></a>'
-        + '<div id="collapseTwo" class="collapse show" role="tabpanel" aria-labelledby="headingTwo"></div>'
-        + '</div>'
-        + '</div>').appendTo('#qunit-fixture')
-    var $trigger = $('#linkTrigger')
-    var $triggerTwo = $('#linkTriggerTwo')
-    var $nestedTrigger = $('#nestedLinkTrigger')
-    var $collapseOne = $('#collapseOne')
-    var $collapseTwo = $('#collapseTwo')
-    var $nestedCollapseOne = $('#nestedCollapseOne')
-
-
-    $collapseOne.one('shown.bs.collapse', function () {
-      assert.ok($collapseOne.hasClass('show'), '#collapseOne is shown')
-      assert.ok(!$collapseTwo.hasClass('show'), '#collapseTwo is not shown')
-      assert.ok(!$('#nestedCollapseOne').hasClass('show'), '#nestedCollapseOne is not shown')
-      $nestedCollapseOne.one('shown.bs.collapse', function () {
-        assert.ok($collapseOne.hasClass('show'), '#collapseOne is shown')
-        assert.ok(!$collapseTwo.hasClass('show'), '#collapseTwo is not shown')
-        assert.ok($nestedCollapseOne.hasClass('show'), '#nestedCollapseOne is shown')
-        $collapseTwo.one('shown.bs.collapse', function () {
-          assert.ok(!$collapseOne.hasClass('show'), '#collapseOne is not shown')
-          assert.ok($collapseTwo.hasClass('show'), '#collapseTwo is shown')
-          assert.ok($nestedCollapseOne.hasClass('show'), '#nestedCollapseOne is shown')
-          done()
-        })
-        $triggerTwo.trigger($.Event('click'))
-      })
-      $nestedTrigger.trigger($.Event('click'))
-    })
-    $trigger.trigger($.Event('click'))
-  })
-
-  QUnit.test('should not prevent event for input', function (assert) {
-    assert.expect(3)
-    var done = assert.async()
-    var $target = $('<input type="checkbox" data-toggle="collapse" data-target="#collapsediv1" />').appendTo('#qunit-fixture')
-
-    $('<div id="collapsediv1"/>')
-      .appendTo('#qunit-fixture')
-      .on('shown.bs.collapse', function () {
-        assert.ok($(this).hasClass('show'))
-        assert.ok($target.attr('aria-expanded') === 'true')
-        assert.ok($target.prop('checked'))
-        done()
-      })
-
-    $target.trigger($.Event('click'))
-  })
-
-  QUnit.test('should add "collapsed" class to triggers only when all the targeted collapse are hidden', function (assert) {
-    assert.expect(9)
-    var done = assert.async()
-
-    var $trigger1 = $('<a role="button" data-toggle="collapse" href="#test1"/>').appendTo('#qunit-fixture')
-    var $trigger2 = $('<a role="button" data-toggle="collapse" href="#test2"/>').appendTo('#qunit-fixture')
-    var $trigger3 = $('<a role="button" data-toggle="collapse" href=".multi"/>').appendTo('#qunit-fixture')
-
-    var $target1 = $('<div id="test1" class="multi"/>').appendTo('#qunit-fixture')
-    var $target2 = $('<div id="test2" class="multi"/>').appendTo('#qunit-fixture')
-
-    $target2.one('shown.bs.collapse', function () {
-      assert.ok(!$trigger1.hasClass('collapsed'), 'trigger1 does not have collapsed class')
-      assert.ok(!$trigger2.hasClass('collapsed'), 'trigger2 does not have collapsed class')
-      assert.ok(!$trigger3.hasClass('collapsed'), 'trigger3 does not have collapsed class')
-      $target2.one('hidden.bs.collapse', function () {
-        assert.ok(!$trigger1.hasClass('collapsed'), 'trigger1 does not have collapsed class')
-        assert.ok($trigger2.hasClass('collapsed'), 'trigger2 has collapsed class')
-        assert.ok(!$trigger3.hasClass('collapsed'), 'trigger3 does not have collapsed class')
-        $target1.one('hidden.bs.collapse', function () {
-          assert.ok($trigger1.hasClass('collapsed'), 'trigger1 has collapsed class')
-          assert.ok($trigger2.hasClass('collapsed'), 'trigger2 has collapsed class')
-          assert.ok($trigger3.hasClass('collapsed'), 'trigger3 has collapsed class')
-          done()
-        })
-        $trigger1.trigger('click')
-      })
-      $trigger2.trigger('click')
-    })
-    $trigger3.trigger('click')
-  })
-
-  QUnit.test('should set aria-expanded="true" to triggers targetting shown collaspe and aria-expanded="false" only when all the targeted collapses are shown', function (assert) {
-    assert.expect(9)
-    var done = assert.async()
-
-    var $trigger1 = $('<a role="button" data-toggle="collapse" href="#test1"/>').appendTo('#qunit-fixture')
-    var $trigger2 = $('<a role="button" data-toggle="collapse" href="#test2"/>').appendTo('#qunit-fixture')
-    var $trigger3 = $('<a role="button" data-toggle="collapse" href=".multi"/>').appendTo('#qunit-fixture')
-
-    var $target1 = $('<div id="test1" class="multi collapse"/>').appendTo('#qunit-fixture')
-    var $target2 = $('<div id="test2" class="multi collapse"/>').appendTo('#qunit-fixture')
-
-    $target2.one('shown.bs.collapse', function () {
-      assert.strictEqual($trigger1.attr('aria-expanded'), 'true', 'aria-expanded on trigger1 is "true"')
-      assert.strictEqual($trigger2.attr('aria-expanded'), 'true', 'aria-expanded on trigger2 is "true"')
-      assert.strictEqual($trigger3.attr('aria-expanded'), 'true', 'aria-expanded on trigger3 is "true"')
-      $target2.one('hidden.bs.collapse', function () {
-        assert.strictEqual($trigger1.attr('aria-expanded'), 'true', 'aria-expanded on trigger1 is "true"')
-        assert.strictEqual($trigger2.attr('aria-expanded'), 'false', 'aria-expanded on trigger2 is "false"')
-        assert.strictEqual($trigger3.attr('aria-expanded'), 'true', 'aria-expanded on trigger3 is "true"')
-        $target1.one('hidden.bs.collapse', function () {
-          assert.strictEqual($trigger1.attr('aria-expanded'), 'false', 'aria-expanded on trigger1 is "fasle"')
-          assert.strictEqual($trigger2.attr('aria-expanded'), 'false', 'aria-expanded on trigger2 is "false"')
-          assert.strictEqual($trigger3.attr('aria-expanded'), 'false', 'aria-expanded on trigger3 is "false"')
-          done()
-        })
-        $trigger1.trigger('click')
-      })
-      $trigger2.trigger('click')
-    })
-    $trigger3.trigger('click')
-  })
-
-  QUnit.test('should not prevent interactions inside the collapse element', function (assert) {
-    assert.expect(2)
-    var done = assert.async()
-
-    var $target = $('<input type="checkbox" data-toggle="collapse" data-target="#collapsediv1" />').appendTo('#qunit-fixture')
-    var htmlCollapse =
-      '<div id="collapsediv1" class="collapse">' +
-      ' <input type="checkbox" id="testCheckbox" />' +
-      '</div>'
-
-    $(htmlCollapse)
-      .appendTo('#qunit-fixture')
-      .on('shown.bs.collapse', function () {
-        assert.ok($target.prop('checked'), '$trigger is checked')
-        var $testCheckbox = $('#testCheckbox')
-        $testCheckbox.trigger($.Event('click'))
-        setTimeout(function () {
-          assert.ok($testCheckbox.prop('checked'), '$testCheckbox is checked too')
-          done()
-        }, 5)
-      })
-
-    $target.trigger($.Event('click'))
-  })
-
-  QUnit.test('should allow jquery object in parent config', function (assert) {
-    assert.expect(1)
-    var html =
-    '<div class="my-collapse">' +
-    '  <div class="item">' +
-    '    <a data-toggle="collapse" href="#">Toggle item</a>' +
-    '    <div class="collapse">Lorem ipsum</div>' +
-    '  </div>' +
-    '</div>'
-
-    $(html).appendTo('#qunit-fixture')
-    try {
-      $('[data-toggle="collapse"]').bootstrapCollapse({
-        parent: $('.my-collapse')
-      })
-      assert.ok(true, 'collapse correctly created')
-    }
-    catch (e) {
-      assert.ok(false, 'collapse not created')
-    }
-  })
-
-  QUnit.test('should allow DOM object in parent config', function (assert) {
-    assert.expect(1)
-    var html =
-    '<div class="my-collapse">' +
-    '  <div class="item">' +
-    '    <a data-toggle="collapse" href="#">Toggle item</a>' +
-    '    <div class="collapse">Lorem ipsum</div>' +
-    '  </div>' +
-    '</div>'
-
-    $(html).appendTo('#qunit-fixture')
-    try {
-      $('[data-toggle="collapse"]').bootstrapCollapse({
-        parent: $('.my-collapse')[0]
-      })
-      assert.ok(true, 'collapse correctly created')
-    }
-    catch (e) {
-      assert.ok(false, 'collapse not created')
-    }
-  })
-})
diff --git a/assets/javascript/tests/unit/dropdown.js b/assets/javascript/tests/unit/dropdown.js
deleted file mode 100644
index 0b808cc..0000000
--- a/assets/javascript/tests/unit/dropdown.js
+++ /dev/null
@@ -1,652 +0,0 @@
-$(function () {
-  'use strict'
-
-  QUnit.module('dropdowns plugin')
-
-  QUnit.test('should be defined on jquery object', function (assert) {
-    assert.expect(1)
-    assert.ok($(document.body).dropdown, 'dropdown method is defined')
-  })
-
-  QUnit.module('dropdowns', {
-    beforeEach: function () {
-      // Run all tests in noConflict mode -- it's the only way to ensure that the plugin works in noConflict mode
-      $.fn.bootstrapDropdown = $.fn.dropdown.noConflict()
-    },
-    afterEach: function () {
-      $.fn.dropdown = $.fn.bootstrapDropdown
-      delete $.fn.bootstrapDropdown
-    }
-  })
-
-  QUnit.test('should provide no conflict', function (assert) {
-    assert.expect(1)
-    assert.strictEqual(typeof $.fn.dropdown, 'undefined', 'dropdown was set back to undefined (org value)')
-  })
-
-  QUnit.test('should throw explicit error on undefined method', function (assert) {
-    assert.expect(1)
-    var $el = $('<div/>')
-    $el.bootstrapDropdown()
-    try {
-      $el.bootstrapDropdown('noMethod')
-    }
-    catch (err) {
-      assert.strictEqual(err.message, 'No method named "noMethod"')
-    }
-  })
-
-  QUnit.test('should return jquery collection containing the element', function (assert) {
-    assert.expect(2)
-    var $el = $('<div/>')
-    var $dropdown = $el.bootstrapDropdown()
-    assert.ok($dropdown instanceof $, 'returns jquery collection')
-    assert.strictEqual($dropdown[0], $el[0], 'collection contains element')
-  })
-
-  QUnit.test('should not open dropdown if target is disabled via attribute', function (assert) {
-    assert.expect(1)
-    var done = assert.async()
-    var dropdownHTML = '<div class="tabs">'
-        + '<div class="dropdown">'
-        + '<button disabled href="#" class="btn dropdown-toggle" data-toggle="dropdown">Dropdown</button>'
-        + '<div class="dropdown-menu">'
-        + '<a class="dropdown-item" href="#">Secondary link</a>'
-        + '<a class="dropdown-item" href="#">Something else here</a>'
-        + '<div class="divider"/>'
-        + '<a class="dropdown-item" href="#">Another link</a>'
-        + '</div>'
-        + '</div>'
-        + '</div>'
-    $(dropdownHTML).appendTo('#qunit-fixture')
-    var $dropdown = $('#qunit-fixture').find('[data-toggle="dropdown"]').bootstrapDropdown()
-    $dropdown.on('click', function () {
-      assert.ok(!$dropdown.parent('.dropdown').hasClass('show'))
-      done()
-    })
-    $dropdown.trigger($.Event('click'))
-  })
-
-  QUnit.test('should set aria-expanded="true" on target when dropdown menu is shown', function (assert) {
-    assert.expect(1)
-    var done = assert.async()
-    var dropdownHTML = '<div class="tabs">'
-        + '<div class="dropdown">'
-        + '<a href="#" class="dropdown-toggle" data-toggle="dropdown" aria-expanded="false">Dropdown</a>'
-        + '<div class="dropdown-menu">'
-        + '<a class="dropdown-item" href="#">Secondary link</a>'
-        + '<a class="dropdown-item" href="#">Something else here</a>'
-        + '<div class="divider"/>'
-        + '<a class="dropdown-item" href="#">Another link</a>'
-        + '</div>'
-        + '</div>'
-        + '</div>'
-    var $dropdown = $(dropdownHTML)
-          .appendTo('#qunit-fixture')
-          .find('[data-toggle="dropdown"]')
-          .bootstrapDropdown()
-    $dropdown
-      .parent('.dropdown')
-      .on('shown.bs.dropdown', function () {
-        assert.strictEqual($dropdown.attr('aria-expanded'), 'true', 'aria-expanded is set to string "true" on click')
-        done()
-      })
-    $dropdown.trigger('click')
-  })
-
-  QUnit.test('should set aria-expanded="false" on target when dropdown menu is hidden', function (assert) {
-    assert.expect(1)
-    var done = assert.async()
-    var dropdownHTML = '<div class="tabs">'
-        + '<div class="dropdown">'
-        + '<a href="#" class="dropdown-toggle" aria-expanded="false" data-toggle="dropdown">Dropdown</a>'
-        + '<div class="dropdown-menu">'
-        + '<a class="dropdown-item" href="#">Secondary link</a>'
-        + '<a class="dropdown-item" href="#">Something else here</a>'
-        + '<div class="divider"/>'
-        + '<a class="dropdown-item" href="#">Another link</a>'
-        + '</div>'
-        + '</div>'
-        + '</div>'
-    var $dropdown = $(dropdownHTML)
-      .appendTo('#qunit-fixture')
-      .find('[data-toggle="dropdown"]')
-      .bootstrapDropdown()
-
-    $dropdown
-      .parent('.dropdown')
-      .on('hidden.bs.dropdown', function () {
-        assert.strictEqual($dropdown.attr('aria-expanded'), 'false', 'aria-expanded is set to string "false" on hide')
-        done()
-      })
-
-    $dropdown.trigger('click')
-    $(document.body).trigger('click')
-  })
-
-  QUnit.test('should not open dropdown if target is disabled via class', function (assert) {
-    assert.expect(1)
-    var done = assert.async()
-    var dropdownHTML = '<div class="tabs">'
-        + '<div class="dropdown">'
-        + '<button href="#" class="btn dropdown-toggle disabled" data-toggle="dropdown">Dropdown</button>'
-        + '<div class="dropdown-menu">'
-        + '<a class="dropdown-item" href="#">Secondary link</a>'
-        + '<a class="dropdown-item" href="#">Something else here</a>'
-        + '<div class="divider"/>'
-        + '<a class="dropdown-item" href="#">Another link</a>'
-        + '</div>'
-        + '</div>'
-        + '</div>'
-
-    $(dropdownHTML).appendTo('#qunit-fixture')
-    var $dropdown = $('#qunit-fixture').find('[data-toggle="dropdown"]').bootstrapDropdown()
-    $dropdown.on('click', function () {
-      assert.ok(!$dropdown.parent('.dropdown').hasClass('show'))
-      done()
-    })
-    $dropdown.trigger($.Event('click'))
-  })
-
-  QUnit.test('should add class show to menu if clicked', function (assert) {
-    assert.expect(1)
-    var done = assert.async()
-    var dropdownHTML = '<div class="tabs">'
-        + '<div class="dropdown">'
-        + '<a href="#" class="dropdown-toggle" data-toggle="dropdown">Dropdown</a>'
-        + '<div class="dropdown-menu">'
-        + '<a class="dropdown-item" href="#">Secondary link</a>'
-        + '<a class="dropdown-item" href="#">Something else here</a>'
-        + '<div class="divider"/>'
-        + '<a class="dropdown-item" href="#">Another link</a>'
-        + '</div>'
-        + '</div>'
-        + '</div>'
-    var $dropdown = $(dropdownHTML).find('[data-toggle="dropdown"]').bootstrapDropdown()
-    $dropdown
-      .parent('.dropdown')
-      .on('shown.bs.dropdown', function () {
-        assert.ok($dropdown.parent('.dropdown').hasClass('show'), '"show" class added on click')
-        done()
-      })
-    $dropdown.trigger('click')
-  })
-
-  QUnit.test('should test if element has a # before assuming it\'s a selector', function (assert) {
-    assert.expect(1)
-    var done = assert.async()
-    var dropdownHTML = '<div class="tabs">'
-        + '<div class="dropdown">'
-        + '<a href="/foo/" class="dropdown-toggle" data-toggle="dropdown">Dropdown</a>'
-        + '<div class="dropdown-menu">'
-        + '<a class="dropdown-item" href="#">Secondary link</a>'
-        + '<a class="dropdown-item" href="#">Something else here</a>'
-        + '<div class="divider"/>'
-        + '<a class="dropdown-item" href="#">Another link</a>'
-        + '</div>'
-        + '</div>'
-        + '</div>'
-    var $dropdown = $(dropdownHTML).find('[data-toggle="dropdown"]').bootstrapDropdown()
-    $dropdown
-      .parent('.dropdown')
-      .on('shown.bs.dropdown', function () {
-        assert.ok($dropdown.parent('.dropdown').hasClass('show'), '"show" class added on click')
-        done()
-      })
-    $dropdown.trigger('click')
-  })
-
-
-  QUnit.test('should remove "show" class if body is clicked', function (assert) {
-    assert.expect(2)
-    var done = assert.async()
-    var dropdownHTML = '<div class="tabs">'
-        + '<div class="dropdown">'
-        + '<a href="#" class="dropdown-toggle" data-toggle="dropdown">Dropdown</a>'
-        + '<div class="dropdown-menu">'
-        + '<a class="dropdown-item" href="#">Secondary link</a>'
-        + '<a class="dropdown-item" href="#">Something else here</a>'
-        + '<div class="divider"/>'
-        + '<a class="dropdown-item" href="#">Another link</a>'
-        + '</div>'
-        + '</div>'
-        + '</div>'
-    var $dropdown = $(dropdownHTML)
-      .appendTo('#qunit-fixture')
-      .find('[data-toggle="dropdown"]')
-      .bootstrapDropdown()
-
-    $dropdown
-      .parent('.dropdown')
-      .on('shown.bs.dropdown', function () {
-        assert.ok($dropdown.parent('.dropdown').hasClass('show'), '"show" class added on click')
-        $(document.body).trigger('click')
-      }).on('hidden.bs.dropdown', function () {
-        assert.ok(!$dropdown.parent('.dropdown').hasClass('show'), '"show" class removed')
-        done()
-      })
-    $dropdown.trigger('click')
-  })
-
-  QUnit.test('should remove "show" class if tabbing outside of menu', function (assert) {
-    assert.expect(2)
-    var done = assert.async()
-    var dropdownHTML = '<div class="tabs">'
-        + '<div class="dropdown">'
-        + '<a href="#" class="dropdown-toggle" data-toggle="dropdown">Dropdown</a>'
-        + '<div class="dropdown-menu">'
-        + '<a class="dropdown-item" href="#">Secondary link</a>'
-        + '<a class="dropdown-item" href="#">Something else here</a>'
-        + '<div class="dropdown-divider"/>'
-        + '<a class="dropdown-item" href="#">Another link</a>'
-        + '</div>'
-        + '</div>'
-        + '</div>'
-    var $dropdown = $(dropdownHTML)
-       .appendTo('#qunit-fixture')
-       .find('[data-toggle="dropdown"]')
-       .bootstrapDropdown()
-    $dropdown
-     .parent('.dropdown')
-     .on('shown.bs.dropdown', function () {
-       assert.ok($dropdown.parent('.dropdown').hasClass('show'), '"show" class added on click')
-       var e = $.Event('keyup')
-       e.which = 9 // Tab
-       $(document.body).trigger(e)
-     }).on('hidden.bs.dropdown', function () {
-       assert.ok(!$dropdown.parent('.dropdown').hasClass('show'), '"show" class removed')
-       done()
-     })
-    $dropdown.trigger('click')
-  })
-
-  QUnit.test('should remove "show" class if body is clicked, with multiple dropdowns', function (assert) {
-    assert.expect(7)
-    var done = assert.async()
-    var dropdownHTML = '<div class="nav">'
-        + '<div class="dropdown" id="testmenu">'
-        + '<a class="dropdown-toggle" data-toggle="dropdown" href="#testmenu">Test menu <span class="caret"/></a>'
-        + '<div class="dropdown-menu">'
-        + '<a class="dropdown-item" href="#sub1">Submenu 1</a>'
-        + '</div>'
-        + '</div>'
-        + '</div>'
-        + '<div class="btn-group">'
-        + '<button class="btn">Actions</button>'
-        + '<button class="btn dropdown-toggle" data-toggle="dropdown"></button>'
-        + '<div class="dropdown-menu">'
-        + '<a class="dropdown-item" href="#">Action 1</a>'
-        + '</div>'
-        + '</div>'
-    var $dropdowns = $(dropdownHTML).appendTo('#qunit-fixture').find('[data-toggle="dropdown"]')
-    var $first = $dropdowns.first()
-    var $last = $dropdowns.last()
-
-    assert.strictEqual($dropdowns.length, 2, 'two dropdowns')
-
-    $first.parent('.dropdown')
-    .on('shown.bs.dropdown', function () {
-      assert.strictEqual($first.parents('.show').length, 1, '"show" class added on click')
-      assert.strictEqual($('#qunit-fixture .dropdown-menu.show').length, 1, 'only one dropdown is shown')
-      $(document.body).trigger('click')
-    }).on('hidden.bs.dropdown', function () {
-      assert.strictEqual($('#qunit-fixture .dropdown-menu.show').length, 0, '"show" class removed')
-      $last.trigger('click')
-    })
-
-    $last.parent('.btn-group')
-    .on('shown.bs.dropdown', function () {
-      assert.strictEqual($last.parent('.show').length, 1, '"show" class added on click')
-      assert.strictEqual($('#qunit-fixture .dropdown-menu.show').length, 1, 'only one dropdown is shown')
-      $(document.body).trigger('click')
-    }).on('hidden.bs.dropdown', function () {
-      assert.strictEqual($('#qunit-fixture .dropdown-menu.show').length, 0, '"show" class removed')
-      done()
-    })
-    $first.trigger('click')
-  })
-
-  QUnit.test('should remove "show" class if body if tabbing outside of menu, with multiple dropdowns', function (assert) {
-    assert.expect(7)
-    var done = assert.async()
-    var dropdownHTML = '<div class="nav">'
-        + '<div class="dropdown" id="testmenu">'
-        + '<a class="dropdown-toggle" data-toggle="dropdown" href="#testmenu">Test menu <span class="caret"/></a>'
-        + '<div class="dropdown-menu">'
-        + '<a class="dropdown-item" href="#sub1">Submenu 1</a>'
-        + '</div>'
-        + '</div>'
-        + '</div>'
-        + '<div class="btn-group">'
-        + '<button class="btn">Actions</button>'
-        + '<button class="btn dropdown-toggle" data-toggle="dropdown"><span class="caret"/></button>'
-        + '<div class="dropdown-menu">'
-        + '<a class="dropdown-item" href="#">Action 1</a>'
-        + '</div>'
-        + '</div>'
-    var $dropdowns = $(dropdownHTML).appendTo('#qunit-fixture').find('[data-toggle="dropdown"]')
-    var $first = $dropdowns.first()
-    var $last = $dropdowns.last()
-
-    assert.strictEqual($dropdowns.length, 2, 'two dropdowns')
-
-    $first.parent('.dropdown')
-    .on('shown.bs.dropdown', function () {
-      assert.strictEqual($first.parents('.show').length, 1, '"show" class added on click')
-      assert.strictEqual($('#qunit-fixture .dropdown-menu.show').length, 1, 'only one dropdown is shown')
-      var e = $.Event('keyup')
-      e.which = 9 // Tab
-      $(document.body).trigger(e)
-    }).on('hidden.bs.dropdown', function () {
-      assert.strictEqual($('#qunit-fixture .dropdown-menu.show').length, 0, '"show" class removed')
-      $last.trigger('click')
-    })
-
-    $last.parent('.btn-group')
-    .on('shown.bs.dropdown', function () {
-      assert.strictEqual($last.parent('.show').length, 1, '"show" class added on click')
-      assert.strictEqual($('#qunit-fixture .dropdown-menu.show').length, 1, 'only one dropdown is shown')
-      var e = $.Event('keyup')
-      e.which = 9 // Tab
-      $(document.body).trigger(e)
-    }).on('hidden.bs.dropdown', function () {
-      assert.strictEqual($('#qunit-fixture .dropdown-menu.show').length, 0, '"show" class removed')
-      done()
-    })
-    $first.trigger('click')
-  })
-
-  QUnit.test('should fire show and hide event', function (assert) {
-    assert.expect(2)
-    var dropdownHTML = '<div class="tabs">'
-        + '<div class="dropdown">'
-        + '<a href="#" class="dropdown-toggle" data-toggle="dropdown">Dropdown</a>'
-        + '<div class="dropdown-menu">'
-        + '<a class="dropdown-item" href="#">Secondary link</a>'
-        + '<a class="dropdown-item" href="#">Something else here</a>'
-        + '<div class="divider"/>'
-        + '<a class="dropdown-item" href="#">Another link</a>'
-        + '</div>'
-        + '</div>'
-        + '</div>'
-    var $dropdown = $(dropdownHTML)
-      .appendTo('#qunit-fixture')
-      .find('[data-toggle="dropdown"]')
-      .bootstrapDropdown()
-
-    var done = assert.async()
-
-    $dropdown
-      .parent('.dropdown')
-      .on('show.bs.dropdown', function () {
-        assert.ok(true, 'show was fired')
-      })
-      .on('hide.bs.dropdown', function () {
-        assert.ok(true, 'hide was fired')
-        done()
-      })
-
-    $dropdown.trigger('click')
-    $(document.body).trigger('click')
-  })
-
-
-  QUnit.test('should fire shown and hidden event', function (assert) {
-    assert.expect(2)
-    var dropdownHTML = '<div class="tabs">'
-        + '<div class="dropdown">'
-        + '<a href="#" class="dropdown-toggle" data-toggle="dropdown">Dropdown</a>'
-        + '<div class="dropdown-menu">'
-        + '<a class="dropdown-item" href="#">Secondary link</a>'
-        + '<a class="dropdown-item" href="#">Something else here</a>'
-        + '<div class="divider"/>'
-        + '<a class="dropdown-item" href="#">Another link</a>'
-        + '</div>'
-        + '</div>'
-        + '</div>'
-    var $dropdown = $(dropdownHTML)
-      .appendTo('#qunit-fixture')
-      .find('[data-toggle="dropdown"]')
-      .bootstrapDropdown()
-
-    var done = assert.async()
-
-    $dropdown
-      .parent('.dropdown')
-      .on('shown.bs.dropdown', function () {
-        assert.ok(true, 'shown was fired')
-      })
-      .on('hidden.bs.dropdown', function () {
-        assert.ok(true, 'hidden was fired')
-        done()
-      })
-
-    $dropdown.trigger('click')
-    $(document.body).trigger('click')
-  })
-
-  QUnit.test('should fire shown and hidden event with a relatedTarget', function (assert) {
-    assert.expect(2)
-    var dropdownHTML = '<div class="tabs">'
-        + '<div class="dropdown">'
-        + '<a href="#" class="dropdown-toggle" data-toggle="dropdown">Dropdown</a>'
-        + '<div class="dropdown-menu">'
-        + '<a class="dropdown-item" href="#">Secondary link</a>'
-        + '<a class="dropdown-item" href="#">Something else here</a>'
-        + '<div class="divider"/>'
-        + '<a class="dropdown-item" href="#">Another link</a>'
-        + '</div>'
-        + '</div>'
-        + '</div>'
-    var $dropdown = $(dropdownHTML)
-      .appendTo('#qunit-fixture')
-      .find('[data-toggle="dropdown"]')
-      .bootstrapDropdown()
-    var done = assert.async()
-
-    $dropdown.parent('.dropdown')
-      .on('hidden.bs.dropdown', function (e) {
-        assert.strictEqual(e.relatedTarget, $dropdown[0])
-        done()
-      })
-      .on('shown.bs.dropdown', function (e) {
-        assert.strictEqual(e.relatedTarget, $dropdown[0])
-        $(document.body).trigger('click')
-      })
-
-    $dropdown.trigger('click')
-  })
-
-  QUnit.test('should ignore keyboard events within <input>s and <textarea>s', function (assert) {
-    assert.expect(3)
-    var done = assert.async()
-
-    var dropdownHTML = '<div class="tabs">'
-        + '<div class="dropdown">'
-        + '<a href="#" class="dropdown-toggle" data-toggle="dropdown">Dropdown</a>'
-        + '<div class="dropdown-menu">'
-        + '<a class="dropdown-item" href="#">Secondary link</a>'
-        + '<a class="dropdown-item" href="#">Something else here</a>'
-        + '<div class="divider"/>'
-        + '<a class="dropdown-item" href="#">Another link</a>'
-        + '<input type="text" id="input">'
-        + '<textarea id="textarea"/>'
-        + '</div>'
-        + '</div>'
-        + '</div>'
-    var $dropdown = $(dropdownHTML)
-      .appendTo('#qunit-fixture')
-      .find('[data-toggle="dropdown"]')
-      .bootstrapDropdown()
-
-    var $input = $('#input')
-    var $textarea = $('#textarea')
-
-    $dropdown
-      .parent('.dropdown')
-      .on('shown.bs.dropdown', function () {
-        assert.ok(true, 'shown was fired')
-
-        $input.trigger('focus').trigger($.Event('keydown', { which: 38 }))
-        assert.ok($(document.activeElement).is($input), 'input still focused')
-
-        $textarea.trigger('focus').trigger($.Event('keydown', { which: 38 }))
-        assert.ok($(document.activeElement).is($textarea), 'textarea still focused')
-
-        done()
-      })
-
-    $dropdown.trigger('click')
-  })
-
-  QUnit.test('should skip disabled element when using keyboard navigation', function (assert) {
-    assert.expect(2)
-    var done = assert.async()
-    var dropdownHTML = '<div class="tabs">'
-        + '<div class="dropdown">'
-        + '<a href="#" class="dropdown-toggle" data-toggle="dropdown">Dropdown</a>'
-        + '<div class="dropdown-menu">'
-        + '<a class="dropdown-item disabled" href="#">Disabled link</a>'
-        + '<a class="dropdown-item" href="#">Another link</a>'
-        + '</div>'
-        + '</div>'
-        + '</div>'
-    var $dropdown = $(dropdownHTML)
-      .appendTo('#qunit-fixture')
-      .find('[data-toggle="dropdown"]')
-      .bootstrapDropdown()
-
-    $dropdown
-      .parent('.dropdown')
-      .on('shown.bs.dropdown', function () {
-        assert.ok(true, 'shown was fired')
-        $dropdown.trigger($.Event('keydown', { which: 40 }))
-        $dropdown.trigger($.Event('keydown', { which: 40 }))
-        assert.ok(!$(document.activeElement).is('.disabled'), '.disabled is not focused')
-        done()
-      })
-    $dropdown.trigger('click')
-  })
-
-  QUnit.test('should focus next/previous element when using keyboard navigation', function (assert) {
-    assert.expect(4)
-    var done = assert.async()
-    var dropdownHTML = '<div class="tabs">'
-        + '<div class="dropdown">'
-        + '<a href="#" class="dropdown-toggle" data-toggle="dropdown">Dropdown</a>'
-        + '<div class="dropdown-menu">'
-        + '<a id="item1" class="dropdown-item" href="#">A link</a>'
-        + '<a id="item2" class="dropdown-item" href="#">Another link</a>'
-        + '</div>'
-        + '</div>'
-        + '</div>'
-    var $dropdown = $(dropdownHTML)
-      .appendTo('#qunit-fixture')
-      .find('[data-toggle="dropdown"]')
-      .bootstrapDropdown()
-
-    $dropdown
-      .parent('.dropdown')
-      .on('shown.bs.dropdown', function () {
-        assert.ok(true, 'shown was fired')
-        $dropdown.trigger($.Event('keydown', { which: 40 }))
-        assert.ok($(document.activeElement).is($('#item1')), 'item1 is focused')
-
-        $(document.activeElement).trigger($.Event('keydown', { which: 40 }))
-        assert.ok($(document.activeElement).is($('#item2')), 'item2 is focused')
-
-        $(document.activeElement).trigger($.Event('keydown', { which: 38 }))
-        assert.ok($(document.activeElement).is($('#item1')), 'item1 is focused')
-        done()
-      })
-    $dropdown.trigger('click')
-
-  })
-
-  QUnit.test('should not close the dropdown if the user clicks on a text field', function (assert) {
-    assert.expect(2)
-    var done = assert.async()
-    var dropdownHTML = '<div class="dropdown">'
-        + '<button type="button" data-toggle="dropdown">Dropdown</button>'
-        + '<div class="dropdown-menu">'
-        + '<input id="textField" type="text" />'
-        + '</div>'
-        + '</div>'
-    var $dropdown = $(dropdownHTML)
-      .appendTo('#qunit-fixture')
-      .find('[data-toggle="dropdown"]')
-      .bootstrapDropdown()
-
-    var $textfield = $('#textField')
-    $textfield.on('click', function () {
-      assert.ok($dropdown.parent('.dropdown').hasClass('show'), 'dropdown menu is shown')
-      done()
-    })
-
-    $dropdown
-      .parent('.dropdown')
-      .on('shown.bs.dropdown', function () {
-        assert.ok($dropdown.parent('.dropdown').hasClass('show'), 'dropdown menu is shown')
-        $textfield.trigger($.Event('click'))
-      })
-    $dropdown.trigger('click')
-  })
-
-  QUnit.test('should not close the dropdown if the user clicks on a textarea', function (assert) {
-    assert.expect(2)
-    var done = assert.async()
-    var dropdownHTML = '<div class="dropdown">'
-        + '<button type="button" data-toggle="dropdown">Dropdown</button>'
-        + '<div class="dropdown-menu">'
-        + '<textarea id="textArea"></textarea>'
-        + '</div>'
-        + '</div>'
-    var $dropdown = $(dropdownHTML)
-      .appendTo('#qunit-fixture')
-      .find('[data-toggle="dropdown"]')
-      .bootstrapDropdown()
-
-    var $textarea = $('#textArea')
-    $textarea.on('click', function () {
-      assert.ok($dropdown.parent('.dropdown').hasClass('show'), 'dropdown menu is shown')
-      done()
-    })
-
-    $dropdown
-      .parent('.dropdown')
-      .on('shown.bs.dropdown', function () {
-        assert.ok($dropdown.parent('.dropdown').hasClass('show'), 'dropdown menu is shown')
-        $textarea.trigger($.Event('click'))
-      })
-    $dropdown.trigger('click')
-  })
-
-  QUnit.test('Dropdown should not use Popper.js in navbar', function (assert) {
-    assert.expect(1)
-    var done = assert.async()
-    var html = '<nav class="navbar navbar-expand-md navbar-light bg-light">'
-        + '<div class="dropdown">'
-        + '  <a class="nav-link dropdown-toggle" href="#" id="dropdown" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">Dropdown</a>'
-        + '  <div class="dropdown-menu" aria-labelledby="dropdown">'
-        + '    <a class="dropdown-item" href="#">Action</a>'
-        + '    <a class="dropdown-item" href="#">Another action</a>'
-        + '    <a class="dropdown-item" href="#">Something else here</a>'
-        + '  </div>'
-        + '</div>'
-        + '</nav>'
-
-    $(html).appendTo('#qunit-fixture')
-    var $triggerDropdown = $('#qunit-fixture')
-      .find('[data-toggle="dropdown"]')
-      .bootstrapDropdown()
-    var $dropdownMenu = $triggerDropdown.next()
-
-    $triggerDropdown
-      .parent('.dropdown')
-      .on('shown.bs.dropdown', function () {
-        assert.ok(typeof $dropdownMenu.attr('style') === 'undefined', 'No inline style applied by Popper.js')
-        done()
-      })
-    $triggerDropdown.trigger($.Event('click'))
-  })
-})
diff --git a/assets/javascript/tests/unit/modal.js b/assets/javascript/tests/unit/modal.js
deleted file mode 100644
index e081a6d..0000000
--- a/assets/javascript/tests/unit/modal.js
+++ /dev/null
@@ -1,692 +0,0 @@
-$(function () {
-  'use strict'
-
-  QUnit.module('modal plugin')
-
-  QUnit.test('should be defined on jquery object', function (assert) {
-    assert.expect(1)
-    assert.ok($(document.body).modal, 'modal method is defined')
-  })
-
-  QUnit.module('modal', {
-    before: function () {
-      // Enable the scrollbar measurer
-      $('<style type="text/css"> .modal-scrollbar-measure { position: absolute; top: -9999px; width: 50px; height: 50px; overflow: scroll; } </style>').appendTo('head')
-      // Function to calculate the scrollbar width which is then compared to the padding or margin changes
-      $.fn.getScrollbarWidth = function () {
-        var scrollDiv = document.createElement('div')
-        scrollDiv.className = 'modal-scrollbar-measure'
-        document.body.appendChild(scrollDiv)
-        var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth
-        document.body.removeChild(scrollDiv)
-        return scrollbarWidth
-      }
-      // Simulate scrollbars in PhantomJS
-      $('html').css('padding-right', '16px')
-    },
-    beforeEach: function () {
-      // Run all tests in noConflict mode -- it's the only way to ensure that the plugin works in noConflict mode
-      $.fn.bootstrapModal = $.fn.modal.noConflict()
-    },
-    afterEach: function () {
-      $.fn.modal = $.fn.bootstrapModal
-      delete $.fn.bootstrapModal
-    }
-  })
-
-  QUnit.test('should provide no conflict', function (assert) {
-    assert.expect(1)
-    assert.strictEqual(typeof $.fn.modal, 'undefined', 'modal was set back to undefined (orig value)')
-  })
-
-  QUnit.test('should throw explicit error on undefined method', function (assert) {
-    assert.expect(1)
-    var $el = $('<div id="modal-test"/>')
-    $el.bootstrapModal()
-    try {
-      $el.bootstrapModal('noMethod')
-    }
-    catch (err) {
-      assert.strictEqual(err.message, 'No method named "noMethod"')
-    }
-  })
-
-  QUnit.test('should return jquery collection containing the element', function (assert) {
-    assert.expect(2)
-    var $el = $('<div id="modal-test"/>')
-    var $modal = $el.bootstrapModal()
-    assert.ok($modal instanceof $, 'returns jquery collection')
-    assert.strictEqual($modal[0], $el[0], 'collection contains element')
-  })
-
-  QUnit.test('should expose defaults var for settings', function (assert) {
-    assert.expect(1)
-    assert.ok($.fn.bootstrapModal.Constructor.Default, 'default object exposed')
-  })
-
-  QUnit.test('should insert into dom when show method is called', function (assert) {
-    assert.expect(1)
-    var done = assert.async()
-
-    $('<div id="modal-test"/>')
-      .on('shown.bs.modal', function () {
-        assert.notEqual($('#modal-test').length, 0, 'modal inserted into dom')
-        done()
-      })
-      .bootstrapModal('show')
-  })
-
-  QUnit.test('should fire show event', function (assert) {
-    assert.expect(1)
-    var done = assert.async()
-
-    $('<div id="modal-test"/>')
-      .on('show.bs.modal', function () {
-        assert.ok(true, 'show event fired')
-        done()
-      })
-      .bootstrapModal('show')
-  })
-
-  QUnit.test('should not fire shown when show was prevented', function (assert) {
-    assert.expect(1)
-    var done = assert.async()
-
-    $('<div id="modal-test"/>')
-      .on('show.bs.modal', function (e) {
-        e.preventDefault()
-        assert.ok(true, 'show event fired')
-        done()
-      })
-      .on('shown.bs.modal', function () {
-        assert.ok(false, 'shown event fired')
-      })
-      .bootstrapModal('show')
-  })
-
-  QUnit.test('should hide modal when hide is called', function (assert) {
-    assert.expect(3)
-    var done = assert.async()
-
-    $('<div id="modal-test"/>')
-      .on('shown.bs.modal', function () {
-        assert.ok($('#modal-test').is(':visible'), 'modal visible')
-        assert.notEqual($('#modal-test').length, 0, 'modal inserted into dom')
-        $(this).bootstrapModal('hide')
-      })
-      .on('hidden.bs.modal', function () {
-        assert.ok(!$('#modal-test').is(':visible'), 'modal hidden')
-        done()
-      })
-      .bootstrapModal('show')
-  })
-
-  QUnit.test('should toggle when toggle is called', function (assert) {
-    assert.expect(3)
-    var done = assert.async()
-
-    $('<div id="modal-test"/>')
-      .on('shown.bs.modal', function () {
-        assert.ok($('#modal-test').is(':visible'), 'modal visible')
-        assert.notEqual($('#modal-test').length, 0, 'modal inserted into dom')
-        $(this).bootstrapModal('toggle')
-      })
-      .on('hidden.bs.modal', function () {
-        assert.ok(!$('#modal-test').is(':visible'), 'modal hidden')
-        done()
-      })
-      .bootstrapModal('toggle')
-  })
-
-  QUnit.test('should remove from dom when click [data-dismiss="modal"]', function (assert) {
-    assert.expect(3)
-    var done = assert.async()
-
-    $('<div id="modal-test"><span class="close" data-dismiss="modal"/></div>')
-      .on('shown.bs.modal', function () {
-        assert.ok($('#modal-test').is(':visible'), 'modal visible')
-        assert.notEqual($('#modal-test').length, 0, 'modal inserted into dom')
-        $(this).find('.close').trigger('click')
-      })
-      .on('hidden.bs.modal', function () {
-        assert.ok(!$('#modal-test').is(':visible'), 'modal hidden')
-        done()
-      })
-      .bootstrapModal('toggle')
-  })
-
-  QUnit.test('should allow modal close with "backdrop:false"', function (assert) {
-    assert.expect(2)
-    var done = assert.async()
-
-    $('<div id="modal-test" data-backdrop="false"/>')
-      .on('shown.bs.modal', function () {
-        assert.ok($('#modal-test').is(':visible'), 'modal visible')
-        $(this).bootstrapModal('hide')
-      })
-      .on('hidden.bs.modal', function () {
-        assert.ok(!$('#modal-test').is(':visible'), 'modal hidden')
-        done()
-      })
-      .bootstrapModal('show')
-  })
-
-  QUnit.test('should close modal when clicking outside of modal-content', function (assert) {
-    assert.expect(3)
-    var done = assert.async()
-
-    $('<div id="modal-test"><div class="contents"/></div>')
-      .on('shown.bs.modal', function () {
-        assert.notEqual($('#modal-test').length, 0, 'modal inserted into dom')
-        $('.contents').trigger('click')
-        assert.ok($('#modal-test').is(':visible'), 'modal visible')
-        $('#modal-test').trigger('click')
-      })
-      .on('hidden.bs.modal', function () {
-        assert.ok(!$('#modal-test').is(':visible'), 'modal hidden')
-        done()
-      })
-      .bootstrapModal('show')
-  })
-
-  QUnit.test('should not close modal when clicking outside of modal-content if data-backdrop="true"', function (assert) {
-    assert.expect(1)
-    var done = assert.async()
-
-    $('<div id="modal-test" data-backdrop="false"><div class="contents"/></div>')
-      .on('shown.bs.modal', function () {
-        $('#modal-test').trigger('click')
-        assert.ok($('#modal-test').is(':visible'), 'modal not hidden')
-        done()
-      })
-      .bootstrapModal('show')
-  })
-
-  QUnit.test('should close modal when escape key is pressed via keydown', function (assert) {
-    assert.expect(3)
-    var done = assert.async()
-
-    var $div = $('<div id="modal-test"/>')
-    $div
-      .on('shown.bs.modal', function () {
-        assert.ok($('#modal-test').length, 'modal inserted into dom')
-        assert.ok($('#modal-test').is(':visible'), 'modal visible')
-        $div.trigger($.Event('keydown', { which: 27 }))
-
-        setTimeout(function () {
-          assert.ok(!$('#modal-test').is(':visible'), 'modal hidden')
-          $div.remove()
-          done()
-        }, 0)
-      })
-      .bootstrapModal('show')
-  })
-
-  QUnit.test('should not close modal when escape key is pressed via keyup', function (assert) {
-    assert.expect(3)
-    var done = assert.async()
-
-    var $div = $('<div id="modal-test"/>')
-    $div
-      .on('shown.bs.modal', function () {
-        assert.ok($('#modal-test').length, 'modal inserted into dom')
-        assert.ok($('#modal-test').is(':visible'), 'modal visible')
-        $div.trigger($.Event('keyup', { which: 27 }))
-
-        setTimeout(function () {
-          assert.ok($div.is(':visible'), 'modal still visible')
-          $div.remove()
-          done()
-        }, 0)
-      })
-      .bootstrapModal('show')
-  })
-
-  QUnit.test('should trigger hide event once when clicking outside of modal-content', function (assert) {
-    assert.expect(1)
-    var done = assert.async()
-
-    var triggered
-
-    $('<div id="modal-test"><div class="contents"/></div>')
-      .on('shown.bs.modal', function () {
-        triggered = 0
-        $('#modal-test').trigger('click')
-      })
-      .on('hide.bs.modal', function () {
-        triggered += 1
-        assert.strictEqual(triggered, 1, 'modal hide triggered once')
-        done()
-      })
-      .bootstrapModal('show')
-  })
-
-  QUnit.test('should remove aria-hidden attribute when shown, add it back when hidden', function (assert) {
-    assert.expect(3)
-    var done = assert.async()
-
-    $('<div id="modal-test" aria-hidden="true"/>')
-      .on('shown.bs.modal', function () {
-        assert.notOk($('#modal-test').is('[aria-hidden]'), 'aria-hidden attribute removed')
-        $(this).bootstrapModal('hide')
-      })
-      .on('hidden.bs.modal', function () {
-        assert.ok($('#modal-test').is('[aria-hidden]'), 'aria-hidden attribute added')
-        assert.strictEqual($('#modal-test').attr('aria-hidden'), 'true', 'correct aria-hidden="true" added')
-        done()
-      })
-      .bootstrapModal('show')
-  })
-
-  QUnit.test('should close reopened modal with [data-dismiss="modal"] click', function (assert) {
-    assert.expect(2)
-    var done = assert.async()
-
-    $('<div id="modal-test"><div class="contents"><div id="close" data-dismiss="modal"/></div></div>')
-      .one('shown.bs.modal', function () {
-        $('#close').trigger('click')
-      })
-      .one('hidden.bs.modal', function () {
-        // after one open-close cycle
-        assert.ok(!$('#modal-test').is(':visible'), 'modal hidden')
-        $(this)
-          .one('shown.bs.modal', function () {
-            $('#close').trigger('click')
-          })
-          .one('hidden.bs.modal', function () {
-            assert.ok(!$('#modal-test').is(':visible'), 'modal hidden')
-            done()
-          })
-          .bootstrapModal('show')
-      })
-      .bootstrapModal('show')
-  })
-
-  QUnit.test('should restore focus to toggling element when modal is hidden after having been opened via data-api', function (assert) {
-    assert.expect(1)
-    var done = assert.async()
-
-    var $toggleBtn = $('<button data-toggle="modal" data-target="#modal-test"/>').appendTo('#qunit-fixture')
-
-    $('<div id="modal-test"><div class="contents"><div id="close" data-dismiss="modal"/></div></div>')
-      .on('hidden.bs.modal', function () {
-        setTimeout(function () {
-          assert.ok($(document.activeElement).is($toggleBtn), 'toggling element is once again focused')
-          done()
-        }, 0)
-      })
-      .on('shown.bs.modal', function () {
-        $('#close').trigger('click')
-      })
-      .appendTo('#qunit-fixture')
-
-    $toggleBtn.trigger('click')
-  })
-
-  QUnit.test('should not restore focus to toggling element if the associated show event gets prevented', function (assert) {
-    assert.expect(1)
-    var done = assert.async()
-    var $toggleBtn = $('<button data-toggle="modal" data-target="#modal-test"/>').appendTo('#qunit-fixture')
-    var $otherBtn = $('<button id="other-btn"/>').appendTo('#qunit-fixture')
-
-    $('<div id="modal-test"><div class="contents"><div id="close" data-dismiss="modal"/></div>')
-      .one('show.bs.modal', function (e) {
-        e.preventDefault()
-        $otherBtn.trigger('focus')
-        setTimeout($.proxy(function () {
-          $(this).bootstrapModal('show')
-        }, this), 0)
-      })
-      .on('hidden.bs.modal', function () {
-        setTimeout(function () {
-          assert.ok($(document.activeElement).is($otherBtn), 'focus returned to toggling element')
-          done()
-        }, 0)
-      })
-      .on('shown.bs.modal', function () {
-        $('#close').trigger('click')
-      })
-      .appendTo('#qunit-fixture')
-
-    $toggleBtn.trigger('click')
-  })
-
-  QUnit.test('should adjust the inline padding of the modal when opening', function (assert) {
-    assert.expect(1)
-    var done = assert.async()
-
-    $('<div id="modal-test"/>')
-      .on('shown.bs.modal', function () {
-        var expectedPadding = $(this).getScrollbarWidth() + 'px'
-        var currentPadding = $(this).css('padding-right')
-        assert.strictEqual(currentPadding, expectedPadding, 'modal padding should be adjusted while opening')
-        done()
-      })
-      .bootstrapModal('show')
-  })
-
-  QUnit.test('should adjust the inline body padding when opening and restore when closing', function (assert) {
-    assert.expect(2)
-    var done = assert.async()
-    var $body = $(document.body)
-    var originalPadding = $body.css('padding-right')
-
-    $('<div id="modal-test"/>')
-      .on('hidden.bs.modal', function () {
-        var currentPadding = $body.css('padding-right')
-        assert.strictEqual(currentPadding, originalPadding, 'body padding should be reset after closing')
-        $body.removeAttr('style')
-        done()
-      })
-      .on('shown.bs.modal', function () {
-        var expectedPadding = parseFloat(originalPadding) + $(this).getScrollbarWidth() + 'px'
-        var currentPadding = $body.css('padding-right')
-        assert.strictEqual(currentPadding, expectedPadding, 'body padding should be adjusted while opening')
-        $(this).bootstrapModal('hide')
-      })
-      .bootstrapModal('show')
-  })
-
-  QUnit.test('should store the original body padding in data-padding-right before showing', function (assert) {
-    assert.expect(2)
-    var done = assert.async()
-    var $body = $(document.body)
-    var originalPadding = '0px'
-    $body.css('padding-right', originalPadding)
-
-    $('<div id="modal-test"/>')
-      .on('hidden.bs.modal', function () {
-        assert.strictEqual(typeof $body.data('padding-right'), 'undefined', 'data-padding-right should be cleared after closing')
-        $body.removeAttr('style')
-        done()
-      })
-      .on('shown.bs.modal', function () {
-        assert.strictEqual($body.data('padding-right'), originalPadding, 'original body padding should be stored in data-padding-right')
-        $(this).bootstrapModal('hide')
-      })
-      .bootstrapModal('show')
-  })
-
-  QUnit.test('should not adjust the inline body padding when it does not overflow', function (assert) {
-    assert.expect(1)
-    var done = assert.async()
-    var $body = $(document.body)
-    var originalPadding = $body.css('padding-right')
-
-    // Hide scrollbars to prevent the body overflowing
-    $body.css('overflow', 'hidden')        // real scrollbar (for in-browser testing)
-    $('html').css('padding-right', '0px')  // simulated scrollbar (for PhantomJS)
-
-    $('<div id="modal-test"/>')
-      .on('shown.bs.modal', function () {
-        var currentPadding = $body.css('padding-right')
-        assert.strictEqual(currentPadding, originalPadding, 'body padding should not be adjusted')
-        $(this).bootstrapModal('hide')
-
-        // restore scrollbars
-        $body.css('overflow', 'auto')
-        $('html').css('padding-right', '16px')
-        done()
-      })
-      .bootstrapModal('show')
-  })
-
-  QUnit.test('should adjust the inline padding of fixed elements when opening and restore when closing', function (assert) {
-    assert.expect(2)
-    var done = assert.async()
-    var $element = $('<div class="fixed-top"></div>').appendTo('#qunit-fixture')
-    var originalPadding = $element.css('padding-right')
-
-    $('<div id="modal-test"/>')
-      .on('hidden.bs.modal', function () {
-        var currentPadding = $element.css('padding-right')
-        assert.strictEqual(currentPadding, originalPadding, 'fixed element padding should be reset after closing')
-        $element.remove()
-        done()
-      })
-      .on('shown.bs.modal', function () {
-        var expectedPadding = parseFloat(originalPadding) + $(this).getScrollbarWidth() + 'px'
-        var currentPadding = $element.css('padding-right')
-        assert.strictEqual(currentPadding, expectedPadding, 'fixed element padding should be adjusted while opening')
-        $(this).bootstrapModal('hide')
-      })
-      .bootstrapModal('show')
-  })
-
-  QUnit.test('should store the original padding of fixed elements in data-padding-right before showing', function (assert) {
-    assert.expect(2)
-    var done = assert.async()
-    var $element = $('<div class="fixed-top"></div>').appendTo('#qunit-fixture')
-    var originalPadding = '0px'
-    $element.css('padding-right', originalPadding)
-
-    $('<div id="modal-test"/>')
-      .on('hidden.bs.modal', function () {
-        assert.strictEqual(typeof $element.data('padding-right'), 'undefined', 'data-padding-right should be cleared after closing')
-        $element.remove()
-        done()
-      })
-      .on('shown.bs.modal', function () {
-        assert.strictEqual($element.data('padding-right'), originalPadding, 'original fixed element padding should be stored in data-padding-right')
-        $(this).bootstrapModal('hide')
-      })
-      .bootstrapModal('show')
-  })
-
-  QUnit.test('should adjust the inline margin of sticky elements when opening and restore when closing', function (assert) {
-    assert.expect(2)
-    var done = assert.async()
-    var $element = $('<div class="sticky-top"></div>').appendTo('#qunit-fixture')
-    var originalPadding = $element.css('margin-right')
-
-    $('<div id="modal-test"/>')
-      .on('hidden.bs.modal', function () {
-        var currentPadding = $element.css('margin-right')
-        assert.strictEqual(currentPadding, originalPadding, 'sticky element margin should be reset after closing')
-        $element.remove()
-        done()
-      })
-      .on('shown.bs.modal', function () {
-        var expectedPadding = parseFloat(originalPadding) - $(this).getScrollbarWidth() + 'px'
-        var currentPadding = $element.css('margin-right')
-        assert.strictEqual(currentPadding, expectedPadding, 'sticky element margin should be adjusted while opening')
-        $(this).bootstrapModal('hide')
-      })
-      .bootstrapModal('show')
-  })
-
-  QUnit.test('should store the original margin of sticky elements in data-margin-right before showing', function (assert) {
-    assert.expect(2)
-    var done = assert.async()
-    var $element = $('<div class="sticky-top"></div>').appendTo('#qunit-fixture')
-    var originalPadding = '0px'
-    $element.css('margin-right', originalPadding)
-
-    $('<div id="modal-test"/>')
-      .on('hidden.bs.modal', function () {
-        assert.strictEqual(typeof $element.data('margin-right'), 'undefined', 'data-margin-right should be cleared after closing')
-        $element.remove()
-        done()
-      })
-      .on('shown.bs.modal', function () {
-        assert.strictEqual($element.data('margin-right'), originalPadding, 'original sticky element margin should be stored in data-margin-right')
-        $(this).bootstrapModal('hide')
-      })
-      .bootstrapModal('show')
-  })
-
-  QUnit.test('should adjust the inline margin of the navbar-toggler when opening and restore when closing', function (assert) {
-    assert.expect(2)
-    var done = assert.async()
-    var $element = $('<div class="navbar-toggler"></div>').appendTo('#qunit-fixture')
-    var originalMargin = $element.css('margin-right')
-
-    $('<div id="modal-test"/>')
-      .on('hidden.bs.modal', function () {
-        var currentMargin = $element.css('margin-right')
-        assert.strictEqual(currentMargin, originalMargin, 'navbar-toggler margin should be reset after closing')
-        $element.remove()
-        done()
-      })
-      .on('shown.bs.modal', function () {
-        var expectedMargin = parseFloat(originalMargin) + $(this).getScrollbarWidth() + 'px'
-        var currentMargin = $element.css('margin-right')
-        assert.strictEqual(currentMargin, expectedMargin, 'navbar-toggler margin should be adjusted while opening')
-        $(this).bootstrapModal('hide')
-      })
-      .bootstrapModal('show')
-  })
-
-  QUnit.test('should store the original margin of the navbar-toggler in data-margin-right before showing', function (assert) {
-    assert.expect(2)
-    var done = assert.async()
-    var $element = $('<div class="navbar-toggler"></div>').appendTo('#qunit-fixture')
-    var originalMargin = '0px'
-    $element.css('margin-right', originalMargin)
-
-    $('<div id="modal-test"/>')
-      .on('hidden.bs.modal', function () {
-        assert.strictEqual(typeof $element.data('margin-right'), 'undefined', 'data-margin-right should be cleared after closing')
-        $element.remove()
-        done()
-      })
-      .on('shown.bs.modal', function () {
-        assert.strictEqual($element.data('margin-right'), originalMargin, 'original navbar-toggler margin should be stored in data-margin-right')
-        $(this).bootstrapModal('hide')
-      })
-      .bootstrapModal('show')
-  })
-
-  QUnit.test('should ignore values set via CSS when trying to restore body padding after closing', function (assert) {
-    assert.expect(1)
-    var done = assert.async()
-    var $body = $(document.body)
-    var $style = $('<style>body { padding-right: 42px; }</style>').appendTo('head')
-
-    $('<div id="modal-test"/>')
-      .on('hidden.bs.modal', function () {
-        assert.strictEqual($body.attr('style').indexOf('padding-right'), -1, 'body does not have inline padding set')
-        $style.remove()
-        done()
-      })
-      .on('shown.bs.modal', function () {
-        $(this).bootstrapModal('hide')
-      })
-      .bootstrapModal('show')
-  })
-
-  QUnit.test('should ignore other inline styles when trying to restore body padding after closing', function (assert) {
-    assert.expect(2)
-    var done = assert.async()
-    var $body = $(document.body)
-    var $style = $('<style>body { padding-right: 42px; }</style>').appendTo('head')
-
-    $body.css('color', 'red')
-
-    $('<div id="modal-test"/>')
-      .on('hidden.bs.modal', function () {
-        assert.strictEqual($body[0].style.paddingRight, '', 'body does not have inline padding set')
-        assert.strictEqual($body[0].style.color, 'red', 'body still has other inline styles set')
-        $body.removeAttr('style')
-        $style.remove()
-        done()
-      })
-      .on('shown.bs.modal', function () {
-        $(this).bootstrapModal('hide')
-      })
-      .bootstrapModal('show')
-  })
-
-  QUnit.test('should properly restore non-pixel inline body padding after closing', function (assert) {
-    assert.expect(1)
-    var done = assert.async()
-    var $body = $(document.body)
-
-    $body.css('padding-right', '5%')
-
-    $('<div id="modal-test"/>')
-      .on('hidden.bs.modal', function () {
-        assert.strictEqual($body[0].style.paddingRight, '5%', 'body does not have inline padding set')
-        $body.removeAttr('style')
-        done()
-      })
-      .on('shown.bs.modal', function () {
-        $(this).bootstrapModal('hide')
-      })
-      .bootstrapModal('show')
-  })
-
-  QUnit.test('should not follow link in area tag', function (assert) {
-    assert.expect(2)
-    var done = assert.async()
-
-    $('<map><area id="test" shape="default" data-toggle="modal" data-target="#modal-test" href="demo.html"/></map>')
-      .appendTo('#qunit-fixture')
-
-    $('<div id="modal-test"><div class="contents"><div id="close" data-dismiss="modal"/></div></div>')
-      .appendTo('#qunit-fixture')
-
-    $('#test')
-      .on('click.bs.modal.data-api', function (event) {
-        assert.notOk(event.isDefaultPrevented(), 'navigating to href will happen')
-
-        setTimeout(function () {
-          assert.ok(event.isDefaultPrevented(), 'model shown instead of navigating to href')
-          done()
-        }, 1)
-      })
-      .trigger('click')
-  })
-
-  QUnit.test('should not parse target as html', function (assert) {
-    assert.expect(1)
-    var done = assert.async()
-
-    var $toggleBtn = $('<button data-toggle="modal" data-target="<div id="modal-test"><div class="contents"<div<div id="close" data-dismiss="modal"/></div></div>"/>')
-      .appendTo('#qunit-fixture')
-
-    $toggleBtn.trigger('click')
-    setTimeout(function () {
-      assert.strictEqual($('#modal-test').length, 0, 'target has not been parsed and added to the document')
-      done()
-    }, 1)
-  })
-
-  QUnit.test('should not execute js from target', function (assert) {
-    assert.expect(0)
-    var done = assert.async()
-
-    // This toggle button contains XSS payload in its data-target
-    // Note: it uses the onerror handler of an img element to execute the js, because a simple script element does not work here
-    //       a script element works in manual tests though, so here it is likely blocked by the qunit framework
-    var $toggleBtn = $('<button data-toggle="modal" data-target="<div><image src="missing.png" onerror="$('#qunit-fixture button.control').trigger('click')"></div>"/>')
-      .appendTo('#qunit-fixture')
-    // The XSS payload above does not have a closure over this function and cannot access the assert object directly
-    // However, it can send a click event to the following control button, which will then fail the assert
-    $('<button>')
-      .addClass('control')
-      .on('click', function () {
-        assert.notOk(true, 'XSS payload is not executed as js')
-      })
-      .appendTo('#qunit-fixture')
-
-    $toggleBtn.trigger('click')
-    setTimeout(done, 500)
-  })
-
-  QUnit.test('should not try to open a modal which is already visible', function (assert) {
-    assert.expect(1)
-    var done = assert.async()
-    var count = 0
-
-    $('<div id="modal-test"/>').on('shown.bs.modal', function () {
-      count++
-    }).on('hidden.bs.modal', function () {
-      assert.strictEqual(count, 1, 'show() runs only once')
-      done()
-    })
-      .bootstrapModal('show')
-      .bootstrapModal('show')
-      .bootstrapModal('hide')
-  })
-})
diff --git a/assets/javascript/tests/unit/popover.js b/assets/javascript/tests/unit/popover.js
deleted file mode 100644
index b5ea714..0000000
--- a/assets/javascript/tests/unit/popover.js
+++ /dev/null
@@ -1,413 +0,0 @@
-$(function () {
-  'use strict'
-
-  QUnit.module('popover plugin')
-
-  QUnit.test('should be defined on jquery object', function (assert) {
-    assert.expect(1)
-    assert.ok($(document.body).popover, 'popover method is defined')
-  })
-
-  QUnit.module('popover', {
-    beforeEach: function () {
-      // Run all tests in noConflict mode -- it's the only way to ensure that the plugin works in noConflict mode
-      $.fn.bootstrapPopover = $.fn.popover.noConflict()
-    },
-    afterEach: function () {
-      $.fn.popover = $.fn.bootstrapPopover
-      delete $.fn.bootstrapPopover
-      $('.popover').remove()
-    }
-  })
-
-  QUnit.test('should provide no conflict', function (assert) {
-    assert.expect(1)
-    assert.strictEqual(typeof $.fn.popover, 'undefined', 'popover was set back to undefined (org value)')
-  })
-
-  QUnit.test('should throw explicit error on undefined method', function (assert) {
-    assert.expect(1)
-    var $el = $('<div/>')
-    $el.bootstrapPopover()
-    try {
-      $el.bootstrapPopover('noMethod')
-    }
-    catch (err) {
-      assert.strictEqual(err.message, 'No method named "noMethod"')
-    }
-  })
-
-  QUnit.test('should return jquery collection containing the element', function (assert) {
-    assert.expect(2)
-    var $el = $('<div/>')
-    var $popover = $el.bootstrapPopover()
-    assert.ok($popover instanceof $, 'returns jquery collection')
-    assert.strictEqual($popover[0], $el[0], 'collection contains element')
-  })
-
-  QUnit.test('should render popover element', function (assert) {
-    assert.expect(2)
-    var done = assert.async()
-    $('<a href="#" title="mdo" data-content="https://twitter.com/mdo">@mdo</a>')
-      .appendTo('#qunit-fixture')
-      .on('shown.bs.popover', function () {
-        assert.notEqual($('.popover').length, 0, 'popover was inserted')
-        $(this).bootstrapPopover('hide')
-      })
-      .on('hidden.bs.popover', function () {
-        assert.strictEqual($('.popover').length, 0, 'popover removed')
-        done()
-      })
-      .bootstrapPopover('show')
-  })
-
-  QUnit.test('should store popover instance in popover data object', function (assert) {
-    assert.expect(1)
-    var $popover = $('<a href="#" title="mdo" data-content="https://twitter.com/mdo">@mdo</a>').bootstrapPopover()
-
-    assert.ok($popover.data('bs.popover'), 'popover instance exists')
-  })
-
-  QUnit.test('should store popover trigger in popover instance data object', function (assert) {
-    assert.expect(1)
-    var $popover = $('<a href="#" title="ResentedHook">@ResentedHook</a>')
-      .appendTo('#qunit-fixture')
-      .bootstrapPopover()
-
-    $popover.bootstrapPopover('show')
-
-    assert.ok($('.popover').data('bs.popover'), 'popover trigger stored in instance data')
-  })
-
-  QUnit.test('should get title and content from options', function (assert) {
-    assert.expect(4)
-    var $popover = $('<a href="#">@fat</a>')
-      .appendTo('#qunit-fixture')
-      .bootstrapPopover({
-        title: function () {
-          return '@fat'
-        },
-        content: function () {
-          return 'loves writing tests (╯°□°)╯︵ ┻━┻'
-        }
-      })
-
-    $popover.bootstrapPopover('show')
-
-    assert.notEqual($('.popover').length, 0, 'popover was inserted')
-    assert.strictEqual($('.popover .popover-header').text(), '@fat', 'title correctly inserted')
-    assert.strictEqual($('.popover .popover-body').text(), 'loves writing tests (╯°□°)╯︵ ┻━┻', 'content correctly inserted')
-
-    $popover.bootstrapPopover('hide')
-
-    assert.strictEqual($('.popover').length, 0, 'popover was removed')
-  })
-
-  QUnit.test('should allow DOMElement title and content (html: true)', function (assert) {
-    assert.expect(5)
-    var title = document.createTextNode('@glebm <3 writing tests')
-    var content = $('<i>¯\\_(ツ)_/¯</i>').get(0)
-    var $popover = $('<a href="#" rel="tooltip"/>')
-      .appendTo('#qunit-fixture')
-      .bootstrapPopover({ html: true, title: title, content: content })
-
-    $popover.bootstrapPopover('show')
-
-    assert.notEqual($('.popover').length, 0, 'popover inserted')
-    assert.strictEqual($('.popover .popover-header').text(), '@glebm <3 writing tests', 'title inserted')
-    assert.ok($.contains($('.popover').get(0), title), 'title node moved, not copied')
-    // toLowerCase because IE8 will return <I>...</I>
-    assert.strictEqual($('.popover .popover-body').html().toLowerCase(), '<i>¯\\_(ツ)_/¯</i>', 'content inserted')
-    assert.ok($.contains($('.popover').get(0), content), 'content node moved, not copied')
-  })
-
-  QUnit.test('should allow DOMElement title and content (html: false)', function (assert) {
-    assert.expect(5)
-    var title = document.createTextNode('@glebm <3 writing tests')
-    var content = $('<i>¯\\_(ツ)_/¯</i>').get(0)
-    var $popover = $('<a href="#" rel="tooltip"/>')
-      .appendTo('#qunit-fixture')
-      .bootstrapPopover({ title: title, content: content })
-
-    $popover.bootstrapPopover('show')
-
-    assert.notEqual($('.popover').length, 0, 'popover inserted')
-    assert.strictEqual($('.popover .popover-header').text(), '@glebm <3 writing tests', 'title inserted')
-    assert.ok(!$.contains($('.popover').get(0), title), 'title node copied, not moved')
-    assert.strictEqual($('.popover .popover-body').html(), '¯\\_(ツ)_/¯', 'content inserted')
-    assert.ok(!$.contains($('.popover').get(0), content), 'content node copied, not moved')
-  })
-
-
-  QUnit.test('should not duplicate HTML object', function (assert) {
-    assert.expect(6)
-    var $div = $('<div/>').html('loves writing tests (╯°□°)╯︵ ┻━┻')
-
-    var $popover = $('<a href="#">@fat</a>')
-      .appendTo('#qunit-fixture')
-      .bootstrapPopover({
-        html: true,
-        content: function () {
-          return $div
-        }
-      })
-
-    $popover.bootstrapPopover('show')
-    assert.notEqual($('.popover').length, 0, 'popover was inserted')
-    assert.equal($('.popover .popover-body').html(), $div[0].outerHTML, 'content correctly inserted')
-
-    $popover.bootstrapPopover('hide')
-    assert.strictEqual($('.popover').length, 0, 'popover was removed')
-
-    $popover.bootstrapPopover('show')
-    assert.notEqual($('.popover').length, 0, 'popover was inserted')
-    assert.equal($('.popover .popover-body').html(), $div[0].outerHTML, 'content correctly inserted')
-
-    $popover.bootstrapPopover('hide')
-    assert.strictEqual($('.popover').length, 0, 'popover was removed')
-  })
-
-  QUnit.test('should get title and content from attributes', function (assert) {
-    assert.expect(4)
-    var $popover = $('<a href="#" title="@mdo" data-content="loves data attributes (づ。◕‿‿◕。)づ ︵ ┻━┻" >@mdo</a>')
-      .appendTo('#qunit-fixture')
-      .bootstrapPopover()
-      .bootstrapPopover('show')
-
-    assert.notEqual($('.popover').length, 0, 'popover was inserted')
-    assert.strictEqual($('.popover .popover-header').text(), '@mdo', 'title correctly inserted')
-    assert.strictEqual($('.popover .popover-body').text(), 'loves data attributes (づ。◕‿‿◕。)づ ︵ ┻━┻', 'content correctly inserted')
-
-    $popover.bootstrapPopover('hide')
-    assert.strictEqual($('.popover').length, 0, 'popover was removed')
-  })
-
-  QUnit.test('should get title and content from attributes ignoring options passed via js', function (assert) {
-    assert.expect(4)
-    var $popover = $('<a href="#" title="@mdo" data-content="loves data attributes (づ。◕‿‿◕。)づ ︵ ┻━┻" >@mdo</a>')
-      .appendTo('#qunit-fixture')
-      .bootstrapPopover({
-        title: 'ignored title option',
-        content: 'ignored content option'
-      })
-      .bootstrapPopover('show')
-
-    assert.notEqual($('.popover').length, 0, 'popover was inserted')
-    assert.strictEqual($('.popover .popover-header').text(), '@mdo', 'title correctly inserted')
-    assert.strictEqual($('.popover .popover-body').text(), 'loves data attributes (づ。◕‿‿◕。)づ ︵ ┻━┻', 'content correctly inserted')
-
-    $popover.bootstrapPopover('hide')
-    assert.strictEqual($('.popover').length, 0, 'popover was removed')
-  })
-
-  QUnit.test('should respect custom template', function (assert) {
-    assert.expect(3)
-    var $popover = $('<a href="#">@fat</a>')
-      .appendTo('#qunit-fixture')
-      .bootstrapPopover({
-        title: 'Test',
-        content: 'Test',
-        template: '<div class="popover foobar"><div class="arrow"></div><div class="inner"><h3 class="title"/><div class="content"><p/></div></div></div>'
-      })
-
-    $popover.bootstrapPopover('show')
-
-    assert.notEqual($('.popover').length, 0, 'popover was inserted')
-    assert.ok($('.popover').hasClass('foobar'), 'custom class is present')
-
-    $popover.bootstrapPopover('hide')
-    assert.strictEqual($('.popover').length, 0, 'popover was removed')
-  })
-
-  QUnit.test('should destroy popover', function (assert) {
-    assert.expect(7)
-    var $popover = $('<div/>')
-      .bootstrapPopover({
-        trigger: 'hover'
-      })
-      .on('click.foo', $.noop)
-
-    assert.ok($popover.data('bs.popover'), 'popover has data')
-    assert.ok($._data($popover[0], 'events').mouseover && $._data($popover[0], 'events').mouseout, 'popover has hover event')
-    assert.strictEqual($._data($popover[0], 'events').click[0].namespace, 'foo', 'popover has extra click.foo event')
-
-    $popover.bootstrapPopover('show')
-    $popover.bootstrapPopover('dispose')
-
-    assert.ok(!$popover.hasClass('show'), 'popover is hidden')
-    assert.ok(!$popover.data('popover'), 'popover does not have data')
-    assert.strictEqual($._data($popover[0], 'events').click[0].namespace, 'foo', 'popover still has click.foo')
-    assert.ok(!$._data($popover[0], 'events').mouseover && !$._data($popover[0], 'events').mouseout, 'popover does not have any events')
-  })
-
-  QUnit.test('should render popover element using delegated selector', function (assert) {
-    assert.expect(2)
-    var $div = $('<div><a href="#" title="mdo" data-content="https://twitter.com/mdo">@mdo</a></div>')
-      .appendTo('#qunit-fixture')
-      .bootstrapPopover({
-        selector: 'a',
-        trigger: 'click'
-      })
-
-    $div.find('a').trigger('click')
-    assert.notEqual($('.popover').length, 0, 'popover was inserted')
-
-    $div.find('a').trigger('click')
-    assert.strictEqual($('.popover').length, 0, 'popover was removed')
-  })
-
-  QUnit.test('should detach popover content rather than removing it so that event handlers are left intact', function (assert) {
-    assert.expect(1)
-    var $content = $('<div class="content-with-handler"><a class="btn btn-warning">Button with event handler</a></div>').appendTo('#qunit-fixture')
-
-    var handlerCalled = false
-    $('.content-with-handler .btn').on('click', function () {
-      handlerCalled = true
-    })
-
-    var $div = $('<div><a href="#">Show popover</a></div>')
-      .appendTo('#qunit-fixture')
-      .bootstrapPopover({
-        html: true,
-        trigger: 'manual',
-        container: 'body',
-        content: function () {
-          return $content
-        }
-      })
-
-    var done = assert.async()
-    $div
-      .one('shown.bs.popover', function () {
-        $div
-          .one('hidden.bs.popover', function () {
-            $div
-              .one('shown.bs.popover', function () {
-                $('.content-with-handler .btn').trigger('click')
-                $div.bootstrapPopover('dispose')
-                assert.ok(handlerCalled, 'content\'s event handler still present')
-                done()
-              })
-              .bootstrapPopover('show')
-          })
-          .bootstrapPopover('hide')
-      })
-      .bootstrapPopover('show')
-  })
-
-  QUnit.test('should do nothing when an attempt is made to hide an uninitialized popover', function (assert) {
-    assert.expect(1)
-
-    var $popover = $('<span data-toggle="popover" data-title="some title" data-content="some content">some text</span>')
-      .appendTo('#qunit-fixture')
-      .on('hidden.bs.popover shown.bs.popover', function () {
-        assert.ok(false, 'should not fire any popover events')
-      })
-      .bootstrapPopover('hide')
-    assert.strictEqual(typeof $popover.data('bs.popover'), 'undefined', 'should not initialize the popover')
-  })
-
-  QUnit.test('should fire inserted event', function (assert) {
-    assert.expect(2)
-    var done = assert.async()
-
-    $('<a href="#">@Johann-S</a>')
-      .appendTo('#qunit-fixture')
-      .on('inserted.bs.popover', function () {
-        assert.notEqual($('.popover').length, 0, 'popover was inserted')
-        assert.ok(true, 'inserted event fired')
-        done()
-      })
-      .bootstrapPopover({
-        title: 'Test',
-        content: 'Test'
-      })
-      .bootstrapPopover('show')
-  })
-
-  QUnit.test('should throw an error when show is called on hidden elements', function (assert) {
-    assert.expect(1)
-    var done = assert.async()
-
-    try {
-      $('<div data-toggle="popover" data-title="some title" data-content="@Johann-S" style="display: none"/>').bootstrapPopover('show')
-    }
-    catch (err) {
-      assert.strictEqual(err.message, 'Please use show on visible elements')
-      done()
-    }
-  })
-
-  QUnit.test('should hide popovers when their containing modal is closed', function (assert) {
-    assert.expect(1)
-    var done = assert.async()
-    var templateHTML = '<div id="modal-test" class="modal">' +
-                          '<div class="modal-dialog" role="document">' +
-                            '<div class="modal-content">' +
-                              '<div class="modal-body">' +
-                                '<button id="popover-test" type="button" class="btn btn-secondary" data-toggle="popover" data-placement="top" data-content="Popover">' +
-                                  'Popover on top' +
-                                '</button>' +
-                              '</div>' +
-                            '</div>' +
-                          '</div>' +
-                        '</div>'
-
-    $(templateHTML).appendTo('#qunit-fixture')
-    $('#popover-test')
-      .on('shown.bs.popover', function () {
-        $('#modal-test').modal('hide')
-      })
-      .on('hide.bs.popover', function () {
-        assert.ok(true, 'popover hide')
-        done()
-      })
-
-    $('#modal-test')
-      .on('shown.bs.modal', function () {
-        $('#popover-test').bootstrapPopover('show')
-      })
-      .modal('show')
-  })
-
-  QUnit.test('should convert number to string without error for content and title', function (assert) {
-    assert.expect(2)
-    var done = assert.async()
-    var $popover = $('<a href="#">@mdo</a>')
-      .appendTo('#qunit-fixture')
-      .bootstrapPopover({
-        title: 5,
-        content: 7
-      })
-      .on('shown.bs.popover', function () {
-        assert.strictEqual($('.popover .popover-header').text(), '5')
-        assert.strictEqual($('.popover .popover-body').text(), '7')
-        done()
-      })
-
-    $popover.bootstrapPopover('show')
-  })
-
-  QUnit.test('popover should be shown right away after the call of disable/enable', function (assert) {
-    assert.expect(2)
-    var done = assert.async()
-    var $popover = $('<a href="#">@mdo</a>')
-      .appendTo('#qunit-fixture')
-      .bootstrapPopover({
-        title: 'Test popover',
-        content: 'with disable/enable'
-      })
-      .on('shown.bs.popover', function () {
-        assert.strictEqual($('.popover').hasClass('show'), true)
-        done()
-      })
-
-    $popover.bootstrapPopover('disable')
-    $popover.trigger($.Event('click'))
-    setTimeout(function () {
-      assert.strictEqual($('.popover').length === 0, true)
-      $popover.bootstrapPopover('enable')
-      $popover.trigger($.Event('click'))
-    }, 200)
-  })
-})
diff --git a/assets/javascript/tests/unit/scrollspy.js b/assets/javascript/tests/unit/scrollspy.js
deleted file mode 100644
index 7bdeb4a..0000000
--- a/assets/javascript/tests/unit/scrollspy.js
+++ /dev/null
@@ -1,659 +0,0 @@
-$(function () {
-  'use strict'
-
-  QUnit.module('scrollspy plugin')
-
-  QUnit.test('should be defined on jquery object', function (assert) {
-    assert.expect(1)
-    assert.ok($(document.body).scrollspy, 'scrollspy method is defined')
-  })
-
-  QUnit.module('scrollspy', {
-    beforeEach: function () {
-      // Run all tests in noConflict mode -- it's the only way to ensure that the plugin works in noConflict mode
-      $.fn.bootstrapScrollspy = $.fn.scrollspy.noConflict()
-    },
-    afterEach: function () {
-      $.fn.scrollspy = $.fn.bootstrapScrollspy
-      delete $.fn.bootstrapScrollspy
-    }
-  })
-
-  QUnit.test('should provide no conflict', function (assert) {
-    assert.expect(1)
-    assert.strictEqual(typeof $.fn.scrollspy, 'undefined', 'scrollspy was set back to undefined (org value)')
-  })
-
-  QUnit.test('should throw explicit error on undefined method', function (assert) {
-    assert.expect(1)
-    var $el = $('<div/>').appendTo('#qunit-fixture')
-    $el.bootstrapScrollspy()
-    try {
-      $el.bootstrapScrollspy('noMethod')
-    }
-    catch (err) {
-      assert.strictEqual(err.message, 'No method named "noMethod"')
-    }
-  })
-
-  QUnit.test('should return jquery collection containing the element', function (assert) {
-    assert.expect(2)
-    var $el = $('<div/>').appendTo('#qunit-fixture')
-    var $scrollspy = $el.bootstrapScrollspy()
-    assert.ok($scrollspy instanceof $, 'returns jquery collection')
-    assert.strictEqual($scrollspy[0], $el[0], 'collection contains element')
-  })
-
-  QUnit.test('should only switch "active" class on current target', function (assert) {
-    assert.expect(1)
-    var done = assert.async()
-
-    var sectionHTML = '<div id="root" class="active">'
-        + '<div class="topbar">'
-        + '<div class="topbar-inner">'
-        + '<div class="container" id="ss-target">'
-        + '<ul class="nav">'
-        + '<li class="nav-item"><a href="#masthead">Overview</a></li>'
-        + '<li class="nav-item"><a href="#detail">Detail</a></li>'
-        + '</ul>'
-        + '</div>'
-        + '</div>'
-        + '</div>'
-        + '<div id="scrollspy-example" style="height: 100px; overflow: auto;">'
-        + '<div style="height: 200px;">'
-        + '<h4 id="masthead">Overview</h4>'
-        + '<p style="height: 200px">'
-        + 'Ad leggings keytar, brunch id art party dolor labore.'
-        + '</p>'
-        + '</div>'
-        + '<div style="height: 200px;">'
-        + '<h4 id="detail">Detail</h4>'
-        + '<p style="height: 200px">'
-        + 'Veniam marfa mustache skateboard, adipisicing fugiat velit pitchfork beard.'
-        + '</p>'
-        + '</div>'
-        + '</div>'
-        + '</div>'
-    var $section = $(sectionHTML).appendTo('#qunit-fixture')
-
-    var $scrollspy = $section
-      .show()
-      .find('#scrollspy-example')
-      .bootstrapScrollspy({ target: '#ss-target' })
-
-    $scrollspy.one('scroll', function () {
-      assert.ok($section.hasClass('active'), '"active" class still on root node')
-      done()
-    })
-
-    $scrollspy.scrollTop(350)
-  })
-
-  QUnit.test('should only switch "active" class on current target specified w element', function (assert) {
-    assert.expect(1)
-    var done = assert.async()
-
-    var sectionHTML = '<div id="root" class="active">'
-        + '<div class="topbar">'
-        + '<div class="topbar-inner">'
-        + '<div class="container" id="ss-target">'
-        + '<ul class="nav">'
-        + '<li class="nav-item"><a href="#masthead">Overview</a></li>'
-        + '<li class="nav-item"><a href="#detail">Detail</a></li>'
-        + '</ul>'
-        + '</div>'
-        + '</div>'
-        + '</div>'
-        + '<div id="scrollspy-example" style="height: 100px; overflow: auto;">'
-        + '<div style="height: 200px;">'
-        + '<h4 id="masthead">Overview</h4>'
-        + '<p style="height: 200px">'
-        + 'Ad leggings keytar, brunch id art party dolor labore.'
-        + '</p>'
-        + '</div>'
-        + '<div style="height: 200px;">'
-        + '<h4 id="detail">Detail</h4>'
-        + '<p style="height: 200px">'
-        + 'Veniam marfa mustache skateboard, adipisicing fugiat velit pitchfork beard.'
-        + '</p>'
-        + '</div>'
-        + '</div>'
-        + '</div>'
-    var $section = $(sectionHTML).appendTo('#qunit-fixture')
-
-    var $scrollspy = $section
-      .show()
-      .find('#scrollspy-example')
-      .bootstrapScrollspy({ target: document.getElementById('#ss-target') })
-
-    $scrollspy.one('scroll', function () {
-      assert.ok($section.hasClass('active'), '"active" class still on root node')
-      done()
-    })
-
-    $scrollspy.scrollTop(350)
-  })
-
-  QUnit.test('should correctly select middle navigation option when large offset is used', function (assert) {
-    assert.expect(3)
-    var done = assert.async()
-
-    var sectionHTML = '<div id="header" style="height: 500px;"></div>'
-        + '<nav id="navigation" class="navbar">'
-        + '<ul class="navbar-nav">'
-        + '<li class="nav-item active"><a class="nav-link" id="one-link" href="#one">One</a></li>'
-        + '<li class="nav-item"><a class="nav-link" id="two-link" href="#two">Two</a></li>'
-        + '<li class="nav-item"><a class="nav-link" id="three-link" href="#three">Three</a></li>'
-        + '</ul>'
-        + '</nav>'
-        + '<div id="content" style="height: 200px; overflow-y: auto;">'
-        + '<div id="one" style="height: 500px;"></div>'
-        + '<div id="two" style="height: 300px;"></div>'
-        + '<div id="three" style="height: 10px;"></div>'
-        + '</div>'
-    var $section = $(sectionHTML).appendTo('#qunit-fixture')
-    var $scrollspy = $section
-      .show()
-      .filter('#content')
-
-    $scrollspy.bootstrapScrollspy({ target: '#navigation', offset: $scrollspy.position().top })
-
-    $scrollspy.one('scroll', function () {
-      assert.ok(!$section.find('#one-link').hasClass('active'), '"active" class removed from first section')
-      assert.ok($section.find('#two-link').hasClass('active'), '"active" class on middle section')
-      assert.ok(!$section.find('#three-link').hasClass('active'), '"active" class not on last section')
-      done()
-    })
-
-    $scrollspy.scrollTop(550)
-  })
-
-  QUnit.test('should add the active class to the correct element', function (assert) {
-    assert.expect(2)
-    var navbarHtml =
-        '<nav class="navbar">'
-      + '<ul class="nav">'
-      + '<li class="nav-item"><a class="nav-link" id="a-1" href="#div-1">div 1</a></li>'
-      + '<li class="nav-item"><a class="nav-link" id="a-2" href="#div-2">div 2</a></li>'
-      + '</ul>'
-      + '</nav>'
-    var contentHtml =
-        '<div class="content" style="overflow: auto; height: 50px">'
-      + '<div id="div-1" style="height: 100px; padding: 0; margin: 0">div 1</div>'
-      + '<div id="div-2" style="height: 200px; padding: 0; margin: 0">div 2</div>'
-      + '</div>'
-
-    $(navbarHtml).appendTo('#qunit-fixture')
-    var $content = $(contentHtml)
-      .appendTo('#qunit-fixture')
-      .bootstrapScrollspy({ offset: 0, target: '.navbar' })
-
-    var done = assert.async()
-    var testElementIsActiveAfterScroll = function (element, target) {
-      var deferred = $.Deferred()
-      var scrollHeight = Math.ceil($content.scrollTop() + $(target).position().top)
-      $content.one('scroll', function () {
-        assert.ok($(element).hasClass('active'), 'target:' + target + ', element' + element)
-        deferred.resolve()
-      })
-      $content.scrollTop(scrollHeight)
-      return deferred.promise()
-    }
-
-    $.when(testElementIsActiveAfterScroll('#a-1', '#div-1'))
-      .then(function () { return testElementIsActiveAfterScroll('#a-2', '#div-2') })
-      .then(function () { done() })
-  })
-
-  QUnit.test('should add the active class to the correct element (nav markup)', function (assert) {
-    assert.expect(2)
-    var navbarHtml =
-        '<nav class="navbar">'
-      + '<nav class="nav">'
-      + '<a class="nav-link" id="a-1" href="#div-1">div 1</a>'
-      + '<a class="nav-link" id="a-2" href="#div-2">div 2</a>'
-      + '</nav>'
-      + '</nav>'
-    var contentHtml =
-        '<div class="content" style="overflow: auto; height: 50px">'
-      + '<div id="div-1" style="height: 100px; padding: 0; margin: 0">div 1</div>'
-      + '<div id="div-2" style="height: 200px; padding: 0; margin: 0">div 2</div>'
-      + '</div>'
-
-    $(navbarHtml).appendTo('#qunit-fixture')
-    var $content = $(contentHtml)
-      .appendTo('#qunit-fixture')
-      .bootstrapScrollspy({ offset: 0, target: '.navbar' })
-
-    var done = assert.async()
-    var testElementIsActiveAfterScroll = function (element, target) {
-      var deferred = $.Deferred()
-      var scrollHeight = Math.ceil($content.scrollTop() + $(target).position().top)
-      $content.one('scroll', function () {
-        assert.ok($(element).hasClass('active'), 'target:' + target + ', element' + element)
-        deferred.resolve()
-      })
-      $content.scrollTop(scrollHeight)
-      return deferred.promise()
-    }
-
-    $.when(testElementIsActiveAfterScroll('#a-1', '#div-1'))
-      .then(function () { return testElementIsActiveAfterScroll('#a-2', '#div-2') })
-      .then(function () { done() })
-  })
-
-  QUnit.test('should add the active class to the correct element (list-group markup)', function (assert) {
-    assert.expect(2)
-    var navbarHtml =
-        '<nav class="navbar">'
-      + '<div class="list-group">'
-      + '<a class="list-group-item" id="a-1" href="#div-1">div 1</a>'
-      + '<a class="list-group-item" id="a-2" href="#div-2">div 2</a>'
-      + '</div>'
-      + '</nav>'
-    var contentHtml =
-        '<div class="content" style="overflow: auto; height: 50px">'
-      + '<div id="div-1" style="height: 100px; padding: 0; margin: 0">div 1</div>'
-      + '<div id="div-2" style="height: 200px; padding: 0; margin: 0">div 2</div>'
-      + '</div>'
-
-    $(navbarHtml).appendTo('#qunit-fixture')
-    var $content = $(contentHtml)
-      .appendTo('#qunit-fixture')
-      .bootstrapScrollspy({ offset: 0, target: '.navbar' })
-
-    var done = assert.async()
-    var testElementIsActiveAfterScroll = function (element, target) {
-      var deferred = $.Deferred()
-      var scrollHeight = Math.ceil($content.scrollTop() + $(target).position().top)
-      $content.one('scroll', function () {
-        assert.ok($(element).hasClass('active'), 'target:' + target + ', element' + element)
-        deferred.resolve()
-      })
-      $content.scrollTop(scrollHeight)
-      return deferred.promise()
-    }
-
-    $.when(testElementIsActiveAfterScroll('#a-1', '#div-1'))
-      .then(function () { return testElementIsActiveAfterScroll('#a-2', '#div-2') })
-      .then(function () { done() })
-  })
-
-  QUnit.test('should add the active class correctly when there are nested elements at 0 scroll offset', function (assert) {
-    assert.expect(6)
-    var times = 0
-    var done = assert.async()
-    var navbarHtml = '<nav id="navigation" class="navbar">'
-      + '<ul class="nav">'
-      + '<li class="nav-item"><a id="a-1" class="nav-link" href="#div-1">div 1</a>'
-      + '<ul class="nav">'
-      + '<li class="nav-item"><a id="a-2" class="nav-link" href="#div-2">div 2</a></li>'
-      + '</ul>'
-      + '</li>'
-      + '</ul>'
-      + '</nav>'
-
-    var contentHtml = '<div class="content" style="position: absolute; top: 0px; overflow: auto; height: 50px">'
-      + '<div id="div-1" style="padding: 0; margin: 0">'
-      + '<div id="div-2" style="height: 200px; padding: 0; margin: 0">div 2</div>'
-      + '</div>'
-      + '</div>'
-
-    $(navbarHtml).appendTo('#qunit-fixture')
-
-    var $content = $(contentHtml)
-      .appendTo('#qunit-fixture')
-      .bootstrapScrollspy({ offset: 0, target: '#navigation' })
-
-    function testActiveElements() {
-      if (++times > 3) { return done() }
-
-      $content.one('scroll', function () {
-        assert.ok($('#a-1').hasClass('active'), 'nav item for outer element has "active" class')
-        assert.ok($('#a-2').hasClass('active'), 'nav item for inner element has "active" class')
-        testActiveElements()
-      })
-
-      $content.scrollTop($content.scrollTop() + 10)
-    }
-
-    testActiveElements()
-  })
-
-  QUnit.test('should add the active class correctly when there are nested elements (nav markup)', function (assert) {
-    assert.expect(6)
-    var times = 0
-    var done = assert.async()
-    var navbarHtml = '<nav id="navigation" class="navbar">'
-      + '<nav class="nav">'
-      + '<a id="a-1" class="nav-link" href="#div-1">div 1</a>'
-      + '<nav class="nav">'
-      + '<a id="a-2" class="nav-link" href="#div-2">div 2</a>'
-      + '</nav>'
-      + '</nav>'
-      + '</nav>'
-
-    var contentHtml = '<div class="content" style="position: absolute; top: 0px; overflow: auto; height: 50px">'
-      + '<div id="div-1" style="padding: 0; margin: 0">'
-      + '<div id="div-2" style="height: 200px; padding: 0; margin: 0">div 2</div>'
-      + '</div>'
-      + '</div>'
-
-    $(navbarHtml).appendTo('#qunit-fixture')
-
-    var $content = $(contentHtml)
-      .appendTo('#qunit-fixture')
-      .bootstrapScrollspy({ offset: 0, target: '#navigation' })
-
-    function testActiveElements() {
-      if (++times > 3) { return done() }
-
-      $content.one('scroll', function () {
-        assert.ok($('#a-1').hasClass('active'), 'nav item for outer element has "active" class')
-        assert.ok($('#a-2').hasClass('active'), 'nav item for inner element has "active" class')
-        testActiveElements()
-      })
-
-      $content.scrollTop($content.scrollTop() + 10)
-    }
-
-    testActiveElements()
-  })
-
-
-  QUnit.test('should add the active class correctly when there are nested elements (nav nav-item markup)', function (assert) {
-    assert.expect(6)
-    var times = 0
-    var done = assert.async()
-    var navbarHtml = '<nav id="navigation" class="navbar">'
-      + '<ul class="nav">'
-      + '<li class="nav-item"><a id="a-1" class="nav-link" href="#div-1">div 1</a></li>'
-      + '<ul class="nav">'
-      + '<li class="nav-item"><a id="a-2" class="nav-link" href="#div-2">div 2</a></li>'
-      + '</ul>'
-      + '</ul>'
-      + '</nav>'
-
-    var contentHtml = '<div class="content" style="position: absolute; top: 0px; overflow: auto; height: 50px">'
-      + '<div id="div-1" style="padding: 0; margin: 0">'
-      + '<div id="div-2" style="height: 200px; padding: 0; margin: 0">div 2</div>'
-      + '</div>'
-      + '</div>'
-
-    $(navbarHtml).appendTo('#qunit-fixture')
-
-    var $content = $(contentHtml)
-      .appendTo('#qunit-fixture')
-      .bootstrapScrollspy({ offset: 0, target: '#navigation' })
-
-    function testActiveElements() {
-      if (++times > 3) { return done() }
-
-      $content.one('scroll', function () {
-        assert.ok($('#a-1').hasClass('active'), 'nav item for outer element has "active" class')
-        assert.ok($('#a-2').hasClass('active'), 'nav item for inner element has "active" class')
-        testActiveElements()
-      })
-
-      $content.scrollTop($content.scrollTop() + 10)
-    }
-
-    testActiveElements()
-  })
-
-  QUnit.test('should add the active class correctly when there are nested elements (list-group markup)', function (assert) {
-    assert.expect(6)
-    var times = 0
-    var done = assert.async()
-    var navbarHtml = '<nav id="navigation" class="navbar">'
-      + '<div class="list-group">'
-      + '<a id="a-1" class="list-group-item" href="#div-1">div 1</a>'
-      + '<div class="list-group">'
-      + '<a id="a-2" class="list-group-item" href="#div-2">div 2</a>'
-      + '</div>'
-      + '</div>'
-      + '</nav>'
-
-    var contentHtml = '<div class="content" style="position: absolute; top: 0px; overflow: auto; height: 50px">'
-      + '<div id="div-1" style="padding: 0; margin: 0">'
-      + '<div id="div-2" style="height: 200px; padding: 0; margin: 0">div 2</div>'
-      + '</div>'
-      + '</div>'
-
-    $(navbarHtml).appendTo('#qunit-fixture')
-
-    var $content = $(contentHtml)
-      .appendTo('#qunit-fixture')
-      .bootstrapScrollspy({ offset: 0, target: '#navigation' })
-
-    function testActiveElements() {
-      if (++times > 3) { return done() }
-
-      $content.one('scroll', function () {
-        assert.ok($('#a-1').hasClass('active'), 'nav item for outer element has "active" class')
-        assert.ok($('#a-2').hasClass('active'), 'nav item for inner element has "active" class')
-        testActiveElements()
-      })
-
-      $content.scrollTop($content.scrollTop() + 10)
-    }
-
-    testActiveElements()
-  })
-
-  QUnit.test('should clear selection if above the first section', function (assert) {
-    assert.expect(3)
-    var done = assert.async()
-
-    var sectionHTML = '<div id="header" style="height: 500px;"></div>'
-        + '<nav id="navigation" class="navbar">'
-        + '<ul class="navbar-nav">'
-        + '<li class="nav-item"><a id="one-link"   class="nav-link active" href="#one">One</a></li>'
-        + '<li class="nav-item"><a id="two-link"   class="nav-link" href="#two">Two</a></li>'
-        + '<li class="nav-item"><a id="three-link" class="nav-link" href="#three">Three</a></li>'
-        + '</ul>'
-        + '</nav>'
-    $(sectionHTML).appendTo('#qunit-fixture')
-
-    var scrollspyHTML = '<div id="content" style="height: 200px; overflow-y: auto;">'
-        + '<div id="spacer" style="height: 100px;"/>'
-        + '<div id="one" style="height: 100px;"/>'
-        + '<div id="two" style="height: 100px;"/>'
-        + '<div id="three" style="height: 100px;"/>'
-        + '<div id="spacer" style="height: 100px;"/>'
-        + '</div>'
-    var $scrollspy = $(scrollspyHTML).appendTo('#qunit-fixture')
-
-    $scrollspy
-      .bootstrapScrollspy({
-        target: '#navigation',
-        offset: $scrollspy.position().top
-      })
-      .one('scroll', function () {
-        assert.strictEqual($('.active').length, 1, '"active" class on only one element present')
-        assert.strictEqual($('.active').is('#two-link'), true, '"active" class on second section')
-        $scrollspy
-          .one('scroll', function () {
-            assert.strictEqual($('.active').length, 0, 'selection cleared')
-            done()
-          })
-          .scrollTop(0)
-      })
-      .scrollTop(201)
-  })
-
-  QUnit.test('should NOT clear selection if above the first section and first section is at the top', function (assert) {
-    assert.expect(4)
-    var done = assert.async()
-
-    var sectionHTML = '<div id="header" style="height: 500px;"></div>'
-        + '<nav id="navigation" class="navbar">'
-        + '<ul class="navbar-nav">'
-        + '<li class="nav-item"><a id="one-link"   class="nav-link active" href="#one">One</a></li>'
-        + '<li class="nav-item"><a id="two-link"   class="nav-link" href="#two">Two</a></li>'
-        + '<li class="nav-item"><a id="three-link" class="nav-link" href="#three">Three</a></li>'
-        + '</ul>'
-        + '</nav>'
-    $(sectionHTML).appendTo('#qunit-fixture')
-
-    var negativeHeight = -10
-    var startOfSectionTwo = 101
-
-    var scrollspyHTML = '<div id="content" style="height: 200px; overflow-y: auto;">'
-        + '<div id="one" style="height: 100px;"/>'
-        + '<div id="two" style="height: 100px;"/>'
-        + '<div id="three" style="height: 100px;"/>'
-        + '<div id="spacer" style="height: 100px;"/>'
-        + '</div>'
-    var $scrollspy = $(scrollspyHTML).appendTo('#qunit-fixture')
-
-    $scrollspy
-      .bootstrapScrollspy({
-        target: '#navigation',
-        offset: $scrollspy.position().top
-      })
-      .one('scroll', function () {
-        assert.strictEqual($('.active').length, 1, '"active" class on only one element present')
-        assert.strictEqual($('.active').is('#two-link'), true, '"active" class on second section')
-        $scrollspy
-          .one('scroll', function () {
-            assert.strictEqual($('.active').length, 1, '"active" class on only one element present')
-            assert.strictEqual($('.active').is('#one-link'), true, '"active" class on first section')
-            done()
-          })
-          .scrollTop(negativeHeight)
-      })
-      .scrollTop(startOfSectionTwo)
-  })
-
-  QUnit.test('should correctly select navigation element on backward scrolling when each target section height is 100%', function (assert) {
-    assert.expect(5)
-    var navbarHtml =
-        '<nav class="navbar">'
-      + '<ul class="nav">'
-      + '<li class="nav-item"><a id="li-100-1" class="nav-link" href="#div-100-1">div 1</a></li>'
-      + '<li class="nav-item"><a id="li-100-2" class="nav-link" href="#div-100-2">div 2</a></li>'
-      + '<li class="nav-item"><a id="li-100-3" class="nav-link" href="#div-100-3">div 3</a></li>'
-      + '<li class="nav-item"><a id="li-100-4" class="nav-link" href="#div-100-4">div 4</a></li>'
-      + '<li class="nav-item"><a id="li-100-5" class="nav-link" href="#div-100-5">div 5</a></li>'
-      + '</ul>'
-      + '</nav>'
-    var contentHtml =
-        '<div class="content" style="position: relative; overflow: auto; height: 100px">'
-      + '<div id="div-100-1" style="position: relative; height: 100%; padding: 0; margin: 0">div 1</div>'
-      + '<div id="div-100-2" style="position: relative; height: 100%; padding: 0; margin: 0">div 2</div>'
-      + '<div id="div-100-3" style="position: relative; height: 100%; padding: 0; margin: 0">div 3</div>'
-      + '<div id="div-100-4" style="position: relative; height: 100%; padding: 0; margin: 0">div 4</div>'
-      + '<div id="div-100-5" style="position: relative; height: 100%; padding: 0; margin: 0">div 5</div>'
-      + '</div>'
-
-    $(navbarHtml).appendTo('#qunit-fixture')
-    var $content = $(contentHtml)
-      .appendTo('#qunit-fixture')
-      .bootstrapScrollspy({ offset: 0, target: '.navbar' })
-
-    var testElementIsActiveAfterScroll = function (element, target) {
-      var deferred = $.Deferred()
-      var scrollHeight = Math.ceil($content.scrollTop() + $(target).position().top)
-      $content.one('scroll', function () {
-        assert.ok($(element).hasClass('active'), 'target:' + target + ', element: ' + element)
-        deferred.resolve()
-      })
-      $content.scrollTop(scrollHeight)
-      return deferred.promise()
-    }
-
-    var done = assert.async()
-    $.when(testElementIsActiveAfterScroll('#li-100-5', '#div-100-5'))
-      .then(function () { return testElementIsActiveAfterScroll('#li-100-4', '#div-100-4') })
-      .then(function () { return testElementIsActiveAfterScroll('#li-100-3', '#div-100-3') })
-      .then(function () { return testElementIsActiveAfterScroll('#li-100-2', '#div-100-2') })
-      .then(function () { return testElementIsActiveAfterScroll('#li-100-1', '#div-100-1') })
-      .then(function () { done() })
-  })
-
-  QUnit.test('should allow passed in option offset method: offset', function (assert) {
-    assert.expect(4)
-
-    var testOffsetMethod = function (type) {
-      var $navbar = $(
-          '<nav class="navbar"' + (type === 'data' ? ' id="navbar-offset-method-menu"' : '') + '>'
-        + '<ul class="nav">'
-        + '<li class="nav-item"><a id="li-' + type + 'm-1" class="nav-link" href="#div-' + type + 'm-1">div 1</a></li>'
-        + '<li class="nav-item"><a id="li-' + type + 'm-2" class="nav-link" href="#div-' + type + 'm-2">div 2</a></li>'
-        + '<li class="nav-item"><a id="li-' + type + 'm-3" class="nav-link" href="#div-' + type + 'm-3">div 3</a></li>'
-        + '</ul>'
-        + '</nav>'
-      )
-      var $content = $(
-          '<div class="content"' + (type === 'data' ? ' data-spy="scroll" data-target="#navbar-offset-method-menu" data-offset="0" data-method="offset"' : '') + ' style="position: relative; overflow: auto; height: 100px">'
-        + '<div id="div-' + type + 'm-1" style="position: relative; height: 200px; padding: 0; margin: 0">div 1</div>'
-        + '<div id="div-' + type + 'm-2" style="position: relative; height: 150px; padding: 0; margin: 0">div 2</div>'
-        + '<div id="div-' + type + 'm-3" style="position: relative; height: 250px; padding: 0; margin: 0">div 3</div>'
-        + '</div>'
-      )
-
-      $navbar.appendTo('#qunit-fixture')
-      $content.appendTo('#qunit-fixture')
-
-      if (type === 'js') {
-        $content.bootstrapScrollspy({ target: '.navbar', offset: 0, method: 'offset' })
-      }
-      else if (type === 'data') {
-        $(window).trigger('load')
-      }
-
-      var $target = $('#div-' + type + 'm-2')
-      var scrollspy = $content.data('bs.scrollspy')
-
-      assert.ok(scrollspy._offsets[1] === $target.offset().top, 'offset method with ' + type + ' option')
-      assert.ok(scrollspy._offsets[1] !== $target.position().top, 'position method with ' + type + ' option')
-      $navbar.remove()
-      $content.remove()
-    }
-
-    testOffsetMethod('js')
-    testOffsetMethod('data')
-  })
-
-  QUnit.test('should allow passed in option offset method: position', function (assert) {
-    assert.expect(4)
-
-    var testOffsetMethod = function (type) {
-      var $navbar = $(
-          '<nav class="navbar"' + (type === 'data' ? ' id="navbar-offset-method-menu"' : '') + '>'
-        + '<ul class="nav">'
-        + '<li class="nav-item"><a class="nav-link" id="li-' + type + 'm-1" href="#div-' + type + 'm-1">div 1</a></li>'
-        + '<li class="nav-item"><a class="nav-link" id="li-' + type + 'm-2" href="#div-' + type + 'm-2">div 2</a></li>'
-        + '<li class="nav-item"><a class="nav-link" id="li-' + type + 'm-3" href="#div-' + type + 'm-3">div 3</a></li>'
-        + '</ul>'
-        + '</nav>'
-      )
-      var $content = $(
-          '<div class="content"' + (type === 'data' ? ' data-spy="scroll" data-target="#navbar-offset-method-menu" data-offset="0" data-method="position"' : '') + ' style="position: relative; overflow: auto; height: 100px">'
-        + '<div id="div-' + type + 'm-1" style="position: relative; height: 200px; padding: 0; margin: 0">div 1</div>'
-        + '<div id="div-' + type + 'm-2" style="position: relative; height: 150px; padding: 0; margin: 0">div 2</div>'
-        + '<div id="div-' + type + 'm-3" style="position: relative; height: 250px; padding: 0; margin: 0">div 3</div>'
-        + '</div>'
-      )
-
-      $navbar.appendTo('#qunit-fixture')
-      $content.appendTo('#qunit-fixture')
-
-      if (type === 'js') { $content.bootstrapScrollspy({ target: '.navbar', offset: 0, method: 'position' }) }
-      else if (type === 'data') { $(window).trigger('load') }
-
-      var $target = $('#div-' + type + 'm-2')
-      var scrollspy = $content.data('bs.scrollspy')
-
-      assert.ok(scrollspy._offsets[1] !== $target.offset().top, 'offset method with ' + type + ' option')
-      assert.ok(scrollspy._offsets[1] === $target.position().top, 'position method with ' + type + ' option')
-      $navbar.remove()
-      $content.remove()
-    }
-
-    testOffsetMethod('js')
-    testOffsetMethod('data')
-  })
-
-})
diff --git a/assets/javascript/tests/unit/tab.js b/assets/javascript/tests/unit/tab.js
deleted file mode 100644
index 73ebbd6..0000000
--- a/assets/javascript/tests/unit/tab.js
+++ /dev/null
@@ -1,385 +0,0 @@
-$(function () {
-  'use strict'
-
-  QUnit.module('tabs plugin')
-
-  QUnit.test('should be defined on jquery object', function (assert) {
-    assert.expect(1)
-    assert.ok($(document.body).tab, 'tabs method is defined')
-  })
-
-  QUnit.module('tabs', {
-    beforeEach: function () {
-      // Run all tests in noConflict mode -- it's the only way to ensure that the plugin works in noConflict mode
-      $.fn.bootstrapTab = $.fn.tab.noConflict()
-    },
-    afterEach: function () {
-      $.fn.tab = $.fn.bootstrapTab
-      delete $.fn.bootstrapTab
-    }
-  })
-
-  QUnit.test('should provide no conflict', function (assert) {
-    assert.expect(1)
-    assert.strictEqual(typeof $.fn.tab, 'undefined', 'tab was set back to undefined (org value)')
-  })
-
-  QUnit.test('should throw explicit error on undefined method', function (assert) {
-    assert.expect(1)
-    var $el = $('<div/>')
-    $el.bootstrapTab()
-    try {
-      $el.bootstrapTab('noMethod')
-    }
-    catch (err) {
-      assert.strictEqual(err.message, 'No method named "noMethod"')
-    }
-  })
-
-  QUnit.test('should return jquery collection containing the element', function (assert) {
-    assert.expect(2)
-    var $el = $('<div/>')
-    var $tab = $el.bootstrapTab()
-    assert.ok($tab instanceof $, 'returns jquery collection')
-    assert.strictEqual($tab[0], $el[0], 'collection contains element')
-  })
-
-  QUnit.test('should activate element by tab id', function (assert) {
-    assert.expect(2)
-    var tabsHTML = '<ul class="nav">'
-        + '<li><a href="#home">Home</a></li>'
-        + '<li><a href="#profile">Profile</a></li>'
-        + '</ul>'
-
-    $('<ul><li id="home"/><li id="profile"/></ul>').appendTo('#qunit-fixture')
-
-    $(tabsHTML).find('li:last a').bootstrapTab('show')
-    assert.strictEqual($('#qunit-fixture').find('.active').attr('id'), 'profile')
-
-    $(tabsHTML).find('li:first a').bootstrapTab('show')
-    assert.strictEqual($('#qunit-fixture').find('.active').attr('id'), 'home')
-  })
-
-  QUnit.test('should activate element by tab id', function (assert) {
-    assert.expect(2)
-    var pillsHTML = '<ul class="nav nav-pills">'
-        + '<li><a href="#home">Home</a></li>'
-        + '<li><a href="#profile">Profile</a></li>'
-        + '</ul>'
-
-    $('<ul><li id="home"/><li id="profile"/></ul>').appendTo('#qunit-fixture')
-
-    $(pillsHTML).find('li:last a').bootstrapTab('show')
-    assert.strictEqual($('#qunit-fixture').find('.active').attr('id'), 'profile')
-
-    $(pillsHTML).find('li:first a').bootstrapTab('show')
-    assert.strictEqual($('#qunit-fixture').find('.active').attr('id'), 'home')
-  })
-
-  QUnit.test('should activate element by tab id in ordered list', function (assert) {
-    assert.expect(2)
-    var pillsHTML = '<ol class="nav nav-pills">'
-        + '<li><a href="#home">Home</a></li>'
-        + '<li><a href="#profile">Profile</a></li>'
-        + '</ol>'
-
-    $('<ol><li id="home"/><li id="profile"/></ol>').appendTo('#qunit-fixture')
-
-    $(pillsHTML).find('li:last a').bootstrapTab('show')
-    assert.strictEqual($('#qunit-fixture').find('.active').attr('id'), 'profile')
-
-    $(pillsHTML).find('li:first a').bootstrapTab('show')
-    assert.strictEqual($('#qunit-fixture').find('.active').attr('id'), 'home')
-  })
-
-  QUnit.test('should activate element by tab id in nav list', function (assert) {
-    assert.expect(2)
-    var tabsHTML =  '<nav class="nav">' +
-                      '<a href="#home">Home</a>' +
-                      '<a href="#profile">Profile</a>' +
-                    '</nav>'
-
-    $('<nav><div id="home"></div><div id="profile"></div></nav>').appendTo('#qunit-fixture')
-
-    $(tabsHTML).find('a:last').bootstrapTab('show')
-    assert.strictEqual($('#qunit-fixture').find('.active').attr('id'), 'profile')
-
-    $(tabsHTML).find('a:first').bootstrapTab('show')
-    assert.strictEqual($('#qunit-fixture').find('.active').attr('id'), 'home')
-  })
-
-  QUnit.test('should activate element by tab id in list group', function (assert) {
-    assert.expect(2)
-    var tabsHTML =  '<div class="list-group">' +
-                      '<a href="#home">Home</a>' +
-                      '<a href="#profile">Profile</a>' +
-                    '</div>'
-
-    $('<nav><div id="home"></div><div id="profile"></div></nav>').appendTo('#qunit-fixture')
-
-    $(tabsHTML).find('a:last').bootstrapTab('show')
-    assert.strictEqual($('#qunit-fixture').find('.active').attr('id'), 'profile')
-
-    $(tabsHTML).find('a:first').bootstrapTab('show')
-    assert.strictEqual($('#qunit-fixture').find('.active').attr('id'), 'home')
-  })
-
-  QUnit.test('should not fire shown when show is prevented', function (assert) {
-    assert.expect(1)
-    var done = assert.async()
-
-    $('<div class="nav"/>')
-      .on('show.bs.tab', function (e) {
-        e.preventDefault()
-        assert.ok(true, 'show event fired')
-        done()
-      })
-      .on('shown.bs.tab', function () {
-        assert.ok(false, 'shown event fired')
-      })
-      .bootstrapTab('show')
-  })
-
-  QUnit.test('should not fire shown when tab is already active', function (assert) {
-    assert.expect(0)
-    var tabsHTML = '<ul class="nav nav-tabs" role="tablist">'
-      + '<li class="nav-item"><a href="#home" class="nav-link active" role="tab">Home</a></li>'
-      + '<li class="nav-item"><a href="#profile" class="nav-link" role="tab">Profile</a></li>'
-      + '</ul>'
-      + '<div class="tab-content">'
-      + '<div class="tab-pane active" id="home" role="tabpanel"></div>'
-      + '<div class="tab-pane" id="profile" role="tabpanel"></div>'
-      + '</div>'
-
-    $(tabsHTML)
-      .find('a.active')
-      .on('shown.bs.tab', function () {
-        assert.ok(true, 'shown event fired')
-      })
-      .bootstrapTab('show')
-  })
-
-  QUnit.test('should not fire shown when tab is disabled', function (assert) {
-    assert.expect(0)
-    var tabsHTML = '<ul class="nav nav-tabs" role="tablist">'
-      + '<li class="nav-item"><a href="#home" class="nav-link active" role="tab">Home</a></li>'
-      + '<li class="nav-item"><a href="#profile" class="nav-link disabled" role="tab">Profile</a></li>'
-      + '</ul>'
-      + '<div class="tab-content">'
-      + '<div class="tab-pane active" id="home" role="tabpanel"></div>'
-      + '<div class="tab-pane" id="profile" role="tabpanel"></div>'
-      + '</div>'
-
-    $(tabsHTML)
-      .find('a.disabled')
-      .on('shown.bs.tab', function () {
-        assert.ok(true, 'shown event fired')
-      })
-      .bootstrapTab('show')
-  })
-
-  QUnit.test('show and shown events should reference correct relatedTarget', function (assert) {
-    assert.expect(2)
-    var done = assert.async()
-
-    var dropHTML =
-          '<ul class="drop nav">'
-        + '  <li class="dropdown"><a data-toggle="dropdown" href="#">1</a>'
-        + '    <ul class="dropdown-menu nav">'
-        + '      <li><a href="#1-1" data-toggle="tab">1-1</a></li>'
-        + '      <li><a href="#1-2" data-toggle="tab">1-2</a></li>'
-        + '    </ul>'
-        + '  </li>'
-        + '</ul>'
-
-    $(dropHTML)
-      .find('ul > li:first a')
-        .bootstrapTab('show')
-      .end()
-      .find('ul > li:last a')
-        .on('show.bs.tab', function (e) {
-          assert.strictEqual(e.relatedTarget.hash, '#1-1', 'references correct element as relatedTarget')
-        })
-        .on('shown.bs.tab', function (e) {
-          assert.strictEqual(e.relatedTarget.hash, '#1-1', 'references correct element as relatedTarget')
-          done()
-        })
-        .bootstrapTab('show')
-  })
-
-  QUnit.test('should fire hide and hidden events', function (assert) {
-    assert.expect(2)
-    var done = assert.async()
-
-    var tabsHTML = '<ul class="nav">'
-        + '<li><a href="#home">Home</a></li>'
-        + '<li><a href="#profile">Profile</a></li>'
-        + '</ul>'
-
-    $(tabsHTML)
-      .find('li:first a')
-        .on('hide.bs.tab', function () {
-          assert.ok(true, 'hide event fired')
-        })
-        .bootstrapTab('show')
-      .end()
-      .find('li:last a')
-        .bootstrapTab('show')
-
-    $(tabsHTML)
-      .find('li:first a')
-        .on('hidden.bs.tab', function () {
-          assert.ok(true, 'hidden event fired')
-          done()
-        })
-        .bootstrapTab('show')
-      .end()
-      .find('li:last a')
-        .bootstrapTab('show')
-  })
-
-  QUnit.test('should not fire hidden when hide is prevented', function (assert) {
-    assert.expect(1)
-    var done = assert.async()
-
-    var tabsHTML = '<ul class="nav">'
-        + '<li><a href="#home">Home</a></li>'
-        + '<li><a href="#profile">Profile</a></li>'
-        + '</ul>'
-
-    $(tabsHTML)
-      .find('li:first a')
-        .on('hide.bs.tab', function (e) {
-          e.preventDefault()
-          assert.ok(true, 'hide event fired')
-          done()
-        })
-        .on('hidden.bs.tab', function () {
-          assert.ok(false, 'hidden event fired')
-        })
-        .bootstrapTab('show')
-      .end()
-      .find('li:last a')
-        .bootstrapTab('show')
-  })
-
-  QUnit.test('hide and hidden events contain correct relatedTarget', function (assert) {
-    assert.expect(2)
-    var done = assert.async()
-
-    var tabsHTML = '<ul class="nav">'
-        + '<li><a href="#home">Home</a></li>'
-        + '<li><a href="#profile">Profile</a></li>'
-        + '</ul>'
-
-    $(tabsHTML)
-      .find('li:first a')
-        .on('hide.bs.tab', function (e) {
-          assert.strictEqual(e.relatedTarget.hash, '#profile', 'references correct element as relatedTarget')
-        })
-        .on('hidden.bs.tab', function (e) {
-          assert.strictEqual(e.relatedTarget.hash, '#profile', 'references correct element as relatedTarget')
-          done()
-        })
-        .bootstrapTab('show')
-      .end()
-      .find('li:last a')
-        .bootstrapTab('show')
-  })
-
-  QUnit.test('selected tab should have aria-selected', function (assert) {
-    assert.expect(8)
-    var tabsHTML = '<ul class="nav nav-tabs">'
-        + '<li><a class="nav-item active" href="#home" toggle="tab" aria-selected="true">Home</a></li>'
-        + '<li><a class="nav-item" href="#profile" toggle="tab" aria-selected="false">Profile</a></li>'
-        + '</ul>'
-    var $tabs = $(tabsHTML).appendTo('#qunit-fixture')
-
-    $tabs.find('li:first a').bootstrapTab('show')
-    assert.strictEqual($tabs.find('.active').attr('aria-selected'), 'true', 'shown tab has aria-selected = true')
-    assert.strictEqual($tabs.find('a:not(.active)').attr('aria-selected'), 'false', 'hidden tab has aria-selected = false')
-
-    $tabs.find('li:last a').trigger('click')
-    assert.strictEqual($tabs.find('.active').attr('aria-selected'), 'true', 'after click, shown tab has aria-selected = true')
-    assert.strictEqual($tabs.find('a:not(.active)').attr('aria-selected'), 'false', 'after click, hidden tab has aria-selected = false')
-
-    $tabs.find('li:first a').bootstrapTab('show')
-    assert.strictEqual($tabs.find('.active').attr('aria-selected'), 'true', 'shown tab has aria-selected = true')
-    assert.strictEqual($tabs.find('a:not(.active)').attr('aria-selected'), 'false', 'hidden tab has aria-selected = false')
-
-    $tabs.find('li:first a').trigger('click')
-    assert.strictEqual($tabs.find('.active').attr('aria-selected'), 'true', 'after second show event, shown tab still has aria-selected = true')
-    assert.strictEqual($tabs.find('a:not(.active)').attr('aria-selected'), 'false', 'after second show event, hidden tab has aria-selected = false')
-  })
-
-  QUnit.test('selected tab should deactivate previous selected tab', function (assert) {
-    assert.expect(2)
-    var tabsHTML = '<ul class="nav nav-tabs">'
-        + '<li class="nav-item"><a class="nav-link active" href="#home" data-toggle="tab">Home</a></li>'
-        + '<li class="nav-item"><a class="nav-link" href="#profile" data-toggle="tab">Profile</a></li>'
-        + '</ul>'
-    var $tabs = $(tabsHTML).appendTo('#qunit-fixture')
-
-    $tabs.find('li:last a').trigger('click')
-    assert.notOk($tabs.find('li:first a').hasClass('active'))
-    assert.ok($tabs.find('li:last a').hasClass('active'))
-  })
-
-  QUnit.test('selected tab should deactivate previous selected link in dropdown', function (assert) {
-    assert.expect(3)
-    var tabsHTML = '<ul class="nav nav-tabs">'
-        + '<li class="nav-item"><a class="nav-link" href="#home" data-toggle="tab">Home</a></li>'
-        + '<li class="nav-item"><a class="nav-link" href="#profile" data-toggle="tab">Profile</a></li>'
-        + '<li class="nav-item dropdown"><a class="nav-link dropdown-toggle active" data-toggle="dropdown" href="#">Dropdown</a>'
-        + '<div class="dropdown-menu">'
-        + '<a class="dropdown-item active" href="#dropdown1" id="dropdown1-tab" data-toggle="tab">@fat</a>'
-        + '<a class="dropdown-item" href="#dropdown2" id="dropdown2-tab" data-toggle="tab">@mdo</a>'
-        + '</div>'
-        + '</li>'
-        + '</ul>'
-    var $tabs = $(tabsHTML).appendTo('#qunit-fixture')
-
-    $tabs.find('li:first > a').trigger('click')
-    assert.ok($tabs.find('li:first a').hasClass('active'))
-    assert.notOk($tabs.find('li:last > a').hasClass('active'))
-    assert.notOk($tabs.find('li:last > .dropdown-menu > a:first').hasClass('active'))
-  })
-
-  QUnit.test('Nested tabs', function (assert) {
-    assert.expect(2)
-    var done = assert.async()
-    var tabsHTML =
-          '<nav class="nav nav-tabs" role="tablist">'
-        + '  <a id="tab1" href="#x-tab1" class="nav-item nav-link" data-toggle="tab" role="tab" aria-controls="x-tab1">Tab 1</a>'
-        + '  <a href="#x-tab2" class="nav-item nav-link active" data-toggle="tab" role="tab" aria-controls="x-tab2" aria-selected="true">Tab 2</a>'
-        + '  <a href="#x-tab3" class="nav-item nav-link" data-toggle="tab" role="tab" aria-controls="x-tab3">Tab 3</a>'
-        + '</nav>'
-        + '<div class="tab-content">'
-        + '  <div class="tab-pane" id="x-tab1" role="tabpanel">'
-        + '    <nav class="nav nav-tabs" role="tablist">'
-        + '      <a href="#nested-tab1" class="nav-item nav-link active" data-toggle="tab" role="tab" aria-controls="x-tab1" aria-selected="true">Nested Tab 1</a>'
-        + '      <a id="tabNested2" href="#nested-tab2" class="nav-item nav-link" data-toggle="tab" role="tab" aria-controls="x-profile">Nested Tab2</a>'
-        + '    </nav>'
-        + '    <div class="tab-content">'
-        + '      <div class="tab-pane active" id="nested-tab1" role="tabpanel">Nested Tab1 Content</div>'
-        + '      <div class="tab-pane" id="nested-tab2" role="tabpanel">Nested Tab2 Content</div>'
-        + '    </div>'
-        + '  </div>'
-        + '  <div class="tab-pane active" id="x-tab2" role="tabpanel">Tab2 Content</div>'
-        + '  <div class="tab-pane" id="x-tab3" role="tabpanel">Tab3 Content</div>'
-        + '</div>'
-
-    $(tabsHTML).appendTo('#qunit-fixture')
-
-    $('#tabNested2').on('shown.bs.tab', function () {
-      assert.ok($('#x-tab1').hasClass('active'))
-      done()
-    })
-
-    $('#tab1').on('shown.bs.tab', function () {
-      assert.ok($('#x-tab1').hasClass('active'))
-      $('#tabNested2').trigger($.Event('click'))
-    })
-    .trigger($.Event('click'))
-  })
-})
diff --git a/assets/javascript/tests/unit/tooltip.js b/assets/javascript/tests/unit/tooltip.js
deleted file mode 100644
index e4e6bdd..0000000
--- a/assets/javascript/tests/unit/tooltip.js
+++ /dev/null
@@ -1,851 +0,0 @@
-$(function () {
-  'use strict'
-
-  QUnit.module('tooltip plugin')
-
-  QUnit.test('should be defined on jquery object', function (assert) {
-    assert.expect(1)
-    assert.ok($(document.body).tooltip, 'tooltip method is defined')
-  })
-
-  QUnit.module('tooltip', {
-    beforeEach: function () {
-      // Run all tests in noConflict mode -- it's the only way to ensure that the plugin works in noConflict mode
-      $.fn.bootstrapTooltip = $.fn.tooltip.noConflict()
-    },
-    afterEach: function () {
-      $.fn.tooltip = $.fn.bootstrapTooltip
-      delete $.fn.bootstrapTooltip
-      $('.tooltip').remove()
-    }
-  })
-
-  QUnit.test('should provide no conflict', function (assert) {
-    assert.expect(1)
-    assert.strictEqual(typeof $.fn.tooltip, 'undefined', 'tooltip was set back to undefined (org value)')
-  })
-
-  QUnit.test('should throw explicit error on undefined method', function (assert) {
-    assert.expect(1)
-    var $el = $('<div/>')
-    $el.bootstrapTooltip()
-    try {
-      $el.bootstrapTooltip('noMethod')
-    }
-    catch (err) {
-      assert.strictEqual(err.message, 'No method named "noMethod"')
-    }
-  })
-
-  QUnit.test('should return jquery collection containing the element', function (assert) {
-    assert.expect(2)
-    var $el = $('<div/>')
-    var $tooltip = $el.bootstrapTooltip()
-    assert.ok($tooltip instanceof $, 'returns jquery collection')
-    assert.strictEqual($tooltip[0], $el[0], 'collection contains element')
-  })
-
-  QUnit.test('should expose default settings', function (assert) {
-    assert.expect(1)
-    assert.ok($.fn.bootstrapTooltip.Constructor.Default, 'defaults is defined')
-  })
-
-  QUnit.test('should empty title attribute', function (assert) {
-    assert.expect(1)
-    var $trigger = $('<a href="#" rel="tooltip" title="Another tooltip"/>').bootstrapTooltip()
-    assert.strictEqual($trigger.attr('title'), '', 'title attribute was emptied')
-  })
-
-  QUnit.test('should add data attribute for referencing original title', function (assert) {
-    assert.expect(1)
-    var $trigger = $('<a href="#" rel="tooltip" title="Another tooltip"/>').bootstrapTooltip()
-    assert.strictEqual($trigger.attr('data-original-title'), 'Another tooltip', 'original title preserved in data attribute')
-  })
-
-  QUnit.test('should add aria-describedby to the trigger on show', function (assert) {
-    assert.expect(3)
-    var $trigger = $('<a href="#" rel="tooltip" title="Another tooltip"/>')
-      .bootstrapTooltip()
-      .appendTo('#qunit-fixture')
-      .bootstrapTooltip('show')
-
-    var id = $('.tooltip').attr('id')
-
-    assert.strictEqual($('#' + id).length, 1, 'has a unique id')
-    assert.strictEqual($('.tooltip').attr('aria-describedby'), $trigger.attr('id'), 'tooltip id and aria-describedby on trigger match')
-    assert.ok($trigger[0].hasAttribute('aria-describedby'), 'trigger has aria-describedby')
-  })
-
-  QUnit.test('should remove aria-describedby from trigger on hide', function (assert) {
-    assert.expect(2)
-    var $trigger = $('<a href="#" rel="tooltip" title="Another tooltip"/>')
-      .bootstrapTooltip()
-      .appendTo('#qunit-fixture')
-
-    $trigger.bootstrapTooltip('show')
-    assert.ok($trigger[0].hasAttribute('aria-describedby'), 'trigger has aria-describedby')
-
-    $trigger.bootstrapTooltip('hide')
-    assert.ok(!$trigger[0].hasAttribute('aria-describedby'), 'trigger does not have aria-describedby')
-  })
-
-  QUnit.test('should assign a unique id tooltip element', function (assert) {
-    assert.expect(2)
-    $('<a href="#" rel="tooltip" title="Another tooltip"/>')
-      .appendTo('#qunit-fixture')
-      .bootstrapTooltip('show')
-
-    var id = $('.tooltip').attr('id')
-
-    assert.strictEqual($('#' + id).length, 1, 'tooltip has unique id')
-    assert.strictEqual(id.indexOf('tooltip'), 0, 'tooltip id has prefix')
-  })
-
-  QUnit.test('should place tooltips relative to placement option', function (assert) {
-    assert.expect(2)
-    var $tooltip = $('<a href="#" rel="tooltip" title="Another tooltip"/>')
-      .appendTo('#qunit-fixture')
-      .bootstrapTooltip({ placement: 'bottom' })
-
-    $tooltip.bootstrapTooltip('show')
-
-    assert
-      .ok($('.tooltip')
-      .is('.fade.bs-tooltip-bottom.show'), 'has correct classes applied')
-
-    $tooltip.bootstrapTooltip('hide')
-
-    assert.strictEqual($tooltip.data('bs.tooltip').tip.parentNode, null, 'tooltip removed')
-  })
-
-  QUnit.test('should allow html entities', function (assert) {
-    assert.expect(2)
-    var $tooltip = $('<a href="#" rel="tooltip" title="<b>@fat</b>"/>')
-      .appendTo('#qunit-fixture')
-      .bootstrapTooltip({ html: true })
-
-    $tooltip.bootstrapTooltip('show')
-    assert.notEqual($('.tooltip b').length, 0, 'b tag was inserted')
-
-    $tooltip.bootstrapTooltip('hide')
-    assert.strictEqual($tooltip.data('bs.tooltip').tip.parentNode, null, 'tooltip removed')
-  })
-
-  QUnit.test('should allow DOMElement title (html: false)', function (assert) {
-    assert.expect(3)
-    var title = document.createTextNode('<3 writing tests')
-    var $tooltip = $('<a href="#" rel="tooltip"/>')
-      .appendTo('#qunit-fixture')
-      .bootstrapTooltip({ title: title })
-
-    $tooltip.bootstrapTooltip('show')
-
-    assert.notEqual($('.tooltip').length, 0, 'tooltip inserted')
-    assert.strictEqual($('.tooltip').text(), '<3 writing tests', 'title inserted')
-    assert.ok(!$.contains($('.tooltip').get(0), title), 'title node copied, not moved')
-  })
-
-  QUnit.test('should allow DOMElement title (html: true)', function (assert) {
-    assert.expect(3)
-    var title = document.createTextNode('<3 writing tests')
-    var $tooltip = $('<a href="#" rel="tooltip"/>')
-      .appendTo('#qunit-fixture')
-      .bootstrapTooltip({ html: true, title: title })
-
-    $tooltip.bootstrapTooltip('show')
-
-    assert.notEqual($('.tooltip').length, 0, 'tooltip inserted')
-    assert.strictEqual($('.tooltip').text(), '<3 writing tests', 'title inserted')
-    assert.ok($.contains($('.tooltip').get(0), title), 'title node moved, not copied')
-  })
-
-
-  QUnit.test('should respect custom classes', function (assert) {
-    assert.expect(2)
-    var $tooltip = $('<a href="#" rel="tooltip" title="Another tooltip"/>')
-      .appendTo('#qunit-fixture')
-      .bootstrapTooltip({ template: '<div class="tooltip some-class"><div class="tooltip-arrow"/><div class="tooltip-inner"/></div>' })
-
-    $tooltip.bootstrapTooltip('show')
-    assert.ok($('.tooltip').hasClass('some-class'), 'custom class is present')
-
-    $tooltip.bootstrapTooltip('hide')
-    assert.strictEqual($tooltip.data('bs.tooltip').tip.parentNode, null, 'tooltip removed')
-  })
-
-  QUnit.test('should fire show event', function (assert) {
-    assert.expect(1)
-    var done = assert.async()
-
-    $('<div title="tooltip title"/>')
-      .on('show.bs.tooltip', function () {
-        assert.ok(true, 'show event fired')
-        done()
-      })
-      .bootstrapTooltip('show')
-  })
-
-  QUnit.test('should throw an error when show is called on hidden elements', function (assert) {
-    assert.expect(1)
-    var done = assert.async()
-
-    try {
-      $('<div title="tooltip title" style="display: none"/>').bootstrapTooltip('show')
-    }
-    catch (err) {
-      assert.strictEqual(err.message, 'Please use show on visible elements')
-      done()
-    }
-  })
-
-  QUnit.test('should fire inserted event', function (assert) {
-    assert.expect(2)
-    var done = assert.async()
-
-    $('<div title="tooltip title"/>')
-      .appendTo('#qunit-fixture')
-      .on('inserted.bs.tooltip', function () {
-        assert.notEqual($('.tooltip').length, 0, 'tooltip was inserted')
-        assert.ok(true, 'inserted event fired')
-        done()
-      })
-      .bootstrapTooltip('show')
-  })
-
-  QUnit.test('should fire shown event', function (assert) {
-    assert.expect(1)
-    var done = assert.async()
-
-    $('<div title="tooltip title"></div>')
-      .appendTo('#qunit-fixture')
-      .on('shown.bs.tooltip', function () {
-        assert.ok(true, 'shown was called')
-        done()
-      })
-      .bootstrapTooltip('show')
-  })
-
-  QUnit.test('should not fire shown event when show was prevented', function (assert) {
-    assert.expect(1)
-    var done = assert.async()
-
-    $('<div title="tooltip title"/>')
-      .on('show.bs.tooltip', function (e) {
-        e.preventDefault()
-        assert.ok(true, 'show event fired')
-        done()
-      })
-      .on('shown.bs.tooltip', function () {
-        assert.ok(false, 'shown event fired')
-      })
-      .bootstrapTooltip('show')
-  })
-
-  QUnit.test('should fire hide event', function (assert) {
-    assert.expect(1)
-    var done = assert.async()
-
-    $('<div title="tooltip title"/>')
-      .appendTo('#qunit-fixture')
-      .on('shown.bs.tooltip', function () {
-        $(this).bootstrapTooltip('hide')
-      })
-      .on('hide.bs.tooltip', function () {
-        assert.ok(true, 'hide event fired')
-        done()
-      })
-      .bootstrapTooltip('show')
-  })
-
-  QUnit.test('should fire hidden event', function (assert) {
-    assert.expect(1)
-    var done = assert.async()
-
-    $('<div title="tooltip title"/>')
-      .appendTo('#qunit-fixture')
-      .on('shown.bs.tooltip', function () {
-        $(this).bootstrapTooltip('hide')
-      })
-      .on('hidden.bs.tooltip', function () {
-        assert.ok(true, 'hidden event fired')
-        done()
-      })
-      .bootstrapTooltip('show')
-  })
-
-  QUnit.test('should not fire hidden event when hide was prevented', function (assert) {
-    assert.expect(1)
-    var done = assert.async()
-
-    $('<div title="tooltip title"/>')
-      .appendTo('#qunit-fixture')
-      .on('shown.bs.tooltip', function () {
-        $(this).bootstrapTooltip('hide')
-      })
-      .on('hide.bs.tooltip', function (e) {
-        e.preventDefault()
-        assert.ok(true, 'hide event fired')
-        done()
-      })
-      .on('hidden.bs.tooltip', function () {
-        assert.ok(false, 'hidden event fired')
-      })
-      .bootstrapTooltip('show')
-  })
-
-  QUnit.test('should destroy tooltip', function (assert) {
-    assert.expect(7)
-    var $tooltip = $('<div/>')
-      .bootstrapTooltip()
-      .on('click.foo', function () {})
-
-    assert.ok($tooltip.data('bs.tooltip'), 'tooltip has data')
-    assert.ok($._data($tooltip[0], 'events').mouseover && $._data($tooltip[0], 'events').mouseout, 'tooltip has hover events')
-    assert.strictEqual($._data($tooltip[0], 'events').click[0].namespace, 'foo', 'tooltip has extra click.foo event')
-
-    $tooltip.bootstrapTooltip('show')
-    $tooltip.bootstrapTooltip('dispose')
-
-    assert.ok(!$tooltip.hasClass('show'), 'tooltip is hidden')
-    assert.ok(!$._data($tooltip[0], 'bs.tooltip'), 'tooltip does not have data')
-    assert.strictEqual($._data($tooltip[0], 'events').click[0].namespace, 'foo', 'tooltip still has click.foo')
-    assert.ok(!$._data($tooltip[0], 'events').mouseover && !$._data($tooltip[0], 'events').mouseout, 'tooltip does not have hover events')
-  })
-
-  // QUnit.test('should show tooltip with delegate selector on click', function (assert) {
-  //   assert.expect(2)
-  //   var $div = $('<div><a href="#" rel="tooltip" title="Another tooltip"/></div>')
-  //     .appendTo('#qunit-fixture')
-  //     .bootstrapTooltip({
-  //       selector: 'a[rel="tooltip"]',
-  //       trigger: 'click'
-  //     })
-
-  //   $div.find('a').trigger('click')
-  //   assert.ok($('.tooltip').is('.fade.in'), 'tooltip is faded in')
-
-  //   $div.find('a').trigger('click')
-  //   assert.strictEqual($div.data('bs.tooltip').tip.parentNode, null, 'tooltip removed')
-  // })
-
-  QUnit.test('should show tooltip when toggle is called', function (assert) {
-    assert.expect(1)
-    $('<a href="#" rel="tooltip" title="tooltip on toggle"/>')
-      .appendTo('#qunit-fixture')
-      .bootstrapTooltip({ trigger: 'manual' })
-      .bootstrapTooltip('toggle')
-
-    assert.ok($('.tooltip').is('.fade.show'), 'tooltip is faded active')
-  })
-
-  QUnit.test('should hide previously shown tooltip when toggle is called on tooltip', function (assert) {
-    assert.expect(1)
-    $('<a href="#" rel="tooltip" title="tooltip on toggle">@ResentedHook</a>')
-      .appendTo('#qunit-fixture')
-      .bootstrapTooltip({ trigger: 'manual' })
-      .bootstrapTooltip('show')
-
-    $('.tooltip').bootstrapTooltip('toggle')
-    assert.ok($('.tooltip').not('.fade.show'), 'tooltip was faded out')
-  })
-
-  QUnit.test('should place tooltips inside body when container is body', function (assert) {
-    assert.expect(3)
-    var $tooltip = $('<a href="#" rel="tooltip" title="Another tooltip"/>')
-      .appendTo('#qunit-fixture')
-      .bootstrapTooltip({ container: 'body' })
-      .bootstrapTooltip('show')
-
-    assert.notEqual($('body > .tooltip').length, 0, 'tooltip is direct descendant of body')
-    assert.strictEqual($('#qunit-fixture > .tooltip').length, 0, 'tooltip is not in parent')
-
-    $tooltip.bootstrapTooltip('hide')
-    assert.strictEqual($('body > .tooltip').length, 0, 'tooltip was removed from dom')
-  })
-
-  QUnit.test('should add position class before positioning so that position-specific styles are taken into account', function (assert) {
-    assert.expect(2)
-    var done = assert.async()
-    var styles = '<style>'
-      + '.bs-tooltip-right { white-space: nowrap; }'
-      + '.bs-tooltip-right .tooltip-inner { max-width: none; }'
-      + '</style>'
-    var $styles = $(styles).appendTo('head')
-
-    var $container = $('<div/>').appendTo('#qunit-fixture')
-    $('<a href="#" rel="tooltip" title="very very very very very very very very long tooltip in one line"/>')
-      .appendTo($container)
-      .bootstrapTooltip({
-        placement: 'right',
-        trigger: 'manual'
-      })
-      .on('inserted.bs.tooltip', function () {
-        var $tooltip = $($(this).data('bs.tooltip').tip)
-        assert.ok($tooltip.hasClass('bs-tooltip-right'))
-        assert.ok(typeof $tooltip.attr('style') === 'undefined')
-        $styles.remove()
-        done()
-      })
-      .bootstrapTooltip('show')
-  })
-
-  QUnit.test('should use title attribute for tooltip text', function (assert) {
-    assert.expect(2)
-    var $tooltip = $('<a href="#" rel="tooltip" title="Simple tooltip"/>')
-      .appendTo('#qunit-fixture')
-      .bootstrapTooltip()
-
-    $tooltip.bootstrapTooltip('show')
-    assert.strictEqual($('.tooltip').children('.tooltip-inner').text(), 'Simple tooltip', 'title from title attribute is set')
-
-    $tooltip.bootstrapTooltip('hide')
-    assert.strictEqual($('.tooltip').length, 0, 'tooltip removed from dom')
-  })
-
-  QUnit.test('should prefer title attribute over title option', function (assert) {
-    assert.expect(2)
-    var $tooltip = $('<a href="#" rel="tooltip" title="Simple tooltip"/>')
-      .appendTo('#qunit-fixture')
-      .bootstrapTooltip({
-        title: 'This is a tooltip with some content'
-      })
-
-    $tooltip.bootstrapTooltip('show')
-    assert.strictEqual($('.tooltip').children('.tooltip-inner').text(), 'Simple tooltip', 'title is set from title attribute while preferred over title option')
-
-    $tooltip.bootstrapTooltip('hide')
-    assert.strictEqual($('.tooltip').length, 0, 'tooltip removed from dom')
-  })
-
-  QUnit.test('should use title option', function (assert) {
-    assert.expect(2)
-    var $tooltip = $('<a href="#" rel="tooltip"/>')
-      .appendTo('#qunit-fixture')
-      .bootstrapTooltip({
-        title: 'This is a tooltip with some content'
-      })
-
-    $tooltip.bootstrapTooltip('show')
-    assert.strictEqual($('.tooltip').children('.tooltip-inner').text(), 'This is a tooltip with some content', 'title from title option is set')
-
-    $tooltip.bootstrapTooltip('hide')
-    assert.strictEqual($('.tooltip').length, 0, 'tooltip removed from dom')
-  })
-
-  QUnit.test('should not error when trying to show an top-placed tooltip that has been removed from the dom', function (assert) {
-    assert.expect(1)
-    var passed = true
-    var $tooltip = $('<a href="#" rel="tooltip" title="Another tooltip"/>')
-      .appendTo('#qunit-fixture')
-      .one('show.bs.tooltip', function () {
-        $(this).remove()
-      })
-      .bootstrapTooltip({ placement: 'top' })
-
-    try {
-      $tooltip.bootstrapTooltip('show')
-    } catch (err) {
-      passed = false
-      console.log(err)
-    }
-
-    assert.ok(passed, '.tooltip(\'show\') should not throw an error if element no longer is in dom')
-  })
-
-  QUnit.test('should place tooltip on top of element', function (assert) {
-    assert.expect(1)
-    var done = assert.async()
-
-    var containerHTML = '<div id="test">'
-        + '<p style="margin-top: 200px">'
-        + '<a href="#" title="very very very very very very very long tooltip">Hover me</a>'
-        + '</p>'
-        + '</div>'
-
-    var $container = $(containerHTML)
-      .css({
-        position: 'absolute',
-        bottom: 0,
-        left: 0,
-        textAlign: 'right',
-        width: 300,
-        height: 300
-      })
-      .appendTo('#qunit-fixture')
-
-    $container
-      .find('a')
-      .css('margin-top', 200)
-      .bootstrapTooltip({
-        placement: 'top',
-        animate: false
-      })
-      .on('shown.bs.tooltip', function () {
-        var $tooltip = $($(this).data('bs.tooltip').tip)
-        if (/iPhone|iPad|iPod/.test(navigator.userAgent)) {
-          assert.ok(Math.round($tooltip.offset().top + $tooltip.outerHeight()) <= Math.round($(this).offset().top))
-        }
-        else {
-          assert.ok(Math.round($tooltip.offset().top + $tooltip.outerHeight()) >= Math.round($(this).offset().top))
-        }
-        done()
-      })
-      .bootstrapTooltip('show')
-  })
-
-  QUnit.test('should show tooltip if leave event hasn\'t occurred before delay expires', function (assert) {
-    assert.expect(2)
-    var done = assert.async()
-
-    var $tooltip = $('<a href="#" rel="tooltip" title="Another tooltip"/>')
-      .appendTo('#qunit-fixture')
-      .bootstrapTooltip({ delay: 150 })
-
-    setTimeout(function () {
-      assert.ok(!$('.tooltip').is('.fade.show'), '100ms: tooltip is not faded active')
-    }, 100)
-
-    setTimeout(function () {
-      assert.ok($('.tooltip').is('.fade.show'), '200ms: tooltip is faded active')
-      done()
-    }, 200)
-
-    $tooltip.trigger('mouseenter')
-  })
-
-  QUnit.test('should not show tooltip if leave event occurs before delay expires', function (assert) {
-    assert.expect(2)
-    var done = assert.async()
-
-    var $tooltip = $('<a href="#" rel="tooltip" title="Another tooltip"/>')
-      .appendTo('#qunit-fixture')
-      .bootstrapTooltip({ delay: 150 })
-
-    setTimeout(function () {
-      assert.ok(!$('.tooltip').is('.fade.show'), '100ms: tooltip not faded active')
-      $tooltip.trigger('mouseout')
-    }, 100)
-
-    setTimeout(function () {
-      assert.ok(!$('.tooltip').is('.fade.show'), '200ms: tooltip not faded active')
-      done()
-    }, 200)
-
-    $tooltip.trigger('mouseenter')
-  })
-
-  QUnit.test('should not hide tooltip if leave event occurs and enter event occurs within the hide delay', function (assert) {
-    assert.expect(3)
-    var done = assert.async()
-
-    var $tooltip = $('<a href="#" rel="tooltip" title="Another tooltip"/>')
-      .appendTo('#qunit-fixture')
-      .bootstrapTooltip({ delay: { show: 0, hide: 150 } })
-
-    setTimeout(function () {
-      assert.ok($('.tooltip').is('.fade.show'), '1ms: tooltip faded active')
-      $tooltip.trigger('mouseout')
-
-      setTimeout(function () {
-        assert.ok($('.tooltip').is('.fade.show'), '100ms: tooltip still faded active')
-        $tooltip.trigger('mouseenter')
-      }, 100)
-
-      setTimeout(function () {
-        assert.ok($('.tooltip').is('.fade.show'), '200ms: tooltip still faded active')
-        done()
-      }, 200)
-    }, 0)
-
-    $tooltip.trigger('mouseenter')
-  })
-
-  QUnit.test('should not show tooltip if leave event occurs before delay expires', function (assert) {
-    assert.expect(2)
-    var done = assert.async()
-
-    var $tooltip = $('<a href="#" rel="tooltip" title="Another tooltip"/>')
-      .appendTo('#qunit-fixture')
-      .bootstrapTooltip({ delay: 150 })
-
-    setTimeout(function () {
-      assert.ok(!$('.tooltip').is('.fade.show'), '100ms: tooltip not faded active')
-      $tooltip.trigger('mouseout')
-    }, 100)
-
-    setTimeout(function () {
-      assert.ok(!$('.tooltip').is('.fade.show'), '200ms: tooltip not faded active')
-      done()
-    }, 200)
-
-    $tooltip.trigger('mouseenter')
-  })
-
-  QUnit.test('should not show tooltip if leave event occurs before delay expires, even if hide delay is 0', function (assert) {
-    assert.expect(2)
-    var done = assert.async()
-
-    var $tooltip = $('<a href="#" rel="tooltip" title="Another tooltip"/>')
-      .appendTo('#qunit-fixture')
-      .bootstrapTooltip({ delay: { show: 150, hide: 0 } })
-
-    setTimeout(function () {
-      assert.ok(!$('.tooltip').is('.fade.show'), '100ms: tooltip not faded active')
-      $tooltip.trigger('mouseout')
-    }, 100)
-
-    setTimeout(function () {
-      assert.ok(!$('.tooltip').is('.fade.show'), '250ms: tooltip not faded active')
-      done()
-    }, 250)
-
-    $tooltip.trigger('mouseenter')
-  })
-
-  QUnit.test('should wait 200ms before hiding the tooltip', function (assert) {
-    assert.expect(3)
-    var done = assert.async()
-
-    var $tooltip = $('<a href="#" rel="tooltip" title="Another tooltip"/>')
-      .appendTo('#qunit-fixture')
-      .bootstrapTooltip({ delay: { show: 0, hide: 150 } })
-
-    setTimeout(function () {
-      assert.ok($($tooltip.data('bs.tooltip').tip).is('.fade.show'), '1ms: tooltip faded active')
-
-      $tooltip.trigger('mouseout')
-
-      setTimeout(function () {
-        assert.ok($($tooltip.data('bs.tooltip').tip).is('.fade.show'), '100ms: tooltip still faded active')
-      }, 100)
-
-      setTimeout(function () {
-        assert.ok(!$($tooltip.data('bs.tooltip').tip).is('.show'), '200ms: tooltip removed')
-        done()
-      }, 200)
-
-    }, 0)
-
-    $tooltip.trigger('mouseenter')
-  })
-
-  QUnit.test('should not reload the tooltip on subsequent mouseenter events', function (assert) {
-    assert.expect(1)
-    var titleHtml = function () {
-      var uid = Util.getUID('tooltip')
-      return '<p id="tt-content">' + uid + '</p><p>' + uid + '</p><p>' + uid + '</p>'
-    }
-
-    var $tooltip = $('<span id="tt-outer" rel="tooltip" data-trigger="hover" data-placement="top">some text</span>')
-      .appendTo('#qunit-fixture')
-
-    $tooltip.bootstrapTooltip({
-      html: true,
-      animation: false,
-      trigger: 'hover',
-      delay: { show: 0, hide: 500 },
-      container: $tooltip,
-      title: titleHtml
-    })
-
-    $('#tt-outer').trigger('mouseenter')
-
-    var currentUid = $('#tt-content').text()
-
-    $('#tt-content').trigger('mouseenter')
-    assert.strictEqual(currentUid, $('#tt-content').text())
-  })
-
-  QUnit.test('should not reload the tooltip if the mouse leaves and re-enters before hiding', function (assert) {
-    assert.expect(4)
-
-    var titleHtml = function () {
-      var uid = Util.getUID('tooltip')
-      return '<p id="tt-content">' + uid + '</p><p>' + uid + '</p><p>' + uid + '</p>'
-    }
-
-    var $tooltip = $('<span id="tt-outer" rel="tooltip" data-trigger="hover" data-placement="top">some text</span>')
-      .appendTo('#qunit-fixture')
-
-    $tooltip.bootstrapTooltip({
-      html: true,
-      animation: false,
-      trigger: 'hover',
-      delay: { show: 0, hide: 500 },
-      title: titleHtml
-    })
-
-    var obj = $tooltip.data('bs.tooltip')
-
-    $('#tt-outer').trigger('mouseenter')
-
-    var currentUid = $('#tt-content').text()
-
-    $('#tt-outer').trigger('mouseleave')
-    assert.strictEqual(currentUid, $('#tt-content').text())
-
-    assert.ok(obj._hoverState === 'out', 'the tooltip hoverState should be set to "out"')
-
-    $('#tt-outer').trigger('mouseenter')
-    assert.ok(obj._hoverState === 'show', 'the tooltip hoverState should be set to "show"')
-
-    assert.strictEqual(currentUid, $('#tt-content').text())
-  })
-
-  QUnit.test('should do nothing when an attempt is made to hide an uninitialized tooltip', function (assert) {
-    assert.expect(1)
-
-    var $tooltip = $('<span data-toggle="tooltip" title="some tip">some text</span>')
-      .appendTo('#qunit-fixture')
-      .on('hidden.bs.tooltip shown.bs.tooltip', function () {
-        assert.ok(false, 'should not fire any tooltip events')
-      })
-      .bootstrapTooltip('hide')
-    assert.strictEqual(typeof $tooltip.data('bs.tooltip'), 'undefined', 'should not initialize the tooltip')
-  })
-
-  QUnit.test('should not remove tooltip if multiple triggers are set and one is still active', function (assert) {
-    assert.expect(41)
-    var $el = $('<button>Trigger</button>')
-      .appendTo('#qunit-fixture')
-      .bootstrapTooltip({ trigger: 'click hover focus', animation: false })
-    var tooltip = $el.data('bs.tooltip')
-    var $tooltip = $(tooltip.getTipElement())
-
-    function showingTooltip() { return $tooltip.hasClass('show') || tooltip._hoverState === 'show' }
-
-    var tests = [
-        ['mouseenter', 'mouseleave'],
-
-        ['focusin', 'focusout'],
-
-        ['click', 'click'],
-
-        ['mouseenter', 'focusin', 'focusout', 'mouseleave'],
-        ['mouseenter', 'focusin', 'mouseleave', 'focusout'],
-
-        ['focusin', 'mouseenter', 'mouseleave', 'focusout'],
-        ['focusin', 'mouseenter', 'focusout', 'mouseleave'],
-
-        ['click', 'focusin', 'mouseenter', 'focusout', 'mouseleave', 'click'],
-        ['mouseenter', 'click', 'focusin', 'focusout', 'mouseleave', 'click'],
-        ['mouseenter', 'focusin', 'click', 'click', 'mouseleave', 'focusout']
-    ]
-
-    assert.ok(!showingTooltip())
-
-    $.each(tests, function (idx, triggers) {
-      for (var i = 0, len = triggers.length; i < len; i++) {
-        $el.trigger(triggers[i])
-        assert.equal(i < len - 1, showingTooltip())
-      }
-    })
-  })
-
-  QUnit.test('should show on first trigger after hide', function (assert) {
-    assert.expect(3)
-    var $el = $('<a href="#" rel="tooltip" title="Test tooltip"/>')
-      .appendTo('#qunit-fixture')
-      .bootstrapTooltip({ trigger: 'click hover focus', animation: false })
-
-    var tooltip = $el.data('bs.tooltip')
-    var $tooltip = $(tooltip.getTipElement())
-
-    function showingTooltip() { return $tooltip.hasClass('show') || tooltip._hoverState === 'show' }
-
-    $el.trigger('click')
-    assert.ok(showingTooltip(), 'tooltip is faded in')
-
-    $el.bootstrapTooltip('hide')
-    assert.ok(!showingTooltip(), 'tooltip was faded out')
-
-    $el.trigger('click')
-    assert.ok(showingTooltip(), 'tooltip is faded in again')
-  })
-
-  QUnit.test('should hide tooltip when their containing modal is closed', function (assert) {
-    assert.expect(1)
-    var done = assert.async()
-    var templateHTML = '<div id="modal-test" class="modal">' +
-                          '<div class="modal-dialog" role="document">' +
-                            '<div class="modal-content">' +
-                              '<div class="modal-body">' +
-                                '<a id="tooltipTest" href="#" data-toggle="tooltip" title="Some tooltip text!">Tooltip</a>' +
-                              '</div>' +
-                            '</div>' +
-                          '</div>' +
-                        '</div>'
-
-    $(templateHTML).appendTo('#qunit-fixture')
-    $('#tooltipTest')
-      .bootstrapTooltip({ trigger: 'manuel' })
-      .on('shown.bs.tooltip', function () {
-        $('#modal-test').modal('hide')
-      })
-      .on('hide.bs.tooltip', function () {
-        assert.ok(true, 'tooltip hide')
-        done()
-      })
-
-    $('#modal-test')
-      .on('shown.bs.modal', function () {
-        $('#tooltipTest').bootstrapTooltip('show')
-      })
-      .modal('show')
-  })
-
-  QUnit.test('should reset tip classes when hidden event triggered', function (assert) {
-    assert.expect(2)
-    var done = assert.async()
-    var $el = $('<a href="#" rel="tooltip" title="Test tooltip"/>')
-      .appendTo('#qunit-fixture')
-      .bootstrapTooltip('show')
-      .on('hidden.bs.tooltip', function () {
-        var tooltip = $el.data('bs.tooltip')
-        var $tooltip = $(tooltip.getTipElement())
-        assert.ok($tooltip.hasClass('tooltip'))
-        assert.ok($tooltip.hasClass('fade'))
-        done()
-      })
-
-    $el.bootstrapTooltip('hide')
-  })
-
-  QUnit.test('should convert number in title to string', function (assert) {
-    assert.expect(1)
-    var done = assert.async()
-    var $el = $('<a href="#" rel="tooltip" title="7"/>')
-      .appendTo('#qunit-fixture')
-      .bootstrapTooltip('show')
-      .on('shown.bs.tooltip', function () {
-        var tooltip = $el.data('bs.tooltip')
-        var $tooltip = $(tooltip.getTipElement())
-        assert.strictEqual($tooltip.children().text(), '7')
-        done()
-      })
-
-    $el.bootstrapTooltip('show')
-  })
-
-  QUnit.test('tooltip should be shown right away after the call of disable/enable', function (assert) {
-    assert.expect(2)
-    var done = assert.async()
-
-    var $trigger = $('<a href="#" rel="tooltip" data-trigger="click" title="Another tooltip"/>')
-      .appendTo('#qunit-fixture')
-      .bootstrapTooltip()
-      .on('shown.bs.tooltip', function () {
-        assert.strictEqual($('.tooltip').hasClass('show'), true)
-        done()
-      })
-
-
-    $trigger.bootstrapTooltip('disable')
-    $trigger.trigger($.Event('click'))
-    setTimeout(function () {
-      assert.strictEqual($('.tooltip').length === 0, true)
-      $trigger.bootstrapTooltip('enable')
-      $trigger.trigger($.Event('click'))
-    }, 200)
-  })
-})
diff --git a/assets/javascript/tests/vendor/qunit.css b/assets/javascript/tests/vendor/qunit.css
deleted file mode 100644
index 4749222..0000000
--- a/assets/javascript/tests/vendor/qunit.css
+++ /dev/null
@@ -1,436 +0,0 @@
-/*!
- * QUnit 2.4.0
- * https://qunitjs.com/
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license
- * https://jquery.org/license
- *
- * Date: 2017-07-08T15:20Z
- */
-
-/** Font Family and Sizes */
-
-#qunit-tests, #qunit-header, #qunit-banner, #qunit-testrunner-toolbar, #qunit-filteredTest, #qunit-userAgent, #qunit-testresult {
-	font-family: "Helvetica Neue Light", "HelveticaNeue-Light", "Helvetica Neue", Calibri, Helvetica, Arial, sans-serif;
-}
-
-#qunit-testrunner-toolbar, #qunit-filteredTest, #qunit-userAgent, #qunit-testresult, #qunit-tests li { font-size: small; }
-#qunit-tests { font-size: smaller; }
-
-
-/** Resets */
-
-#qunit-tests, #qunit-header, #qunit-banner, #qunit-filteredTest, #qunit-userAgent, #qunit-testresult, #qunit-modulefilter {
-	margin: 0;
-	padding: 0;
-}
-
-
-/** Header (excluding toolbar) */
-
-#qunit-header {
-	padding: 0.5em 0 0.5em 1em;
-
-	color: #8699A4;
-	background-color: #0D3349;
-
-	font-size: 1.5em;
-	line-height: 1em;
-	font-weight: 400;
-
-	border-radius: 5px 5px 0 0;
-}
-
-#qunit-header a {
-	text-decoration: none;
-	color: #C2CCD1;
-}
-
-#qunit-header a:hover,
-#qunit-header a:focus {
-	color: #FFF;
-}
-
-#qunit-banner {
-	height: 5px;
-}
-
-#qunit-filteredTest {
-	padding: 0.5em 1em 0.5em 1em;
-	color: #366097;
-	background-color: #F4FF77;
-}
-
-#qunit-userAgent {
-	padding: 0.5em 1em 0.5em 1em;
-	color: #FFF;
-	background-color: #2B81AF;
-	text-shadow: rgba(0, 0, 0, 0.5) 2px 2px 1px;
-}
-
-
-/** Toolbar */
-
-#qunit-testrunner-toolbar {
-	padding: 0.5em 1em 0.5em 1em;
-	color: #5E740B;
-	background-color: #EEE;
-}
-
-#qunit-testrunner-toolbar .clearfix {
-	height: 0;
-	clear: both;
-}
-
-#qunit-testrunner-toolbar label {
-	display: inline-block;
-}
-
-#qunit-testrunner-toolbar input[type=checkbox],
-#qunit-testrunner-toolbar input[type=radio] {
-	margin: 3px;
-	vertical-align: -2px;
-}
-
-#qunit-testrunner-toolbar input[type=text] {
-	box-sizing: border-box;
-	height: 1.6em;
-}
-
-.qunit-url-config,
-.qunit-filter,
-#qunit-modulefilter {
-	display: inline-block;
-	line-height: 2.1em;
-}
-
-.qunit-filter,
-#qunit-modulefilter {
-	float: right;
-	position: relative;
-	margin-left: 1em;
-}
-
-.qunit-url-config label {
-	margin-right: 0.5em;
-}
-
-#qunit-modulefilter-search {
-	box-sizing: border-box;
-	width: 400px;
-}
-
-#qunit-modulefilter-search-container:after {
-	position: absolute;
-	right: 0.3em;
-	content: "\25bc";
-	color: black;
-}
-
-#qunit-modulefilter-dropdown {
-	/* align with #qunit-modulefilter-search */
-	box-sizing: border-box;
-	width: 400px;
-	position: absolute;
-	right: 0;
-	top: 50%;
-	margin-top: 0.8em;
-
-	border: 1px solid #D3D3D3;
-	border-top: none;
-	border-radius: 0 0 .25em .25em;
-	color: #000;
-	background-color: #F5F5F5;
-	z-index: 99;
-}
-
-#qunit-modulefilter-dropdown a {
-	color: inherit;
-	text-decoration: none;
-}
-
-#qunit-modulefilter-dropdown .clickable.checked {
-	font-weight: bold;
-	color: #000;
-	background-color: #D2E0E6;
-}
-
-#qunit-modulefilter-dropdown .clickable:hover {
-	color: #FFF;
-	background-color: #0D3349;
-}
-
-#qunit-modulefilter-actions {
-	display: block;
-	overflow: auto;
-
-	/* align with #qunit-modulefilter-dropdown-list */
-	font: smaller/1.5em sans-serif;
-}
-
-#qunit-modulefilter-dropdown #qunit-modulefilter-actions > * {
-	box-sizing: border-box;
-	max-height: 2.8em;
-	display: block;
-	padding: 0.4em;
-}
-
-#qunit-modulefilter-dropdown #qunit-modulefilter-actions > button {
-	float: right;
-	font: inherit;
-}
-
-#qunit-modulefilter-dropdown #qunit-modulefilter-actions > :last-child {
-	/* insert padding to align with checkbox margins */
-	padding-left: 3px;
-}
-
-#qunit-modulefilter-dropdown-list {
-	max-height: 200px;
-	overflow-y: auto;
-	margin: 0;
-	border-top: 2px groove threedhighlight;
-	padding: 0.4em 0 0;
-	font: smaller/1.5em sans-serif;
-}
-
-#qunit-modulefilter-dropdown-list li {
-	white-space: nowrap;
-	overflow: hidden;
-	text-overflow: ellipsis;
-}
-
-#qunit-modulefilter-dropdown-list .clickable {
-	display: block;
-	padding-left: 0.15em;
-}
-
-
-/** Tests: Pass/Fail */
-
-#qunit-tests {
-	list-style-position: inside;
-}
-
-#qunit-tests li {
-	padding: 0.4em 1em 0.4em 1em;
-	border-bottom: 1px solid #FFF;
-	list-style-position: inside;
-}
-
-#qunit-tests > li {
-	display: none;
-}
-
-#qunit-tests li.running,
-#qunit-tests li.pass,
-#qunit-tests li.fail,
-#qunit-tests li.skipped,
-#qunit-tests li.aborted {
-	display: list-item;
-}
-
-#qunit-tests.hidepass {
-	position: relative;
-}
-
-#qunit-tests.hidepass li.running,
-#qunit-tests.hidepass li.pass:not(.todo) {
-	visibility: hidden;
-	position: absolute;
-	width:   0;
-	height:  0;
-	padding: 0;
-	border:  0;
-	margin:  0;
-}
-
-#qunit-tests li strong {
-	cursor: pointer;
-}
-
-#qunit-tests li.skipped strong {
-	cursor: default;
-}
-
-#qunit-tests li a {
-	padding: 0.5em;
-	color: #C2CCD1;
-	text-decoration: none;
-}
-
-#qunit-tests li p a {
-	padding: 0.25em;
-	color: #6B6464;
-}
-#qunit-tests li a:hover,
-#qunit-tests li a:focus {
-	color: #000;
-}
-
-#qunit-tests li .runtime {
-	float: right;
-	font-size: smaller;
-}
-
-.qunit-assert-list {
-	margin-top: 0.5em;
-	padding: 0.5em;
-
-	background-color: #FFF;
-
-	border-radius: 5px;
-}
-
-.qunit-source {
-	margin: 0.6em 0 0.3em;
-}
-
-.qunit-collapsed {
-	display: none;
-}
-
-#qunit-tests table {
-	border-collapse: collapse;
-	margin-top: 0.2em;
-}
-
-#qunit-tests th {
-	text-align: right;
-	vertical-align: top;
-	padding: 0 0.5em 0 0;
-}
-
-#qunit-tests td {
-	vertical-align: top;
-}
-
-#qunit-tests pre {
-	margin: 0;
-	white-space: pre-wrap;
-	word-wrap: break-word;
-}
-
-#qunit-tests del {
-	color: #374E0C;
-	background-color: #E0F2BE;
-	text-decoration: none;
-}
-
-#qunit-tests ins {
-	color: #500;
-	background-color: #FFCACA;
-	text-decoration: none;
-}
-
-/*** Test Counts */
-
-#qunit-tests b.counts                       { color: #000; }
-#qunit-tests b.passed                       { color: #5E740B; }
-#qunit-tests b.failed                       { color: #710909; }
-
-#qunit-tests li li {
-	padding: 5px;
-	background-color: #FFF;
-	border-bottom: none;
-	list-style-position: inside;
-}
-
-/*** Passing Styles */
-
-#qunit-tests li li.pass {
-	color: #3C510C;
-	background-color: #FFF;
-	border-left: 10px solid #C6E746;
-}
-
-#qunit-tests .pass                          { color: #528CE0; background-color: #D2E0E6; }
-#qunit-tests .pass .test-name               { color: #366097; }
-
-#qunit-tests .pass .test-actual,
-#qunit-tests .pass .test-expected           { color: #999; }
-
-#qunit-banner.qunit-pass                    { background-color: #C6E746; }
-
-/*** Failing Styles */
-
-#qunit-tests li li.fail {
-	color: #710909;
-	background-color: #FFF;
-	border-left: 10px solid #EE5757;
-	white-space: pre;
-}
-
-#qunit-tests > li:last-child {
-	border-radius: 0 0 5px 5px;
-}
-
-#qunit-tests .fail                          { color: #000; background-color: #EE5757; }
-#qunit-tests .fail .test-name,
-#qunit-tests .fail .module-name             { color: #000; }
-
-#qunit-tests .fail .test-actual             { color: #EE5757; }
-#qunit-tests .fail .test-expected           { color: #008000; }
-
-#qunit-banner.qunit-fail                    { background-color: #EE5757; }
-
-
-/*** Aborted tests */
-#qunit-tests .aborted { color: #000; background-color: orange; }
-/*** Skipped tests */
-
-#qunit-tests .skipped {
-	background-color: #EBECE9;
-}
-
-#qunit-tests .qunit-todo-label,
-#qunit-tests .qunit-skipped-label {
-	background-color: #F4FF77;
-	display: inline-block;
-	font-style: normal;
-	color: #366097;
-	line-height: 1.8em;
-	padding: 0 0.5em;
-	margin: -0.4em 0.4em -0.4em 0;
-}
-
-#qunit-tests .qunit-todo-label {
-	background-color: #EEE;
-}
-
-/** Result */
-
-#qunit-testresult {
-	color: #2B81AF;
-	background-color: #D2E0E6;
-
-	border-bottom: 1px solid #FFF;
-}
-#qunit-testresult .clearfix {
-	height: 0;
-	clear: both;
-}
-#qunit-testresult .module-name {
-	font-weight: 700;
-}
-#qunit-testresult-display {
-	padding: 0.5em 1em 0.5em 1em;
-	width: 85%;
-	float:left;
-}
-#qunit-testresult-controls {
-	padding: 0.5em 1em 0.5em 1em;
-  width: 10%;
-	float:left;
-}
-
-/** Fixture */
-
-#qunit-fixture {
-	position: absolute;
-	top: -10000px;
-	left: -10000px;
-	width: 1000px;
-	height: 1000px;
-}
diff --git a/assets/javascript/tests/vendor/qunit.js b/assets/javascript/tests/vendor/qunit.js
deleted file mode 100644
index bb8f31d..0000000
--- a/assets/javascript/tests/vendor/qunit.js
+++ /dev/null
@@ -1,5048 +0,0 @@
-/*!
- * QUnit 2.4.0
- * https://qunitjs.com/
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license
- * https://jquery.org/license
- *
- * Date: 2017-07-08T15:20Z
- */
-(function (global$1) {
-  'use strict';
-
-  global$1 = global$1 && 'default' in global$1 ? global$1['default'] : global$1;
-
-  var window = global$1.window;
-  var self$1 = global$1.self;
-  var console = global$1.console;
-  var setTimeout = global$1.setTimeout;
-  var clearTimeout = global$1.clearTimeout;
-
-  var document = window && window.document;
-  var navigator = window && window.navigator;
-
-  var localSessionStorage = function () {
-  	var x = "qunit-test-string";
-  	try {
-  		global$1.sessionStorage.setItem(x, x);
-  		global$1.sessionStorage.removeItem(x);
-  		return global$1.sessionStorage;
-  	} catch (e) {
-  		return undefined;
-  	}
-  }();
-
-  var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) {
-    return typeof obj;
-  } : function (obj) {
-    return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;
-  };
-
-
-
-
-
-
-
-
-
-
-
-  var classCallCheck = function (instance, Constructor) {
-    if (!(instance instanceof Constructor)) {
-      throw new TypeError("Cannot call a class as a function");
-    }
-  };
-
-  var createClass = function () {
-    function defineProperties(target, props) {
-      for (var i = 0; i < props.length; i++) {
-        var descriptor = props[i];
-        descriptor.enumerable = descriptor.enumerable || false;
-        descriptor.configurable = true;
-        if ("value" in descriptor) descriptor.writable = true;
-        Object.defineProperty(target, descriptor.key, descriptor);
-      }
-    }
-
-    return function (Constructor, protoProps, staticProps) {
-      if (protoProps) defineProperties(Constructor.prototype, protoProps);
-      if (staticProps) defineProperties(Constructor, staticProps);
-      return Constructor;
-    };
-  }();
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-  var toConsumableArray = function (arr) {
-    if (Array.isArray(arr)) {
-      for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i];
-
-      return arr2;
-    } else {
-      return Array.from(arr);
-    }
-  };
-
-  var toString = Object.prototype.toString;
-  var hasOwn = Object.prototype.hasOwnProperty;
-  var now = Date.now || function () {
-  	return new Date().getTime();
-  };
-
-  var defined = {
-  	document: window && window.document !== undefined,
-  	setTimeout: setTimeout !== undefined
-  };
-
-  // Returns a new Array with the elements that are in a but not in b
-  function diff(a, b) {
-  	var i,
-  	    j,
-  	    result = a.slice();
-
-  	for (i = 0; i < result.length; i++) {
-  		for (j = 0; j < b.length; j++) {
-  			if (result[i] === b[j]) {
-  				result.splice(i, 1);
-  				i--;
-  				break;
-  			}
-  		}
-  	}
-  	return result;
-  }
-
-  /**
-   * Determines whether an element exists in a given array or not.
-   *
-   * @method inArray
-   * @param {Any} elem
-   * @param {Array} array
-   * @return {Boolean}
-   */
-  function inArray(elem, array) {
-  	return array.indexOf(elem) !== -1;
-  }
-
-  /**
-   * Makes a clone of an object using only Array or Object as base,
-   * and copies over the own enumerable properties.
-   *
-   * @param {Object} obj
-   * @return {Object} New object with only the own properties (recursively).
-   */
-  function objectValues(obj) {
-  	var key,
-  	    val,
-  	    vals = is("array", obj) ? [] : {};
-  	for (key in obj) {
-  		if (hasOwn.call(obj, key)) {
-  			val = obj[key];
-  			vals[key] = val === Object(val) ? objectValues(val) : val;
-  		}
-  	}
-  	return vals;
-  }
-
-  function extend(a, b, undefOnly) {
-  	for (var prop in b) {
-  		if (hasOwn.call(b, prop)) {
-  			if (b[prop] === undefined) {
-  				delete a[prop];
-  			} else if (!(undefOnly && typeof a[prop] !== "undefined")) {
-  				a[prop] = b[prop];
-  			}
-  		}
-  	}
-
-  	return a;
-  }
-
-  function objectType(obj) {
-  	if (typeof obj === "undefined") {
-  		return "undefined";
-  	}
-
-  	// Consider: typeof null === object
-  	if (obj === null) {
-  		return "null";
-  	}
-
-  	var match = toString.call(obj).match(/^\[object\s(.*)\]$/),
-  	    type = match && match[1];
-
-  	switch (type) {
-  		case "Number":
-  			if (isNaN(obj)) {
-  				return "nan";
-  			}
-  			return "number";
-  		case "String":
-  		case "Boolean":
-  		case "Array":
-  		case "Set":
-  		case "Map":
-  		case "Date":
-  		case "RegExp":
-  		case "Function":
-  		case "Symbol":
-  			return type.toLowerCase();
-  		default:
-  			return typeof obj === "undefined" ? "undefined" : _typeof(obj);
-  	}
-  }
-
-  // Safe object type checking
-  function is(type, obj) {
-  	return objectType(obj) === type;
-  }
-
-  // Based on Java's String.hashCode, a simple but not
-  // rigorously collision resistant hashing function
-  function generateHash(module, testName) {
-  	var str = module + "\x1C" + testName;
-  	var hash = 0;
-
-  	for (var i = 0; i < str.length; i++) {
-  		hash = (hash << 5) - hash + str.charCodeAt(i);
-  		hash |= 0;
-  	}
-
-  	// Convert the possibly negative integer hash code into an 8 character hex string, which isn't
-  	// strictly necessary but increases user understanding that the id is a SHA-like hash
-  	var hex = (0x100000000 + hash).toString(16);
-  	if (hex.length < 8) {
-  		hex = "0000000" + hex;
-  	}
-
-  	return hex.slice(-8);
-  }
-
-  // Test for equality any JavaScript type.
-  // Authors: Philippe Rathé <prathe at gmail.com>, David Chan <david at troi.org>
-  var equiv = (function () {
-
-  	// Value pairs queued for comparison. Used for breadth-first processing order, recursion
-  	// detection and avoiding repeated comparison (see below for details).
-  	// Elements are { a: val, b: val }.
-  	var pairs = [];
-
-  	var getProto = Object.getPrototypeOf || function (obj) {
-  		return obj.__proto__;
-  	};
-
-  	function useStrictEquality(a, b) {
-
-  		// This only gets called if a and b are not strict equal, and is used to compare on
-  		// the primitive values inside object wrappers. For example:
-  		// `var i = 1;`
-  		// `var j = new Number(1);`
-  		// Neither a nor b can be null, as a !== b and they have the same type.
-  		if ((typeof a === "undefined" ? "undefined" : _typeof(a)) === "object") {
-  			a = a.valueOf();
-  		}
-  		if ((typeof b === "undefined" ? "undefined" : _typeof(b)) === "object") {
-  			b = b.valueOf();
-  		}
-
-  		return a === b;
-  	}
-
-  	function compareConstructors(a, b) {
-  		var protoA = getProto(a);
-  		var protoB = getProto(b);
-
-  		// Comparing constructors is more strict than using `instanceof`
-  		if (a.constructor === b.constructor) {
-  			return true;
-  		}
-
-  		// Ref #851
-  		// If the obj prototype descends from a null constructor, treat it
-  		// as a null prototype.
-  		if (protoA && protoA.constructor === null) {
-  			protoA = null;
-  		}
-  		if (protoB && protoB.constructor === null) {
-  			protoB = null;
-  		}
-
-  		// Allow objects with no prototype to be equivalent to
-  		// objects with Object as their constructor.
-  		if (protoA === null && protoB === Object.prototype || protoB === null && protoA === Object.prototype) {
-  			return true;
-  		}
-
-  		return false;
-  	}
-
-  	function getRegExpFlags(regexp) {
-  		return "flags" in regexp ? regexp.flags : regexp.toString().match(/[gimuy]*$/)[0];
-  	}
-
-  	function isContainer(val) {
-  		return ["object", "array", "map", "set"].indexOf(objectType(val)) !== -1;
-  	}
-
-  	function breadthFirstCompareChild(a, b) {
-
-  		// If a is a container not reference-equal to b, postpone the comparison to the
-  		// end of the pairs queue -- unless (a, b) has been seen before, in which case skip
-  		// over the pair.
-  		if (a === b) {
-  			return true;
-  		}
-  		if (!isContainer(a)) {
-  			return typeEquiv(a, b);
-  		}
-  		if (pairs.every(function (pair) {
-  			return pair.a !== a || pair.b !== b;
-  		})) {
-
-  			// Not yet started comparing this pair
-  			pairs.push({ a: a, b: b });
-  		}
-  		return true;
-  	}
-
-  	var callbacks = {
-  		"string": useStrictEquality,
-  		"boolean": useStrictEquality,
-  		"number": useStrictEquality,
-  		"null": useStrictEquality,
-  		"undefined": useStrictEquality,
-  		"symbol": useStrictEquality,
-  		"date": useStrictEquality,
-
-  		"nan": function nan() {
-  			return true;
-  		},
-
-  		"regexp": function regexp(a, b) {
-  			return a.source === b.source &&
-
-  			// Include flags in the comparison
-  			getRegExpFlags(a) === getRegExpFlags(b);
-  		},
-
-  		// abort (identical references / instance methods were skipped earlier)
-  		"function": function _function() {
-  			return false;
-  		},
-
-  		"array": function array(a, b) {
-  			var i, len;
-
-  			len = a.length;
-  			if (len !== b.length) {
-
-  				// Safe and faster
-  				return false;
-  			}
-
-  			for (i = 0; i < len; i++) {
-
-  				// Compare non-containers; queue non-reference-equal containers
-  				if (!breadthFirstCompareChild(a[i], b[i])) {
-  					return false;
-  				}
-  			}
-  			return true;
-  		},
-
-  		// Define sets a and b to be equivalent if for each element aVal in a, there
-  		// is some element bVal in b such that aVal and bVal are equivalent. Element
-  		// repetitions are not counted, so these are equivalent:
-  		// a = new Set( [ {}, [], [] ] );
-  		// b = new Set( [ {}, {}, [] ] );
-  		"set": function set$$1(a, b) {
-  			var innerEq,
-  			    outerEq = true;
-
-  			if (a.size !== b.size) {
-
-  				// This optimization has certain quirks because of the lack of
-  				// repetition counting. For instance, adding the same
-  				// (reference-identical) element to two equivalent sets can
-  				// make them non-equivalent.
-  				return false;
-  			}
-
-  			a.forEach(function (aVal) {
-
-  				// Short-circuit if the result is already known. (Using for...of
-  				// with a break clause would be cleaner here, but it would cause
-  				// a syntax error on older Javascript implementations even if
-  				// Set is unused)
-  				if (!outerEq) {
-  					return;
-  				}
-
-  				innerEq = false;
-
-  				b.forEach(function (bVal) {
-  					var parentPairs;
-
-  					// Likewise, short-circuit if the result is already known
-  					if (innerEq) {
-  						return;
-  					}
-
-  					// Swap out the global pairs list, as the nested call to
-  					// innerEquiv will clobber its contents
-  					parentPairs = pairs;
-  					if (innerEquiv(bVal, aVal)) {
-  						innerEq = true;
-  					}
-
-  					// Replace the global pairs list
-  					pairs = parentPairs;
-  				});
-
-  				if (!innerEq) {
-  					outerEq = false;
-  				}
-  			});
-
-  			return outerEq;
-  		},
-
-  		// Define maps a and b to be equivalent if for each key-value pair (aKey, aVal)
-  		// in a, there is some key-value pair (bKey, bVal) in b such that
-  		// [ aKey, aVal ] and [ bKey, bVal ] are equivalent. Key repetitions are not
-  		// counted, so these are equivalent:
-  		// a = new Map( [ [ {}, 1 ], [ {}, 1 ], [ [], 1 ] ] );
-  		// b = new Map( [ [ {}, 1 ], [ [], 1 ], [ [], 1 ] ] );
-  		"map": function map(a, b) {
-  			var innerEq,
-  			    outerEq = true;
-
-  			if (a.size !== b.size) {
-
-  				// This optimization has certain quirks because of the lack of
-  				// repetition counting. For instance, adding the same
-  				// (reference-identical) key-value pair to two equivalent maps
-  				// can make them non-equivalent.
-  				return false;
-  			}
-
-  			a.forEach(function (aVal, aKey) {
-
-  				// Short-circuit if the result is already known. (Using for...of
-  				// with a break clause would be cleaner here, but it would cause
-  				// a syntax error on older Javascript implementations even if
-  				// Map is unused)
-  				if (!outerEq) {
-  					return;
-  				}
-
-  				innerEq = false;
-
-  				b.forEach(function (bVal, bKey) {
-  					var parentPairs;
-
-  					// Likewise, short-circuit if the result is already known
-  					if (innerEq) {
-  						return;
-  					}
-
-  					// Swap out the global pairs list, as the nested call to
-  					// innerEquiv will clobber its contents
-  					parentPairs = pairs;
-  					if (innerEquiv([bVal, bKey], [aVal, aKey])) {
-  						innerEq = true;
-  					}
-
-  					// Replace the global pairs list
-  					pairs = parentPairs;
-  				});
-
-  				if (!innerEq) {
-  					outerEq = false;
-  				}
-  			});
-
-  			return outerEq;
-  		},
-
-  		"object": function object(a, b) {
-  			var i,
-  			    aProperties = [],
-  			    bProperties = [];
-
-  			if (compareConstructors(a, b) === false) {
-  				return false;
-  			}
-
-  			// Be strict: don't ensure hasOwnProperty and go deep
-  			for (i in a) {
-
-  				// Collect a's properties
-  				aProperties.push(i);
-
-  				// Skip OOP methods that look the same
-  				if (a.constructor !== Object && typeof a.constructor !== "undefined" && typeof a[i] === "function" && typeof b[i] === "function" && a[i].toString() === b[i].toString()) {
-  					continue;
-  				}
-
-  				// Compare non-containers; queue non-reference-equal containers
-  				if (!breadthFirstCompareChild(a[i], b[i])) {
-  					return false;
-  				}
-  			}
-
-  			for (i in b) {
-
-  				// Collect b's properties
-  				bProperties.push(i);
-  			}
-
-  			// Ensures identical properties name
-  			return typeEquiv(aProperties.sort(), bProperties.sort());
-  		}
-  	};
-
-  	function typeEquiv(a, b) {
-  		var type = objectType(a);
-
-  		// Callbacks for containers will append to the pairs queue to achieve breadth-first
-  		// search order. The pairs queue is also used to avoid reprocessing any pair of
-  		// containers that are reference-equal to a previously visited pair (a special case
-  		// this being recursion detection).
-  		//
-  		// Because of this approach, once typeEquiv returns a false value, it should not be
-  		// called again without clearing the pair queue else it may wrongly report a visited
-  		// pair as being equivalent.
-  		return objectType(b) === type && callbacks[type](a, b);
-  	}
-
-  	function innerEquiv(a, b) {
-  		var i, pair;
-
-  		// We're done when there's nothing more to compare
-  		if (arguments.length < 2) {
-  			return true;
-  		}
-
-  		// Clear the global pair queue and add the top-level values being compared
-  		pairs = [{ a: a, b: b }];
-
-  		for (i = 0; i < pairs.length; i++) {
-  			pair = pairs[i];
-
-  			// Perform type-specific comparison on any pairs that are not strictly
-  			// equal. For container types, that comparison will postpone comparison
-  			// of any sub-container pair to the end of the pair queue. This gives
-  			// breadth-first search order. It also avoids the reprocessing of
-  			// reference-equal siblings, cousins etc, which can have a significant speed
-  			// impact when comparing a container of small objects each of which has a
-  			// reference to the same (singleton) large object.
-  			if (pair.a !== pair.b && !typeEquiv(pair.a, pair.b)) {
-  				return false;
-  			}
-  		}
-
-  		// ...across all consecutive argument pairs
-  		return arguments.length === 2 || innerEquiv.apply(this, [].slice.call(arguments, 1));
-  	}
-
-  	return function () {
-  		var result = innerEquiv.apply(undefined, arguments);
-
-  		// Release any retained objects
-  		pairs.length = 0;
-  		return result;
-  	};
-  })();
-
-  /**
-   * Config object: Maintain internal state
-   * Later exposed as QUnit.config
-   * `config` initialized at top of scope
-   */
-  var config = {
-
-  	// The queue of tests to run
-  	queue: [],
-
-  	// Block until document ready
-  	blocking: true,
-
-  	// By default, run previously failed tests first
-  	// very useful in combination with "Hide passed tests" checked
-  	reorder: true,
-
-  	// By default, modify document.title when suite is done
-  	altertitle: true,
-
-  	// HTML Reporter: collapse every test except the first failing test
-  	// If false, all failing tests will be expanded
-  	collapse: true,
-
-  	// By default, scroll to top of the page when suite is done
-  	scrolltop: true,
-
-  	// Depth up-to which object will be dumped
-  	maxDepth: 5,
-
-  	// When enabled, all tests must call expect()
-  	requireExpects: false,
-
-  	// Placeholder for user-configurable form-exposed URL parameters
-  	urlConfig: [],
-
-  	// Set of all modules.
-  	modules: [],
-
-  	// The first unnamed module
-  	currentModule: {
-  		name: "",
-  		tests: [],
-  		childModules: [],
-  		testsRun: 0,
-  		unskippedTestsRun: 0,
-  		hooks: {
-  			before: [],
-  			beforeEach: [],
-  			afterEach: [],
-  			after: []
-  		}
-  	},
-
-  	callbacks: {},
-
-  	// The storage module to use for reordering tests
-  	storage: localSessionStorage
-  };
-
-  // take a predefined QUnit.config and extend the defaults
-  var globalConfig = window && window.QUnit && window.QUnit.config;
-
-  // only extend the global config if there is no QUnit overload
-  if (window && window.QUnit && !window.QUnit.version) {
-  	extend(config, globalConfig);
-  }
-
-  // Push a loose unnamed module to the modules collection
-  config.modules.push(config.currentModule);
-
-  // Based on jsDump by Ariel Flesler
-  // http://flesler.blogspot.com/2008/05/jsdump-pretty-dump-of-any-javascript.html
-  var dump = (function () {
-  	function quote(str) {
-  		return "\"" + str.toString().replace(/\\/g, "\\\\").replace(/"/g, "\\\"") + "\"";
-  	}
-  	function literal(o) {
-  		return o + "";
-  	}
-  	function join(pre, arr, post) {
-  		var s = dump.separator(),
-  		    base = dump.indent(),
-  		    inner = dump.indent(1);
-  		if (arr.join) {
-  			arr = arr.join("," + s + inner);
-  		}
-  		if (!arr) {
-  			return pre + post;
-  		}
-  		return [pre, inner + arr, base + post].join(s);
-  	}
-  	function array(arr, stack) {
-  		var i = arr.length,
-  		    ret = new Array(i);
-
-  		if (dump.maxDepth && dump.depth > dump.maxDepth) {
-  			return "[object Array]";
-  		}
-
-  		this.up();
-  		while (i--) {
-  			ret[i] = this.parse(arr[i], undefined, stack);
-  		}
-  		this.down();
-  		return join("[", ret, "]");
-  	}
-
-  	function isArray(obj) {
-  		return (
-
-  			//Native Arrays
-  			toString.call(obj) === "[object Array]" ||
-
-  			// NodeList objects
-  			typeof obj.length === "number" && obj.item !== undefined && (obj.length ? obj.item(0) === obj[0] : obj.item(0) === null && obj[0] === undefined)
-  		);
-  	}
-
-  	var reName = /^function (\w+)/,
-  	    dump = {
-
-  		// The objType is used mostly internally, you can fix a (custom) type in advance
-  		parse: function parse(obj, objType, stack) {
-  			stack = stack || [];
-  			var res,
-  			    parser,
-  			    parserType,
-  			    objIndex = stack.indexOf(obj);
-
-  			if (objIndex !== -1) {
-  				return "recursion(" + (objIndex - stack.length) + ")";
-  			}
-
-  			objType = objType || this.typeOf(obj);
-  			parser = this.parsers[objType];
-  			parserType = typeof parser === "undefined" ? "undefined" : _typeof(parser);
-
-  			if (parserType === "function") {
-  				stack.push(obj);
-  				res = parser.call(this, obj, stack);
-  				stack.pop();
-  				return res;
-  			}
-  			return parserType === "string" ? parser : this.parsers.error;
-  		},
-  		typeOf: function typeOf(obj) {
-  			var type;
-
-  			if (obj === null) {
-  				type = "null";
-  			} else if (typeof obj === "undefined") {
-  				type = "undefined";
-  			} else if (is("regexp", obj)) {
-  				type = "regexp";
-  			} else if (is("date", obj)) {
-  				type = "date";
-  			} else if (is("function", obj)) {
-  				type = "function";
-  			} else if (obj.setInterval !== undefined && obj.document !== undefined && obj.nodeType === undefined) {
-  				type = "window";
-  			} else if (obj.nodeType === 9) {
-  				type = "document";
-  			} else if (obj.nodeType) {
-  				type = "node";
-  			} else if (isArray(obj)) {
-  				type = "array";
-  			} else if (obj.constructor === Error.prototype.constructor) {
-  				type = "error";
-  			} else {
-  				type = typeof obj === "undefined" ? "undefined" : _typeof(obj);
-  			}
-  			return type;
-  		},
-
-  		separator: function separator() {
-  			if (this.multiline) {
-  				return this.HTML ? "<br />" : "\n";
-  			} else {
-  				return this.HTML ? " " : " ";
-  			}
-  		},
-
-  		// Extra can be a number, shortcut for increasing-calling-decreasing
-  		indent: function indent(extra) {
-  			if (!this.multiline) {
-  				return "";
-  			}
-  			var chr = this.indentChar;
-  			if (this.HTML) {
-  				chr = chr.replace(/\t/g, "   ").replace(/ /g, " ");
-  			}
-  			return new Array(this.depth + (extra || 0)).join(chr);
-  		},
-  		up: function up(a) {
-  			this.depth += a || 1;
-  		},
-  		down: function down(a) {
-  			this.depth -= a || 1;
-  		},
-  		setParser: function setParser(name, parser) {
-  			this.parsers[name] = parser;
-  		},
-
-  		// The next 3 are exposed so you can use them
-  		quote: quote,
-  		literal: literal,
-  		join: join,
-  		depth: 1,
-  		maxDepth: config.maxDepth,
-
-  		// This is the list of parsers, to modify them, use dump.setParser
-  		parsers: {
-  			window: "[Window]",
-  			document: "[Document]",
-  			error: function error(_error) {
-  				return "Error(\"" + _error.message + "\")";
-  			},
-  			unknown: "[Unknown]",
-  			"null": "null",
-  			"undefined": "undefined",
-  			"function": function _function(fn) {
-  				var ret = "function",
-
-
-  				// Functions never have name in IE
-  				name = "name" in fn ? fn.name : (reName.exec(fn) || [])[1];
-
-  				if (name) {
-  					ret += " " + name;
-  				}
-  				ret += "(";
-
-  				ret = [ret, dump.parse(fn, "functionArgs"), "){"].join("");
-  				return join(ret, dump.parse(fn, "functionCode"), "}");
-  			},
-  			array: array,
-  			nodelist: array,
-  			"arguments": array,
-  			object: function object(map, stack) {
-  				var keys,
-  				    key,
-  				    val,
-  				    i,
-  				    nonEnumerableProperties,
-  				    ret = [];
-
-  				if (dump.maxDepth && dump.depth > dump.maxDepth) {
-  					return "[object Object]";
-  				}
-
-  				dump.up();
-  				keys = [];
-  				for (key in map) {
-  					keys.push(key);
-  				}
-
-  				// Some properties are not always enumerable on Error objects.
-  				nonEnumerableProperties = ["message", "name"];
-  				for (i in nonEnumerableProperties) {
-  					key = nonEnumerableProperties[i];
-  					if (key in map && !inArray(key, keys)) {
-  						keys.push(key);
-  					}
-  				}
-  				keys.sort();
-  				for (i = 0; i < keys.length; i++) {
-  					key = keys[i];
-  					val = map[key];
-  					ret.push(dump.parse(key, "key") + ": " + dump.parse(val, undefined, stack));
-  				}
-  				dump.down();
-  				return join("{", ret, "}");
-  			},
-  			node: function node(_node) {
-  				var len,
-  				    i,
-  				    val,
-  				    open = dump.HTML ? "<" : "<",
-  				    close = dump.HTML ? ">" : ">",
-  				    tag = _node.nodeName.toLowerCase(),
-  				    ret = open + tag,
-  				    attrs = _node.attributes;
-
-  				if (attrs) {
-  					for (i = 0, len = attrs.length; i < len; i++) {
-  						val = attrs[i].nodeValue;
-
-  						// IE6 includes all attributes in .attributes, even ones not explicitly
-  						// set. Those have values like undefined, null, 0, false, "" or
-  						// "inherit".
-  						if (val && val !== "inherit") {
-  							ret += " " + attrs[i].nodeName + "=" + dump.parse(val, "attribute");
-  						}
-  					}
-  				}
-  				ret += close;
-
-  				// Show content of TextNode or CDATASection
-  				if (_node.nodeType === 3 || _node.nodeType === 4) {
-  					ret += _node.nodeValue;
-  				}
-
-  				return ret + open + "/" + tag + close;
-  			},
-
-  			// Function calls it internally, it's the arguments part of the function
-  			functionArgs: function functionArgs(fn) {
-  				var args,
-  				    l = fn.length;
-
-  				if (!l) {
-  					return "";
-  				}
-
-  				args = new Array(l);
-  				while (l--) {
-
-  					// 97 is 'a'
-  					args[l] = String.fromCharCode(97 + l);
-  				}
-  				return " " + args.join(", ") + " ";
-  			},
-
-  			// Object calls it internally, the key part of an item in a map
-  			key: quote,
-
-  			// Function calls it internally, it's the content of the function
-  			functionCode: "[code]",
-
-  			// Node calls it internally, it's a html attribute value
-  			attribute: quote,
-  			string: quote,
-  			date: quote,
-  			regexp: literal,
-  			number: literal,
-  			"boolean": literal,
-  			symbol: function symbol(sym) {
-  				return sym.toString();
-  			}
-  		},
-
-  		// If true, entities are escaped ( <, >, \t, space and \n )
-  		HTML: false,
-
-  		// Indentation unit
-  		indentChar: "  ",
-
-  		// If true, items in a collection, are separated by a \n, else just a space.
-  		multiline: true
-  	};
-
-  	return dump;
-  })();
-
-  var LISTENERS = Object.create(null);
-  var SUPPORTED_EVENTS = ["runStart", "suiteStart", "testStart", "assertion", "testEnd", "suiteEnd", "runEnd"];
-
-  /**
-   * Emits an event with the specified data to all currently registered listeners.
-   * Callbacks will fire in the order in which they are registered (FIFO). This
-   * function is not exposed publicly; it is used by QUnit internals to emit
-   * logging events.
-   *
-   * @private
-   * @method emit
-   * @param {String} eventName
-   * @param {Object} data
-   * @return {Void}
-   */
-  function emit(eventName, data) {
-  	if (objectType(eventName) !== "string") {
-  		throw new TypeError("eventName must be a string when emitting an event");
-  	}
-
-  	// Clone the callbacks in case one of them registers a new callback
-  	var originalCallbacks = LISTENERS[eventName];
-  	var callbacks = originalCallbacks ? [].concat(toConsumableArray(originalCallbacks)) : [];
-
-  	for (var i = 0; i < callbacks.length; i++) {
-  		callbacks[i](data);
-  	}
-  }
-
-  /**
-   * Registers a callback as a listener to the specified event.
-   *
-   * @public
-   * @method on
-   * @param {String} eventName
-   * @param {Function} callback
-   * @return {Void}
-   */
-  function on(eventName, callback) {
-  	if (objectType(eventName) !== "string") {
-  		throw new TypeError("eventName must be a string when registering a listener");
-  	} else if (!inArray(eventName, SUPPORTED_EVENTS)) {
-  		var events = SUPPORTED_EVENTS.join(", ");
-  		throw new Error("\"" + eventName + "\" is not a valid event; must be one of: " + events + ".");
-  	} else if (objectType(callback) !== "function") {
-  		throw new TypeError("callback must be a function when registering a listener");
-  	}
-
-  	if (!LISTENERS[eventName]) {
-  		LISTENERS[eventName] = [];
-  	}
-
-  	// Don't register the same callback more than once
-  	if (!inArray(callback, LISTENERS[eventName])) {
-  		LISTENERS[eventName].push(callback);
-  	}
-  }
-
-  // Register logging callbacks
-  function registerLoggingCallbacks(obj) {
-  	var i,
-  	    l,
-  	    key,
-  	    callbackNames = ["begin", "done", "log", "testStart", "testDone", "moduleStart", "moduleDone"];
-
-  	function registerLoggingCallback(key) {
-  		var loggingCallback = function loggingCallback(callback) {
-  			if (objectType(callback) !== "function") {
-  				throw new Error("QUnit logging methods require a callback function as their first parameters.");
-  			}
-
-  			config.callbacks[key].push(callback);
-  		};
-
-  		return loggingCallback;
-  	}
-
-  	for (i = 0, l = callbackNames.length; i < l; i++) {
-  		key = callbackNames[i];
-
-  		// Initialize key collection of logging callback
-  		if (objectType(config.callbacks[key]) === "undefined") {
-  			config.callbacks[key] = [];
-  		}
-
-  		obj[key] = registerLoggingCallback(key);
-  	}
-  }
-
-  function runLoggingCallbacks(key, args) {
-  	var i, l, callbacks;
-
-  	callbacks = config.callbacks[key];
-  	for (i = 0, l = callbacks.length; i < l; i++) {
-  		callbacks[i](args);
-  	}
-  }
-
-  // Doesn't support IE9, it will return undefined on these browsers
-  // See also https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error/Stack
-  var fileName = (sourceFromStacktrace(0) || "").replace(/(:\d+)+\)?/, "").replace(/.+\//, "");
-
-  function extractStacktrace(e, offset) {
-  	offset = offset === undefined ? 4 : offset;
-
-  	var stack, include, i;
-
-  	if (e && e.stack) {
-  		stack = e.stack.split("\n");
-  		if (/^error$/i.test(stack[0])) {
-  			stack.shift();
-  		}
-  		if (fileName) {
-  			include = [];
-  			for (i = offset; i < stack.length; i++) {
-  				if (stack[i].indexOf(fileName) !== -1) {
-  					break;
-  				}
-  				include.push(stack[i]);
-  			}
-  			if (include.length) {
-  				return include.join("\n");
-  			}
-  		}
-  		return stack[offset];
-  	}
-  }
-
-  function sourceFromStacktrace(offset) {
-  	var error = new Error();
-
-  	// Support: Safari <=7 only, IE <=10 - 11 only
-  	// Not all browsers generate the `stack` property for `new Error()`, see also #636
-  	if (!error.stack) {
-  		try {
-  			throw error;
-  		} catch (err) {
-  			error = err;
-  		}
-  	}
-
-  	return extractStacktrace(error, offset);
-  }
-
-  var priorityCount = 0;
-  var unitSampler = void 0;
-
-  /**
-   * Advances the ProcessingQueue to the next item if it is ready.
-   * @param {Boolean} last
-   */
-  function advance() {
-  	var start = now();
-  	config.depth = (config.depth || 0) + 1;
-
-  	while (config.queue.length && !config.blocking) {
-  		var elapsedTime = now() - start;
-
-  		if (!defined.setTimeout || config.updateRate <= 0 || elapsedTime < config.updateRate) {
-  			if (priorityCount > 0) {
-  				priorityCount--;
-  			}
-
-  			config.queue.shift()();
-  		} else {
-  			setTimeout(advance, 13);
-  			break;
-  		}
-  	}
-
-  	config.depth--;
-
-  	if (!config.blocking && !config.queue.length && config.depth === 0) {
-  		done();
-  	}
-  }
-
-  function addToQueueImmediate(callback) {
-  	if (objectType(callback) === "array") {
-  		while (callback.length) {
-  			addToQueueImmediate(callback.pop());
-  		}
-
-  		return;
-  	}
-
-  	config.queue.unshift(callback);
-  	priorityCount++;
-  }
-
-  /**
-   * Adds a function to the ProcessingQueue for execution.
-   * @param {Function|Array} callback
-   * @param {Boolean} priority
-   * @param {String} seed
-   */
-  function addToQueue(callback, prioritize, seed) {
-  	if (prioritize) {
-  		config.queue.splice(priorityCount++, 0, callback);
-  	} else if (seed) {
-  		if (!unitSampler) {
-  			unitSampler = unitSamplerGenerator(seed);
-  		}
-
-  		// Insert into a random position after all prioritized items
-  		var index = Math.floor(unitSampler() * (config.queue.length - priorityCount + 1));
-  		config.queue.splice(priorityCount + index, 0, callback);
-  	} else {
-  		config.queue.push(callback);
-  	}
-  }
-
-  /**
-   * Creates a seeded "sample" generator which is used for randomizing tests.
-   */
-  function unitSamplerGenerator(seed) {
-
-  	// 32-bit xorshift, requires only a nonzero seed
-  	// http://excamera.com/sphinx/article-xorshift.html
-  	var sample = parseInt(generateHash(seed), 16) || -1;
-  	return function () {
-  		sample ^= sample << 13;
-  		sample ^= sample >>> 17;
-  		sample ^= sample << 5;
-
-  		// ECMAScript has no unsigned number type
-  		if (sample < 0) {
-  			sample += 0x100000000;
-  		}
-
-  		return sample / 0x100000000;
-  	};
-  }
-
-  /**
-   * This function is called when the ProcessingQueue is done processing all
-   * items. It handles emitting the final run events.
-   */
-  function done() {
-  	var storage = config.storage;
-
-  	ProcessingQueue.finished = true;
-
-  	var runtime = now() - config.started;
-  	var passed = config.stats.all - config.stats.bad;
-
-  	emit("runEnd", globalSuite.end(true));
-  	runLoggingCallbacks("done", {
-  		passed: passed,
-  		failed: config.stats.bad,
-  		total: config.stats.all,
-  		runtime: runtime
-  	});
-
-  	// Clear own storage items if all tests passed
-  	if (storage && config.stats.bad === 0) {
-  		for (var i = storage.length - 1; i >= 0; i--) {
-  			var key = storage.key(i);
-
-  			if (key.indexOf("qunit-test-") === 0) {
-  				storage.removeItem(key);
-  			}
-  		}
-  	}
-  }
-
-  var ProcessingQueue = {
-  	finished: false,
-  	add: addToQueue,
-  	addImmediate: addToQueueImmediate,
-  	advance: advance
-  };
-
-  var TestReport = function () {
-  	function TestReport(name, suite, options) {
-  		classCallCheck(this, TestReport);
-
-  		this.name = name;
-  		this.suiteName = suite.name;
-  		this.fullName = suite.fullName.concat(name);
-  		this.runtime = 0;
-  		this.assertions = [];
-
-  		this.skipped = !!options.skip;
-  		this.todo = !!options.todo;
-
-  		this.valid = options.valid;
-
-  		this._startTime = 0;
-  		this._endTime = 0;
-
-  		suite.pushTest(this);
-  	}
-
-  	createClass(TestReport, [{
-  		key: "start",
-  		value: function start(recordTime) {
-  			if (recordTime) {
-  				this._startTime = Date.now();
-  			}
-
-  			return {
-  				name: this.name,
-  				suiteName: this.suiteName,
-  				fullName: this.fullName.slice()
-  			};
-  		}
-  	}, {
-  		key: "end",
-  		value: function end(recordTime) {
-  			if (recordTime) {
-  				this._endTime = Date.now();
-  			}
-
-  			return extend(this.start(), {
-  				runtime: this.getRuntime(),
-  				status: this.getStatus(),
-  				errors: this.getFailedAssertions(),
-  				assertions: this.getAssertions()
-  			});
-  		}
-  	}, {
-  		key: "pushAssertion",
-  		value: function pushAssertion(assertion) {
-  			this.assertions.push(assertion);
-  		}
-  	}, {
-  		key: "getRuntime",
-  		value: function getRuntime() {
-  			return this._endTime - this._startTime;
-  		}
-  	}, {
-  		key: "getStatus",
-  		value: function getStatus() {
-  			if (this.skipped) {
-  				return "skipped";
-  			}
-
-  			var testPassed = this.getFailedAssertions().length > 0 ? this.todo : !this.todo;
-
-  			if (!testPassed) {
-  				return "failed";
-  			} else if (this.todo) {
-  				return "todo";
-  			} else {
-  				return "passed";
-  			}
-  		}
-  	}, {
-  		key: "getFailedAssertions",
-  		value: function getFailedAssertions() {
-  			return this.assertions.filter(function (assertion) {
-  				return !assertion.passed;
-  			});
-  		}
-  	}, {
-  		key: "getAssertions",
-  		value: function getAssertions() {
-  			return this.assertions.slice();
-  		}
-
-  		// Remove actual and expected values from assertions. This is to prevent
-  		// leaking memory throughout a test suite.
-
-  	}, {
-  		key: "slimAssertions",
-  		value: function slimAssertions() {
-  			this.assertions = this.assertions.map(function (assertion) {
-  				delete assertion.actual;
-  				delete assertion.expected;
-  				return assertion;
-  			});
-  		}
-  	}]);
-  	return TestReport;
-  }();
-
-  var focused$1 = false;
-
-  function Test(settings) {
-  	var i, l;
-
-  	++Test.count;
-
-  	this.expected = null;
-  	this.assertions = [];
-  	this.semaphore = 0;
-  	this.module = config.currentModule;
-  	this.stack = sourceFromStacktrace(3);
-  	this.steps = [];
-  	this.timeout = undefined;
-
-  	// If a module is skipped, all its tests and the tests of the child suites
-  	// should be treated as skipped even if they are defined as `only` or `todo`.
-  	// As for `todo` module, all its tests will be treated as `todo` except for
-  	// tests defined as `skip` which will be left intact.
-  	//
-  	// So, if a test is defined as `todo` and is inside a skipped module, we should
-  	// then treat that test as if was defined as `skip`.
-  	if (this.module.skip) {
-  		settings.skip = true;
-  		settings.todo = false;
-
-  		// Skipped tests should be left intact
-  	} else if (this.module.todo && !settings.skip) {
-  		settings.todo = true;
-  	}
-
-  	extend(this, settings);
-
-  	this.testReport = new TestReport(settings.testName, this.module.suiteReport, {
-  		todo: settings.todo,
-  		skip: settings.skip,
-  		valid: this.valid()
-  	});
-
-  	// Register unique strings
-  	for (i = 0, l = this.module.tests; i < l.length; i++) {
-  		if (this.module.tests[i].name === this.testName) {
-  			this.testName += " ";
-  		}
-  	}
-
-  	this.testId = generateHash(this.module.name, this.testName);
-
-  	this.module.tests.push({
-  		name: this.testName,
-  		testId: this.testId,
-  		skip: !!settings.skip
-  	});
-
-  	if (settings.skip) {
-
-  		// Skipped tests will fully ignore any sent callback
-  		this.callback = function () {};
-  		this.async = false;
-  		this.expected = 0;
-  	} else {
-  		this.assert = new Assert(this);
-  	}
-  }
-
-  Test.count = 0;
-
-  function getNotStartedModules(startModule) {
-  	var module = startModule,
-  	    modules = [];
-
-  	while (module && module.testsRun === 0) {
-  		modules.push(module);
-  		module = module.parentModule;
-  	}
-
-  	return modules;
-  }
-
-  Test.prototype = {
-  	before: function before() {
-  		var i,
-  		    startModule,
-  		    module = this.module,
-  		    notStartedModules = getNotStartedModules(module);
-
-  		for (i = notStartedModules.length - 1; i >= 0; i--) {
-  			startModule = notStartedModules[i];
-  			startModule.stats = { all: 0, bad: 0, started: now() };
-  			emit("suiteStart", startModule.suiteReport.start(true));
-  			runLoggingCallbacks("moduleStart", {
-  				name: startModule.name,
-  				tests: startModule.tests
-  			});
-  		}
-
-  		config.current = this;
-
-  		this.testEnvironment = extend({}, module.testEnvironment);
-
-  		this.started = now();
-  		emit("testStart", this.testReport.start(true));
-  		runLoggingCallbacks("testStart", {
-  			name: this.testName,
-  			module: module.name,
-  			testId: this.testId,
-  			previousFailure: this.previousFailure
-  		});
-
-  		if (!config.pollution) {
-  			saveGlobal();
-  		}
-  	},
-
-  	run: function run() {
-  		var promise;
-
-  		config.current = this;
-
-  		this.callbackStarted = now();
-
-  		if (config.notrycatch) {
-  			runTest(this);
-  			return;
-  		}
-
-  		try {
-  			runTest(this);
-  		} catch (e) {
-  			this.pushFailure("Died on test #" + (this.assertions.length + 1) + " " + this.stack + ": " + (e.message || e), extractStacktrace(e, 0));
-
-  			// Else next test will carry the responsibility
-  			saveGlobal();
-
-  			// Restart the tests if they're blocking
-  			if (config.blocking) {
-  				internalRecover(this);
-  			}
-  		}
-
-  		function runTest(test) {
-  			promise = test.callback.call(test.testEnvironment, test.assert);
-  			test.resolvePromise(promise);
-
-  			// If the test has a "lock" on it, but the timeout is 0, then we push a
-  			// failure as the test should be synchronous.
-  			if (test.timeout === 0 && test.semaphore !== 0) {
-  				pushFailure("Test did not finish synchronously even though assert.timeout( 0 ) was used.", sourceFromStacktrace(2));
-  			}
-  		}
-  	},
-
-  	after: function after() {
-  		checkPollution();
-  	},
-
-  	queueHook: function queueHook(hook, hookName, hookOwner) {
-  		var _this = this;
-
-  		var callHook = function callHook() {
-  			var promise = hook.call(_this.testEnvironment, _this.assert);
-  			_this.resolvePromise(promise, hookName);
-  		};
-
-  		var runHook = function runHook() {
-  			if (hookName === "before") {
-  				if (hookOwner.unskippedTestsRun !== 0) {
-  					return;
-  				}
-
-  				_this.preserveEnvironment = true;
-  			}
-
-  			if (hookName === "after" && hookOwner.unskippedTestsRun !== numberOfUnskippedTests(hookOwner) - 1 && config.queue.length > 2) {
-  				return;
-  			}
-
-  			config.current = _this;
-  			if (config.notrycatch) {
-  				callHook();
-  				return;
-  			}
-  			try {
-  				callHook();
-  			} catch (error) {
-  				_this.pushFailure(hookName + " failed on " + _this.testName + ": " + (error.message || error), extractStacktrace(error, 0));
-  			}
-  		};
-
-  		return runHook;
-  	},
-
-
-  	// Currently only used for module level hooks, can be used to add global level ones
-  	hooks: function hooks(handler) {
-  		var hooks = [];
-
-  		function processHooks(test, module) {
-  			if (module.parentModule) {
-  				processHooks(test, module.parentModule);
-  			}
-
-  			if (module.hooks[handler].length) {
-  				for (var i = 0; i < module.hooks[handler].length; i++) {
-  					hooks.push(test.queueHook(module.hooks[handler][i], handler, module));
-  				}
-  			}
-  		}
-
-  		// Hooks are ignored on skipped tests
-  		if (!this.skip) {
-  			processHooks(this, this.module);
-  		}
-
-  		return hooks;
-  	},
-
-
-  	finish: function finish() {
-  		config.current = this;
-  		if (config.requireExpects && this.expected === null) {
-  			this.pushFailure("Expected number of assertions to be defined, but expect() was " + "not called.", this.stack);
-  		} else if (this.expected !== null && this.expected !== this.assertions.length) {
-  			this.pushFailure("Expected " + this.expected + " assertions, but " + this.assertions.length + " were run", this.stack);
-  		} else if (this.expected === null && !this.assertions.length) {
-  			this.pushFailure("Expected at least one assertion, but none were run - call " + "expect(0) to accept zero assertions.", this.stack);
-  		}
-
-  		var i,
-  		    module = this.module,
-  		    moduleName = module.name,
-  		    testName = this.testName,
-  		    skipped = !!this.skip,
-  		    todo = !!this.todo,
-  		    bad = 0,
-  		    storage = config.storage;
-
-  		this.runtime = now() - this.started;
-
-  		config.stats.all += this.assertions.length;
-  		module.stats.all += this.assertions.length;
-
-  		for (i = 0; i < this.assertions.length; i++) {
-  			if (!this.assertions[i].result) {
-  				bad++;
-  				config.stats.bad++;
-  				module.stats.bad++;
-  			}
-  		}
-
-  		notifyTestsRan(module, skipped);
-
-  		// Store result when possible
-  		if (storage) {
-  			if (bad) {
-  				storage.setItem("qunit-test-" + moduleName + "-" + testName, bad);
-  			} else {
-  				storage.removeItem("qunit-test-" + moduleName + "-" + testName);
-  			}
-  		}
-
-  		// After emitting the js-reporters event we cleanup the assertion data to
-  		// avoid leaking it. It is not used by the legacy testDone callbacks.
-  		emit("testEnd", this.testReport.end(true));
-  		this.testReport.slimAssertions();
-
-  		runLoggingCallbacks("testDone", {
-  			name: testName,
-  			module: moduleName,
-  			skipped: skipped,
-  			todo: todo,
-  			failed: bad,
-  			passed: this.assertions.length - bad,
-  			total: this.assertions.length,
-  			runtime: skipped ? 0 : this.runtime,
-
-  			// HTML Reporter use
-  			assertions: this.assertions,
-  			testId: this.testId,
-
-  			// Source of Test
-  			source: this.stack
-  		});
-
-  		if (module.testsRun === numberOfTests(module)) {
-  			logSuiteEnd(module);
-
-  			// Check if the parent modules, iteratively, are done. If that the case,
-  			// we emit the `suiteEnd` event and trigger `moduleDone` callback.
-  			var parent = module.parentModule;
-  			while (parent && parent.testsRun === numberOfTests(parent)) {
-  				logSuiteEnd(parent);
-  				parent = parent.parentModule;
-  			}
-  		}
-
-  		config.current = undefined;
-
-  		function logSuiteEnd(module) {
-  			emit("suiteEnd", module.suiteReport.end(true));
-  			runLoggingCallbacks("moduleDone", {
-  				name: module.name,
-  				tests: module.tests,
-  				failed: module.stats.bad,
-  				passed: module.stats.all - module.stats.bad,
-  				total: module.stats.all,
-  				runtime: now() - module.stats.started
-  			});
-  		}
-  	},
-
-  	preserveTestEnvironment: function preserveTestEnvironment() {
-  		if (this.preserveEnvironment) {
-  			this.module.testEnvironment = this.testEnvironment;
-  			this.testEnvironment = extend({}, this.module.testEnvironment);
-  		}
-  	},
-
-  	queue: function queue() {
-  		var test = this;
-
-  		if (!this.valid()) {
-  			return;
-  		}
-
-  		function runTest() {
-
-  			// Each of these can by async
-  			ProcessingQueue.addImmediate([function () {
-  				test.before();
-  			}, test.hooks("before"), function () {
-  				test.preserveTestEnvironment();
-  			}, test.hooks("beforeEach"), function () {
-  				test.run();
-  			}, test.hooks("afterEach").reverse(), test.hooks("after").reverse(), function () {
-  				test.after();
-  			}, function () {
-  				test.finish();
-  			}]);
-  		}
-
-  		var previousFailCount = config.storage && +config.storage.getItem("qunit-test-" + this.module.name + "-" + this.testName);
-
-  		// Prioritize previously failed tests, detected from storage
-  		var prioritize = config.reorder && !!previousFailCount;
-
-  		this.previousFailure = !!previousFailCount;
-
-  		ProcessingQueue.add(runTest, prioritize, config.seed);
-
-  		// If the queue has already finished, we manually process the new test
-  		if (ProcessingQueue.finished) {
-  			ProcessingQueue.advance();
-  		}
-  	},
-
-
-  	pushResult: function pushResult(resultInfo) {
-  		if (this !== config.current) {
-  			throw new Error("Assertion occured after test had finished.");
-  		}
-
-  		// Destructure of resultInfo = { result, actual, expected, message, negative }
-  		var source,
-  		    details = {
-  			module: this.module.name,
-  			name: this.testName,
-  			result: resultInfo.result,
-  			message: resultInfo.message,
-  			actual: resultInfo.actual,
-  			expected: resultInfo.expected,
-  			testId: this.testId,
-  			negative: resultInfo.negative || false,
-  			runtime: now() - this.started,
-  			todo: !!this.todo
-  		};
-
-  		if (!resultInfo.result) {
-  			source = resultInfo.source || sourceFromStacktrace();
-
-  			if (source) {
-  				details.source = source;
-  			}
-  		}
-
-  		this.logAssertion(details);
-
-  		this.assertions.push({
-  			result: !!resultInfo.result,
-  			message: resultInfo.message
-  		});
-  	},
-
-  	pushFailure: function pushFailure(message, source, actual) {
-  		if (!(this instanceof Test)) {
-  			throw new Error("pushFailure() assertion outside test context, was " + sourceFromStacktrace(2));
-  		}
-
-  		this.pushResult({
-  			result: false,
-  			message: message || "error",
-  			actual: actual || null,
-  			expected: null,
-  			source: source
-  		});
-  	},
-
-  	/**
-    * Log assertion details using both the old QUnit.log interface and
-    * QUnit.on( "assertion" ) interface.
-    *
-    * @private
-    */
-  	logAssertion: function logAssertion(details) {
-  		runLoggingCallbacks("log", details);
-
-  		var assertion = {
-  			passed: details.result,
-  			actual: details.actual,
-  			expected: details.expected,
-  			message: details.message,
-  			stack: details.source,
-  			todo: details.todo
-  		};
-  		this.testReport.pushAssertion(assertion);
-  		emit("assertion", assertion);
-  	},
-
-
-  	resolvePromise: function resolvePromise(promise, phase) {
-  		var then,
-  		    resume,
-  		    message,
-  		    test = this;
-  		if (promise != null) {
-  			then = promise.then;
-  			if (objectType(then) === "function") {
-  				resume = internalStop(test);
-  				then.call(promise, function () {
-  					resume();
-  				}, function (error) {
-  					message = "Promise rejected " + (!phase ? "during" : phase.replace(/Each$/, "")) + " \"" + test.testName + "\": " + (error && error.message || error);
-  					test.pushFailure(message, extractStacktrace(error, 0));
-
-  					// Else next test will carry the responsibility
-  					saveGlobal();
-
-  					// Unblock
-  					resume();
-  				});
-  			}
-  		}
-  	},
-
-  	valid: function valid() {
-  		var filter = config.filter,
-  		    regexFilter = /^(!?)\/([\w\W]*)\/(i?$)/.exec(filter),
-  		    module = config.module && config.module.toLowerCase(),
-  		    fullName = this.module.name + ": " + this.testName;
-
-  		function moduleChainNameMatch(testModule) {
-  			var testModuleName = testModule.name ? testModule.name.toLowerCase() : null;
-  			if (testModuleName === module) {
-  				return true;
-  			} else if (testModule.parentModule) {
-  				return moduleChainNameMatch(testModule.parentModule);
-  			} else {
-  				return false;
-  			}
-  		}
-
-  		function moduleChainIdMatch(testModule) {
-  			return inArray(testModule.moduleId, config.moduleId) || testModule.parentModule && moduleChainIdMatch(testModule.parentModule);
-  		}
-
-  		// Internally-generated tests are always valid
-  		if (this.callback && this.callback.validTest) {
-  			return true;
-  		}
-
-  		if (config.moduleId && config.moduleId.length > 0 && !moduleChainIdMatch(this.module)) {
-
-  			return false;
-  		}
-
-  		if (config.testId && config.testId.length > 0 && !inArray(this.testId, config.testId)) {
-
-  			return false;
-  		}
-
-  		if (module && !moduleChainNameMatch(this.module)) {
-  			return false;
-  		}
-
-  		if (!filter) {
-  			return true;
-  		}
-
-  		return regexFilter ? this.regexFilter(!!regexFilter[1], regexFilter[2], regexFilter[3], fullName) : this.stringFilter(filter, fullName);
-  	},
-
-  	regexFilter: function regexFilter(exclude, pattern, flags, fullName) {
-  		var regex = new RegExp(pattern, flags);
-  		var match = regex.test(fullName);
-
-  		return match !== exclude;
-  	},
-
-  	stringFilter: function stringFilter(filter, fullName) {
-  		filter = filter.toLowerCase();
-  		fullName = fullName.toLowerCase();
-
-  		var include = filter.charAt(0) !== "!";
-  		if (!include) {
-  			filter = filter.slice(1);
-  		}
-
-  		// If the filter matches, we need to honour include
-  		if (fullName.indexOf(filter) !== -1) {
-  			return include;
-  		}
-
-  		// Otherwise, do the opposite
-  		return !include;
-  	}
-  };
-
-  function pushFailure() {
-  	if (!config.current) {
-  		throw new Error("pushFailure() assertion outside test context, in " + sourceFromStacktrace(2));
-  	}
-
-  	// Gets current test obj
-  	var currentTest = config.current;
-
-  	return currentTest.pushFailure.apply(currentTest, arguments);
-  }
-
-  function saveGlobal() {
-  	config.pollution = [];
-
-  	if (config.noglobals) {
-  		for (var key in global$1) {
-  			if (hasOwn.call(global$1, key)) {
-
-  				// In Opera sometimes DOM element ids show up here, ignore them
-  				if (/^qunit-test-output/.test(key)) {
-  					continue;
-  				}
-  				config.pollution.push(key);
-  			}
-  		}
-  	}
-  }
-
-  function checkPollution() {
-  	var newGlobals,
-  	    deletedGlobals,
-  	    old = config.pollution;
-
-  	saveGlobal();
-
-  	newGlobals = diff(config.pollution, old);
-  	if (newGlobals.length > 0) {
-  		pushFailure("Introduced global variable(s): " + newGlobals.join(", "));
-  	}
-
-  	deletedGlobals = diff(old, config.pollution);
-  	if (deletedGlobals.length > 0) {
-  		pushFailure("Deleted global variable(s): " + deletedGlobals.join(", "));
-  	}
-  }
-
-  // Will be exposed as QUnit.test
-  function test(testName, callback) {
-  	if (focused$1) {
-  		return;
-  	}
-
-  	var newTest = new Test({
-  		testName: testName,
-  		callback: callback
-  	});
-
-  	newTest.queue();
-  }
-
-  function todo(testName, callback) {
-  	if (focused$1) {
-  		return;
-  	}
-
-  	var newTest = new Test({
-  		testName: testName,
-  		callback: callback,
-  		todo: true
-  	});
-
-  	newTest.queue();
-  }
-
-  // Will be exposed as QUnit.skip
-  function skip(testName) {
-  	if (focused$1) {
-  		return;
-  	}
-
-  	var test = new Test({
-  		testName: testName,
-  		skip: true
-  	});
-
-  	test.queue();
-  }
-
-  // Will be exposed as QUnit.only
-  function only(testName, callback) {
-  	if (focused$1) {
-  		return;
-  	}
-
-  	config.queue.length = 0;
-  	focused$1 = true;
-
-  	var newTest = new Test({
-  		testName: testName,
-  		callback: callback
-  	});
-
-  	newTest.queue();
-  }
-
-  // Put a hold on processing and return a function that will release it.
-  function internalStop(test) {
-  	test.semaphore += 1;
-  	config.blocking = true;
-
-  	// Set a recovery timeout, if so configured.
-  	if (defined.setTimeout) {
-  		var timeoutDuration = void 0;
-
-  		if (typeof test.timeout === "number") {
-  			timeoutDuration = test.timeout;
-  		} else if (typeof config.testTimeout === "number") {
-  			timeoutDuration = config.testTimeout;
-  		}
-
-  		if (typeof timeoutDuration === "number" && timeoutDuration > 0) {
-  			clearTimeout(config.timeout);
-  			config.timeout = setTimeout(function () {
-  				pushFailure("Test took longer than " + timeoutDuration + "ms; test timed out.", sourceFromStacktrace(2));
-  				internalRecover(test);
-  			}, timeoutDuration);
-  		}
-  	}
-
-  	var released = false;
-  	return function resume() {
-  		if (released) {
-  			return;
-  		}
-
-  		released = true;
-  		test.semaphore -= 1;
-  		internalStart(test);
-  	};
-  }
-
-  // Forcefully release all processing holds.
-  function internalRecover(test) {
-  	test.semaphore = 0;
-  	internalStart(test);
-  }
-
-  // Release a processing hold, scheduling a resumption attempt if no holds remain.
-  function internalStart(test) {
-
-  	// If semaphore is non-numeric, throw error
-  	if (isNaN(test.semaphore)) {
-  		test.semaphore = 0;
-
-  		pushFailure("Invalid value on test.semaphore", sourceFromStacktrace(2));
-  		return;
-  	}
-
-  	// Don't start until equal number of stop-calls
-  	if (test.semaphore > 0) {
-  		return;
-  	}
-
-  	// Throw an Error if start is called more often than stop
-  	if (test.semaphore < 0) {
-  		test.semaphore = 0;
-
-  		pushFailure("Tried to restart test while already started (test's semaphore was 0 already)", sourceFromStacktrace(2));
-  		return;
-  	}
-
-  	// Add a slight delay to allow more assertions etc.
-  	if (defined.setTimeout) {
-  		if (config.timeout) {
-  			clearTimeout(config.timeout);
-  		}
-  		config.timeout = setTimeout(function () {
-  			if (test.semaphore > 0) {
-  				return;
-  			}
-
-  			if (config.timeout) {
-  				clearTimeout(config.timeout);
-  			}
-
-  			begin();
-  		}, 13);
-  	} else {
-  		begin();
-  	}
-  }
-
-  function collectTests(module) {
-  	var tests = [].concat(module.tests);
-  	var modules = [].concat(toConsumableArray(module.childModules));
-
-  	// Do a breadth-first traversal of the child modules
-  	while (modules.length) {
-  		var nextModule = modules.shift();
-  		tests.push.apply(tests, nextModule.tests);
-  		modules.push.apply(modules, toConsumableArray(nextModule.childModules));
-  	}
-
-  	return tests;
-  }
-
-  function numberOfTests(module) {
-  	return collectTests(module).length;
-  }
-
-  function numberOfUnskippedTests(module) {
-  	return collectTests(module).filter(function (test) {
-  		return !test.skip;
-  	}).length;
-  }
-
-  function notifyTestsRan(module, skipped) {
-  	module.testsRun++;
-  	if (!skipped) {
-  		module.unskippedTestsRun++;
-  	}
-  	while (module = module.parentModule) {
-  		module.testsRun++;
-  		if (!skipped) {
-  			module.unskippedTestsRun++;
-  		}
-  	}
-  }
-
-  /**
-   * Returns a function that proxies to the given method name on the globals
-   * console object. The proxy will also detect if the console doesn't exist and
-   * will appropriately no-op. This allows support for IE9, which doesn't have a
-   * console if the developer tools are not open.
-   */
-  function consoleProxy(method) {
-  	return function () {
-  		if (console) {
-  			console[method].apply(console, arguments);
-  		}
-  	};
-  }
-
-  var Logger = {
-  	warn: consoleProxy("warn")
-  };
-
-  var Assert = function () {
-  	function Assert(testContext) {
-  		classCallCheck(this, Assert);
-
-  		this.test = testContext;
-  	}
-
-  	// Assert helpers
-
-  	createClass(Assert, [{
-  		key: "timeout",
-  		value: function timeout(duration) {
-  			if (typeof duration !== "number") {
-  				throw new Error("You must pass a number as the duration to assert.timeout");
-  			}
-
-  			this.test.timeout = duration;
-  		}
-
-  		// Documents a "step", which is a string value, in a test as a passing assertion
-
-  	}, {
-  		key: "step",
-  		value: function step(message) {
-  			var result = !!message;
-
-  			this.test.steps.push(message);
-
-  			return this.pushResult({
-  				result: result,
-  				message: message || "You must provide a message to assert.step"
-  			});
-  		}
-
-  		// Verifies the steps in a test match a given array of string values
-
-  	}, {
-  		key: "verifySteps",
-  		value: function verifySteps(steps, message) {
-  			this.deepEqual(this.test.steps, steps, message);
-  		}
-
-  		// Specify the number of expected assertions to guarantee that failed test
-  		// (no assertions are run at all) don't slip through.
-
-  	}, {
-  		key: "expect",
-  		value: function expect(asserts) {
-  			if (arguments.length === 1) {
-  				this.test.expected = asserts;
-  			} else {
-  				return this.test.expected;
-  			}
-  		}
-
-  		// Put a hold on processing and return a function that will release it a maximum of once.
-
-  	}, {
-  		key: "async",
-  		value: function async(count) {
-  			var test$$1 = this.test;
-
-  			var popped = false,
-  			    acceptCallCount = count;
-
-  			if (typeof acceptCallCount === "undefined") {
-  				acceptCallCount = 1;
-  			}
-
-  			var resume = internalStop(test$$1);
-
-  			return function done() {
-  				if (config.current !== test$$1) {
-  					throw Error("assert.async callback called after test finished.");
-  				}
-
-  				if (popped) {
-  					test$$1.pushFailure("Too many calls to the `assert.async` callback", sourceFromStacktrace(2));
-  					return;
-  				}
-
-  				acceptCallCount -= 1;
-  				if (acceptCallCount > 0) {
-  					return;
-  				}
-
-  				popped = true;
-  				resume();
-  			};
-  		}
-
-  		// Exports test.push() to the user API
-  		// Alias of pushResult.
-
-  	}, {
-  		key: "push",
-  		value: function push(result, actual, expected, message, negative) {
-  			Logger.warn("assert.push is deprecated and will be removed in QUnit 3.0." + " Please use assert.pushResult instead (https://api.qunitjs.com/assert/pushResult).");
-
-  			var currentAssert = this instanceof Assert ? this : config.current.assert;
-  			return currentAssert.pushResult({
-  				result: result,
-  				actual: actual,
-  				expected: expected,
-  				message: message,
-  				negative: negative
-  			});
-  		}
-  	}, {
-  		key: "pushResult",
-  		value: function pushResult(resultInfo) {
-
-  			// Destructure of resultInfo = { result, actual, expected, message, negative }
-  			var assert = this;
-  			var currentTest = assert instanceof Assert && assert.test || config.current;
-
-  			// Backwards compatibility fix.
-  			// Allows the direct use of global exported assertions and QUnit.assert.*
-  			// Although, it's use is not recommended as it can leak assertions
-  			// to other tests from async tests, because we only get a reference to the current test,
-  			// not exactly the test where assertion were intended to be called.
-  			if (!currentTest) {
-  				throw new Error("assertion outside test context, in " + sourceFromStacktrace(2));
-  			}
-
-  			if (!(assert instanceof Assert)) {
-  				assert = currentTest.assert;
-  			}
-
-  			return assert.test.pushResult(resultInfo);
-  		}
-  	}, {
-  		key: "ok",
-  		value: function ok(result, message) {
-  			if (!message) {
-  				message = result ? "okay" : "failed, expected argument to be truthy, was: " + dump.parse(result);
-  			}
-
-  			this.pushResult({
-  				result: !!result,
-  				actual: result,
-  				expected: true,
-  				message: message
-  			});
-  		}
-  	}, {
-  		key: "notOk",
-  		value: function notOk(result, message) {
-  			if (!message) {
-  				message = !result ? "okay" : "failed, expected argument to be falsy, was: " + dump.parse(result);
-  			}
-
-  			this.pushResult({
-  				result: !result,
-  				actual: result,
-  				expected: false,
-  				message: message
-  			});
-  		}
-  	}, {
-  		key: "equal",
-  		value: function equal(actual, expected, message) {
-
-  			// eslint-disable-next-line eqeqeq
-  			var result = expected == actual;
-
-  			this.pushResult({
-  				result: result,
-  				actual: actual,
-  				expected: expected,
-  				message: message
-  			});
-  		}
-  	}, {
-  		key: "notEqual",
-  		value: function notEqual(actual, expected, message) {
-
-  			// eslint-disable-next-line eqeqeq
-  			var result = expected != actual;
-
-  			this.pushResult({
-  				result: result,
-  				actual: actual,
-  				expected: expected,
-  				message: message,
-  				negative: true
-  			});
-  		}
-  	}, {
-  		key: "propEqual",
-  		value: function propEqual(actual, expected, message) {
-  			actual = objectValues(actual);
-  			expected = objectValues(expected);
-
-  			this.pushResult({
-  				result: equiv(actual, expected),
-  				actual: actual,
-  				expected: expected,
-  				message: message
-  			});
-  		}
-  	}, {
-  		key: "notPropEqual",
-  		value: function notPropEqual(actual, expected, message) {
-  			actual = objectValues(actual);
-  			expected = objectValues(expected);
-
-  			this.pushResult({
-  				result: !equiv(actual, expected),
-  				actual: actual,
-  				expected: expected,
-  				message: message,
-  				negative: true
-  			});
-  		}
-  	}, {
-  		key: "deepEqual",
-  		value: function deepEqual(actual, expected, message) {
-  			this.pushResult({
-  				result: equiv(actual, expected),
-  				actual: actual,
-  				expected: expected,
-  				message: message
-  			});
-  		}
-  	}, {
-  		key: "notDeepEqual",
-  		value: function notDeepEqual(actual, expected, message) {
-  			this.pushResult({
-  				result: !equiv(actual, expected),
-  				actual: actual,
-  				expected: expected,
-  				message: message,
-  				negative: true
-  			});
-  		}
-  	}, {
-  		key: "strictEqual",
-  		value: function strictEqual(actual, expected, message) {
-  			this.pushResult({
-  				result: expected === actual,
-  				actual: actual,
-  				expected: expected,
-  				message: message
-  			});
-  		}
-  	}, {
-  		key: "notStrictEqual",
-  		value: function notStrictEqual(actual, expected, message) {
-  			this.pushResult({
-  				result: expected !== actual,
-  				actual: actual,
-  				expected: expected,
-  				message: message,
-  				negative: true
-  			});
-  		}
-  	}, {
-  		key: "throws",
-  		value: function throws(block, expected, message) {
-  			var actual = void 0,
-  			    result = false;
-
-  			var currentTest = this instanceof Assert && this.test || config.current;
-
-  			// 'expected' is optional unless doing string comparison
-  			if (objectType(expected) === "string") {
-  				if (message == null) {
-  					message = expected;
-  					expected = null;
-  				} else {
-  					throw new Error("throws/raises does not accept a string value for the expected argument.\n" + "Use a non-string object value (e.g. regExp) instead if it's necessary.");
-  				}
-  			}
-
-  			currentTest.ignoreGlobalErrors = true;
-  			try {
-  				block.call(currentTest.testEnvironment);
-  			} catch (e) {
-  				actual = e;
-  			}
-  			currentTest.ignoreGlobalErrors = false;
-
-  			if (actual) {
-  				var expectedType = objectType(expected);
-
-  				// We don't want to validate thrown error
-  				if (!expected) {
-  					result = true;
-  					expected = null;
-
-  					// Expected is a regexp
-  				} else if (expectedType === "regexp") {
-  					result = expected.test(errorString(actual));
-
-  					// Expected is a constructor, maybe an Error constructor
-  				} else if (expectedType === "function" && actual instanceof expected) {
-  					result = true;
-
-  					// Expected is an Error object
-  				} else if (expectedType === "object") {
-  					result = actual instanceof expected.constructor && actual.name === expected.name && actual.message === expected.message;
-
-  					// Expected is a validation function which returns true if validation passed
-  				} else if (expectedType === "function" && expected.call({}, actual) === true) {
-  					expected = null;
-  					result = true;
-  				}
-  			}
-
-  			currentTest.assert.pushResult({
-  				result: result,
-  				actual: actual,
-  				expected: expected,
-  				message: message
-  			});
-  		}
-  	}]);
-  	return Assert;
-  }();
-
-  // Provide an alternative to assert.throws(), for environments that consider throws a reserved word
-  // Known to us are: Closure Compiler, Narwhal
-  // eslint-disable-next-line dot-notation
-
-
-  Assert.prototype.raises = Assert.prototype["throws"];
-
-  /**
-   * Converts an error into a simple string for comparisons.
-   *
-   * @param {Error} error
-   * @return {String}
-   */
-  function errorString(error) {
-  	var resultErrorString = error.toString();
-
-  	if (resultErrorString.substring(0, 7) === "[object") {
-  		var name = error.name ? error.name.toString() : "Error";
-  		var message = error.message ? error.message.toString() : "";
-
-  		if (name && message) {
-  			return name + ": " + message;
-  		} else if (name) {
-  			return name;
-  		} else if (message) {
-  			return message;
-  		} else {
-  			return "Error";
-  		}
-  	} else {
-  		return resultErrorString;
-  	}
-  }
-
-  /* global module, exports, define */
-  function exportQUnit(QUnit) {
-
-  	if (defined.document) {
-
-  		// QUnit may be defined when it is preconfigured but then only QUnit and QUnit.config may be defined.
-  		if (window.QUnit && window.QUnit.version) {
-  			throw new Error("QUnit has already been defined.");
-  		}
-
-  		window.QUnit = QUnit;
-  	}
-
-  	// For nodejs
-  	if (typeof module !== "undefined" && module && module.exports) {
-  		module.exports = QUnit;
-
-  		// For consistency with CommonJS environments' exports
-  		module.exports.QUnit = QUnit;
-  	}
-
-  	// For CommonJS with exports, but without module.exports, like Rhino
-  	if (typeof exports !== "undefined" && exports) {
-  		exports.QUnit = QUnit;
-  	}
-
-  	if (typeof define === "function" && define.amd) {
-  		define(function () {
-  			return QUnit;
-  		});
-  		QUnit.config.autostart = false;
-  	}
-
-  	// For Web/Service Workers
-  	if (self$1 && self$1.WorkerGlobalScope && self$1 instanceof self$1.WorkerGlobalScope) {
-  		self$1.QUnit = QUnit;
-  	}
-  }
-
-  var SuiteReport = function () {
-  	function SuiteReport(name, parentSuite) {
-  		classCallCheck(this, SuiteReport);
-
-  		this.name = name;
-  		this.fullName = parentSuite ? parentSuite.fullName.concat(name) : [];
-
-  		this.tests = [];
-  		this.childSuites = [];
-
-  		if (parentSuite) {
-  			parentSuite.pushChildSuite(this);
-  		}
-  	}
-
-  	createClass(SuiteReport, [{
-  		key: "start",
-  		value: function start(recordTime) {
-  			if (recordTime) {
-  				this._startTime = Date.now();
-  			}
-
-  			return {
-  				name: this.name,
-  				fullName: this.fullName.slice(),
-  				tests: this.tests.map(function (test) {
-  					return test.start();
-  				}),
-  				childSuites: this.childSuites.map(function (suite) {
-  					return suite.start();
-  				}),
-  				testCounts: {
-  					total: this.getTestCounts().total
-  				}
-  			};
-  		}
-  	}, {
-  		key: "end",
-  		value: function end(recordTime) {
-  			if (recordTime) {
-  				this._endTime = Date.now();
-  			}
-
-  			return {
-  				name: this.name,
-  				fullName: this.fullName.slice(),
-  				tests: this.tests.map(function (test) {
-  					return test.end();
-  				}),
-  				childSuites: this.childSuites.map(function (suite) {
-  					return suite.end();
-  				}),
-  				testCounts: this.getTestCounts(),
-  				runtime: this.getRuntime(),
-  				status: this.getStatus()
-  			};
-  		}
-  	}, {
-  		key: "pushChildSuite",
-  		value: function pushChildSuite(suite) {
-  			this.childSuites.push(suite);
-  		}
-  	}, {
-  		key: "pushTest",
-  		value: function pushTest(test) {
-  			this.tests.push(test);
-  		}
-  	}, {
-  		key: "getRuntime",
-  		value: function getRuntime() {
-  			return this._endTime - this._startTime;
-  		}
-  	}, {
-  		key: "getTestCounts",
-  		value: function getTestCounts() {
-  			var counts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : { passed: 0, failed: 0, skipped: 0, todo: 0, total: 0 };
-
-  			counts = this.tests.reduce(function (counts, test) {
-  				if (test.valid) {
-  					counts[test.getStatus()]++;
-  					counts.total++;
-  				}
-
-  				return counts;
-  			}, counts);
-
-  			return this.childSuites.reduce(function (counts, suite) {
-  				return suite.getTestCounts(counts);
-  			}, counts);
-  		}
-  	}, {
-  		key: "getStatus",
-  		value: function getStatus() {
-  			var _getTestCounts = this.getTestCounts(),
-  			    total = _getTestCounts.total,
-  			    failed = _getTestCounts.failed,
-  			    skipped = _getTestCounts.skipped,
-  			    todo = _getTestCounts.todo;
-
-  			if (failed) {
-  				return "failed";
-  			} else {
-  				if (skipped === total) {
-  					return "skipped";
-  				} else if (todo === total) {
-  					return "todo";
-  				} else {
-  					return "passed";
-  				}
-  			}
-  		}
-  	}]);
-  	return SuiteReport;
-  }();
-
-  // Handle an unhandled exception. By convention, returns true if further
-  // error handling should be suppressed and false otherwise.
-  // In this case, we will only suppress further error handling if the
-  // "ignoreGlobalErrors" configuration option is enabled.
-  function onError(error) {
-  	for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
-  		args[_key - 1] = arguments[_key];
-  	}
-
-  	if (config.current) {
-  		if (config.current.ignoreGlobalErrors) {
-  			return true;
-  		}
-  		pushFailure.apply(undefined, [error.message, error.fileName + ":" + error.lineNumber].concat(args));
-  	} else {
-  		test("global failure", extend(function () {
-  			pushFailure.apply(undefined, [error.message, error.fileName + ":" + error.lineNumber].concat(args));
-  		}, { validTest: true }));
-  	}
-
-  	return false;
-  }
-
-  var focused = false;
-  var QUnit = {};
-  var globalSuite = new SuiteReport();
-
-  // The initial "currentModule" represents the global (or top-level) module that
-  // is not explicitly defined by the user, therefore we add the "globalSuite" to
-  // it since each module has a suiteReport associated with it.
-  config.currentModule.suiteReport = globalSuite;
-
-  var moduleStack = [];
-  var globalStartCalled = false;
-  var runStarted = false;
-
-  // Figure out if we're running the tests from a server or not
-  QUnit.isLocal = !(defined.document && window.location.protocol !== "file:");
-
-  // Expose the current QUnit version
-  QUnit.version = "2.4.0";
-
-  function createModule(name, testEnvironment, modifiers) {
-  	var parentModule = moduleStack.length ? moduleStack.slice(-1)[0] : null;
-  	var moduleName = parentModule !== null ? [parentModule.name, name].join(" > ") : name;
-  	var parentSuite = parentModule ? parentModule.suiteReport : globalSuite;
-
-  	var skip$$1 = parentModule !== null && parentModule.skip || modifiers.skip;
-  	var todo$$1 = parentModule !== null && parentModule.todo || modifiers.todo;
-
-  	var module = {
-  		name: moduleName,
-  		parentModule: parentModule,
-  		tests: [],
-  		moduleId: generateHash(moduleName),
-  		testsRun: 0,
-  		unskippedTestsRun: 0,
-  		childModules: [],
-  		suiteReport: new SuiteReport(name, parentSuite),
-
-  		// Pass along `skip` and `todo` properties from parent module, in case
-  		// there is one, to childs. And use own otherwise.
-  		// This property will be used to mark own tests and tests of child suites
-  		// as either `skipped` or `todo`.
-  		skip: skip$$1,
-  		todo: skip$$1 ? false : todo$$1
-  	};
-
-  	var env = {};
-  	if (parentModule) {
-  		parentModule.childModules.push(module);
-  		extend(env, parentModule.testEnvironment);
-  	}
-  	extend(env, testEnvironment);
-  	module.testEnvironment = env;
-
-  	config.modules.push(module);
-  	return module;
-  }
-
-  function processModule(name, options, executeNow) {
-  	var modifiers = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
-
-  	var module = createModule(name, options, modifiers);
-
-  	// Move any hooks to a 'hooks' object
-  	var testEnvironment = module.testEnvironment;
-  	var hooks = module.hooks = {};
-
-  	setHookFromEnvironment(hooks, testEnvironment, "before");
-  	setHookFromEnvironment(hooks, testEnvironment, "beforeEach");
-  	setHookFromEnvironment(hooks, testEnvironment, "afterEach");
-  	setHookFromEnvironment(hooks, testEnvironment, "after");
-
-  	function setHookFromEnvironment(hooks, environment, name) {
-  		var potentialHook = environment[name];
-  		hooks[name] = typeof potentialHook === "function" ? [potentialHook] : [];
-  		delete environment[name];
-  	}
-
-  	var moduleFns = {
-  		before: setHookFunction(module, "before"),
-  		beforeEach: setHookFunction(module, "beforeEach"),
-  		afterEach: setHookFunction(module, "afterEach"),
-  		after: setHookFunction(module, "after")
-  	};
-
-  	var currentModule = config.currentModule;
-  	if (objectType(executeNow) === "function") {
-  		moduleStack.push(module);
-  		config.currentModule = module;
-  		executeNow.call(module.testEnvironment, moduleFns);
-  		moduleStack.pop();
-  		module = module.parentModule || currentModule;
-  	}
-
-  	config.currentModule = module;
-  }
-
-  // TODO: extract this to a new file alongside its related functions
-  function module$1(name, options, executeNow) {
-  	if (focused) {
-  		return;
-  	}
-
-  	if (arguments.length === 2) {
-  		if (objectType(options) === "function") {
-  			executeNow = options;
-  			options = undefined;
-  		}
-  	}
-
-  	processModule(name, options, executeNow);
-  }
-
-  module$1.only = function () {
-  	if (focused) {
-  		return;
-  	}
-
-  	config.modules.length = 0;
-  	config.queue.length = 0;
-
-  	module$1.apply(undefined, arguments);
-
-  	focused = true;
-  };
-
-  module$1.skip = function (name, options, executeNow) {
-  	if (focused) {
-  		return;
-  	}
-
-  	if (arguments.length === 2) {
-  		if (objectType(options) === "function") {
-  			executeNow = options;
-  			options = undefined;
-  		}
-  	}
-
-  	processModule(name, options, executeNow, { skip: true });
-  };
-
-  module$1.todo = function (name, options, executeNow) {
-  	if (focused) {
-  		return;
-  	}
-
-  	if (arguments.length === 2) {
-  		if (objectType(options) === "function") {
-  			executeNow = options;
-  			options = undefined;
-  		}
-  	}
-
-  	processModule(name, options, executeNow, { todo: true });
-  };
-
-  extend(QUnit, {
-  	on: on,
-
-  	module: module$1,
-
-  	test: test,
-
-  	todo: todo,
-
-  	skip: skip,
-
-  	only: only,
-
-  	start: function start(count) {
-  		var globalStartAlreadyCalled = globalStartCalled;
-
-  		if (!config.current) {
-  			globalStartCalled = true;
-
-  			if (runStarted) {
-  				throw new Error("Called start() while test already started running");
-  			} else if (globalStartAlreadyCalled || count > 1) {
-  				throw new Error("Called start() outside of a test context too many times");
-  			} else if (config.autostart) {
-  				throw new Error("Called start() outside of a test context when " + "QUnit.config.autostart was true");
-  			} else if (!config.pageLoaded) {
-
-  				// The page isn't completely loaded yet, so we set autostart and then
-  				// load if we're in Node or wait for the browser's load event.
-  				config.autostart = true;
-
-  				// Starts from Node even if .load was not previously called. We still return
-  				// early otherwise we'll wind up "beginning" twice.
-  				if (!defined.document) {
-  					QUnit.load();
-  				}
-
-  				return;
-  			}
-  		} else {
-  			throw new Error("QUnit.start cannot be called inside a test context.");
-  		}
-
-  		scheduleBegin();
-  	},
-
-  	config: config,
-
-  	is: is,
-
-  	objectType: objectType,
-
-  	extend: extend,
-
-  	load: function load() {
-  		config.pageLoaded = true;
-
-  		// Initialize the configuration options
-  		extend(config, {
-  			stats: { all: 0, bad: 0 },
-  			started: 0,
-  			updateRate: 1000,
-  			autostart: true,
-  			filter: ""
-  		}, true);
-
-  		if (!runStarted) {
-  			config.blocking = false;
-
-  			if (config.autostart) {
-  				scheduleBegin();
-  			}
-  		}
-  	},
-
-  	stack: function stack(offset) {
-  		offset = (offset || 0) + 2;
-  		return sourceFromStacktrace(offset);
-  	},
-
-  	onError: onError
-  });
-
-  QUnit.pushFailure = pushFailure;
-  QUnit.assert = Assert.prototype;
-  QUnit.equiv = equiv;
-  QUnit.dump = dump;
-
-  registerLoggingCallbacks(QUnit);
-
-  function scheduleBegin() {
-
-  	runStarted = true;
-
-  	// Add a slight delay to allow definition of more modules and tests.
-  	if (defined.setTimeout) {
-  		setTimeout(function () {
-  			begin();
-  		}, 13);
-  	} else {
-  		begin();
-  	}
-  }
-
-  function begin() {
-  	var i,
-  	    l,
-  	    modulesLog = [];
-
-  	// If the test run hasn't officially begun yet
-  	if (!config.started) {
-
-  		// Record the time of the test run's beginning
-  		config.started = now();
-
-  		// Delete the loose unnamed module if unused.
-  		if (config.modules[0].name === "" && config.modules[0].tests.length === 0) {
-  			config.modules.shift();
-  		}
-
-  		// Avoid unnecessary information by not logging modules' test environments
-  		for (i = 0, l = config.modules.length; i < l; i++) {
-  			modulesLog.push({
-  				name: config.modules[i].name,
-  				tests: config.modules[i].tests
-  			});
-  		}
-
-  		// The test run is officially beginning now
-  		emit("runStart", globalSuite.start(true));
-  		runLoggingCallbacks("begin", {
-  			totalTests: Test.count,
-  			modules: modulesLog
-  		});
-  	}
-
-  	config.blocking = false;
-  	ProcessingQueue.advance();
-  }
-
-  function setHookFunction(module, hookName) {
-  	return function setHook(callback) {
-  		module.hooks[hookName].push(callback);
-  	};
-  }
-
-  exportQUnit(QUnit);
-
-  (function () {
-
-  	if (typeof window === "undefined" || typeof document === "undefined") {
-  		return;
-  	}
-
-  	var config = QUnit.config,
-  	    hasOwn = Object.prototype.hasOwnProperty;
-
-  	// Stores fixture HTML for resetting later
-  	function storeFixture() {
-
-  		// Avoid overwriting user-defined values
-  		if (hasOwn.call(config, "fixture")) {
-  			return;
-  		}
-
-  		var fixture = document.getElementById("qunit-fixture");
-  		if (fixture) {
-  			config.fixture = fixture.innerHTML;
-  		}
-  	}
-
-  	QUnit.begin(storeFixture);
-
-  	// Resets the fixture DOM element if available.
-  	function resetFixture() {
-  		if (config.fixture == null) {
-  			return;
-  		}
-
-  		var fixture = document.getElementById("qunit-fixture");
-  		if (fixture) {
-  			fixture.innerHTML = config.fixture;
-  		}
-  	}
-
-  	QUnit.testStart(resetFixture);
-  })();
-
-  (function () {
-
-  	// Only interact with URLs via window.location
-  	var location = typeof window !== "undefined" && window.location;
-  	if (!location) {
-  		return;
-  	}
-
-  	var urlParams = getUrlParams();
-
-  	QUnit.urlParams = urlParams;
-
-  	// Match module/test by inclusion in an array
-  	QUnit.config.moduleId = [].concat(urlParams.moduleId || []);
-  	QUnit.config.testId = [].concat(urlParams.testId || []);
-
-  	// Exact case-insensitive match of the module name
-  	QUnit.config.module = urlParams.module;
-
-  	// Regular expression or case-insenstive substring match against "moduleName: testName"
-  	QUnit.config.filter = urlParams.filter;
-
-  	// Test order randomization
-  	if (urlParams.seed === true) {
-
-  		// Generate a random seed if the option is specified without a value
-  		QUnit.config.seed = Math.random().toString(36).slice(2);
-  	} else if (urlParams.seed) {
-  		QUnit.config.seed = urlParams.seed;
-  	}
-
-  	// Add URL-parameter-mapped config values with UI form rendering data
-  	QUnit.config.urlConfig.push({
-  		id: "hidepassed",
-  		label: "Hide passed tests",
-  		tooltip: "Only show tests and assertions that fail. Stored as query-strings."
-  	}, {
-  		id: "noglobals",
-  		label: "Check for Globals",
-  		tooltip: "Enabling this will test if any test introduces new properties on the " + "global object (`window` in Browsers). Stored as query-strings."
-  	}, {
-  		id: "notrycatch",
-  		label: "No try-catch",
-  		tooltip: "Enabling this will run tests outside of a try-catch block. Makes debugging " + "exceptions in IE reasonable. Stored as query-strings."
-  	});
-
-  	QUnit.begin(function () {
-  		var i,
-  		    option,
-  		    urlConfig = QUnit.config.urlConfig;
-
-  		for (i = 0; i < urlConfig.length; i++) {
-
-  			// Options can be either strings or objects with nonempty "id" properties
-  			option = QUnit.config.urlConfig[i];
-  			if (typeof option !== "string") {
-  				option = option.id;
-  			}
-
-  			if (QUnit.config[option] === undefined) {
-  				QUnit.config[option] = urlParams[option];
-  			}
-  		}
-  	});
-
-  	function getUrlParams() {
-  		var i, param, name, value;
-  		var urlParams = Object.create(null);
-  		var params = location.search.slice(1).split("&");
-  		var length = params.length;
-
-  		for (i = 0; i < length; i++) {
-  			if (params[i]) {
-  				param = params[i].split("=");
-  				name = decodeQueryParam(param[0]);
-
-  				// Allow just a key to turn on a flag, e.g., test.html?noglobals
-  				value = param.length === 1 || decodeQueryParam(param.slice(1).join("="));
-  				if (name in urlParams) {
-  					urlParams[name] = [].concat(urlParams[name], value);
-  				} else {
-  					urlParams[name] = value;
-  				}
-  			}
-  		}
-
-  		return urlParams;
-  	}
-
-  	function decodeQueryParam(param) {
-  		return decodeURIComponent(param.replace(/\+/g, "%20"));
-  	}
-  })();
-
-  var stats = {
-  	passedTests: 0,
-  	failedTests: 0,
-  	skippedTests: 0,
-  	todoTests: 0
-  };
-
-  // Escape text for attribute or text content.
-  function escapeText(s) {
-  	if (!s) {
-  		return "";
-  	}
-  	s = s + "";
-
-  	// Both single quotes and double quotes (for attributes)
-  	return s.replace(/['"<>&]/g, function (s) {
-  		switch (s) {
-  			case "'":
-  				return "'";
-  			case "\"":
-  				return """;
-  			case "<":
-  				return "<";
-  			case ">":
-  				return ">";
-  			case "&":
-  				return "&";
-  		}
-  	});
-  }
-
-  (function () {
-
-  	// Don't load the HTML Reporter on non-browser environments
-  	if (typeof window === "undefined" || !window.document) {
-  		return;
-  	}
-
-  	var config = QUnit.config,
-  	    document$$1 = window.document,
-  	    collapseNext = false,
-  	    hasOwn = Object.prototype.hasOwnProperty,
-  	    unfilteredUrl = setUrl({ filter: undefined, module: undefined,
-  		moduleId: undefined, testId: undefined }),
-  	    modulesList = [];
-
-  	function addEvent(elem, type, fn) {
-  		elem.addEventListener(type, fn, false);
-  	}
-
-  	function removeEvent(elem, type, fn) {
-  		elem.removeEventListener(type, fn, false);
-  	}
-
-  	function addEvents(elems, type, fn) {
-  		var i = elems.length;
-  		while (i--) {
-  			addEvent(elems[i], type, fn);
-  		}
-  	}
-
-  	function hasClass(elem, name) {
-  		return (" " + elem.className + " ").indexOf(" " + name + " ") >= 0;
-  	}
-
-  	function addClass(elem, name) {
-  		if (!hasClass(elem, name)) {
-  			elem.className += (elem.className ? " " : "") + name;
-  		}
-  	}
-
-  	function toggleClass(elem, name, force) {
-  		if (force || typeof force === "undefined" && !hasClass(elem, name)) {
-  			addClass(elem, name);
-  		} else {
-  			removeClass(elem, name);
-  		}
-  	}
-
-  	function removeClass(elem, name) {
-  		var set = " " + elem.className + " ";
-
-  		// Class name may appear multiple times
-  		while (set.indexOf(" " + name + " ") >= 0) {
-  			set = set.replace(" " + name + " ", " ");
-  		}
-
-  		// Trim for prettiness
-  		elem.className = typeof set.trim === "function" ? set.trim() : set.replace(/^\s+|\s+$/g, "");
-  	}
-
-  	function id(name) {
-  		return document$$1.getElementById && document$$1.getElementById(name);
-  	}
-
-  	function abortTests() {
-  		var abortButton = id("qunit-abort-tests-button");
-  		if (abortButton) {
-  			abortButton.disabled = true;
-  			abortButton.innerHTML = "Aborting...";
-  		}
-  		QUnit.config.queue.length = 0;
-  		return false;
-  	}
-
-  	function interceptNavigation(ev) {
-  		applyUrlParams();
-
-  		if (ev && ev.preventDefault) {
-  			ev.preventDefault();
-  		}
-
-  		return false;
-  	}
-
-  	function getUrlConfigHtml() {
-  		var i,
-  		    j,
-  		    val,
-  		    escaped,
-  		    escapedTooltip,
-  		    selection = false,
-  		    urlConfig = config.urlConfig,
-  		    urlConfigHtml = "";
-
-  		for (i = 0; i < urlConfig.length; i++) {
-
-  			// Options can be either strings or objects with nonempty "id" properties
-  			val = config.urlConfig[i];
-  			if (typeof val === "string") {
-  				val = {
-  					id: val,
-  					label: val
-  				};
-  			}
-
-  			escaped = escapeText(val.id);
-  			escapedTooltip = escapeText(val.tooltip);
-
-  			if (!val.value || typeof val.value === "string") {
-  				urlConfigHtml += "<label for='qunit-urlconfig-" + escaped + "' title='" + escapedTooltip + "'><input id='qunit-urlconfig-" + escaped + "' name='" + escaped + "' type='checkbox'" + (val.value ? " value='" + escapeText(val.value) + "'" : "") + (config[val.id] ? " checked='checked'" : "") + " title='" + escapedTooltip + "' />" + escapeText(val.label) + "</label>";
-  			} else {
-  				urlConfigHtml += "<label for='qunit-urlconfig-" + escaped + "' title='" + escapedTooltip + "'>" + val.label + ": </label><select id='qunit-urlconfig-" + escaped + "' name='" + escaped + "' title='" + escapedTooltip + "'><option></option>";
-
-  				if (QUnit.is("array", val.value)) {
-  					for (j = 0; j < val.value.length; j++) {
-  						escaped = escapeText(val.value[j]);
-  						urlConfigHtml += "<option value='" + escaped + "'" + (config[val.id] === val.value[j] ? (selection = true) && " selected='selected'" : "") + ">" + escaped + "</option>";
-  					}
-  				} else {
-  					for (j in val.value) {
-  						if (hasOwn.call(val.value, j)) {
-  							urlConfigHtml += "<option value='" + escapeText(j) + "'" + (config[val.id] === j ? (selection = true) && " selected='selected'" : "") + ">" + escapeText(val.value[j]) + "</option>";
-  						}
-  					}
-  				}
-  				if (config[val.id] && !selection) {
-  					escaped = escapeText(config[val.id]);
-  					urlConfigHtml += "<option value='" + escaped + "' selected='selected' disabled='disabled'>" + escaped + "</option>";
-  				}
-  				urlConfigHtml += "</select>";
-  			}
-  		}
-
-  		return urlConfigHtml;
-  	}
-
-  	// Handle "click" events on toolbar checkboxes and "change" for select menus.
-  	// Updates the URL with the new state of `config.urlConfig` values.
-  	function toolbarChanged() {
-  		var updatedUrl,
-  		    value,
-  		    tests,
-  		    field = this,
-  		    params = {};
-
-  		// Detect if field is a select menu or a checkbox
-  		if ("selectedIndex" in field) {
-  			value = field.options[field.selectedIndex].value || undefined;
-  		} else {
-  			value = field.checked ? field.defaultValue || true : undefined;
-  		}
-
-  		params[field.name] = value;
-  		updatedUrl = setUrl(params);
-
-  		// Check if we can apply the change without a page refresh
-  		if ("hidepassed" === field.name && "replaceState" in window.history) {
-  			QUnit.urlParams[field.name] = value;
-  			config[field.name] = value || false;
-  			tests = id("qunit-tests");
-  			if (tests) {
-  				toggleClass(tests, "hidepass", value || false);
-  			}
-  			window.history.replaceState(null, "", updatedUrl);
-  		} else {
-  			window.location = updatedUrl;
-  		}
-  	}
-
-  	function setUrl(params) {
-  		var key,
-  		    arrValue,
-  		    i,
-  		    querystring = "?",
-  		    location = window.location;
-
-  		params = QUnit.extend(QUnit.extend({}, QUnit.urlParams), params);
-
-  		for (key in params) {
-
-  			// Skip inherited or undefined properties
-  			if (hasOwn.call(params, key) && params[key] !== undefined) {
-
-  				// Output a parameter for each value of this key (but usually just one)
-  				arrValue = [].concat(params[key]);
-  				for (i = 0; i < arrValue.length; i++) {
-  					querystring += encodeURIComponent(key);
-  					if (arrValue[i] !== true) {
-  						querystring += "=" + encodeURIComponent(arrValue[i]);
-  					}
-  					querystring += "&";
-  				}
-  			}
-  		}
-  		return location.protocol + "//" + location.host + location.pathname + querystring.slice(0, -1);
-  	}
-
-  	function applyUrlParams() {
-  		var i,
-  		    selectedModules = [],
-  		    modulesList = id("qunit-modulefilter-dropdown-list").getElementsByTagName("input"),
-  		    filter = id("qunit-filter-input").value;
-
-  		for (i = 0; i < modulesList.length; i++) {
-  			if (modulesList[i].checked) {
-  				selectedModules.push(modulesList[i].value);
-  			}
-  		}
-
-  		window.location = setUrl({
-  			filter: filter === "" ? undefined : filter,
-  			moduleId: selectedModules.length === 0 ? undefined : selectedModules,
-
-  			// Remove module and testId filter
-  			module: undefined,
-  			testId: undefined
-  		});
-  	}
-
-  	function toolbarUrlConfigContainer() {
-  		var urlConfigContainer = document$$1.createElement("span");
-
-  		urlConfigContainer.innerHTML = getUrlConfigHtml();
-  		addClass(urlConfigContainer, "qunit-url-config");
-
-  		addEvents(urlConfigContainer.getElementsByTagName("input"), "change", toolbarChanged);
-  		addEvents(urlConfigContainer.getElementsByTagName("select"), "change", toolbarChanged);
-
-  		return urlConfigContainer;
-  	}
-
-  	function abortTestsButton() {
-  		var button = document$$1.createElement("button");
-  		button.id = "qunit-abort-tests-button";
-  		button.innerHTML = "Abort";
-  		addEvent(button, "click", abortTests);
-  		return button;
-  	}
-
-  	function toolbarLooseFilter() {
-  		var filter = document$$1.createElement("form"),
-  		    label = document$$1.createElement("label"),
-  		    input = document$$1.createElement("input"),
-  		    button = document$$1.createElement("button");
-
-  		addClass(filter, "qunit-filter");
-
-  		label.innerHTML = "Filter: ";
-
-  		input.type = "text";
-  		input.value = config.filter || "";
-  		input.name = "filter";
-  		input.id = "qunit-filter-input";
-
-  		button.innerHTML = "Go";
-
-  		label.appendChild(input);
-
-  		filter.appendChild(label);
-  		filter.appendChild(document$$1.createTextNode(" "));
-  		filter.appendChild(button);
-  		addEvent(filter, "submit", interceptNavigation);
-
-  		return filter;
-  	}
-
-  	function moduleListHtml() {
-  		var i,
-  		    checked,
-  		    html = "";
-
-  		for (i = 0; i < config.modules.length; i++) {
-  			if (config.modules[i].name !== "") {
-  				checked = config.moduleId.indexOf(config.modules[i].moduleId) > -1;
-  				html += "<li><label class='clickable" + (checked ? " checked" : "") + "'><input type='checkbox' " + "value='" + config.modules[i].moduleId + "'" + (checked ? " checked='checked'" : "") + " />" + escapeText(config.modules[i].name) + "</label></li>";
-  			}
-  		}
-
-  		return html;
-  	}
-
-  	function toolbarModuleFilter() {
-  		var allCheckbox,
-  		    commit,
-  		    reset,
-  		    moduleFilter = document$$1.createElement("form"),
-  		    label = document$$1.createElement("label"),
-  		    moduleSearch = document$$1.createElement("input"),
-  		    dropDown = document$$1.createElement("div"),
-  		    actions = document$$1.createElement("span"),
-  		    dropDownList = document$$1.createElement("ul"),
-  		    dirty = false;
-
-  		moduleSearch.id = "qunit-modulefilter-search";
-  		addEvent(moduleSearch, "input", searchInput);
-  		addEvent(moduleSearch, "input", searchFocus);
-  		addEvent(moduleSearch, "focus", searchFocus);
-  		addEvent(moduleSearch, "click", searchFocus);
-
-  		label.id = "qunit-modulefilter-search-container";
-  		label.innerHTML = "Module: ";
-  		label.appendChild(moduleSearch);
-
-  		actions.id = "qunit-modulefilter-actions";
-  		actions.innerHTML = "<button style='display:none'>Apply</button>" + "<button type='reset' style='display:none'>Reset</button>" + "<label class='clickable" + (config.moduleId.length ? "" : " checked") + "'><input type='checkbox'" + (config.moduleId.length ? "" : " checked='checked'") + ">All modules</label>";
-  		allCheckbox = actions.lastChild.firstChild;
-  		commit = actions.firstChild;
-  		reset = commit.nextSibling;
-  		addEvent(commit, "click", applyUrlParams);
-
-  		dropDownList.id = "qunit-modulefilter-dropdown-list";
-  		dropDownList.innerHTML = moduleListHtml();
-
-  		dropDown.id = "qunit-modulefilter-dropdown";
-  		dropDown.style.display = "none";
-  		dropDown.appendChild(actions);
-  		dropDown.appendChild(dropDownList);
-  		addEvent(dropDown, "change", selectionChange);
-  		selectionChange();
-
-  		moduleFilter.id = "qunit-modulefilter";
-  		moduleFilter.appendChild(label);
-  		moduleFilter.appendChild(dropDown);
-  		addEvent(moduleFilter, "submit", interceptNavigation);
-  		addEvent(moduleFilter, "reset", function () {
-
-  			// Let the reset happen, then update styles
-  			window.setTimeout(selectionChange);
-  		});
-
-  		// Enables show/hide for the dropdown
-  		function searchFocus() {
-  			if (dropDown.style.display !== "none") {
-  				return;
-  			}
-
-  			dropDown.style.display = "block";
-  			addEvent(document$$1, "click", hideHandler);
-  			addEvent(document$$1, "keydown", hideHandler);
-
-  			// Hide on Escape keydown or outside-container click
-  			function hideHandler(e) {
-  				var inContainer = moduleFilter.contains(e.target);
-
-  				if (e.keyCode === 27 || !inContainer) {
-  					if (e.keyCode === 27 && inContainer) {
-  						moduleSearch.focus();
-  					}
-  					dropDown.style.display = "none";
-  					removeEvent(document$$1, "click", hideHandler);
-  					removeEvent(document$$1, "keydown", hideHandler);
-  					moduleSearch.value = "";
-  					searchInput();
-  				}
-  			}
-  		}
-
-  		// Processes module search box input
-  		function searchInput() {
-  			var i,
-  			    item,
-  			    searchText = moduleSearch.value.toLowerCase(),
-  			    listItems = dropDownList.children;
-
-  			for (i = 0; i < listItems.length; i++) {
-  				item = listItems[i];
-  				if (!searchText || item.textContent.toLowerCase().indexOf(searchText) > -1) {
-  					item.style.display = "";
-  				} else {
-  					item.style.display = "none";
-  				}
-  			}
-  		}
-
-  		// Processes selection changes
-  		function selectionChange(evt) {
-  			var i,
-  			    item,
-  			    checkbox = evt && evt.target || allCheckbox,
-  			    modulesList = dropDownList.getElementsByTagName("input"),
-  			    selectedNames = [];
-
-  			toggleClass(checkbox.parentNode, "checked", checkbox.checked);
-
-  			dirty = false;
-  			if (checkbox.checked && checkbox !== allCheckbox) {
-  				allCheckbox.checked = false;
-  				removeClass(allCheckbox.parentNode, "checked");
-  			}
-  			for (i = 0; i < modulesList.length; i++) {
-  				item = modulesList[i];
-  				if (!evt) {
-  					toggleClass(item.parentNode, "checked", item.checked);
-  				} else if (checkbox === allCheckbox && checkbox.checked) {
-  					item.checked = false;
-  					removeClass(item.parentNode, "checked");
-  				}
-  				dirty = dirty || item.checked !== item.defaultChecked;
-  				if (item.checked) {
-  					selectedNames.push(item.parentNode.textContent);
-  				}
-  			}
-
-  			commit.style.display = reset.style.display = dirty ? "" : "none";
-  			moduleSearch.placeholder = selectedNames.join(", ") || allCheckbox.parentNode.textContent;
-  			moduleSearch.title = "Type to filter list. Current selection:\n" + (selectedNames.join("\n") || allCheckbox.parentNode.textContent);
-  		}
-
-  		return moduleFilter;
-  	}
-
-  	function appendToolbar() {
-  		var toolbar = id("qunit-testrunner-toolbar");
-
-  		if (toolbar) {
-  			toolbar.appendChild(toolbarUrlConfigContainer());
-  			toolbar.appendChild(toolbarModuleFilter());
-  			toolbar.appendChild(toolbarLooseFilter());
-  			toolbar.appendChild(document$$1.createElement("div")).className = "clearfix";
-  		}
-  	}
-
-  	function appendHeader() {
-  		var header = id("qunit-header");
-
-  		if (header) {
-  			header.innerHTML = "<a href='" + escapeText(unfilteredUrl) + "'>" + header.innerHTML + "</a> ";
-  		}
-  	}
-
-  	function appendBanner() {
-  		var banner = id("qunit-banner");
-
-  		if (banner) {
-  			banner.className = "";
-  		}
-  	}
-
-  	function appendTestResults() {
-  		var tests = id("qunit-tests"),
-  		    result = id("qunit-testresult"),
-  		    controls;
-
-  		if (result) {
-  			result.parentNode.removeChild(result);
-  		}
-
-  		if (tests) {
-  			tests.innerHTML = "";
-  			result = document$$1.createElement("p");
-  			result.id = "qunit-testresult";
-  			result.className = "result";
-  			tests.parentNode.insertBefore(result, tests);
-  			result.innerHTML = "<div id=\"qunit-testresult-display\">Running...<br /> </div>" + "<div id=\"qunit-testresult-controls\"></div>" + "<div class=\"clearfix\"></div>";
-  			controls = id("qunit-testresult-controls");
-  		}
-
-  		if (controls) {
-  			controls.appendChild(abortTestsButton());
-  		}
-  	}
-
-  	function appendFilteredTest() {
-  		var testId = QUnit.config.testId;
-  		if (!testId || testId.length <= 0) {
-  			return "";
-  		}
-  		return "<div id='qunit-filteredTest'>Rerunning selected tests: " + escapeText(testId.join(", ")) + " <a id='qunit-clearFilter' href='" + escapeText(unfilteredUrl) + "'>Run all tests</a></div>";
-  	}
-
-  	function appendUserAgent() {
-  		var userAgent = id("qunit-userAgent");
-
-  		if (userAgent) {
-  			userAgent.innerHTML = "";
-  			userAgent.appendChild(document$$1.createTextNode("QUnit " + QUnit.version + "; " + navigator.userAgent));
-  		}
-  	}
-
-  	function appendInterface() {
-  		var qunit = id("qunit");
-
-  		if (qunit) {
-  			qunit.innerHTML = "<h1 id='qunit-header'>" + escapeText(document$$1.title) + "</h1>" + "<h2 id='qunit-banner'></h2>" + "<div id='qunit-testrunner-toolbar'></div>" + appendFilteredTest() + "<h2 id='qunit-userAgent'></h2>" + "<ol id='qunit-tests'></ol>";
-  		}
-
-  		appendHeader();
-  		appendBanner();
-  		appendTestResults();
-  		appendUserAgent();
-  		appendToolbar();
-  	}
-
-  	function appendTestsList(modules) {
-  		var i, l, x, z, test, moduleObj;
-
-  		for (i = 0, l = modules.length; i < l; i++) {
-  			moduleObj = modules[i];
-
-  			for (x = 0, z = moduleObj.tests.length; x < z; x++) {
-  				test = moduleObj.tests[x];
-
-  				appendTest(test.name, test.testId, moduleObj.name);
-  			}
-  		}
-  	}
-
-  	function appendTest(name, testId, moduleName) {
-  		var title,
-  		    rerunTrigger,
-  		    testBlock,
-  		    assertList,
-  		    tests = id("qunit-tests");
-
-  		if (!tests) {
-  			return;
-  		}
-
-  		title = document$$1.createElement("strong");
-  		title.innerHTML = getNameHtml(name, moduleName);
-
-  		rerunTrigger = document$$1.createElement("a");
-  		rerunTrigger.innerHTML = "Rerun";
-  		rerunTrigger.href = setUrl({ testId: testId });
-
-  		testBlock = document$$1.createElement("li");
-  		testBlock.appendChild(title);
-  		testBlock.appendChild(rerunTrigger);
-  		testBlock.id = "qunit-test-output-" + testId;
-
-  		assertList = document$$1.createElement("ol");
-  		assertList.className = "qunit-assert-list";
-
-  		testBlock.appendChild(assertList);
-
-  		tests.appendChild(testBlock);
-  	}
-
-  	// HTML Reporter initialization and load
-  	QUnit.begin(function (details) {
-  		var i, moduleObj, tests;
-
-  		// Sort modules by name for the picker
-  		for (i = 0; i < details.modules.length; i++) {
-  			moduleObj = details.modules[i];
-  			if (moduleObj.name) {
-  				modulesList.push(moduleObj.name);
-  			}
-  		}
-  		modulesList.sort(function (a, b) {
-  			return a.localeCompare(b);
-  		});
-
-  		// Initialize QUnit elements
-  		appendInterface();
-  		appendTestsList(details.modules);
-  		tests = id("qunit-tests");
-  		if (tests && config.hidepassed) {
-  			addClass(tests, "hidepass");
-  		}
-  	});
-
-  	QUnit.done(function (details) {
-  		var banner = id("qunit-banner"),
-  		    tests = id("qunit-tests"),
-  		    abortButton = id("qunit-abort-tests-button"),
-  		    totalTests = stats.passedTests + stats.skippedTests + stats.todoTests + stats.failedTests,
-  		    html = [totalTests, " tests completed in ", details.runtime, " milliseconds, with ", stats.failedTests, " failed, ", stats.skippedTests, " skipped, and ", stats.todoTests, " todo.<br />", "<span class='passed'>", details.passed, "</span> assertions of <span class='total'>", details.total, "</span> passed, <span class='failed'>", details.failed, "</span> failed."].join(""),
-  		    test,
-  		    assertLi,
-  		    assertList;
-
-  		// Update remaing tests to aborted
-  		if (abortButton && abortButton.disabled) {
-  			html = "Tests aborted after " + details.runtime + " milliseconds.";
-
-  			for (var i = 0; i < tests.children.length; i++) {
-  				test = tests.children[i];
-  				if (test.className === "" || test.className === "running") {
-  					test.className = "aborted";
-  					assertList = test.getElementsByTagName("ol")[0];
-  					assertLi = document$$1.createElement("li");
-  					assertLi.className = "fail";
-  					assertLi.innerHTML = "Test aborted.";
-  					assertList.appendChild(assertLi);
-  				}
-  			}
-  		}
-
-  		if (banner && (!abortButton || abortButton.disabled === false)) {
-  			banner.className = stats.failedTests ? "qunit-fail" : "qunit-pass";
-  		}
-
-  		if (abortButton) {
-  			abortButton.parentNode.removeChild(abortButton);
-  		}
-
-  		if (tests) {
-  			id("qunit-testresult-display").innerHTML = html;
-  		}
-
-  		if (config.altertitle && document$$1.title) {
-
-  			// Show ✖ for good, ✔ for bad suite result in title
-  			// use escape sequences in case file gets loaded with non-utf-8-charset
-  			document$$1.title = [stats.failedTests ? "\u2716" : "\u2714", document$$1.title.replace(/^[\u2714\u2716] /i, "")].join(" ");
-  		}
-
-  		// Scroll back to top to show results
-  		if (config.scrolltop && window.scrollTo) {
-  			window.scrollTo(0, 0);
-  		}
-  	});
-
-  	function getNameHtml(name, module) {
-  		var nameHtml = "";
-
-  		if (module) {
-  			nameHtml = "<span class='module-name'>" + escapeText(module) + "</span>: ";
-  		}
-
-  		nameHtml += "<span class='test-name'>" + escapeText(name) + "</span>";
-
-  		return nameHtml;
-  	}
-
-  	QUnit.testStart(function (details) {
-  		var running, testBlock, bad;
-
-  		testBlock = id("qunit-test-output-" + details.testId);
-  		if (testBlock) {
-  			testBlock.className = "running";
-  		} else {
-
-  			// Report later registered tests
-  			appendTest(details.name, details.testId, details.module);
-  		}
-
-  		running = id("qunit-testresult-display");
-  		if (running) {
-  			bad = QUnit.config.reorder && details.previousFailure;
-
-  			running.innerHTML = (bad ? "Rerunning previously failed test: <br />" : "Running: <br />") + getNameHtml(details.name, details.module);
-  		}
-  	});
-
-  	function stripHtml(string) {
-
-  		// Strip tags, html entity and whitespaces
-  		return string.replace(/<\/?[^>]+(>|$)/g, "").replace(/\"/g, "").replace(/\s+/g, "");
-  	}
-
-  	QUnit.log(function (details) {
-  		var assertList,
-  		    assertLi,
-  		    message,
-  		    expected,
-  		    actual,
-  		    diff,
-  		    showDiff = false,
-  		    testItem = id("qunit-test-output-" + details.testId);
-
-  		if (!testItem) {
-  			return;
-  		}
-
-  		message = escapeText(details.message) || (details.result ? "okay" : "failed");
-  		message = "<span class='test-message'>" + message + "</span>";
-  		message += "<span class='runtime'>@ " + details.runtime + " ms</span>";
-
-  		// The pushFailure doesn't provide details.expected
-  		// when it calls, it's implicit to also not show expected and diff stuff
-  		// Also, we need to check details.expected existence, as it can exist and be undefined
-  		if (!details.result && hasOwn.call(details, "expected")) {
-  			if (details.negative) {
-  				expected = "NOT " + QUnit.dump.parse(details.expected);
-  			} else {
-  				expected = QUnit.dump.parse(details.expected);
-  			}
-
-  			actual = QUnit.dump.parse(details.actual);
-  			message += "<table><tr class='test-expected'><th>Expected: </th><td><pre>" + escapeText(expected) + "</pre></td></tr>";
-
-  			if (actual !== expected) {
-
-  				message += "<tr class='test-actual'><th>Result: </th><td><pre>" + escapeText(actual) + "</pre></td></tr>";
-
-  				if (typeof details.actual === "number" && typeof details.expected === "number") {
-  					if (!isNaN(details.actual) && !isNaN(details.expected)) {
-  						showDiff = true;
-  						diff = details.actual - details.expected;
-  						diff = (diff > 0 ? "+" : "") + diff;
-  					}
-  				} else if (typeof details.actual !== "boolean" && typeof details.expected !== "boolean") {
-  					diff = QUnit.diff(expected, actual);
-
-  					// don't show diff if there is zero overlap
-  					showDiff = stripHtml(diff).length !== stripHtml(expected).length + stripHtml(actual).length;
-  				}
-
-  				if (showDiff) {
-  					message += "<tr class='test-diff'><th>Diff: </th><td><pre>" + diff + "</pre></td></tr>";
-  				}
-  			} else if (expected.indexOf("[object Array]") !== -1 || expected.indexOf("[object Object]") !== -1) {
-  				message += "<tr class='test-message'><th>Message: </th><td>" + "Diff suppressed as the depth of object is more than current max depth (" + QUnit.config.maxDepth + ").<p>Hint: Use <code>QUnit.dump.maxDepth</code> to " + " run with a higher max depth or <a href='" + escapeText(setUrl({ maxDepth: -1 })) + "'>" + "Rerun</a> without max depth.</p></td></tr>";
-  			} else {
-  				message += "<tr class='test-message'><th>Message: </th><td>" + "Diff suppressed as the expected and actual results have an equivalent" + " serialization</td></tr>";
-  			}
-
-  			if (details.source) {
-  				message += "<tr class='test-source'><th>Source: </th><td><pre>" + escapeText(details.source) + "</pre></td></tr>";
-  			}
-
-  			message += "</table>";
-
-  			// This occurs when pushFailure is set and we have an extracted stack trace
-  		} else if (!details.result && details.source) {
-  			message += "<table>" + "<tr class='test-source'><th>Source: </th><td><pre>" + escapeText(details.source) + "</pre></td></tr>" + "</table>";
-  		}
-
-  		assertList = testItem.getElementsByTagName("ol")[0];
-
-  		assertLi = document$$1.createElement("li");
-  		assertLi.className = details.result ? "pass" : "fail";
-  		assertLi.innerHTML = message;
-  		assertList.appendChild(assertLi);
-  	});
-
-  	QUnit.testDone(function (details) {
-  		var testTitle,
-  		    time,
-  		    testItem,
-  		    assertList,
-  		    good,
-  		    bad,
-  		    testCounts,
-  		    skipped,
-  		    sourceName,
-  		    tests = id("qunit-tests");
-
-  		if (!tests) {
-  			return;
-  		}
-
-  		testItem = id("qunit-test-output-" + details.testId);
-
-  		assertList = testItem.getElementsByTagName("ol")[0];
-
-  		good = details.passed;
-  		bad = details.failed;
-
-  		// This test passed if it has no unexpected failed assertions
-  		var testPassed = details.failed > 0 ? details.todo : !details.todo;
-
-  		if (testPassed) {
-
-  			// Collapse the passing tests
-  			addClass(assertList, "qunit-collapsed");
-  		} else if (config.collapse) {
-  			if (!collapseNext) {
-
-  				// Skip collapsing the first failing test
-  				collapseNext = true;
-  			} else {
-
-  				// Collapse remaining tests
-  				addClass(assertList, "qunit-collapsed");
-  			}
-  		}
-
-  		// The testItem.firstChild is the test name
-  		testTitle = testItem.firstChild;
-
-  		testCounts = bad ? "<b class='failed'>" + bad + "</b>, " + "<b class='passed'>" + good + "</b>, " : "";
-
-  		testTitle.innerHTML += " <b class='counts'>(" + testCounts + details.assertions.length + ")</b>";
-
-  		if (details.skipped) {
-  			stats.skippedTests++;
-
-  			testItem.className = "skipped";
-  			skipped = document$$1.createElement("em");
-  			skipped.className = "qunit-skipped-label";
-  			skipped.innerHTML = "skipped";
-  			testItem.insertBefore(skipped, testTitle);
-  		} else {
-  			addEvent(testTitle, "click", function () {
-  				toggleClass(assertList, "qunit-collapsed");
-  			});
-
-  			testItem.className = testPassed ? "pass" : "fail";
-
-  			if (details.todo) {
-  				var todoLabel = document$$1.createElement("em");
-  				todoLabel.className = "qunit-todo-label";
-  				todoLabel.innerHTML = "todo";
-  				testItem.className += " todo";
-  				testItem.insertBefore(todoLabel, testTitle);
-  			}
-
-  			time = document$$1.createElement("span");
-  			time.className = "runtime";
-  			time.innerHTML = details.runtime + " ms";
-  			testItem.insertBefore(time, assertList);
-
-  			if (!testPassed) {
-  				stats.failedTests++;
-  			} else if (details.todo) {
-  				stats.todoTests++;
-  			} else {
-  				stats.passedTests++;
-  			}
-  		}
-
-  		// Show the source of the test when showing assertions
-  		if (details.source) {
-  			sourceName = document$$1.createElement("p");
-  			sourceName.innerHTML = "<strong>Source: </strong>" + details.source;
-  			addClass(sourceName, "qunit-source");
-  			if (testPassed) {
-  				addClass(sourceName, "qunit-collapsed");
-  			}
-  			addEvent(testTitle, "click", function () {
-  				toggleClass(sourceName, "qunit-collapsed");
-  			});
-  			testItem.appendChild(sourceName);
-  		}
-  	});
-
-  	// Avoid readyState issue with phantomjs
-  	// Ref: #818
-  	var notPhantom = function (p) {
-  		return !(p && p.version && p.version.major > 0);
-  	}(window.phantom);
-
-  	if (notPhantom && document$$1.readyState === "complete") {
-  		QUnit.load();
-  	} else {
-  		addEvent(window, "load", QUnit.load);
-  	}
-
-  	// Wrap window.onerror. We will call the original window.onerror to see if
-  	// the existing handler fully handles the error; if not, we will call the
-  	// QUnit.onError function.
-  	var originalWindowOnError = window.onerror;
-
-  	// Cover uncaught exceptions
-  	// Returning true will suppress the default browser handler,
-  	// returning false will let it run.
-  	window.onerror = function (message, fileName, lineNumber) {
-  		var ret = false;
-  		if (originalWindowOnError) {
-  			for (var _len = arguments.length, args = Array(_len > 3 ? _len - 3 : 0), _key = 3; _key < _len; _key++) {
-  				args[_key - 3] = arguments[_key];
-  			}
-
-  			ret = originalWindowOnError.call.apply(originalWindowOnError, [this, message, fileName, lineNumber].concat(args));
-  		}
-
-  		// Treat return value as window.onerror itself does,
-  		// Only do our handling if not suppressed.
-  		if (ret !== true) {
-  			var error = {
-  				message: message,
-  				fileName: fileName,
-  				lineNumber: lineNumber
-  			};
-
-  			ret = QUnit.onError(error);
-  		}
-
-  		return ret;
-  	};
-  })();
-
-  /*
-   * This file is a modified version of google-diff-match-patch's JavaScript implementation
-   * (https://code.google.com/p/google-diff-match-patch/source/browse/trunk/javascript/diff_match_patch_uncompressed.js),
-   * modifications are licensed as more fully set forth in LICENSE.txt.
-   *
-   * The original source of google-diff-match-patch is attributable and licensed as follows:
-   *
-   * Copyright 2006 Google Inc.
-   * https://code.google.com/p/google-diff-match-patch/
-   *
-   * Licensed under the Apache License, Version 2.0 (the "License");
-   * you may not use this file except in compliance with the License.
-   * You may obtain a copy of the License at
-   *
-   * https://www.apache.org/licenses/LICENSE-2.0
-   *
-   * Unless required by applicable law or agreed to in writing, software
-   * distributed under the License is distributed on an "AS IS" BASIS,
-   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   * See the License for the specific language governing permissions and
-   * limitations under the License.
-   *
-   * More Info:
-   *  https://code.google.com/p/google-diff-match-patch/
-   *
-   * Usage: QUnit.diff(expected, actual)
-   *
-   */
-  QUnit.diff = function () {
-  	function DiffMatchPatch() {}
-
-  	//  DIFF FUNCTIONS
-
-  	/**
-    * The data structure representing a diff is an array of tuples:
-    * [[DIFF_DELETE, 'Hello'], [DIFF_INSERT, 'Goodbye'], [DIFF_EQUAL, ' world.']]
-    * which means: delete 'Hello', add 'Goodbye' and keep ' world.'
-    */
-  	var DIFF_DELETE = -1,
-  	    DIFF_INSERT = 1,
-  	    DIFF_EQUAL = 0;
-
-  	/**
-    * Find the differences between two texts.  Simplifies the problem by stripping
-    * any common prefix or suffix off the texts before diffing.
-    * @param {string} text1 Old string to be diffed.
-    * @param {string} text2 New string to be diffed.
-    * @param {boolean=} optChecklines Optional speedup flag. If present and false,
-    *     then don't run a line-level diff first to identify the changed areas.
-    *     Defaults to true, which does a faster, slightly less optimal diff.
-    * @return {!Array.<!DiffMatchPatch.Diff>} Array of diff tuples.
-    */
-  	DiffMatchPatch.prototype.DiffMain = function (text1, text2, optChecklines) {
-  		var deadline, checklines, commonlength, commonprefix, commonsuffix, diffs;
-
-  		// The diff must be complete in up to 1 second.
-  		deadline = new Date().getTime() + 1000;
-
-  		// Check for null inputs.
-  		if (text1 === null || text2 === null) {
-  			throw new Error("Null input. (DiffMain)");
-  		}
-
-  		// Check for equality (speedup).
-  		if (text1 === text2) {
-  			if (text1) {
-  				return [[DIFF_EQUAL, text1]];
-  			}
-  			return [];
-  		}
-
-  		if (typeof optChecklines === "undefined") {
-  			optChecklines = true;
-  		}
-
-  		checklines = optChecklines;
-
-  		// Trim off common prefix (speedup).
-  		commonlength = this.diffCommonPrefix(text1, text2);
-  		commonprefix = text1.substring(0, commonlength);
-  		text1 = text1.substring(commonlength);
-  		text2 = text2.substring(commonlength);
-
-  		// Trim off common suffix (speedup).
-  		commonlength = this.diffCommonSuffix(text1, text2);
-  		commonsuffix = text1.substring(text1.length - commonlength);
-  		text1 = text1.substring(0, text1.length - commonlength);
-  		text2 = text2.substring(0, text2.length - commonlength);
-
-  		// Compute the diff on the middle block.
-  		diffs = this.diffCompute(text1, text2, checklines, deadline);
-
-  		// Restore the prefix and suffix.
-  		if (commonprefix) {
-  			diffs.unshift([DIFF_EQUAL, commonprefix]);
-  		}
-  		if (commonsuffix) {
-  			diffs.push([DIFF_EQUAL, commonsuffix]);
-  		}
-  		this.diffCleanupMerge(diffs);
-  		return diffs;
-  	};
-
-  	/**
-    * Reduce the number of edits by eliminating operationally trivial equalities.
-    * @param {!Array.<!DiffMatchPatch.Diff>} diffs Array of diff tuples.
-    */
-  	DiffMatchPatch.prototype.diffCleanupEfficiency = function (diffs) {
-  		var changes, equalities, equalitiesLength, lastequality, pointer, preIns, preDel, postIns, postDel;
-  		changes = false;
-  		equalities = []; // Stack of indices where equalities are found.
-  		equalitiesLength = 0; // Keeping our own length var is faster in JS.
-  		/** @type {?string} */
-  		lastequality = null;
-
-  		// Always equal to diffs[equalities[equalitiesLength - 1]][1]
-  		pointer = 0; // Index of current position.
-
-  		// Is there an insertion operation before the last equality.
-  		preIns = false;
-
-  		// Is there a deletion operation before the last equality.
-  		preDel = false;
-
-  		// Is there an insertion operation after the last equality.
-  		postIns = false;
-
-  		// Is there a deletion operation after the last equality.
-  		postDel = false;
-  		while (pointer < diffs.length) {
-
-  			// Equality found.
-  			if (diffs[pointer][0] === DIFF_EQUAL) {
-  				if (diffs[pointer][1].length < 4 && (postIns || postDel)) {
-
-  					// Candidate found.
-  					equalities[equalitiesLength++] = pointer;
-  					preIns = postIns;
-  					preDel = postDel;
-  					lastequality = diffs[pointer][1];
-  				} else {
-
-  					// Not a candidate, and can never become one.
-  					equalitiesLength = 0;
-  					lastequality = null;
-  				}
-  				postIns = postDel = false;
-
-  				// An insertion or deletion.
-  			} else {
-
-  				if (diffs[pointer][0] === DIFF_DELETE) {
-  					postDel = true;
-  				} else {
-  					postIns = true;
-  				}
-
-  				/*
-       * Five types to be split:
-       * <ins>A</ins><del>B</del>XY<ins>C</ins><del>D</del>
-       * <ins>A</ins>X<ins>C</ins><del>D</del>
-       * <ins>A</ins><del>B</del>X<ins>C</ins>
-       * <ins>A</del>X<ins>C</ins><del>D</del>
-       * <ins>A</ins><del>B</del>X<del>C</del>
-       */
-  				if (lastequality && (preIns && preDel && postIns && postDel || lastequality.length < 2 && preIns + preDel + postIns + postDel === 3)) {
-
-  					// Duplicate record.
-  					diffs.splice(equalities[equalitiesLength - 1], 0, [DIFF_DELETE, lastequality]);
-
-  					// Change second copy to insert.
-  					diffs[equalities[equalitiesLength - 1] + 1][0] = DIFF_INSERT;
-  					equalitiesLength--; // Throw away the equality we just deleted;
-  					lastequality = null;
-  					if (preIns && preDel) {
-
-  						// No changes made which could affect previous entry, keep going.
-  						postIns = postDel = true;
-  						equalitiesLength = 0;
-  					} else {
-  						equalitiesLength--; // Throw away the previous equality.
-  						pointer = equalitiesLength > 0 ? equalities[equalitiesLength - 1] : -1;
-  						postIns = postDel = false;
-  					}
-  					changes = true;
-  				}
-  			}
-  			pointer++;
-  		}
-
-  		if (changes) {
-  			this.diffCleanupMerge(diffs);
-  		}
-  	};
-
-  	/**
-    * Convert a diff array into a pretty HTML report.
-    * @param {!Array.<!DiffMatchPatch.Diff>} diffs Array of diff tuples.
-    * @param {integer} string to be beautified.
-    * @return {string} HTML representation.
-    */
-  	DiffMatchPatch.prototype.diffPrettyHtml = function (diffs) {
-  		var op,
-  		    data,
-  		    x,
-  		    html = [];
-  		for (x = 0; x < diffs.length; x++) {
-  			op = diffs[x][0]; // Operation (insert, delete, equal)
-  			data = diffs[x][1]; // Text of change.
-  			switch (op) {
-  				case DIFF_INSERT:
-  					html[x] = "<ins>" + escapeText(data) + "</ins>";
-  					break;
-  				case DIFF_DELETE:
-  					html[x] = "<del>" + escapeText(data) + "</del>";
-  					break;
-  				case DIFF_EQUAL:
-  					html[x] = "<span>" + escapeText(data) + "</span>";
-  					break;
-  			}
-  		}
-  		return html.join("");
-  	};
-
-  	/**
-    * Determine the common prefix of two strings.
-    * @param {string} text1 First string.
-    * @param {string} text2 Second string.
-    * @return {number} The number of characters common to the start of each
-    *     string.
-    */
-  	DiffMatchPatch.prototype.diffCommonPrefix = function (text1, text2) {
-  		var pointermid, pointermax, pointermin, pointerstart;
-
-  		// Quick check for common null cases.
-  		if (!text1 || !text2 || text1.charAt(0) !== text2.charAt(0)) {
-  			return 0;
-  		}
-
-  		// Binary search.
-  		// Performance analysis: https://neil.fraser.name/news/2007/10/09/
-  		pointermin = 0;
-  		pointermax = Math.min(text1.length, text2.length);
-  		pointermid = pointermax;
-  		pointerstart = 0;
-  		while (pointermin < pointermid) {
-  			if (text1.substring(pointerstart, pointermid) === text2.substring(pointerstart, pointermid)) {
-  				pointermin = pointermid;
-  				pointerstart = pointermin;
-  			} else {
-  				pointermax = pointermid;
-  			}
-  			pointermid = Math.floor((pointermax - pointermin) / 2 + pointermin);
-  		}
-  		return pointermid;
-  	};
-
-  	/**
-    * Determine the common suffix of two strings.
-    * @param {string} text1 First string.
-    * @param {string} text2 Second string.
-    * @return {number} The number of characters common to the end of each string.
-    */
-  	DiffMatchPatch.prototype.diffCommonSuffix = function (text1, text2) {
-  		var pointermid, pointermax, pointermin, pointerend;
-
-  		// Quick check for common null cases.
-  		if (!text1 || !text2 || text1.charAt(text1.length - 1) !== text2.charAt(text2.length - 1)) {
-  			return 0;
-  		}
-
-  		// Binary search.
-  		// Performance analysis: https://neil.fraser.name/news/2007/10/09/
-  		pointermin = 0;
-  		pointermax = Math.min(text1.length, text2.length);
-  		pointermid = pointermax;
-  		pointerend = 0;
-  		while (pointermin < pointermid) {
-  			if (text1.substring(text1.length - pointermid, text1.length - pointerend) === text2.substring(text2.length - pointermid, text2.length - pointerend)) {
-  				pointermin = pointermid;
-  				pointerend = pointermin;
-  			} else {
-  				pointermax = pointermid;
-  			}
-  			pointermid = Math.floor((pointermax - pointermin) / 2 + pointermin);
-  		}
-  		return pointermid;
-  	};
-
-  	/**
-    * Find the differences between two texts.  Assumes that the texts do not
-    * have any common prefix or suffix.
-    * @param {string} text1 Old string to be diffed.
-    * @param {string} text2 New string to be diffed.
-    * @param {boolean} checklines Speedup flag.  If false, then don't run a
-    *     line-level diff first to identify the changed areas.
-    *     If true, then run a faster, slightly less optimal diff.
-    * @param {number} deadline Time when the diff should be complete by.
-    * @return {!Array.<!DiffMatchPatch.Diff>} Array of diff tuples.
-    * @private
-    */
-  	DiffMatchPatch.prototype.diffCompute = function (text1, text2, checklines, deadline) {
-  		var diffs, longtext, shorttext, i, hm, text1A, text2A, text1B, text2B, midCommon, diffsA, diffsB;
-
-  		if (!text1) {
-
-  			// Just add some text (speedup).
-  			return [[DIFF_INSERT, text2]];
-  		}
-
-  		if (!text2) {
-
-  			// Just delete some text (speedup).
-  			return [[DIFF_DELETE, text1]];
-  		}
-
-  		longtext = text1.length > text2.length ? text1 : text2;
-  		shorttext = text1.length > text2.length ? text2 : text1;
-  		i = longtext.indexOf(shorttext);
-  		if (i !== -1) {
-
-  			// Shorter text is inside the longer text (speedup).
-  			diffs = [[DIFF_INSERT, longtext.substring(0, i)], [DIFF_EQUAL, shorttext], [DIFF_INSERT, longtext.substring(i + shorttext.length)]];
-
-  			// Swap insertions for deletions if diff is reversed.
-  			if (text1.length > text2.length) {
-  				diffs[0][0] = diffs[2][0] = DIFF_DELETE;
-  			}
-  			return diffs;
-  		}
-
-  		if (shorttext.length === 1) {
-
-  			// Single character string.
-  			// After the previous speedup, the character can't be an equality.
-  			return [[DIFF_DELETE, text1], [DIFF_INSERT, text2]];
-  		}
-
-  		// Check to see if the problem can be split in two.
-  		hm = this.diffHalfMatch(text1, text2);
-  		if (hm) {
-
-  			// A half-match was found, sort out the return data.
-  			text1A = hm[0];
-  			text1B = hm[1];
-  			text2A = hm[2];
-  			text2B = hm[3];
-  			midCommon = hm[4];
-
-  			// Send both pairs off for separate processing.
-  			diffsA = this.DiffMain(text1A, text2A, checklines, deadline);
-  			diffsB = this.DiffMain(text1B, text2B, checklines, deadline);
-
-  			// Merge the results.
-  			return diffsA.concat([[DIFF_EQUAL, midCommon]], diffsB);
-  		}
-
-  		if (checklines && text1.length > 100 && text2.length > 100) {
-  			return this.diffLineMode(text1, text2, deadline);
-  		}
-
-  		return this.diffBisect(text1, text2, deadline);
-  	};
-
-  	/**
-    * Do the two texts share a substring which is at least half the length of the
-    * longer text?
-    * This speedup can produce non-minimal diffs.
-    * @param {string} text1 First string.
-    * @param {string} text2 Second string.
-    * @return {Array.<string>} Five element Array, containing the prefix of
-    *     text1, the suffix of text1, the prefix of text2, the suffix of
-    *     text2 and the common middle.  Or null if there was no match.
-    * @private
-    */
-  	DiffMatchPatch.prototype.diffHalfMatch = function (text1, text2) {
-  		var longtext, shorttext, dmp, text1A, text2B, text2A, text1B, midCommon, hm1, hm2, hm;
-
-  		longtext = text1.length > text2.length ? text1 : text2;
-  		shorttext = text1.length > text2.length ? text2 : text1;
-  		if (longtext.length < 4 || shorttext.length * 2 < longtext.length) {
-  			return null; // Pointless.
-  		}
-  		dmp = this; // 'this' becomes 'window' in a closure.
-
-  		/**
-     * Does a substring of shorttext exist within longtext such that the substring
-     * is at least half the length of longtext?
-     * Closure, but does not reference any external variables.
-     * @param {string} longtext Longer string.
-     * @param {string} shorttext Shorter string.
-     * @param {number} i Start index of quarter length substring within longtext.
-     * @return {Array.<string>} Five element Array, containing the prefix of
-     *     longtext, the suffix of longtext, the prefix of shorttext, the suffix
-     *     of shorttext and the common middle.  Or null if there was no match.
-     * @private
-     */
-  		function diffHalfMatchI(longtext, shorttext, i) {
-  			var seed, j, bestCommon, prefixLength, suffixLength, bestLongtextA, bestLongtextB, bestShorttextA, bestShorttextB;
-
-  			// Start with a 1/4 length substring at position i as a seed.
-  			seed = longtext.substring(i, i + Math.floor(longtext.length / 4));
-  			j = -1;
-  			bestCommon = "";
-  			while ((j = shorttext.indexOf(seed, j + 1)) !== -1) {
-  				prefixLength = dmp.diffCommonPrefix(longtext.substring(i), shorttext.substring(j));
-  				suffixLength = dmp.diffCommonSuffix(longtext.substring(0, i), shorttext.substring(0, j));
-  				if (bestCommon.length < suffixLength + prefixLength) {
-  					bestCommon = shorttext.substring(j - suffixLength, j) + shorttext.substring(j, j + prefixLength);
-  					bestLongtextA = longtext.substring(0, i - suffixLength);
-  					bestLongtextB = longtext.substring(i + prefixLength);
-  					bestShorttextA = shorttext.substring(0, j - suffixLength);
-  					bestShorttextB = shorttext.substring(j + prefixLength);
-  				}
-  			}
-  			if (bestCommon.length * 2 >= longtext.length) {
-  				return [bestLongtextA, bestLongtextB, bestShorttextA, bestShorttextB, bestCommon];
-  			} else {
-  				return null;
-  			}
-  		}
-
-  		// First check if the second quarter is the seed for a half-match.
-  		hm1 = diffHalfMatchI(longtext, shorttext, Math.ceil(longtext.length / 4));
-
-  		// Check again based on the third quarter.
-  		hm2 = diffHalfMatchI(longtext, shorttext, Math.ceil(longtext.length / 2));
-  		if (!hm1 && !hm2) {
-  			return null;
-  		} else if (!hm2) {
-  			hm = hm1;
-  		} else if (!hm1) {
-  			hm = hm2;
-  		} else {
-
-  			// Both matched.  Select the longest.
-  			hm = hm1[4].length > hm2[4].length ? hm1 : hm2;
-  		}
-
-  		// A half-match was found, sort out the return data.
-  		if (text1.length > text2.length) {
-  			text1A = hm[0];
-  			text1B = hm[1];
-  			text2A = hm[2];
-  			text2B = hm[3];
-  		} else {
-  			text2A = hm[0];
-  			text2B = hm[1];
-  			text1A = hm[2];
-  			text1B = hm[3];
-  		}
-  		midCommon = hm[4];
-  		return [text1A, text1B, text2A, text2B, midCommon];
-  	};
-
-  	/**
-    * Do a quick line-level diff on both strings, then rediff the parts for
-    * greater accuracy.
-    * This speedup can produce non-minimal diffs.
-    * @param {string} text1 Old string to be diffed.
-    * @param {string} text2 New string to be diffed.
-    * @param {number} deadline Time when the diff should be complete by.
-    * @return {!Array.<!DiffMatchPatch.Diff>} Array of diff tuples.
-    * @private
-    */
-  	DiffMatchPatch.prototype.diffLineMode = function (text1, text2, deadline) {
-  		var a, diffs, linearray, pointer, countInsert, countDelete, textInsert, textDelete, j;
-
-  		// Scan the text on a line-by-line basis first.
-  		a = this.diffLinesToChars(text1, text2);
-  		text1 = a.chars1;
-  		text2 = a.chars2;
-  		linearray = a.lineArray;
-
-  		diffs = this.DiffMain(text1, text2, false, deadline);
-
-  		// Convert the diff back to original text.
-  		this.diffCharsToLines(diffs, linearray);
-
-  		// Eliminate freak matches (e.g. blank lines)
-  		this.diffCleanupSemantic(diffs);
-
-  		// Rediff any replacement blocks, this time character-by-character.
-  		// Add a dummy entry at the end.
-  		diffs.push([DIFF_EQUAL, ""]);
-  		pointer = 0;
-  		countDelete = 0;
-  		countInsert = 0;
-  		textDelete = "";
-  		textInsert = "";
-  		while (pointer < diffs.length) {
-  			switch (diffs[pointer][0]) {
-  				case DIFF_INSERT:
-  					countInsert++;
-  					textInsert += diffs[pointer][1];
-  					break;
-  				case DIFF_DELETE:
-  					countDelete++;
-  					textDelete += diffs[pointer][1];
-  					break;
-  				case DIFF_EQUAL:
-
-  					// Upon reaching an equality, check for prior redundancies.
-  					if (countDelete >= 1 && countInsert >= 1) {
-
-  						// Delete the offending records and add the merged ones.
-  						diffs.splice(pointer - countDelete - countInsert, countDelete + countInsert);
-  						pointer = pointer - countDelete - countInsert;
-  						a = this.DiffMain(textDelete, textInsert, false, deadline);
-  						for (j = a.length - 1; j >= 0; j--) {
-  							diffs.splice(pointer, 0, a[j]);
-  						}
-  						pointer = pointer + a.length;
-  					}
-  					countInsert = 0;
-  					countDelete = 0;
-  					textDelete = "";
-  					textInsert = "";
-  					break;
-  			}
-  			pointer++;
-  		}
-  		diffs.pop(); // Remove the dummy entry at the end.
-
-  		return diffs;
-  	};
-
-  	/**
-    * Find the 'middle snake' of a diff, split the problem in two
-    * and return the recursively constructed diff.
-    * See Myers 1986 paper: An O(ND) Difference Algorithm and Its Variations.
-    * @param {string} text1 Old string to be diffed.
-    * @param {string} text2 New string to be diffed.
-    * @param {number} deadline Time at which to bail if not yet complete.
-    * @return {!Array.<!DiffMatchPatch.Diff>} Array of diff tuples.
-    * @private
-    */
-  	DiffMatchPatch.prototype.diffBisect = function (text1, text2, deadline) {
-  		var text1Length, text2Length, maxD, vOffset, vLength, v1, v2, x, delta, front, k1start, k1end, k2start, k2end, k2Offset, k1Offset, x1, x2, y1, y2, d, k1, k2;
-
-  		// Cache the text lengths to prevent multiple calls.
-  		text1Length = text1.length;
-  		text2Length = text2.length;
-  		maxD = Math.ceil((text1Length + text2Length) / 2);
-  		vOffset = maxD;
-  		vLength = 2 * maxD;
-  		v1 = new Array(vLength);
-  		v2 = new Array(vLength);
-
-  		// Setting all elements to -1 is faster in Chrome & Firefox than mixing
-  		// integers and undefined.
-  		for (x = 0; x < vLength; x++) {
-  			v1[x] = -1;
-  			v2[x] = -1;
-  		}
-  		v1[vOffset + 1] = 0;
-  		v2[vOffset + 1] = 0;
-  		delta = text1Length - text2Length;
-
-  		// If the total number of characters is odd, then the front path will collide
-  		// with the reverse path.
-  		front = delta % 2 !== 0;
-
-  		// Offsets for start and end of k loop.
-  		// Prevents mapping of space beyond the grid.
-  		k1start = 0;
-  		k1end = 0;
-  		k2start = 0;
-  		k2end = 0;
-  		for (d = 0; d < maxD; d++) {
-
-  			// Bail out if deadline is reached.
-  			if (new Date().getTime() > deadline) {
-  				break;
-  			}
-
-  			// Walk the front path one step.
-  			for (k1 = -d + k1start; k1 <= d - k1end; k1 += 2) {
-  				k1Offset = vOffset + k1;
-  				if (k1 === -d || k1 !== d && v1[k1Offset - 1] < v1[k1Offset + 1]) {
-  					x1 = v1[k1Offset + 1];
-  				} else {
-  					x1 = v1[k1Offset - 1] + 1;
-  				}
-  				y1 = x1 - k1;
-  				while (x1 < text1Length && y1 < text2Length && text1.charAt(x1) === text2.charAt(y1)) {
-  					x1++;
-  					y1++;
-  				}
-  				v1[k1Offset] = x1;
-  				if (x1 > text1Length) {
-
-  					// Ran off the right of the graph.
-  					k1end += 2;
-  				} else if (y1 > text2Length) {
-
-  					// Ran off the bottom of the graph.
-  					k1start += 2;
-  				} else if (front) {
-  					k2Offset = vOffset + delta - k1;
-  					if (k2Offset >= 0 && k2Offset < vLength && v2[k2Offset] !== -1) {
-
-  						// Mirror x2 onto top-left coordinate system.
-  						x2 = text1Length - v2[k2Offset];
-  						if (x1 >= x2) {
-
-  							// Overlap detected.
-  							return this.diffBisectSplit(text1, text2, x1, y1, deadline);
-  						}
-  					}
-  				}
-  			}
-
-  			// Walk the reverse path one step.
-  			for (k2 = -d + k2start; k2 <= d - k2end; k2 += 2) {
-  				k2Offset = vOffset + k2;
-  				if (k2 === -d || k2 !== d && v2[k2Offset - 1] < v2[k2Offset + 1]) {
-  					x2 = v2[k2Offset + 1];
-  				} else {
-  					x2 = v2[k2Offset - 1] + 1;
-  				}
-  				y2 = x2 - k2;
-  				while (x2 < text1Length && y2 < text2Length && text1.charAt(text1Length - x2 - 1) === text2.charAt(text2Length - y2 - 1)) {
-  					x2++;
-  					y2++;
-  				}
-  				v2[k2Offset] = x2;
-  				if (x2 > text1Length) {
-
-  					// Ran off the left of the graph.
-  					k2end += 2;
-  				} else if (y2 > text2Length) {
-
-  					// Ran off the top of the graph.
-  					k2start += 2;
-  				} else if (!front) {
-  					k1Offset = vOffset + delta - k2;
-  					if (k1Offset >= 0 && k1Offset < vLength && v1[k1Offset] !== -1) {
-  						x1 = v1[k1Offset];
-  						y1 = vOffset + x1 - k1Offset;
-
-  						// Mirror x2 onto top-left coordinate system.
-  						x2 = text1Length - x2;
-  						if (x1 >= x2) {
-
-  							// Overlap detected.
-  							return this.diffBisectSplit(text1, text2, x1, y1, deadline);
-  						}
-  					}
-  				}
-  			}
-  		}
-
-  		// Diff took too long and hit the deadline or
-  		// number of diffs equals number of characters, no commonality at all.
-  		return [[DIFF_DELETE, text1], [DIFF_INSERT, text2]];
-  	};
-
-  	/**
-    * Given the location of the 'middle snake', split the diff in two parts
-    * and recurse.
-    * @param {string} text1 Old string to be diffed.
-    * @param {string} text2 New string to be diffed.
-    * @param {number} x Index of split point in text1.
-    * @param {number} y Index of split point in text2.
-    * @param {number} deadline Time at which to bail if not yet complete.
-    * @return {!Array.<!DiffMatchPatch.Diff>} Array of diff tuples.
-    * @private
-    */
-  	DiffMatchPatch.prototype.diffBisectSplit = function (text1, text2, x, y, deadline) {
-  		var text1a, text1b, text2a, text2b, diffs, diffsb;
-  		text1a = text1.substring(0, x);
-  		text2a = text2.substring(0, y);
-  		text1b = text1.substring(x);
-  		text2b = text2.substring(y);
-
-  		// Compute both diffs serially.
-  		diffs = this.DiffMain(text1a, text2a, false, deadline);
-  		diffsb = this.DiffMain(text1b, text2b, false, deadline);
-
-  		return diffs.concat(diffsb);
-  	};
-
-  	/**
-    * Reduce the number of edits by eliminating semantically trivial equalities.
-    * @param {!Array.<!DiffMatchPatch.Diff>} diffs Array of diff tuples.
-    */
-  	DiffMatchPatch.prototype.diffCleanupSemantic = function (diffs) {
-  		var changes, equalities, equalitiesLength, lastequality, pointer, lengthInsertions2, lengthDeletions2, lengthInsertions1, lengthDeletions1, deletion, insertion, overlapLength1, overlapLength2;
-  		changes = false;
-  		equalities = []; // Stack of indices where equalities are found.
-  		equalitiesLength = 0; // Keeping our own length var is faster in JS.
-  		/** @type {?string} */
-  		lastequality = null;
-
-  		// Always equal to diffs[equalities[equalitiesLength - 1]][1]
-  		pointer = 0; // Index of current position.
-
-  		// Number of characters that changed prior to the equality.
-  		lengthInsertions1 = 0;
-  		lengthDeletions1 = 0;
-
-  		// Number of characters that changed after the equality.
-  		lengthInsertions2 = 0;
-  		lengthDeletions2 = 0;
-  		while (pointer < diffs.length) {
-  			if (diffs[pointer][0] === DIFF_EQUAL) {
-  				// Equality found.
-  				equalities[equalitiesLength++] = pointer;
-  				lengthInsertions1 = lengthInsertions2;
-  				lengthDeletions1 = lengthDeletions2;
-  				lengthInsertions2 = 0;
-  				lengthDeletions2 = 0;
-  				lastequality = diffs[pointer][1];
-  			} else {
-  				// An insertion or deletion.
-  				if (diffs[pointer][0] === DIFF_INSERT) {
-  					lengthInsertions2 += diffs[pointer][1].length;
-  				} else {
-  					lengthDeletions2 += diffs[pointer][1].length;
-  				}
-
-  				// Eliminate an equality that is smaller or equal to the edits on both
-  				// sides of it.
-  				if (lastequality && lastequality.length <= Math.max(lengthInsertions1, lengthDeletions1) && lastequality.length <= Math.max(lengthInsertions2, lengthDeletions2)) {
-
-  					// Duplicate record.
-  					diffs.splice(equalities[equalitiesLength - 1], 0, [DIFF_DELETE, lastequality]);
-
-  					// Change second copy to insert.
-  					diffs[equalities[equalitiesLength - 1] + 1][0] = DIFF_INSERT;
-
-  					// Throw away the equality we just deleted.
-  					equalitiesLength--;
-
-  					// Throw away the previous equality (it needs to be reevaluated).
-  					equalitiesLength--;
-  					pointer = equalitiesLength > 0 ? equalities[equalitiesLength - 1] : -1;
-
-  					// Reset the counters.
-  					lengthInsertions1 = 0;
-  					lengthDeletions1 = 0;
-  					lengthInsertions2 = 0;
-  					lengthDeletions2 = 0;
-  					lastequality = null;
-  					changes = true;
-  				}
-  			}
-  			pointer++;
-  		}
-
-  		// Normalize the diff.
-  		if (changes) {
-  			this.diffCleanupMerge(diffs);
-  		}
-
-  		// Find any overlaps between deletions and insertions.
-  		// e.g: <del>abcxxx</del><ins>xxxdef</ins>
-  		//   -> <del>abc</del>xxx<ins>def</ins>
-  		// e.g: <del>xxxabc</del><ins>defxxx</ins>
-  		//   -> <ins>def</ins>xxx<del>abc</del>
-  		// Only extract an overlap if it is as big as the edit ahead or behind it.
-  		pointer = 1;
-  		while (pointer < diffs.length) {
-  			if (diffs[pointer - 1][0] === DIFF_DELETE && diffs[pointer][0] === DIFF_INSERT) {
-  				deletion = diffs[pointer - 1][1];
-  				insertion = diffs[pointer][1];
-  				overlapLength1 = this.diffCommonOverlap(deletion, insertion);
-  				overlapLength2 = this.diffCommonOverlap(insertion, deletion);
-  				if (overlapLength1 >= overlapLength2) {
-  					if (overlapLength1 >= deletion.length / 2 || overlapLength1 >= insertion.length / 2) {
-
-  						// Overlap found.  Insert an equality and trim the surrounding edits.
-  						diffs.splice(pointer, 0, [DIFF_EQUAL, insertion.substring(0, overlapLength1)]);
-  						diffs[pointer - 1][1] = deletion.substring(0, deletion.length - overlapLength1);
-  						diffs[pointer + 1][1] = insertion.substring(overlapLength1);
-  						pointer++;
-  					}
-  				} else {
-  					if (overlapLength2 >= deletion.length / 2 || overlapLength2 >= insertion.length / 2) {
-
-  						// Reverse overlap found.
-  						// Insert an equality and swap and trim the surrounding edits.
-  						diffs.splice(pointer, 0, [DIFF_EQUAL, deletion.substring(0, overlapLength2)]);
-
-  						diffs[pointer - 1][0] = DIFF_INSERT;
-  						diffs[pointer - 1][1] = insertion.substring(0, insertion.length - overlapLength2);
-  						diffs[pointer + 1][0] = DIFF_DELETE;
-  						diffs[pointer + 1][1] = deletion.substring(overlapLength2);
-  						pointer++;
-  					}
-  				}
-  				pointer++;
-  			}
-  			pointer++;
-  		}
-  	};
-
-  	/**
-    * Determine if the suffix of one string is the prefix of another.
-    * @param {string} text1 First string.
-    * @param {string} text2 Second string.
-    * @return {number} The number of characters common to the end of the first
-    *     string and the start of the second string.
-    * @private
-    */
-  	DiffMatchPatch.prototype.diffCommonOverlap = function (text1, text2) {
-  		var text1Length, text2Length, textLength, best, length, pattern, found;
-
-  		// Cache the text lengths to prevent multiple calls.
-  		text1Length = text1.length;
-  		text2Length = text2.length;
-
-  		// Eliminate the null case.
-  		if (text1Length === 0 || text2Length === 0) {
-  			return 0;
-  		}
-
-  		// Truncate the longer string.
-  		if (text1Length > text2Length) {
-  			text1 = text1.substring(text1Length - text2Length);
-  		} else if (text1Length < text2Length) {
-  			text2 = text2.substring(0, text1Length);
-  		}
-  		textLength = Math.min(text1Length, text2Length);
-
-  		// Quick check for the worst case.
-  		if (text1 === text2) {
-  			return textLength;
-  		}
-
-  		// Start by looking for a single character match
-  		// and increase length until no match is found.
-  		// Performance analysis: https://neil.fraser.name/news/2010/11/04/
-  		best = 0;
-  		length = 1;
-  		while (true) {
-  			pattern = text1.substring(textLength - length);
-  			found = text2.indexOf(pattern);
-  			if (found === -1) {
-  				return best;
-  			}
-  			length += found;
-  			if (found === 0 || text1.substring(textLength - length) === text2.substring(0, length)) {
-  				best = length;
-  				length++;
-  			}
-  		}
-  	};
-
-  	/**
-    * Split two texts into an array of strings.  Reduce the texts to a string of
-    * hashes where each Unicode character represents one line.
-    * @param {string} text1 First string.
-    * @param {string} text2 Second string.
-    * @return {{chars1: string, chars2: string, lineArray: !Array.<string>}}
-    *     An object containing the encoded text1, the encoded text2 and
-    *     the array of unique strings.
-    *     The zeroth element of the array of unique strings is intentionally blank.
-    * @private
-    */
-  	DiffMatchPatch.prototype.diffLinesToChars = function (text1, text2) {
-  		var lineArray, lineHash, chars1, chars2;
-  		lineArray = []; // E.g. lineArray[4] === 'Hello\n'
-  		lineHash = {}; // E.g. lineHash['Hello\n'] === 4
-
-  		// '\x00' is a valid character, but various debuggers don't like it.
-  		// So we'll insert a junk entry to avoid generating a null character.
-  		lineArray[0] = "";
-
-  		/**
-     * Split a text into an array of strings.  Reduce the texts to a string of
-     * hashes where each Unicode character represents one line.
-     * Modifies linearray and linehash through being a closure.
-     * @param {string} text String to encode.
-     * @return {string} Encoded string.
-     * @private
-     */
-  		function diffLinesToCharsMunge(text) {
-  			var chars, lineStart, lineEnd, lineArrayLength, line;
-  			chars = "";
-
-  			// Walk the text, pulling out a substring for each line.
-  			// text.split('\n') would would temporarily double our memory footprint.
-  			// Modifying text would create many large strings to garbage collect.
-  			lineStart = 0;
-  			lineEnd = -1;
-
-  			// Keeping our own length variable is faster than looking it up.
-  			lineArrayLength = lineArray.length;
-  			while (lineEnd < text.length - 1) {
-  				lineEnd = text.indexOf("\n", lineStart);
-  				if (lineEnd === -1) {
-  					lineEnd = text.length - 1;
-  				}
-  				line = text.substring(lineStart, lineEnd + 1);
-  				lineStart = lineEnd + 1;
-
-  				if (lineHash.hasOwnProperty ? lineHash.hasOwnProperty(line) : lineHash[line] !== undefined) {
-  					chars += String.fromCharCode(lineHash[line]);
-  				} else {
-  					chars += String.fromCharCode(lineArrayLength);
-  					lineHash[line] = lineArrayLength;
-  					lineArray[lineArrayLength++] = line;
-  				}
-  			}
-  			return chars;
-  		}
-
-  		chars1 = diffLinesToCharsMunge(text1);
-  		chars2 = diffLinesToCharsMunge(text2);
-  		return {
-  			chars1: chars1,
-  			chars2: chars2,
-  			lineArray: lineArray
-  		};
-  	};
-
-  	/**
-    * Rehydrate the text in a diff from a string of line hashes to real lines of
-    * text.
-    * @param {!Array.<!DiffMatchPatch.Diff>} diffs Array of diff tuples.
-    * @param {!Array.<string>} lineArray Array of unique strings.
-    * @private
-    */
-  	DiffMatchPatch.prototype.diffCharsToLines = function (diffs, lineArray) {
-  		var x, chars, text, y;
-  		for (x = 0; x < diffs.length; x++) {
-  			chars = diffs[x][1];
-  			text = [];
-  			for (y = 0; y < chars.length; y++) {
-  				text[y] = lineArray[chars.charCodeAt(y)];
-  			}
-  			diffs[x][1] = text.join("");
-  		}
-  	};
-
-  	/**
-    * Reorder and merge like edit sections.  Merge equalities.
-    * Any edit section can move as long as it doesn't cross an equality.
-    * @param {!Array.<!DiffMatchPatch.Diff>} diffs Array of diff tuples.
-    */
-  	DiffMatchPatch.prototype.diffCleanupMerge = function (diffs) {
-  		var pointer, countDelete, countInsert, textInsert, textDelete, commonlength, changes, diffPointer, position;
-  		diffs.push([DIFF_EQUAL, ""]); // Add a dummy entry at the end.
-  		pointer = 0;
-  		countDelete = 0;
-  		countInsert = 0;
-  		textDelete = "";
-  		textInsert = "";
-
-  		while (pointer < diffs.length) {
-  			switch (diffs[pointer][0]) {
-  				case DIFF_INSERT:
-  					countInsert++;
-  					textInsert += diffs[pointer][1];
-  					pointer++;
-  					break;
-  				case DIFF_DELETE:
-  					countDelete++;
-  					textDelete += diffs[pointer][1];
-  					pointer++;
-  					break;
-  				case DIFF_EQUAL:
-
-  					// Upon reaching an equality, check for prior redundancies.
-  					if (countDelete + countInsert > 1) {
-  						if (countDelete !== 0 && countInsert !== 0) {
-
-  							// Factor out any common prefixes.
-  							commonlength = this.diffCommonPrefix(textInsert, textDelete);
-  							if (commonlength !== 0) {
-  								if (pointer - countDelete - countInsert > 0 && diffs[pointer - countDelete - countInsert - 1][0] === DIFF_EQUAL) {
-  									diffs[pointer - countDelete - countInsert - 1][1] += textInsert.substring(0, commonlength);
-  								} else {
-  									diffs.splice(0, 0, [DIFF_EQUAL, textInsert.substring(0, commonlength)]);
-  									pointer++;
-  								}
-  								textInsert = textInsert.substring(commonlength);
-  								textDelete = textDelete.substring(commonlength);
-  							}
-
-  							// Factor out any common suffixies.
-  							commonlength = this.diffCommonSuffix(textInsert, textDelete);
-  							if (commonlength !== 0) {
-  								diffs[pointer][1] = textInsert.substring(textInsert.length - commonlength) + diffs[pointer][1];
-  								textInsert = textInsert.substring(0, textInsert.length - commonlength);
-  								textDelete = textDelete.substring(0, textDelete.length - commonlength);
-  							}
-  						}
-
-  						// Delete the offending records and add the merged ones.
-  						if (countDelete === 0) {
-  							diffs.splice(pointer - countInsert, countDelete + countInsert, [DIFF_INSERT, textInsert]);
-  						} else if (countInsert === 0) {
-  							diffs.splice(pointer - countDelete, countDelete + countInsert, [DIFF_DELETE, textDelete]);
-  						} else {
-  							diffs.splice(pointer - countDelete - countInsert, countDelete + countInsert, [DIFF_DELETE, textDelete], [DIFF_INSERT, textInsert]);
-  						}
-  						pointer = pointer - countDelete - countInsert + (countDelete ? 1 : 0) + (countInsert ? 1 : 0) + 1;
-  					} else if (pointer !== 0 && diffs[pointer - 1][0] === DIFF_EQUAL) {
-
-  						// Merge this equality with the previous one.
-  						diffs[pointer - 1][1] += diffs[pointer][1];
-  						diffs.splice(pointer, 1);
-  					} else {
-  						pointer++;
-  					}
-  					countInsert = 0;
-  					countDelete = 0;
-  					textDelete = "";
-  					textInsert = "";
-  					break;
-  			}
-  		}
-  		if (diffs[diffs.length - 1][1] === "") {
-  			diffs.pop(); // Remove the dummy entry at the end.
-  		}
-
-  		// Second pass: look for single edits surrounded on both sides by equalities
-  		// which can be shifted sideways to eliminate an equality.
-  		// e.g: A<ins>BA</ins>C -> <ins>AB</ins>AC
-  		changes = false;
-  		pointer = 1;
-
-  		// Intentionally ignore the first and last element (don't need checking).
-  		while (pointer < diffs.length - 1) {
-  			if (diffs[pointer - 1][0] === DIFF_EQUAL && diffs[pointer + 1][0] === DIFF_EQUAL) {
-
-  				diffPointer = diffs[pointer][1];
-  				position = diffPointer.substring(diffPointer.length - diffs[pointer - 1][1].length);
-
-  				// This is a single edit surrounded by equalities.
-  				if (position === diffs[pointer - 1][1]) {
-
-  					// Shift the edit over the previous equality.
-  					diffs[pointer][1] = diffs[pointer - 1][1] + diffs[pointer][1].substring(0, diffs[pointer][1].length - diffs[pointer - 1][1].length);
-  					diffs[pointer + 1][1] = diffs[pointer - 1][1] + diffs[pointer + 1][1];
-  					diffs.splice(pointer - 1, 1);
-  					changes = true;
-  				} else if (diffPointer.substring(0, diffs[pointer + 1][1].length) === diffs[pointer + 1][1]) {
-
-  					// Shift the edit over the next equality.
-  					diffs[pointer - 1][1] += diffs[pointer + 1][1];
-  					diffs[pointer][1] = diffs[pointer][1].substring(diffs[pointer + 1][1].length) + diffs[pointer + 1][1];
-  					diffs.splice(pointer + 1, 1);
-  					changes = true;
-  				}
-  			}
-  			pointer++;
-  		}
-
-  		// If shifts were made, the diff needs reordering and another shift sweep.
-  		if (changes) {
-  			this.diffCleanupMerge(diffs);
-  		}
-  	};
-
-  	return function (o, n) {
-  		var diff, output, text;
-  		diff = new DiffMatchPatch();
-  		output = diff.DiffMain(o, n);
-  		diff.diffCleanupEfficiency(output);
-  		text = diff.diffPrettyHtml(output);
-
-  		return text;
-  	};
-  }();
-
-}((function() { return this; }())));
diff --git a/assets/javascript/tests/visual/alert.html b/assets/javascript/tests/visual/alert.html
deleted file mode 100644
index bb2d9cb..0000000
--- a/assets/javascript/tests/visual/alert.html
+++ /dev/null
@@ -1,51 +0,0 @@
-<!doctype html>
-<html>
-  <head>
-    <meta charset="utf-8">
-    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
-    <link rel="stylesheet" href="../../../dist/css/bootstrap.min.css">
-    <title>Alert</title>
-  </head>
-  <body>
-    <div class="container">
-      <h1>Alert <small>Bootstrap Visual Test</small></h1>
-
-      <div class="alert alert-warning alert-dismissible fade show" role="alert">
-        <button type="button" class="close" data-dismiss="alert" aria-label="Close">
-          <span aria-hidden="true">×</span>
-        </button>
-        <strong>Holy guacamole!</strong> You should check in on some of those fields below.
-      </div>
-
-      <div class="alert alert-danger alert-dismissible fade show" role="alert">
-        <button type="button" class="close" data-dismiss="alert" aria-label="Close">
-          <span aria-hidden="true">×</span>
-        </button>
-        <p>
-          <strong>Oh snap!</strong> <a href="#" class="alert-link">Change a few things up</a> and try submitting again.
-        </p>
-        <p>
-          <button type="button" class="btn btn-danger">Danger</button>
-          <button type="button" class="btn btn-secondary">Secondary</button>
-        </p>
-      </div>
-
-      <div class="alert alert-danger alert-dismissible fade show" role="alert">
-        <button type="button" class="close" data-dismiss="alert" aria-label="Close">
-          <span aria-hidden="true">×</span>
-        </button>
-        <p>
-          <strong>Oh snap!</strong> <a href="#" class="alert-link">Change a few things up</a> and try submitting again. Duis mollis, est non commodo luctus, nisi erat porttitor ligula, eget lacinia odio sem nec elit. Cras mattis consectetur purus sit amet fermentum.
-        </p>
-        <p>
-          <button type="button" class="btn btn-danger">Take this action</button>
-          <button type="button" class="btn btn-primary">Or do this</button>
-        </p>
-      </div>
-    </div>
-
-    <script src="../../../assets/js/vendor/jquery-slim.min.js"></script>
-    <script src="../../dist/util.js"></script>
-    <script src="../../dist/alert.js"></script>
-  </body>
-</html>
diff --git a/assets/javascript/tests/visual/button.html b/assets/javascript/tests/visual/button.html
deleted file mode 100644
index 33de14d..0000000
--- a/assets/javascript/tests/visual/button.html
+++ /dev/null
@@ -1,51 +0,0 @@
-<!doctype html>
-<html>
-  <head>
-    <meta charset="utf-8">
-    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
-    <link rel="stylesheet" href="../../../dist/css/bootstrap.min.css">
-    <title>Button</title>
-  </head>
-  <body>
-    <div class="container">
-      <h1>Button <small>Bootstrap Visual Test</small></h1>
-
-      <button type="button" class="btn btn-primary" data-toggle="button" aria-pressed="false" autocomplete="off">
-        Single toggle
-      </button>
-
-      <p>For checkboxes and radio buttons, ensure that keyboard behavior is functioning correctly.</p>
-      <p>Navigate to the checkboxes with the keyboard (generally, using <kbd>TAB</kbd> / <kbd>SHIFT + TAB</kbd>), and ensure that <kbd>SPACE</kbd> toggles the currently focused checkbox. Click on one of the checkboxes using the mouse, ensure that focus was correctly set on the actual checkbox, and that <kbd>SPACE</kbd> toggles the checkbox again.</p>
-
-      <div class="btn-group" data-toggle="buttons">
-        <label class="btn btn-primary active">
-          <input type="checkbox" checked autocomplete="off"> Checkbox 1 (pre-checked)
-        </label>
-        <label class="btn btn-primary">
-          <input type="checkbox" autocomplete="off"> Checkbox 2
-        </label>
-        <label class="btn btn-primary">
-          <input type="checkbox" autocomplete="off"> Checkbox 3
-        </label>
-      </div>
-
-      <p>Navigate to the radio button group with the keyboard (generally, using <kbd>TAB</kbd> / <kbd>SHIFT + TAB</kbd>). If no radio button was initially set to be selected, the first/last radio button should receive focus (depending on whether you navigated "forward" to the group with <kbd>TAB</kbd> or "backwards" using <kbd>SHIFT + TAB</kbd>). If a radio button was already selected, navigating with the keyboard should set focus to that particular radio button. Only one radio button in a group should receive focus at any given time.  Ensure that the selected radio button can be changed by using the <kbd>←</kbd> and <kbd>→</kbd> arrow keys. Click on one of the radio buttons with the mouse,  ensure that focus was correctly set on the actual radio button, and that <kbd>←</kbd> and <kbd>→</kbd> change the selected radio button again.</p>
-
-      <div class="btn-group" data-toggle="buttons">
-        <label class="btn btn-primary active">
-          <input type="radio" name="options" id="option1" autocomplete="off" checked> Radio 1 (preselected)
-        </label>
-        <label class="btn btn-primary">
-          <input type="radio" name="options" id="option2" autocomplete="off"> Radio 2
-        </label>
-        <label class="btn btn-primary">
-          <input type="radio" name="options" id="option3" autocomplete="off"> Radio 3
-        </label>
-      </div>
-    </div>
-
-    <script src="../../../assets/js/vendor/jquery-slim.min.js"></script>
-    <script src="../../dist/util.js"></script>
-    <script src="../../dist/button.js"></script>
-  </body>
-</html>
diff --git a/assets/javascript/tests/visual/carousel.html b/assets/javascript/tests/visual/carousel.html
deleted file mode 100644
index 5bdd616..0000000
--- a/assets/javascript/tests/visual/carousel.html
+++ /dev/null
@@ -1,56 +0,0 @@
-<!doctype html>
-<html>
-  <head>
-    <meta charset="utf-8">
-    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
-    <link rel="stylesheet" href="../../../dist/css/bootstrap.min.css">
-    <title>Carousel</title>
-  </head>
-  <body>
-    <div class="container">
-      <h1>Carousel <small>Bootstrap Visual Test</small></h1>
-
-      <p>Also, the carousel shouldn't slide when its window/tab is hidden. Check the console log.</p>
-
-      <div id="carousel-example-generic" class="carousel slide" data-ride="carousel">
-        <ol class="carousel-indicators">
-          <li data-target="#carousel-example-generic" data-slide-to="0" class="active"></li>
-          <li data-target="#carousel-example-generic" data-slide-to="1"></li>
-          <li data-target="#carousel-example-generic" data-slide-to="2"></li>
-        </ol>
-        <div class="carousel-inner">
-          <div class="carousel-item active">
-            <img src="https://i.imgur.com/iEZgY7Y.jpg" alt="First slide">
-          </div>
-          <div class="carousel-item">
-            <img src="https://i.imgur.com/eNWn1Xs.jpg" alt="Second slide">
-          </div>
-          <div class="carousel-item">
-            <img src="https://i.imgur.com/Nm7xoti.jpg" alt="Third slide">
-          </div>
-        </div>
-        <a class="carousel-control-prev" href="#carousel-example-generic" role="button" data-slide="prev">
-          <span class="carousel-control-prev-icon" aria-hidden="true"></span>
-          <span class="sr-only">Previous</span>
-        </a>
-        <a class="carousel-control-next" href="#carousel-example-generic" role="button" data-slide="next">
-          <span class="carousel-control-next-icon" aria-hidden="true"></span>
-          <span class="sr-only">Next</span>
-        </a>
-      </div>
-    </div>
-
-    <script src="../../../assets/js/vendor/jquery-slim.min.js"></script>
-    <script src="../../dist/util.js"></script>
-    <script src="../../dist/carousel.js"></script>
-
-    <script>
-      $(function() {
-        // Test to show that the carousel doesn't slide when the current tab isn't visible
-        $('#carousel-example-generic').on('slid.bs.carousel', function(event) {
-          console.log('slid at ', event.timeStamp)
-        })
-      })
-    </script>
-  </body>
-</html>
diff --git a/assets/javascript/tests/visual/collapse.html b/assets/javascript/tests/visual/collapse.html
deleted file mode 100644
index 0c19def..0000000
--- a/assets/javascript/tests/visual/collapse.html
+++ /dev/null
@@ -1,64 +0,0 @@
-<!doctype html>
-<html>
-  <head>
-    <meta charset="utf-8">
-    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
-    <link rel="stylesheet" href="../../../dist/css/bootstrap.min.css">
-    <title>Collapse</title>
-  </head>
-  <body>
-    <div class="container">
-      <h1>Collapse <small>Bootstrap Visual Test</small></h1>
-
-      <div id="accordion" role="tablist">
-        <div class="card">
-          <div class="card-header" role="tab" id="headingOne">
-            <h5 class="mb-0">
-              <a data-toggle="collapse" href="#collapseOne" aria-expanded="true" aria-controls="collapseOne">
-                Collapsible Group Item #1
-              </a>
-            </h5>
-          </div>
-
-          <div id="collapseOne" class="collapse show" data-parent="#accordion" role="tabpanel" aria-labelledby="headingOne">
-            <div class="card-body">
-              Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf moon officia aute, non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum eiusmod. Brunch 3 wolf moon tempor, sunt aliqua put a bird on it squid single-origin coffee nulla assumenda shoreditch et. Nihil anim keffiyeh helvetica, craft beer labore wes anderson cred nesciunt sapiente ea proident. Ad vegan excepteur butcher vice lomo. Leggings occaecat craft beer farm-to-table, raw denim aesthetic synth nesciunt you probably haven't heard of them accusamus labore sustainable VHS.
-            </div>
-          </div>
-        </div>
-        <div class="card">
-          <div class="card-header" role="tab" id="headingTwo">
-            <h5 class="mb-0">
-              <a class="collapsed" data-toggle="collapse" href="#collapseTwo" aria-expanded="false" aria-controls="collapseTwo">
-                Collapsible Group Item #2
-              </a>
-            </h5>
-          </div>
-          <div id="collapseTwo" class="collapse" data-parent="#accordion" role="tabpanel" aria-labelledby="headingTwo">
-            <div class="card-body">
-              Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf moon officia aute, non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum eiusmod. Brunch 3 wolf moon tempor, sunt aliqua put a bird on it squid single-origin coffee nulla assumenda shoreditch et. Nihil anim keffiyeh helvetica, craft beer labore wes anderson cred nesciunt sapiente ea proident. Ad vegan excepteur butcher vice lomo. Leggings occaecat craft beer farm-to-table, raw denim aesthetic synth nesciunt you probably haven't heard of them accusamus labore sustainable VHS.
-            </div>
-          </div>
-        </div>
-        <div class="card">
-          <div class="card-header" role="tab" id="headingThree">
-            <h5 class="mb-0">
-              <a class="collapsed" data-toggle="collapse" href="#collapseThree" aria-expanded="false" aria-controls="collapseThree">
-                Collapsible Group Item #3
-              </a>
-            </h5>
-          </div>
-          <div id="collapseThree" class="collapse" data-parent="#accordion" role="tabpanel" aria-labelledby="headingThree">
-            <div class="card-body">
-              Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf moon officia aute, non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum eiusmod. Brunch 3 wolf moon tempor, sunt aliqua put a bird on it squid single-origin coffee nulla assumenda shoreditch et. Nihil anim keffiyeh helvetica, craft beer labore wes anderson cred nesciunt sapiente ea proident. Ad vegan excepteur butcher vice lomo. Leggings occaecat craft beer farm-to-table, raw denim aesthetic synth nesciunt you probably haven't heard of them accusamus labore sustainable VHS.
-            </div>
-          </div>
-        </div>
-      </div>
-    </div>
-
-    <script src="../../../assets/js/vendor/jquery-slim.min.js"></script>
-    <script src="../../dist/util.js"></script>
-    <script src="../../dist/collapse.js"></script>
-  </body>
-</html>
diff --git a/assets/javascript/tests/visual/dropdown.html b/assets/javascript/tests/visual/dropdown.html
deleted file mode 100644
index bb0fc6e..0000000
--- a/assets/javascript/tests/visual/dropdown.html
+++ /dev/null
@@ -1,126 +0,0 @@
-<!doctype html>
-<html>
-  <head>
-    <meta charset="utf-8">
-    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
-    <link rel="stylesheet" href="../../../dist/css/bootstrap.min.css">
-    <title>Dropdown</title>
-  </head>
-  <body>
-    <div class="container">
-      <h1>Dropdown <small>Bootstrap Visual Test</small></h1>
-
-      <nav class="navbar navbar-expand-md navbar-light bg-light">
-        <a class="navbar-brand" href="#">Navbar</a>
-        <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarResponsive" aria-controls="navbarResponsive" aria-expanded="false" aria-label="Toggle navigation">
-          <span class="navbar-toggler-icon"></span>
-        </button>
-
-        <div class="collapse navbar-collapse" id="navbarResponsive">
-          <ul class="navbar-nav">
-            <li class="nav-item active">
-              <a class="nav-link" href="#">Home <span class="sr-only">(current)</span></a>
-            </li>
-            <li class="nav-item">
-              <a class="nav-link" href="#">Link</a>
-            </li>
-            <li class="nav-item">
-              <a class="nav-link" href="#">Link</a>
-            </li>
-            <li class="nav-item dropdown">
-              <a class="nav-link dropdown-toggle" href="#" id="dropdown" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">Dropdown</a>
-              <div class="dropdown-menu" aria-labelledby="dropdown">
-                <a class="dropdown-item" href="#">Action</a>
-                <a class="dropdown-item" href="#">Another action</a>
-                <a class="dropdown-item" href="#">Something else here</a>
-              </div>
-            </li>
-          </ul>
-        </div>
-      </nav>
-
-      <ul class="nav nav-pills mt-3">
-        <li class="nav-item">
-          <a class="nav-link active" href="#">Active</a>
-        </li>
-        <li class="nav-item">
-          <a class="nav-link" href="#">Link</a>
-        </li>
-        <li class="nav-item">
-          <a class="nav-link" href="#">Link</a>
-        </li>
-        <li class="nav-item dropdown">
-          <a class="nav-link dropdown-toggle" href="http://example.com" id="dropdown2" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">Dropdown</a>
-          <div class="dropdown-menu" aria-labelledby="dropdown2">
-            <a class="dropdown-item" href="#">Action</a>
-            <a class="dropdown-item" href="#">Another action</a>
-            <a class="dropdown-item" href="#">Something else here</a>
-          </div>
-        </li>
-      </ul>
-
-      <div class="row">
-        <div class="col-sm-12 mt-4">
-          <div class="btn-group dropup">
-            <button type="button" class="btn btn-secondary">Dropup split</button>
-            <button type="button" class="btn btn-secondary dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
-              <span class="sr-only">Dropup split</span>
-            </button>
-            <div class="dropdown-menu">
-              <a class="dropdown-item" href="#">Action</a>
-              <a class="dropdown-item" href="#">Another action</a>
-              <a class="dropdown-item" href="#">Something else here</a>
-            </div>
-          </div>
-
-          <div class="btn-group dropup">
-            <button type="button" class="btn btn-secondary dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">Dropup</button>
-            <div class="dropdown-menu">
-              <a class="dropdown-item" href="#">Action</a>
-              <a class="dropdown-item" href="#">Another action</a>
-              <a class="dropdown-item" href="#">Something else here</a>
-            </div>
-          </div>
-
-          <div class="btn-group">
-            <button type="button" class="btn btn-secondary dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
-              This dropdown's menu is right-aligned
-            </button>
-            <div class="dropdown-menu dropdown-menu-right">
-              <button class="dropdown-item" type="button">Action</button>
-              <button class="dropdown-item" type="button">Another action</button>
-              <button class="dropdown-item" type="button">Something else here</button>
-            </div>
-          </div>
-        </div>
-        <div class="col-sm-12 mt-4">
-          <div class="btn-group dropup" role="group">
-            <a href="#" class="btn btn-secondary">Dropup split align right</a>
-            <button type="button" id="dropdown-page-subheader-button-3" class="btn btn-secondary dropdown-toggle dropdown-toggle-split" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
-              <span class="sr-only">Product actions</span>
-            </button>
-            <div class="dropdown-menu dropdown-menu-right">
-              <button class="dropdown-item" type="button">Action</button>
-              <button class="dropdown-item" type="button">Another action</button>
-              <button class="dropdown-item" type="button">Something else here with a long text</button>
-            </div>
-          </div>
-          <div class="btn-group dropup">
-            <button type="button" class="btn btn-secondary dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">Dropup align right</button>
-            <div class="dropdown-menu dropdown-menu-right">
-              <button class="dropdown-item" type="button">Action</button>
-              <button class="dropdown-item" type="button">Another action</button>
-              <button class="dropdown-item" type="button">Something else here with a long text</button>
-            </div>
-          </div>
-        </div>
-        </div>
-      </div>
-
-    <script src="../../../assets/js/vendor/jquery-slim.min.js"></script>
-    <script src="../../../assets/js/vendor/popper.min.js"></script>
-    <script src="../../dist/util.js"></script>
-    <script src="../../dist/dropdown.js"></script>
-    <script src="../../dist/collapse.js"></script>
-  </body>
-</html>
diff --git a/assets/javascript/tests/visual/modal.html b/assets/javascript/tests/visual/modal.html
deleted file mode 100644
index fcc9603..0000000
--- a/assets/javascript/tests/visual/modal.html
+++ /dev/null
@@ -1,231 +0,0 @@
-<!doctype html>
-<html>
-  <head>
-    <meta charset="utf-8">
-    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
-    <link rel="stylesheet" href="../../../dist/css/bootstrap.min.css">
-    <title>Modal</title>
-    <style>
-      #tall {
-        height: 1500px;
-        width: 100px;
-      }
-    </style>
-  </head>
-  <body>
-    <nav class="navbar navbar-full navbar-dark bg-dark">
-      <button class="navbar-toggler hidden-lg-up" type="button" data-toggle="collapse" data-target="#navbarResponsive" aria-controls="navbarResponsive" aria-expanded="false" aria-label="Toggle navigation"></button>
-      <div class="collapse navbar-expand-md" id="navbarResponsive">
-        <a class="navbar-brand" href="#">This shouldn't jump!</a>
-        <ul class="navbar-nav">
-          <li class="nav-item active">
-            <a class="nav-link" href="#">Home <span class="sr-only">(current)</span></a>
-          </li>
-          <li class="nav-item">
-            <a class="nav-link" href="#">Link</a>
-          </li>
-          <li class="nav-item">
-            <a class="nav-link" href="#">Link</a>
-          </li>
-        </ul>
-      </div>
-    </nav>
-
-    <div class="container mt-3">
-      <h1>Modal <small>Bootstrap Visual Test</small></h1>
-
-      <div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
-        <div class="modal-dialog" role="document">
-          <div class="modal-content">
-            <div class="modal-header">
-              <button type="button" class="close" data-dismiss="modal" aria-label="Close">
-                <span aria-hidden="true">×</span>
-              </button>
-              <h4 class="modal-title" id="myModalLabel">Modal title</h4>
-            </div>
-            <div class="modal-body">
-              <h4>Text in a modal</h4>
-              <p>Duis mollis, est non commodo luctus, nisi erat porttitor ligula.</p>
-
-              <h4>Popover in a modal</h4>
-              <p>This <button type="button" class="btn btn-primary" data-toggle="popover" data-placement="left" title="Popover title" data-content="And here's some amazing content. It's very engaging. Right?">button</button> should trigger a popover on click.</p>
-
-
-              <h4>Tooltips in a modal</h4>
-              <p><a href="#" data-toggle="tooltip" data-placement="top" title="Tooltip on top">This link</a> and <a href="#" data-toggle="tooltip" data-placement="bottom" title="Tooltip on bottom">that link</a> should have tooltips on hover.</p>
-
-              <div id="accordion" role="tablist">
-                <div class="card">
-                  <div class="card-header" role="tab" id="headingOne">
-                    <h5 class="mb-0">
-                      <a data-toggle="collapse" data-parent="#accordion" href="#collapseOne" aria-expanded="true" aria-controls="collapseOne">
-                        Collapsible Group Item #1
-                      </a>
-                    </h5>
-                  </div>
-
-                  <div id="collapseOne" class="collapse show" role="tabpanel" aria-labelledby="headingOne">
-                    <div class="card-body">
-                      Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf moon officia aute, non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum eiusmod. Brunch 3 wolf moon tempor, sunt aliqua put a bird on it squid single-origin coffee nulla assumenda shoreditch et. Nihil anim keffiyeh helvetica, craft beer labore wes anderson cred nesciunt sapiente ea proident. Ad vegan excepteur butcher vice lomo. Leggings occaecat craft beer farm-to-table, raw denim aesthetic synth nesciunt you probably haven't heard of them accusamus labore sustainable VHS.
-                    </div>
-                  </div>
-                </div>
-                <div class="card">
-                  <div class="card-header" role="tab" id="headingTwo">
-                    <h5 class="mb-0">
-                      <a class="collapsed" data-toggle="collapse" data-parent="#accordion" href="#collapseTwo" aria-expanded="false" aria-controls="collapseTwo">
-                        Collapsible Group Item #2
-                      </a>
-                    </h5>
-                  </div>
-                  <div id="collapseTwo" class="collapse" role="tabpanel" aria-labelledby="headingTwo">
-                    <div class="card-body">
-                      Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf moon officia aute, non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum eiusmod. Brunch 3 wolf moon tempor, sunt aliqua put a bird on it squid single-origin coffee nulla assumenda shoreditch et. Nihil anim keffiyeh helvetica, craft beer labore wes anderson cred nesciunt sapiente ea proident. Ad vegan excepteur butcher vice lomo. Leggings occaecat craft beer farm-to-table, raw denim aesthetic synth nesciunt you probably haven't heard of them accusamus labore sustainable VHS.
-                    </div>
-                  </div>
-                </div>
-                <div class="card">
-                  <div class="card-header" role="tab" id="headingThree">
-                    <h5 class="mb-0">
-                      <a class="collapsed" data-toggle="collapse" data-parent="#accordion" href="#collapseThree" aria-expanded="false" aria-controls="collapseThree">
-                        Collapsible Group Item #3
-                      </a>
-                    </h5>
-                  </div>
-                  <div id="collapseThree" class="collapse" role="tabpanel" aria-labelledby="headingThree">
-                    <div class="card-body">
-                      Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf moon officia aute, non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum eiusmod. Brunch 3 wolf moon tempor, sunt aliqua put a bird on it squid single-origin coffee nulla assumenda shoreditch et. Nihil anim keffiyeh helvetica, craft beer labore wes anderson cred nesciunt sapiente ea proident. Ad vegan excepteur butcher vice lomo. Leggings occaecat craft beer farm-to-table, raw denim aesthetic synth nesciunt you probably haven't heard of them accusamus labore sustainable VHS.
-                    </div>
-                  </div>
-                </div>
-              </div>
-
-              <hr>
-
-              <h4>Overflowing text to show scroll behavior</h4>
-              <p>Cras mattis consectetur purus sit amet fermentum. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Morbi leo risus, porta ac consectetur ac, vestibulum at eros.</p>
-              <p>Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor.</p>
-              <p>Aenean lacinia bibendum nulla sed consectetur. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Donec sed odio dui. Donec ullamcorper nulla non metus auctor fringilla.</p>
-              <p>Cras mattis consectetur purus sit amet fermentum. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Morbi leo risus, porta ac consectetur ac, vestibulum at eros.</p>
-              <p>Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor.</p>
-              <p>Aenean lacinia bibendum nulla sed consectetur. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Donec sed odio dui. Donec ullamcorper nulla non metus auctor fringilla.</p>
-              <p>Cras mattis consectetur purus sit amet fermentum. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Morbi leo risus, porta ac consectetur ac, vestibulum at eros.</p>
-              <p>Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor.</p>
-              <p>Aenean lacinia bibendum nulla sed consectetur. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Donec sed odio dui. Donec ullamcorper nulla non metus auctor fringilla.</p>
-            </div>
-            <div class="modal-footer">
-              <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
-              <button type="button" class="btn btn-primary">Save changes</button>
-            </div>
-          </div>
-        </div>
-      </div>
-
-      <div class="modal fade" id="firefoxModal" tabindex="-1" role="dialog" aria-labelledby="firefoxModalLabel" aria-hidden="true">
-        <div class="modal-dialog" role="document">
-          <div class="modal-content">
-            <div class="modal-header">
-              <button type="button" class="close" data-dismiss="modal" aria-label="Close">
-                <span aria-hidden="true">×</span>
-              </button>
-              <h4 class="modal-title" id="firefoxModalLabel">Firefox Bug Test</h4>
-            </div>
-            <div class="modal-body">
-              <ol>
-                <li>Ensure you're using Firefox.</li>
-                <li>Open a new tab and then switch back to this tab.</li>
-                <li>Click into this input: <input type="text" id="ff-bug-input"></li>
-                <li>Switch to the other tab and then back to this tab.</li>
-              </ol>
-              <p>Test result: <strong id="ff-bug-test-result"></strong></p>
-            </div>
-            <div class="modal-footer">
-              <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
-              <button type="button" class="btn btn-primary">Save changes</button>
-            </div>
-          </div>
-        </div>
-      </div>
-
-      <button type="button" class="btn btn-primary btn-lg" data-toggle="modal" data-target="#myModal">
-        Launch demo modal
-      </button>
-
-      <button type="button" class="btn btn-primary btn-lg" id="tall-toggle">
-        Toggle tall <body> content
-      </button>
-
-      <br><br>
-
-      <button type="button" class="btn btn-secondary btn-lg" data-toggle="modal" data-target="#firefoxModal">
-        Launch Firefox bug test modal
-      </button>
-      (<a href="https://github.com/twbs/bootstrap/issues/18365">See Issue #18365</a>)
-
-      <br><br>
-
-      <div class="bg-dark text-white p-2" id="tall" style="display: none;">
-        Tall body content to force the page to have a scrollbar.
-      </div>
-
-      <button type="button" class="btn btn-secondary btn-lg" data-toggle="modal" data-target="&#x3C;div class=&#x22;modal fade the-bad&#x22; tabindex=&#x22;-1&#x22; role=&#x22;dialog&#x22;&#x3E;&#x3C;div class=&#x22;modal-dialog&#x22; role=&#x22;document&#x22;&#x3E;&#x3C;div class=&#x22;modal-content&#x22;&#x3E;&#x3C;div class=&#x22;modal-header&#x22;&#x3E;&#x3C;button type=&#x22;button&#x22; class=&#x22;close&#x22; data-dismiss=&#x22;modal&#x22; aria-label=&#x22;Close&#x22;&#x3E;&#x3C;span aria-hidden=&#x22;true&#x22;&#x3E;&#x26;times;&#x3C;/span&#x3E;&#x3C;/button&#x3E;&#x3C;h4 class=&#x22;modal-title&#x22;&#x3E;The Bad Modal&#x3C;/h4&#x3E;&#x3C;/div&#x3E;&#x3C;div class=&#x22;modal-body&#x22;&#x3E;This modal&#x27;s HTTML source code is declared inline, inside the data-target attribute of it&#x27;s show-button&#x3C;/div&#x3E;&#x3C;/div&#x3E;&#x3C;/div&#x3E;&#x3C;/div&#x3E;">
-        Modal with an XSS inside the data-target
-      </button>
-
-      <br><br>
-
-      <button type="button" class="btn btn-secondary btn-lg" id="btnPreventModal">
-        Launch prevented modal on hide (to see the result open your console)
-      </button>
-    </div>
-
-    <script src="../../../assets/js/vendor/jquery-slim.min.js"></script>
-    <script src="../../../assets/js/vendor/popper.min.js"></script>
-    <script src="../../dist/util.js"></script>
-    <script src="../../dist/modal.js"></script>
-    <script src="../../dist/collapse.js"></script>
-    <script src="../../dist/tooltip.js"></script>
-    <script src="../../dist/popover.js"></script>
-
-    <script>
-      var firefoxTestDone = false
-      function reportFirefoxTestResult(result) {
-        if (!firefoxTestDone) {
-          $('#ff-bug-test-result')
-            .addClass(result ? 'text-success' : 'text-danger')
-            .text(result ? 'PASS' : 'FAIL')
-        }
-      }
-
-      $(function () {
-        $('[data-toggle="popover"]').popover()
-        $('[data-toggle="tooltip"]').tooltip()
-
-        $('#tall-toggle').click(function () {
-          $('#tall').toggle()
-        })
-
-        $('#ff-bug-input').one('focus', function () {
-          $('#firefoxModal').on('focus', reportFirefoxTestResult.bind(false))
-          $('#ff-bug-input').on('focus', reportFirefoxTestResult.bind(true))
-        })
-
-        $('#btnPreventModal').on('click', function () {
-          $('#firefoxModal').one('shown.bs.modal', function () {
-            $(this).modal('hide')
-          })
-          .one('hide.bs.modal', function (event) {
-            event.preventDefault()
-            if ($(this).data('bs.modal')._isTransitioning) {
-              console.error('Modal plugin should not set _isTransitioning when hide event is prevented')
-            } else {
-              console.log('Test passed')
-              $(this).modal('hide') // work as expected
-            }
-          })
-          .modal('show')
-        })
-      })
-    </script>
-  </body>
-</html>
diff --git a/assets/javascript/tests/visual/popover.html b/assets/javascript/tests/visual/popover.html
deleted file mode 100644
index d979d96..0000000
--- a/assets/javascript/tests/visual/popover.html
+++ /dev/null
@@ -1,47 +0,0 @@
-<!doctype html>
-<html>
-  <head>
-    <meta charset="utf-8">
-    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
-    <link rel="stylesheet" href="../../../dist/css/bootstrap.min.css">
-    <title>Popover</title>
-  </head>
-  <body>
-    <div class="container">
-      <h1>Popover <small>Bootstrap Visual Test</small></h1>
-
-      <button type="button" class="btn btn-secondary" data-container="body" data-toggle="popover" data-placement="auto" data-content="Vivamus sagittis lacus vel augue laoreet rutrum faucibus.">
-        Popover on auto
-      </button>
-
-      <button type="button" class="btn btn-secondary" data-container="body" data-toggle="popover" data-placement="top" data-content="Default placement was on top but not enough place">
-        Popover on top
-      </button>
-
-      <button type="button" class="btn btn-secondary" data-container="body" data-toggle="popover" data-placement="right" data-content="Vivamus sagittis lacus vel augue laoreet rutrum faucibus.">
-        Popover on right
-      </button>
-
-      <button type="button" class="btn btn-secondary" data-container="body" data-toggle="popover" data-placement="bottom" data-content="Vivamus
-      sagittis lacus vel augue laoreet rutrum faucibus.">
-        Popover on bottom
-      </button>
-
-      <button type="button" class="btn btn-secondary" data-container="body" data-toggle="popover" data-placement="left" data-content="Vivamus sagittis lacus vel augue laoreet rutrum faucibus.">
-        Popover on left
-      </button>
-    </div>
-
-    <script src="../../../assets/js/vendor/jquery-slim.min.js"></script>
-    <script src="../../../assets/js/vendor/popper.min.js"></script>
-    <script src="../../dist/util.js"></script>
-    <script src="../../dist/tooltip.js"></script>
-    <script src="../../dist/popover.js"></script>
-
-    <script>
-      $(function () {
-        $('[data-toggle="popover"]').popover()
-      })
-    </script>
-  </body>
-</html>
diff --git a/assets/javascript/tests/visual/scrollspy.html b/assets/javascript/tests/visual/scrollspy.html
deleted file mode 100644
index cfa31ce..0000000
--- a/assets/javascript/tests/visual/scrollspy.html
+++ /dev/null
@@ -1,96 +0,0 @@
-<!doctype html>
-<html>
-  <head>
-    <meta charset="utf-8">
-    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
-    <link rel="stylesheet" href="../../../dist/css/bootstrap.min.css">
-    <title>Scrollspy</title>
-    <style>
-      body { padding-top: 70px; }
-    </style>
-  </head>
-  <body data-spy="scroll" data-target=".navbar" data-offset="70">
-    <nav class="navbar navbar-expand-md navbar-dark bg-dark fixed-top">
-      <a class="navbar-brand" href="#">Scrollspy test</a>
-      <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
-        <span class="navbar-toggler-icon"></span>
-      </button>
-      <div class="navbar-collapse collapse" id="navbarSupportedContent">
-        <ul class="navbar-nav mr-auto">
-          <li class="nav-item">
-            <a class="nav-link" href="#fat">@fat</a>
-          </li>
-          <li class="nav-item">
-            <a class="nav-link" href="#mdo">@mdo</a>
-          </li>
-          <li class="nav-item dropdown">
-            <a class="nav-link dropdown-toggle" href="#" id="dropdown" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">Dropdown</a>
-            <div class="dropdown-menu" aria-labelledby="dropdown">
-              <a class="dropdown-item" href="#one">One</a>
-              <a class="dropdown-item" href="#two">Two</a>
-              <a class="dropdown-item" href="#three">Three</a>
-            </div>
-          </li>
-          <li class="nav-item">
-            <a class="nav-link" href="#final">Final</a>
-          </li>
-        </ul>
-      </div>
-    </nav>
-    <div class="container">
-      <h2 id="fat">@fat</h2>
-      <p>Ad leggings keytar, brunch id art party dolor labore. Pitchfork yr enim lo-fi before they sold out qui. Tumblr farm-to-table bicycle rights whatever. Anim keffiyeh carles cardigan. Velit seitan mcsweeney's photo booth 3 wolf moon irure. Cosby sweater lomo jean shorts, williamsburg hoodie minim qui you probably haven't heard of them et cardigan trust fund culpa biodiesel wes anderson aesthetic. Nihil tattooed accusamus, cred irony biodiesel keffiyeh artisan ullamco consequat.</p>
-      <p>Ad leggings keytar, brunch id art party dolor labore. Pitchfork yr enim lo-fi before they sold out qui. Tumblr farm-to-table bicycle rights whatever. Anim keffiyeh carles cardigan. Velit seitan mcsweeney's photo booth 3 wolf moon irure. Cosby sweater lomo jean shorts, williamsburg hoodie minim qui you probably haven't heard of them et cardigan trust fund culpa biodiesel wes anderson aesthetic. Nihil tattooed accusamus, cred irony biodiesel keffiyeh artisan ullamco consequat.</p>
-      <p>Ad leggings keytar, brunch id art party dolor labore. Pitchfork yr enim lo-fi before they sold out qui. Tumblr farm-to-table bicycle rights whatever. Anim keffiyeh carles cardigan. Velit seitan mcsweeney's photo booth 3 wolf moon irure. Cosby sweater lomo jean shorts, williamsburg hoodie minim qui you probably haven't heard of them et cardigan trust fund culpa biodiesel wes anderson aesthetic. Nihil tattooed accusamus, cred irony biodiesel keffiyeh artisan ullamco consequat.</p>
-      <p>Ad leggings keytar, brunch id art party dolor labore. Pitchfork yr enim lo-fi before they sold out qui. Tumblr farm-to-table bicycle rights whatever. Anim keffiyeh carles cardigan. Velit seitan mcsweeney's photo booth 3 wolf moon irure. Cosby sweater lomo jean shorts, williamsburg hoodie minim qui you probably haven't heard of them et cardigan trust fund culpa biodiesel wes anderson aesthetic. Nihil tattooed accusamus, cred irony biodiesel keffiyeh artisan ullamco consequat.</p>
-      <p>Ad leggings keytar, brunch id art party dolor labore. Pitchfork yr enim lo-fi before they sold out qui. Tumblr farm-to-table bicycle rights whatever. Anim keffiyeh carles cardigan. Velit seitan mcsweeney's photo booth 3 wolf moon irure. Cosby sweater lomo jean shorts, williamsburg hoodie minim qui you probably haven't heard of them et cardigan trust fund culpa biodiesel wes anderson aesthetic. Nihil tattooed accusamus, cred irony biodiesel keffiyeh artisan ullamco consequat.</p>
-      <hr>
-      <h2 id="mdo">@mdo</h2>
-      <p>Veniam marfa mustache skateboard, adipisicing fugiat velit pitchfork beard. Freegan beard aliqua cupidatat mcsweeney's vero. Cupidatat four loko nisi, ea helvetica nulla carles. Tattooed cosby sweater food truck, mcsweeney's quis non freegan vinyl. Lo-fi wes anderson +1 sartorial. Carles non aesthetic exercitation quis gentrify. Brooklyn adipisicing craft beer vice keytar deserunt.</p>
-      <p>Ad leggings keytar, brunch id art party dolor labore. Pitchfork yr enim lo-fi before they sold out qui. Tumblr farm-to-table bicycle rights whatever. Anim keffiyeh carles cardigan. Velit seitan mcsweeney's photo booth 3 wolf moon irure. Cosby sweater lomo jean shorts, williamsburg hoodie minim qui you probably haven't heard of them et cardigan trust fund culpa biodiesel wes anderson aesthetic. Nihil tattooed accusamus, cred irony biodiesel keffiyeh artisan ullamco consequat.</p>
-      <p>Ad leggings keytar, brunch id art party dolor labore. Pitchfork yr enim lo-fi before they sold out qui. Tumblr farm-to-table bicycle rights whatever. Anim keffiyeh carles cardigan. Velit seitan mcsweeney's photo booth 3 wolf moon irure. Cosby sweater lomo jean shorts, williamsburg hoodie minim qui you probably haven't heard of them et cardigan trust fund culpa biodiesel wes anderson aesthetic. Nihil tattooed accusamus, cred irony biodiesel keffiyeh artisan ullamco consequat.</p>
-      <p>Ad leggings keytar, brunch id art party dolor labore. Pitchfork yr enim lo-fi before they sold out qui. Tumblr farm-to-table bicycle rights whatever. Anim keffiyeh carles cardigan. Velit seitan mcsweeney's photo booth 3 wolf moon irure. Cosby sweater lomo jean shorts, williamsburg hoodie minim qui you probably haven't heard of them et cardigan trust fund culpa biodiesel wes anderson aesthetic. Nihil tattooed accusamus, cred irony biodiesel keffiyeh artisan ullamco consequat.</p>
-      <p>Ad leggings keytar, brunch id art party dolor labore. Pitchfork yr enim lo-fi before they sold out qui. Tumblr farm-to-table bicycle rights whatever. Anim keffiyeh carles cardigan. Velit seitan mcsweeney's photo booth 3 wolf moon irure. Cosby sweater lomo jean shorts, williamsburg hoodie minim qui you probably haven't heard of them et cardigan trust fund culpa biodiesel wes anderson aesthetic. Nihil tattooed accusamus, cred irony biodiesel keffiyeh artisan ullamco consequat.</p>
-      <hr>
-      <h2 id="one">one</h2>
-      <p>Occaecat commodo aliqua delectus. Fap craft beer deserunt skateboard ea. Lomo bicycle rights adipisicing banh mi, velit ea sunt next level locavore single-origin coffee in magna veniam. High life id vinyl, echo park consequat quis aliquip banh mi pitchfork. Vero VHS est adipisicing. Consectetur nisi DIY minim messenger bag. Cred ex in, sustainable delectus consectetur fanny pack iphone.</p>
-      <p>Ad leggings keytar, brunch id art party dolor labore. Pitchfork yr enim lo-fi before they sold out qui. Tumblr farm-to-table bicycle rights whatever. Anim keffiyeh carles cardigan. Velit seitan mcsweeney's photo booth 3 wolf moon irure. Cosby sweater lomo jean shorts, williamsburg hoodie minim qui you probably haven't heard of them et cardigan trust fund culpa biodiesel wes anderson aesthetic. Nihil tattooed accusamus, cred irony biodiesel keffiyeh artisan ullamco consequat.</p>
-      <p>Ad leggings keytar, brunch id art party dolor labore. Pitchfork yr enim lo-fi before they sold out qui. Tumblr farm-to-table bicycle rights whatever. Anim keffiyeh carles cardigan. Velit seitan mcsweeney's photo booth 3 wolf moon irure. Cosby sweater lomo jean shorts, williamsburg hoodie minim qui you probably haven't heard of them et cardigan trust fund culpa biodiesel wes anderson aesthetic. Nihil tattooed accusamus, cred irony biodiesel keffiyeh artisan ullamco consequat.</p>
-      <p>Ad leggings keytar, brunch id art party dolor labore. Pitchfork yr enim lo-fi before they sold out qui. Tumblr farm-to-table bicycle rights whatever. Anim keffiyeh carles cardigan. Velit seitan mcsweeney's photo booth 3 wolf moon irure. Cosby sweater lomo jean shorts, williamsburg hoodie minim qui you probably haven't heard of them et cardigan trust fund culpa biodiesel wes anderson aesthetic. Nihil tattooed accusamus, cred irony biodiesel keffiyeh artisan ullamco consequat.</p>
-      <p>Ad leggings keytar, brunch id art party dolor labore. Pitchfork yr enim lo-fi before they sold out qui. Tumblr farm-to-table bicycle rights whatever. Anim keffiyeh carles cardigan. Velit seitan mcsweeney's photo booth 3 wolf moon irure. Cosby sweater lomo jean shorts, williamsburg hoodie minim qui you probably haven't heard of them et cardigan trust fund culpa biodiesel wes anderson aesthetic. Nihil tattooed accusamus, cred irony biodiesel keffiyeh artisan ullamco consequat.</p>
-      <hr>
-      <h2 id="two">two</h2>
-      <p>In incididunt echo park, officia deserunt mcsweeney's proident master cleanse thundercats sapiente veniam. Excepteur VHS elit, proident shoreditch +1 biodiesel laborum craft beer. Single-origin coffee wayfarers irure four loko, cupidatat terry richardson master cleanse. Assumenda you probably haven't heard of them art party fanny pack, tattooed nulla cardigan tempor ad. Proident wolf nesciunt sartorial keffiyeh eu banh mi sustainable. Elit wolf voluptate, lo-fi ea portland before they sold out four loko. Locavore enim nostrud mlkshk brooklyn nesciunt.</p>
-      <p>Ad leggings keytar, brunch id art party dolor labore. Pitchfork yr enim lo-fi before they sold out qui. Tumblr farm-to-table bicycle rights whatever. Anim keffiyeh carles cardigan. Velit seitan mcsweeney's photo booth 3 wolf moon irure. Cosby sweater lomo jean shorts, williamsburg hoodie minim qui you probably haven't heard of them et cardigan trust fund culpa biodiesel wes anderson aesthetic. Nihil tattooed accusamus, cred irony biodiesel keffiyeh artisan ullamco consequat.</p>
-      <p>Ad leggings keytar, brunch id art party dolor labore. Pitchfork yr enim lo-fi before they sold out qui. Tumblr farm-to-table bicycle rights whatever. Anim keffiyeh carles cardigan. Velit seitan mcsweeney's photo booth 3 wolf moon irure. Cosby sweater lomo jean shorts, williamsburg hoodie minim qui you probably haven't heard of them et cardigan trust fund culpa biodiesel wes anderson aesthetic. Nihil tattooed accusamus, cred irony biodiesel keffiyeh artisan ullamco consequat.</p>
-      <p>Ad leggings keytar, brunch id art party dolor labore. Pitchfork yr enim lo-fi before they sold out qui. Tumblr farm-to-table bicycle rights whatever. Anim keffiyeh carles cardigan. Velit seitan mcsweeney's photo booth 3 wolf moon irure. Cosby sweater lomo jean shorts, williamsburg hoodie minim qui you probably haven't heard of them et cardigan trust fund culpa biodiesel wes anderson aesthetic. Nihil tattooed accusamus, cred irony biodiesel keffiyeh artisan ullamco consequat.</p>
-      <p>Ad leggings keytar, brunch id art party dolor labore. Pitchfork yr enim lo-fi before they sold out qui. Tumblr farm-to-table bicycle rights whatever. Anim keffiyeh carles cardigan. Velit seitan mcsweeney's photo booth 3 wolf moon irure. Cosby sweater lomo jean shorts, williamsburg hoodie minim qui you probably haven't heard of them et cardigan trust fund culpa biodiesel wes anderson aesthetic. Nihil tattooed accusamus, cred irony biodiesel keffiyeh artisan ullamco consequat.</p>
-      <hr>
-      <h2 id="three">three</h2>
-      <p>Ad leggings keytar, brunch id art party dolor labore. Pitchfork yr enim lo-fi before they sold out qui. Tumblr farm-to-table bicycle rights whatever. Anim keffiyeh carles cardigan. Velit seitan mcsweeney's photo booth 3 wolf moon irure. Cosby sweater lomo jean shorts, williamsburg hoodie minim qui you probably haven't heard of them et cardigan trust fund culpa biodiesel wes anderson aesthetic. Nihil tattooed accusamus, cred irony biodiesel keffiyeh artisan ullamco consequat.</p>
-      <p>Keytar twee blog, culpa messenger bag marfa whatever delectus food truck. Sapiente synth id assumenda. Locavore sed helvetica cliche irony, thundercats you probably haven't heard of them consequat hoodie gluten-free lo-fi fap aliquip. Labore elit placeat before they sold out, terry richardson proident brunch nesciunt quis cosby sweater pariatur keffiyeh ut helvetica artisan. Cardigan craft beer seitan readymade velit. VHS chambray laboris tempor veniam. Anim mollit minim commodo ullamco thundercats.</p>
-      <p>Ad leggings keytar, brunch id art party dolor labore. Pitchfork yr enim lo-fi before they sold out qui. Tumblr farm-to-table bicycle rights whatever. Anim keffiyeh carles cardigan. Velit seitan mcsweeney's photo booth 3 wolf moon irure. Cosby sweater lomo jean shorts, williamsburg hoodie minim qui you probably haven't heard of them et cardigan trust fund culpa biodiesel wes anderson aesthetic. Nihil tattooed accusamus, cred irony biodiesel keffiyeh artisan ullamco consequat.</p>
-      <p>Ad leggings keytar, brunch id art party dolor labore. Pitchfork yr enim lo-fi before they sold out qui. Tumblr farm-to-table bicycle rights whatever. Anim keffiyeh carles cardigan. Velit seitan mcsweeney's photo booth 3 wolf moon irure. Cosby sweater lomo jean shorts, williamsburg hoodie minim qui you probably haven't heard of them et cardigan trust fund culpa biodiesel wes anderson aesthetic. Nihil tattooed accusamus, cred irony biodiesel keffiyeh artisan ullamco consequat.</p>
-      <p>Ad leggings keytar, brunch id art party dolor labore. Pitchfork yr enim lo-fi before they sold out qui. Tumblr farm-to-table bicycle rights whatever. Anim keffiyeh carles cardigan. Velit seitan mcsweeney's photo booth 3 wolf moon irure. Cosby sweater lomo jean shorts, williamsburg hoodie minim qui you probably haven't heard of them et cardigan trust fund culpa biodiesel wes anderson aesthetic. Nihil tattooed accusamus, cred irony biodiesel keffiyeh artisan ullamco consequat.</p>
-      <p>Ad leggings keytar, brunch id art party dolor labore. Pitchfork yr enim lo-fi before they sold out qui. Tumblr farm-to-table bicycle rights whatever. Anim keffiyeh carles cardigan. Velit seitan mcsweeney's photo booth 3 wolf moon irure. Cosby sweater lomo jean shorts, williamsburg hoodie minim qui you probably haven't heard of them et cardigan trust fund culpa biodiesel wes anderson aesthetic. Nihil tattooed accusamus, cred irony biodiesel keffiyeh artisan ullamco consequat.</p>
-      <p>Ad leggings keytar, brunch id art party dolor labore. Pitchfork yr enim lo-fi before they sold out qui. Tumblr farm-to-table bicycle rights whatever. Anim keffiyeh carles cardigan. Velit seitan mcsweeney's photo booth 3 wolf moon irure. Cosby sweater lomo jean shorts, williamsburg hoodie minim qui you probably haven't heard of them et cardigan trust fund culpa biodiesel wes anderson aesthetic. Nihil tattooed accusamus, cred irony biodiesel keffiyeh artisan ullamco consequat.</p>
-      <p>Ad leggings keytar, brunch id art party dolor labore. Pitchfork yr enim lo-fi before they sold out qui. Tumblr farm-to-table bicycle rights whatever. Anim keffiyeh carles cardigan. Velit seitan mcsweeney's photo booth 3 wolf moon irure. Cosby sweater lomo jean shorts, williamsburg hoodie minim qui you probably haven't heard of them et cardigan trust fund culpa biodiesel wes anderson aesthetic. Nihil tattooed accusamus, cred irony biodiesel keffiyeh artisan ullamco consequat.</p>
-      <p>Ad leggings keytar, brunch id art party dolor labore. Pitchfork yr enim lo-fi before they sold out qui. Tumblr farm-to-table bicycle rights whatever. Anim keffiyeh carles cardigan. Velit seitan mcsweeney's photo booth 3 wolf moon irure. Cosby sweater lomo jean shorts, williamsburg hoodie minim qui you probably haven't heard of them et cardigan trust fund culpa biodiesel wes anderson aesthetic. Nihil tattooed accusamus, cred irony biodiesel keffiyeh artisan ullamco consequat.</p>
-      <p>Ad leggings keytar, brunch id art party dolor labore. Pitchfork yr enim lo-fi before they sold out qui. Tumblr farm-to-table bicycle rights whatever. Anim keffiyeh carles cardigan. Velit seitan mcsweeney's photo booth 3 wolf moon irure. Cosby sweater lomo jean shorts, williamsburg hoodie minim qui you probably haven't heard of them et cardigan trust fund culpa biodiesel wes anderson aesthetic. Nihil tattooed accusamus, cred irony biodiesel keffiyeh artisan ullamco consequat.</p>
-      <p>Ad leggings keytar, brunch id art party dolor labore. Pitchfork yr enim lo-fi before they sold out qui. Tumblr farm-to-table bicycle rights whatever. Anim keffiyeh carles cardigan. Velit seitan mcsweeney's photo booth 3 wolf moon irure. Cosby sweater lomo jean shorts, williamsburg hoodie minim qui you probably haven't heard of them et cardigan trust fund culpa biodiesel wes anderson aesthetic. Nihil tattooed accusamus, cred irony biodiesel keffiyeh artisan ullamco consequat.</p>
-      <p>Ad leggings keytar, brunch id art party dolor labore. Pitchfork yr enim lo-fi before they sold out qui. Tumblr farm-to-table bicycle rights whatever. Anim keffiyeh carles cardigan. Velit seitan mcsweeney's photo booth 3 wolf moon irure. Cosby sweater lomo jean shorts, williamsburg hoodie minim qui you probably haven't heard of them et cardigan trust fund culpa biodiesel wes anderson aesthetic. Nihil tattooed accusamus, cred irony biodiesel keffiyeh artisan ullamco consequat.</p>
-      <p>Ad leggings keytar, brunch id art party dolor labore. Pitchfork yr enim lo-fi before they sold out qui. Tumblr farm-to-table bicycle rights whatever. Anim keffiyeh carles cardigan. Velit seitan mcsweeney's photo booth 3 wolf moon irure. Cosby sweater lomo jean shorts, williamsburg hoodie minim qui you probably haven't heard of them et cardigan trust fund culpa biodiesel wes anderson aesthetic. Nihil tattooed accusamus, cred irony biodiesel keffiyeh artisan ullamco consequat.</p>
-      <p>Ad leggings keytar, brunch id art party dolor labore. Pitchfork yr enim lo-fi before they sold out qui. Tumblr farm-to-table bicycle rights whatever. Anim keffiyeh carles cardigan. Velit seitan mcsweeney's photo booth 3 wolf moon irure. Cosby sweater lomo jean shorts, williamsburg hoodie minim qui you probably haven't heard of them et cardigan trust fund culpa biodiesel wes anderson aesthetic. Nihil tattooed accusamus, cred irony biodiesel keffiyeh artisan ullamco consequat.</p>
-      <hr>
-      <h2 id="final">Final section</h2>
-      <p>Ad leggings keytar, brunch id art party dolor labore.</p>
-    </div>
-
-    <script src="../../../assets/js/vendor/jquery-slim.min.js"></script>
-    <script src="../../../assets/js/vendor/popper.min.js"></script>
-    <script src="../../dist/util.js"></script>
-    <script src="../../dist/scrollspy.js"></script>
-    <script src="../../dist/dropdown.js"></script>
-    <script src="../../dist/collapse.js"></script>
-  </body>
-</html>
diff --git a/assets/javascript/tests/visual/tab.html b/assets/javascript/tests/visual/tab.html
deleted file mode 100644
index defb577..0000000
--- a/assets/javascript/tests/visual/tab.html
+++ /dev/null
@@ -1,233 +0,0 @@
-<!doctype html>
-<html>
-  <head>
-    <meta charset="utf-8">
-    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
-    <link rel="stylesheet" href="../../../dist/css/bootstrap.min.css">
-    <title>Tab</title>
-    <style>
-      h4 {
-        margin: 40px 0 10px;
-      }
-    </style>
-  </head>
-  <body>
-    <div class="container">
-      <h1>Tab <small>Bootstrap Visual Test</small></h1>
-
-      <h4>Tabs without fade</h4>
-
-      <ul class="nav nav-tabs" role="tablist">
-        <li class="nav-item">
-          <a class="nav-link active" data-toggle="tab" href="#home" role="tab">Home</a>
-        </li>
-        <li class="nav-item">
-          <a class="nav-link" data-toggle="tab" href="#profile" role="tab">Profile</a>
-        </li>
-        <li class="nav-item dropdown">
-          <a class="nav-link dropdown-toggle" href="#" id="dropdown" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">Dropdown</a>
-          <div class="dropdown-menu" aria-labelledby="dropdown">
-            <a class="dropdown-item" data-toggle="tab" href="#fat" role="tab">@fat</a>
-            <a class="dropdown-item" data-toggle="tab" href="#mdo" role="tab">@mdo</a>
-          </div>
-        </li>
-      </ul>
-
-      <div class="tab-content" role="tablist">
-        <div class="tab-pane active" id="home" role="tabpanel">
-          <p>Raw denim you probably haven't heard of them jean shorts Austin. Nesciunt tofu stumptown aliqua, retro synth master cleanse. Mustache cliche tempor, williamsburg carles vegan helvetica. Reprehenderit butcher retro keffiyeh dreamcatcher synth. Cosby sweater eu banh mi, qui irure terry richardson ex squid. Aliquip placeat salvia cillum iphone. Seitan aliquip quis cardigan american apparel, butcher voluptate nisi qui.</p>
-          <p>Raw denim you probably haven't heard of them jean shorts Austin. Nesciunt tofu stumptown aliqua, retro synth master cleanse. Mustache cliche tempor, williamsburg carles vegan helvetica. Reprehenderit butcher retro keffiyeh dreamcatcher synth. Cosby sweater eu banh mi, qui irure terry richardson ex squid. Aliquip placeat salvia cillum iphone. Seitan aliquip quis cardigan american apparel, butcher voluptate nisi qui.</p>
-        </div>
-        <div class="tab-pane" id="profile" role="tabpanel">
-          <p>Food truck fixie locavore, accusamus mcsweeney's marfa nulla single-origin coffee squid. Exercitation +1 labore velit, blog sartorial PBR leggings next level wes anderson artisan four loko farm-to-table craft beer twee. Qui photo booth letterpress, commodo enim craft beer mlkshk aliquip jean shorts ullamco ad vinyl cillum PBR. Homo nostrud organic, assumenda labore aesthetic magna delectus mollit. Keytar helvetica VHS salvia yr, vero magna velit sapiente labore stumptown. Vegan fanny pack odio cillum wes anderson 8-bit, sustainable jean shorts beard ut DIY ethical culpa terry richardson biodiesel. Art party scenester stumptown, tumblr butcher vero sint qui sapiente accusamus tattooed echo park.</p>
-          <p>Food truck fixie locavore, accusamus mcsweeney's marfa nulla single-origin coffee squid. Exercitation +1 labore velit, blog sartorial PBR leggings next level wes anderson artisan four loko farm-to-table craft beer twee. Qui photo booth letterpress, commodo enim craft beer mlkshk aliquip jean shorts ullamco ad vinyl cillum PBR. Homo nostrud organic, assumenda labore aesthetic magna delectus mollit. Keytar helvetica VHS salvia yr, vero magna velit sapiente labore stumptown. Vegan fanny pack odio cillum wes anderson 8-bit, sustainable jean shorts beard ut DIY ethical culpa terry richardson biodiesel. Art party scenester stumptown, tumblr butcher vero sint qui sapiente accusamus tattooed echo park.</p>
-        </div>
-        <div class="tab-pane" id="fat" role="tabpanel">
-          <p>Etsy mixtape wayfarers, ethical wes anderson tofu before they sold out mcsweeney's organic lomo retro fanny pack lo-fi farm-to-table readymade. Messenger bag gentrify pitchfork tattooed craft beer, iphone skateboard locavore carles etsy salvia banksy hoodie helvetica. DIY synth PBR banksy irony. Leggings gentrify squid 8-bit cred pitchfork. Williamsburg banh mi whatever gluten-free, carles pitchfork biodiesel fixie etsy retro mlkshk vice blog. Scenester cred you probably haven't heard of them, vinyl craft beer blog stumptown. Pitchfork sustainable tofu synth chambray yr.</p>
-          <p>Etsy mixtape wayfarers, ethical wes anderson tofu before they sold out mcsweeney's organic lomo retro fanny pack lo-fi farm-to-table readymade. Messenger bag gentrify pitchfork tattooed craft beer, iphone skateboard locavore carles etsy salvia banksy hoodie helvetica. DIY synth PBR banksy irony. Leggings gentrify squid 8-bit cred pitchfork. Williamsburg banh mi whatever gluten-free, carles pitchfork biodiesel fixie etsy retro mlkshk vice blog. Scenester cred you probably haven't heard of them, vinyl craft beer blog stumptown. Pitchfork sustainable tofu synth chambray yr.</p>
-        </div>
-        <div class="tab-pane" id="mdo" role="tabpanel">
-          <p>Trust fund seitan letterpress, keytar raw denim keffiyeh etsy art party before they sold out master cleanse gluten-free squid scenester freegan cosby sweater. Fanny pack portland seitan DIY, art party locavore wolf cliche high life echo park Austin. Cred vinyl keffiyeh DIY salvia PBR, banh mi before they sold out farm-to-table VHS viral locavore cosby sweater. Lomo wolf viral, mustache readymade thundercats keffiyeh craft beer marfa ethical. Wolf salvia freegan, sartorial keffiyeh echo park vegan.</p>
-          <p>Trust fund seitan letterpress, keytar raw denim keffiyeh etsy art party before they sold out master cleanse gluten-free squid scenester freegan cosby sweater. Fanny pack portland seitan DIY, art party locavore wolf cliche high life echo park Austin. Cred vinyl keffiyeh DIY salvia PBR, banh mi before they sold out farm-to-table VHS viral locavore cosby sweater. Lomo wolf viral, mustache readymade thundercats keffiyeh craft beer marfa ethical. Wolf salvia freegan, sartorial keffiyeh echo park vegan.</p>
-        </div>
-      </div>
-
-      <h4>Tabs with fade</h4>
-
-      <ul class="nav nav-tabs" role="tablist">
-        <li class="nav-item">
-          <a class="nav-link active" data-toggle="tab" href="#home2" role="tab">Home</a>
-        </li>
-        <li class="nav-item">
-          <a class="nav-link" data-toggle="tab" href="#profile2" role="tab">Profile</a>
-        </li>
-        <li class="nav-item dropdown">
-          <a class="nav-link dropdown-toggle" href="#" id="dropdown2" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">Dropdown</a>
-          <div class="dropdown-menu" aria-labelledby="dropdown2">
-            <a class="dropdown-item" data-toggle="tab" href="#fat2" role="tab">@fat</a>
-            <a class="dropdown-item" data-toggle="tab" href="#mdo2" role="tab">@mdo</a>
-          </div>
-        </li>
-      </ul>
-
-      <div class="tab-content" role="tablist">
-        <div class="tab-pane fade show active" id="home2" role="tabpanel">
-          <p>Raw denim you probably haven't heard of them jean shorts Austin. Nesciunt tofu stumptown aliqua, retro synth master cleanse. Mustache cliche tempor, williamsburg carles vegan helvetica. Reprehenderit butcher retro keffiyeh dreamcatcher synth. Cosby sweater eu banh mi, qui irure terry richardson ex squid. Aliquip placeat salvia cillum iphone. Seitan aliquip quis cardigan american apparel, butcher voluptate nisi qui.</p>
-          <p>Raw denim you probably haven't heard of them jean shorts Austin. Nesciunt tofu stumptown aliqua, retro synth master cleanse. Mustache cliche tempor, williamsburg carles vegan helvetica. Reprehenderit butcher retro keffiyeh dreamcatcher synth. Cosby sweater eu banh mi, qui irure terry richardson ex squid. Aliquip placeat salvia cillum iphone. Seitan aliquip quis cardigan american apparel, butcher voluptate nisi qui.</p>
-        </div>
-        <div class="tab-pane fade" id="profile2" role="tabpanel">
-          <p>Food truck fixie locavore, accusamus mcsweeney's marfa nulla single-origin coffee squid. Exercitation +1 labore velit, blog sartorial PBR leggings next level wes anderson artisan four loko farm-to-table craft beer twee. Qui photo booth letterpress, commodo enim craft beer mlkshk aliquip jean shorts ullamco ad vinyl cillum PBR. Homo nostrud organic, assumenda labore aesthetic magna delectus mollit. Keytar helvetica VHS salvia yr, vero magna velit sapiente labore stumptown. Vegan fanny pack odio cillum wes anderson 8-bit, sustainable jean shorts beard ut DIY ethical culpa terry richardson biodiesel. Art party scenester stumptown, tumblr butcher vero sint qui sapiente accusamus tattooed echo park.</p>
-          <p>Food truck fixie locavore, accusamus mcsweeney's marfa nulla single-origin coffee squid. Exercitation +1 labore velit, blog sartorial PBR leggings next level wes anderson artisan four loko farm-to-table craft beer twee. Qui photo booth letterpress, commodo enim craft beer mlkshk aliquip jean shorts ullamco ad vinyl cillum PBR. Homo nostrud organic, assumenda labore aesthetic magna delectus mollit. Keytar helvetica VHS salvia yr, vero magna velit sapiente labore stumptown. Vegan fanny pack odio cillum wes anderson 8-bit, sustainable jean shorts beard ut DIY ethical culpa terry richardson biodiesel. Art party scenester stumptown, tumblr butcher vero sint qui sapiente accusamus tattooed echo park.</p>
-        </div>
-        <div class="tab-pane fade" id="fat2" role="tabpanel">
-          <p>Etsy mixtape wayfarers, ethical wes anderson tofu before they sold out mcsweeney's organic lomo retro fanny pack lo-fi farm-to-table readymade. Messenger bag gentrify pitchfork tattooed craft beer, iphone skateboard locavore carles etsy salvia banksy hoodie helvetica. DIY synth PBR banksy irony. Leggings gentrify squid 8-bit cred pitchfork. Williamsburg banh mi whatever gluten-free, carles pitchfork biodiesel fixie etsy retro mlkshk vice blog. Scenester cred you probably haven't heard of them, vinyl craft beer blog stumptown. Pitchfork sustainable tofu synth chambray yr.</p>
-          <p>Etsy mixtape wayfarers, ethical wes anderson tofu before they sold out mcsweeney's organic lomo retro fanny pack lo-fi farm-to-table readymade. Messenger bag gentrify pitchfork tattooed craft beer, iphone skateboard locavore carles etsy salvia banksy hoodie helvetica. DIY synth PBR banksy irony. Leggings gentrify squid 8-bit cred pitchfork. Williamsburg banh mi whatever gluten-free, carles pitchfork biodiesel fixie etsy retro mlkshk vice blog. Scenester cred you probably haven't heard of them, vinyl craft beer blog stumptown. Pitchfork sustainable tofu synth chambray yr.</p>
-        </div>
-        <div class="tab-pane fade" id="mdo2" role="tabpanel">
-          <p>Trust fund seitan letterpress, keytar raw denim keffiyeh etsy art party before they sold out master cleanse gluten-free squid scenester freegan cosby sweater. Fanny pack portland seitan DIY, art party locavore wolf cliche high life echo park Austin. Cred vinyl keffiyeh DIY salvia PBR, banh mi before they sold out farm-to-table VHS viral locavore cosby sweater. Lomo wolf viral, mustache readymade thundercats keffiyeh craft beer marfa ethical. Wolf salvia freegan, sartorial keffiyeh echo park vegan.</p>
-          <p>Trust fund seitan letterpress, keytar raw denim keffiyeh etsy art party before they sold out master cleanse gluten-free squid scenester freegan cosby sweater. Fanny pack portland seitan DIY, art party locavore wolf cliche high life echo park Austin. Cred vinyl keffiyeh DIY salvia PBR, banh mi before they sold out farm-to-table VHS viral locavore cosby sweater. Lomo wolf viral, mustache readymade thundercats keffiyeh craft beer marfa ethical. Wolf salvia freegan, sartorial keffiyeh echo park vegan.</p>
-        </div>
-      </div>
-
-      <h4>Tabs without fade (no initially active pane)</h4>
-
-      <ul class="nav nav-tabs" role="tablist">
-        <li class="nav-item">
-          <a class="nav-link" data-toggle="tab" href="#home3" role="tab">Home</a>
-        </li>
-        <li class="nav-item">
-          <a class="nav-link" data-toggle="tab" href="#profile3" role="tab">Profile</a>
-        </li>
-        <li class="nav-item dropdown">
-          <a class="nav-link dropdown-toggle" href="#" id="dropdown3" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">Dropdown</a>
-          <div class="dropdown-menu" aria-labelledby="dropdown3">
-            <a class="dropdown-item" data-toggle="tab" href="#fat3" role="tab">@fat</a>
-            <a class="dropdown-item" data-toggle="tab" href="#mdo3" role="tab">@mdo</a>
-          </div>
-        </li>
-      </ul>
-
-      <div class="tab-content" role="tablist">
-        <div class="tab-pane" id="home3" role="tabpanel">
-          <p>Raw denim you probably haven't heard of them jean shorts Austin. Nesciunt tofu stumptown aliqua, retro synth master cleanse. Mustache cliche tempor, williamsburg carles vegan helvetica. Reprehenderit butcher retro keffiyeh dreamcatcher synth. Cosby sweater eu banh mi, qui irure terry richardson ex squid. Aliquip placeat salvia cillum iphone. Seitan aliquip quis cardigan american apparel, butcher voluptate nisi qui.</p>
-          <p>Raw denim you probably haven't heard of them jean shorts Austin. Nesciunt tofu stumptown aliqua, retro synth master cleanse. Mustache cliche tempor, williamsburg carles vegan helvetica. Reprehenderit butcher retro keffiyeh dreamcatcher synth. Cosby sweater eu banh mi, qui irure terry richardson ex squid. Aliquip placeat salvia cillum iphone. Seitan aliquip quis cardigan american apparel, butcher voluptate nisi qui.</p>
-        </div>
-        <div class="tab-pane" id="profile3" role="tabpanel">
-          <p>Food truck fixie locavore, accusamus mcsweeney's marfa nulla single-origin coffee squid. Exercitation +1 labore velit, blog sartorial PBR leggings next level wes anderson artisan four loko farm-to-table craft beer twee. Qui photo booth letterpress, commodo enim craft beer mlkshk aliquip jean shorts ullamco ad vinyl cillum PBR. Homo nostrud organic, assumenda labore aesthetic magna delectus mollit. Keytar helvetica VHS salvia yr, vero magna velit sapiente labore stumptown. Vegan fanny pack odio cillum wes anderson 8-bit, sustainable jean shorts beard ut DIY ethical culpa terry richardson biodiesel. Art party scenester stumptown, tumblr butcher vero sint qui sapiente accusamus tattooed echo park.</p>
-          <p>Food truck fixie locavore, accusamus mcsweeney's marfa nulla single-origin coffee squid. Exercitation +1 labore velit, blog sartorial PBR leggings next level wes anderson artisan four loko farm-to-table craft beer twee. Qui photo booth letterpress, commodo enim craft beer mlkshk aliquip jean shorts ullamco ad vinyl cillum PBR. Homo nostrud organic, assumenda labore aesthetic magna delectus mollit. Keytar helvetica VHS salvia yr, vero magna velit sapiente labore stumptown. Vegan fanny pack odio cillum wes anderson 8-bit, sustainable jean shorts beard ut DIY ethical culpa terry richardson biodiesel. Art party scenester stumptown, tumblr butcher vero sint qui sapiente accusamus tattooed echo park.</p>
-        </div>
-        <div class="tab-pane" id="fat3" role="tabpanel">
-          <p>Etsy mixtape wayfarers, ethical wes anderson tofu before they sold out mcsweeney's organic lomo retro fanny pack lo-fi farm-to-table readymade. Messenger bag gentrify pitchfork tattooed craft beer, iphone skateboard locavore carles etsy salvia banksy hoodie helvetica. DIY synth PBR banksy irony. Leggings gentrify squid 8-bit cred pitchfork. Williamsburg banh mi whatever gluten-free, carles pitchfork biodiesel fixie etsy retro mlkshk vice blog. Scenester cred you probably haven't heard of them, vinyl craft beer blog stumptown. Pitchfork sustainable tofu synth chambray yr.</p>
-          <p>Etsy mixtape wayfarers, ethical wes anderson tofu before they sold out mcsweeney's organic lomo retro fanny pack lo-fi farm-to-table readymade. Messenger bag gentrify pitchfork tattooed craft beer, iphone skateboard locavore carles etsy salvia banksy hoodie helvetica. DIY synth PBR banksy irony. Leggings gentrify squid 8-bit cred pitchfork. Williamsburg banh mi whatever gluten-free, carles pitchfork biodiesel fixie etsy retro mlkshk vice blog. Scenester cred you probably haven't heard of them, vinyl craft beer blog stumptown. Pitchfork sustainable tofu synth chambray yr.</p>
-        </div>
-        <div class="tab-pane" id="mdo3" role="tabpanel">
-          <p>Trust fund seitan letterpress, keytar raw denim keffiyeh etsy art party before they sold out master cleanse gluten-free squid scenester freegan cosby sweater. Fanny pack portland seitan DIY, art party locavore wolf cliche high life echo park Austin. Cred vinyl keffiyeh DIY salvia PBR, banh mi before they sold out farm-to-table VHS viral locavore cosby sweater. Lomo wolf viral, mustache readymade thundercats keffiyeh craft beer marfa ethical. Wolf salvia freegan, sartorial keffiyeh echo park vegan.</p>
-          <p>Trust fund seitan letterpress, keytar raw denim keffiyeh etsy art party before they sold out master cleanse gluten-free squid scenester freegan cosby sweater. Fanny pack portland seitan DIY, art party locavore wolf cliche high life echo park Austin. Cred vinyl keffiyeh DIY salvia PBR, banh mi before they sold out farm-to-table VHS viral locavore cosby sweater. Lomo wolf viral, mustache readymade thundercats keffiyeh craft beer marfa ethical. Wolf salvia freegan, sartorial keffiyeh echo park vegan.</p>
-        </div>
-      </div>
-
-      <h4>Tabs with fade (no initially active pane)</h4>
-
-      <ul class="nav nav-tabs" role="tablist">
-        <li class="nav-item">
-          <a class="nav-link" data-toggle="tab" href="#home4" role="tab">Home</a>
-        </li>
-        <li class="nav-item">
-          <a class="nav-link" data-toggle="tab" href="#profile4" role="tab">Profile</a>
-        </li>
-        <li class="nav-item dropdown">
-          <a class="nav-link dropdown-toggle" href="#" id="dropdown4" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">Dropdown</a>
-          <div class="dropdown-menu" aria-labelledby="dropdown4">
-            <a class="dropdown-item" data-toggle="tab" href="#fat4" role="tab">@fat</a>
-            <a class="dropdown-item" data-toggle="tab" href="#mdo4" role="tab">@mdo</a>
-          </div>
-        </li>
-      </ul>
-
-      <div class="tab-content">
-        <div class="tab-pane fade" id="home4" role="tabpanel">
-          <p>Raw denim you probably haven't heard of them jean shorts Austin. Nesciunt tofu stumptown aliqua, retro synth master cleanse. Mustache cliche tempor, williamsburg carles vegan helvetica. Reprehenderit butcher retro keffiyeh dreamcatcher synth. Cosby sweater eu banh mi, qui irure terry richardson ex squid. Aliquip placeat salvia cillum iphone. Seitan aliquip quis cardigan american apparel, butcher voluptate nisi qui.</p>
-          <p>Raw denim you probably haven't heard of them jean shorts Austin. Nesciunt tofu stumptown aliqua, retro synth master cleanse. Mustache cliche tempor, williamsburg carles vegan helvetica. Reprehenderit butcher retro keffiyeh dreamcatcher synth. Cosby sweater eu banh mi, qui irure terry richardson ex squid. Aliquip placeat salvia cillum iphone. Seitan aliquip quis cardigan american apparel, butcher voluptate nisi qui.</p>
-        </div>
-        <div class="tab-pane fade" id="profile4" role="tabpanel">
-          <p>Food truck fixie locavore, accusamus mcsweeney's marfa nulla single-origin coffee squid. Exercitation +1 labore velit, blog sartorial PBR leggings next level wes anderson artisan four loko farm-to-table craft beer twee. Qui photo booth letterpress, commodo enim craft beer mlkshk aliquip jean shorts ullamco ad vinyl cillum PBR. Homo nostrud organic, assumenda labore aesthetic magna delectus mollit. Keytar helvetica VHS salvia yr, vero magna velit sapiente labore stumptown. Vegan fanny pack odio cillum wes anderson 8-bit, sustainable jean shorts beard ut DIY ethical culpa terry richardson biodiesel. Art party scenester stumptown, tumblr butcher vero sint qui sapiente accusamus tattooed echo park.</p>
-          <p>Food truck fixie locavore, accusamus mcsweeney's marfa nulla single-origin coffee squid. Exercitation +1 labore velit, blog sartorial PBR leggings next level wes anderson artisan four loko farm-to-table craft beer twee. Qui photo booth letterpress, commodo enim craft beer mlkshk aliquip jean shorts ullamco ad vinyl cillum PBR. Homo nostrud organic, assumenda labore aesthetic magna delectus mollit. Keytar helvetica VHS salvia yr, vero magna velit sapiente labore stumptown. Vegan fanny pack odio cillum wes anderson 8-bit, sustainable jean shorts beard ut DIY ethical culpa terry richardson biodiesel. Art party scenester stumptown, tumblr butcher vero sint qui sapiente accusamus tattooed echo park.</p>
-        </div>
-        <div class="tab-pane fade" id="fat4" role="tabpanel">
-          <p>Etsy mixtape wayfarers, ethical wes anderson tofu before they sold out mcsweeney's organic lomo retro fanny pack lo-fi farm-to-table readymade. Messenger bag gentrify pitchfork tattooed craft beer, iphone skateboard locavore carles etsy salvia banksy hoodie helvetica. DIY synth PBR banksy irony. Leggings gentrify squid 8-bit cred pitchfork. Williamsburg banh mi whatever gluten-free, carles pitchfork biodiesel fixie etsy retro mlkshk vice blog. Scenester cred you probably haven't heard of them, vinyl craft beer blog stumptown. Pitchfork sustainable tofu synth chambray yr.</p>
-          <p>Etsy mixtape wayfarers, ethical wes anderson tofu before they sold out mcsweeney's organic lomo retro fanny pack lo-fi farm-to-table readymade. Messenger bag gentrify pitchfork tattooed craft beer, iphone skateboard locavore carles etsy salvia banksy hoodie helvetica. DIY synth PBR banksy irony. Leggings gentrify squid 8-bit cred pitchfork. Williamsburg banh mi whatever gluten-free, carles pitchfork biodiesel fixie etsy retro mlkshk vice blog. Scenester cred you probably haven't heard of them, vinyl craft beer blog stumptown. Pitchfork sustainable tofu synth chambray yr.</p>
-        </div>
-        <div class="tab-pane fade" id="mdo4" role="tabpanel">
-          <p>Trust fund seitan letterpress, keytar raw denim keffiyeh etsy art party before they sold out master cleanse gluten-free squid scenester freegan cosby sweater. Fanny pack portland seitan DIY, art party locavore wolf cliche high life echo park Austin. Cred vinyl keffiyeh DIY salvia PBR, banh mi before they sold out farm-to-table VHS viral locavore cosby sweater. Lomo wolf viral, mustache readymade thundercats keffiyeh craft beer marfa ethical. Wolf salvia freegan, sartorial keffiyeh echo park vegan.</p>
-          <p>Trust fund seitan letterpress, keytar raw denim keffiyeh etsy art party before they sold out master cleanse gluten-free squid scenester freegan cosby sweater. Fanny pack portland seitan DIY, art party locavore wolf cliche high life echo park Austin. Cred vinyl keffiyeh DIY salvia PBR, banh mi before they sold out farm-to-table VHS viral locavore cosby sweater. Lomo wolf viral, mustache readymade thundercats keffiyeh craft beer marfa ethical. Wolf salvia freegan, sartorial keffiyeh echo park vegan.</p>
-        </div>
-      </div>
-
-      <h4>Tabs with nav (with fade)</h4>
-      <nav class="nav nav-pills">
-        <a class="nav-link nav-item active" data-toggle="tab" href="#home5">Home</a>
-        <a class="nav-link nav-item" data-toggle="tab" href="#profile5">Profile</a>
-        <div class="nav-item dropdown">
-          <a class="nav-link dropdown-toggle" href="#" id="dropdown5" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">Dropdown</a>
-          <div class="dropdown-menu" aria-labelledby="dropdown5">
-            <a class="dropdown-item" data-toggle="tab" href="#fat5">@fat</a>
-            <a class="dropdown-item" data-toggle="tab" href="#mdo5">@mdo</a>
-          </div>
-        </div>
-        <a class="nav-link nav-item disabled" href="#">Disabled</a>
-      </nav>
-
-      <div class="tab-content" role="tabpanel">
-        <div role="tabpanel" class="tab-pane fade show active" id="home5">
-          <p>Raw denim you probably haven't heard of them jean shorts Austin. Nesciunt tofu stumptown aliqua, retro synth master cleanse. Mustache cliche tempor, williamsburg carles vegan helvetica. Reprehenderit butcher retro keffiyeh dreamcatcher synth. Cosby sweater eu banh mi, qui irure terry richardson ex squid. Aliquip placeat salvia cillum iphone. Seitan aliquip quis cardigan american apparel, butcher voluptate nisi qui.</p>
-          <p>Raw denim you probably haven't heard of them jean shorts Austin. Nesciunt tofu stumptown aliqua, retro synth master cleanse. Mustache cliche tempor, williamsburg carles vegan helvetica. Reprehenderit butcher retro keffiyeh dreamcatcher synth. Cosby sweater eu banh mi, qui irure terry richardson ex squid. Aliquip placeat salvia cillum iphone. Seitan aliquip quis cardigan american apparel, butcher voluptate nisi qui.</p>
-        </div>
-        <div role="tabpanel" class="tab-pane fade" id="profile5">
-          <p>Raw denim you probably haven't heard of them jean shorts Austin. Nesciunt tofu stumptown aliqua, retro synth master cleanse. Mustache cliche tempor, williamsburg carles vegan helvetica. Reprehenderit butcher retro keffiyeh dreamcatcher synth. Cosby sweater eu banh mi, qui irure terry richardson ex squid. Aliquip placeat salvia cillum iphone. Seitan aliquip quis cardigan american apparel, butcher voluptate nisi qui.</p>
-          <p>Raw denim you probably haven't heard of them jean shorts Austin. Nesciunt tofu stumptown aliqua, retro synth master cleanse. Mustache cliche tempor, williamsburg carles vegan helvetica. Reprehenderit butcher retro keffiyeh dreamcatcher synth. Cosby sweater eu banh mi, qui irure terry richardson ex squid. Aliquip placeat salvia cillum iphone. Seitan aliquip quis cardigan american apparel, butcher voluptate nisi qui.</p>
-        </div>
-        <div class="tab-pane fade" id="fat5" role="tabpanel">
-          <p>Etsy mixtape wayfarers, ethical wes anderson tofu before they sold out mcsweeney's organic lomo retro fanny pack lo-fi farm-to-table readymade. Messenger bag gentrify pitchfork tattooed craft beer, iphone skateboard locavore carles etsy salvia banksy hoodie helvetica. DIY synth PBR banksy irony. Leggings gentrify squid 8-bit cred pitchfork. Williamsburg banh mi whatever gluten-free, carles pitchfork biodiesel fixie etsy retro mlkshk vice blog. Scenester cred you probably haven't heard of them, vinyl craft beer blog stumptown. Pitchfork sustainable tofu synth chambray yr.</p>
-          <p>Etsy mixtape wayfarers, ethical wes anderson tofu before they sold out mcsweeney's organic lomo retro fanny pack lo-fi farm-to-table readymade. Messenger bag gentrify pitchfork tattooed craft beer, iphone skateboard locavore carles etsy salvia banksy hoodie helvetica. DIY synth PBR banksy irony. Leggings gentrify squid 8-bit cred pitchfork. Williamsburg banh mi whatever gluten-free, carles pitchfork biodiesel fixie etsy retro mlkshk vice blog. Scenester cred you probably haven't heard of them, vinyl craft beer blog stumptown. Pitchfork sustainable tofu synth chambray yr.</p>
-        </div>
-        <div class="tab-pane fade" id="mdo5" role="tabpanel">
-          <p>Trust fund seitan letterpress, keytar raw denim keffiyeh etsy art party before they sold out master cleanse gluten-free squid scenester freegan cosby sweater. Fanny pack portland seitan DIY, art party locavore wolf cliche high life echo park Austin. Cred vinyl keffiyeh DIY salvia PBR, banh mi before they sold out farm-to-table VHS viral locavore cosby sweater. Lomo wolf viral, mustache readymade thundercats keffiyeh craft beer marfa ethical. Wolf salvia freegan, sartorial keffiyeh echo park vegan.</p>
-          <p>Trust fund seitan letterpress, keytar raw denim keffiyeh etsy art party before they sold out master cleanse gluten-free squid scenester freegan cosby sweater. Fanny pack portland seitan DIY, art party locavore wolf cliche high life echo park Austin. Cred vinyl keffiyeh DIY salvia PBR, banh mi before they sold out farm-to-table VHS viral locavore cosby sweater. Lomo wolf viral, mustache readymade thundercats keffiyeh craft beer marfa ethical. Wolf salvia freegan, sartorial keffiyeh echo park vegan.</p>
-        </div>
-      </div>
-
-      <h4>Tabs with list-group (with fade)</h4>
-      <div class="row">
-        <div class="col-4">
-          <div class="list-group" id="list-tab" role="tablist">
-            <a class="list-group-item list-group-item-action active" id="list-home-list" data-toggle="tab" href="#list-home" role="tab" aria-controls="list-home">Home</a>
-            <a class="list-group-item list-group-item-action" id="list-profile-list" data-toggle="tab" href="#list-profile" role="tab" aria-controls="list-profile">Profile</a>
-            <a class="list-group-item list-group-item-action" id="list-messages-list" data-toggle="tab" href="#list-messages" role="tab" aria-controls="list-messages">Messages</a>
-            <a class="list-group-item list-group-item-action" id="list-settings-list" data-toggle="tab" href="#list-settings" role="tab" aria-controls="list-settings">Settings</a>
-          </div>
-        </div>
-        <div class="col-8">
-          <div class="tab-content" id="nav-tabContent">
-            <div class="tab-pane fade show active" id="list-home" role="tabpanel" aria-labelledby="list-home-list">
-              <p>Velit aute mollit ipsum ad dolor consectetur nulla officia culpa adipisicing exercitation fugiat tempor. Voluptate deserunt sit sunt nisi aliqua fugiat proident ea ut. Mollit voluptate reprehenderit occaecat nisi ad non minim tempor sunt voluptate consectetur exercitation id ut nulla. Ea et fugiat aliquip nostrud sunt incididunt consectetur culpa aliquip eiusmod dolor. Anim ad Lorem aliqua in cupidatat nisi enim eu nostrud do aliquip veniam minim.</p>
-            </div>
-            <div class="tab-pane fade" id="list-profile" role="tabpanel" aria-labelledby="list-profile-list">
-              <p>Cupidatat quis ad sint excepteur laborum in esse qui. Et excepteur consectetur ex nisi eu do cillum ad laborum. Mollit et eu officia dolore sunt Lorem culpa qui commodo velit ex amet id ex. Officia anim incididunt laboris deserunt anim aute dolor incididunt veniam aute dolore do exercitation. Dolor nisi culpa ex ad irure in elit eu dolore. Ad laboris ipsum reprehenderit irure non commodo enim culpa commodo veniam incididunt veniam ad.</p>
-            </div>
-            <div class="tab-pane fade" id="list-messages" role="tabpanel" aria-labelledby="list-messages-list">
-              <p>Ut ut do pariatur aliquip aliqua aliquip exercitation do nostrud commodo reprehenderit aute ipsum voluptate. Irure Lorem et laboris nostrud amet cupidatat cupidatat anim do ut velit mollit consequat enim tempor. Consectetur est minim nostrud nostrud consectetur irure labore voluptate irure. Ipsum id Lorem sit sint voluptate est pariatur eu ad cupidatat et deserunt culpa sit eiusmod deserunt. Consectetur et fugiat anim do eiusmod aliquip nulla laborum elit adipisicing pariatur cillum.</p>
-            </div>
-            <div class="tab-pane fade" id="list-settings" role="tabpanel" aria-labelledby="list-settings-list">
-              <p>Irure enim occaecat labore sit qui aliquip reprehenderit amet velit. Deserunt ullamco ex elit nostrud ut dolore nisi officia magna sit occaecat laboris sunt dolor. Nisi eu minim cillum occaecat aute est cupidatat aliqua labore aute occaecat ea aliquip sunt amet. Aute mollit dolor ut exercitation irure commodo non amet consectetur quis amet culpa. Quis ullamco nisi amet qui aute irure eu. Magna labore dolor quis ex labore id nostrud deserunt dolor eiusmod eu pariatur culpa mollit in irure.</p>
-            </div>
-          </div>
-        </div>
-      </div>
-    </div>
-    <script src="../../../assets/js/vendor/jquery-slim.min.js"></script>
-    <script src="../../../assets/js/vendor/popper.min.js"></script>
-    <script src="../../dist/util.js"></script>
-    <script src="../../dist/tab.js"></script>
-    <script src="../../dist/dropdown.js"></script>
-  </body>
-</html>
diff --git a/assets/javascript/tests/visual/tooltip.html b/assets/javascript/tests/visual/tooltip.html
deleted file mode 100644
index 2d37678..0000000
--- a/assets/javascript/tests/visual/tooltip.html
+++ /dev/null
@@ -1,71 +0,0 @@
-<!doctype html>
-<html>
-  <head>
-    <meta charset="utf-8">
-    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
-    <link rel="stylesheet" href="../../../dist/css/bootstrap.min.css">
-    <title>Tooltip</title>
-    <style>
-      #target {
-        border: 1px solid;
-        width: 100px;
-        height: 50px;
-        border: 1px solid;
-        margin-left: 50px;
-        -webkit-transform: rotate(270deg);
-        -ms-transform: rotate(270deg);
-        transform: rotate(270deg);
-        margin-top: 100px;
-      }
-    </style>
-  </head>
-  <body>
-    <div class="container">
-      <h1>Tooltip <small>Bootstrap Visual Test</small></h1>
-
-      <p class="text-muted">Tight pants next level keffiyeh <a href="#" data-toggle="tooltip" title="Default tooltip">you probably</a> haven't heard of them. Photo booth beard raw denim letterpress vegan messenger bag stumptown. Farm-to-table seitan, mcsweeney's fixie sustainable quinoa 8-bit american apparel <a href="#" data-toggle="tooltip" title="Another tooltip">have a</a> terry richardson vinyl chambray. Beard stumptown, cardigans banh mi lomo thundercats. Tofu biodiesel williamsburg marfa, four loko mcsweeney's cleanse vegan chambray. A really ironic artisan <a href="#" data-toggle="tooltip" title="Another one here too">whatever keytar</a>, scenester farm-to-table banksy Austin <a href="#" data-toggle="tooltip" title="The last tip!">twitter handle</a> freegan cred raw denim single-origin coffee viral.</p>
-
-      <hr>
-
-      <p>
-        <button type="button" class="btn btn-secondary" data-toggle="tooltip" data-placement="auto" title="Tooltip on auto">
-          Tooltip on auto
-        </button>
-        <button type="button" class="btn btn-secondary" data-toggle="tooltip" data-placement="top" title="Tooltip on top">
-          Tooltip on top
-        </button>
-        <button type="button" class="btn btn-secondary" data-toggle="tooltip" data-placement="right" title="Tooltip on right">
-          Tooltip on right
-        </button>
-        <button type="button" class="btn btn-secondary" data-toggle="tooltip" data-placement="bottom" title="Tooltip on bottom">
-          Tooltip on bottom
-        </button>
-        <button type="button" class="btn btn-secondary" data-toggle="tooltip" data-placement="left" title="Tooltip on left">
-          Tooltip on left
-        </button>
-        <button type="button" class="btn btn-secondary" data-toggle="tooltip" data-html="true" title="<em>Tooltip</em> <u>with</u> <b>HTML</b>">
-          Tooltip with HTML
-        </button>
-        <svg width="30" height="20">
-          <circle cx="15" cy="10" r="10" fill="#62448F" data-toggle="tooltip" data-placement="top" title="Tooltip on SVG" />
-        </svg>
-      </p>
-      <div id="target" title="Test tooltip on transformed element"></div>
-    </div>
-
-    <script src="../../../assets/js/vendor/jquery-slim.min.js"></script>
-    <script src="../../../assets/js/vendor/popper.min.js"></script>
-    <script src="../../dist/util.js"></script>
-    <script src="../../dist/tooltip.js"></script>
-
-    <script>
-      $(function () {
-        $('[data-toggle="tooltip"]').tooltip()
-        $('#target').tooltip({
-          placement : 'top',
-          trigger : 'manual'
-        }).tooltip('show')
-      })
-    </script>
-  </body>
-</html>
diff --git a/assets/scss b/assets/scss
new file mode 120000
index 0000000..b77f409
--- /dev/null
+++ b/assets/scss
@@ -0,0 +1 @@
+../lego/assests/scss
\ No newline at end of file
diff --git a/assets/scss/_alert.scss b/assets/scss/_alert.scss
deleted file mode 100644
index 66fba24..0000000
--- a/assets/scss/_alert.scss
+++ /dev/null
@@ -1,49 +0,0 @@
-//
-// Base styles
-//
-
-.alert {
-  position: relative;
-  padding: $alert-padding-y $alert-padding-x;
-  margin-bottom: $alert-margin-bottom;
-  border: $alert-border-width solid transparent;
-  @include border-radius($alert-border-radius);
-}
-
-// Headings for larger alerts
-.alert-heading {
-  // Specified to prevent conflicts of changing $headings-color
-  color: inherit;
-}
-
-// Provide class for links that match alerts
-.alert-link {
-  font-weight: $alert-link-font-weight;
-}
-
-
-// Dismissible alerts
-//
-// Expand the right padding and account for the close button's positioning.
-
-.alert-dismissible {
-  // Adjust close link position
-  .close {
-    position: absolute;
-    top: 0;
-    right: 0;
-    padding: $alert-padding-y $alert-padding-x;
-    color: inherit;
-  }
-}
-
-
-// Alternate styles
-//
-// Generate contextual modifier classes for colorizing the alert.
-
- at each $color, $value in $theme-colors {
-  .alert-#{$color} {
-    @include alert-variant(theme-color-level($color, -10), theme-color-level($color, -9), theme-color-level($color, 6));
-  }
-}
diff --git a/assets/scss/_badge.scss b/assets/scss/_badge.scss
deleted file mode 100644
index b87a1b0..0000000
--- a/assets/scss/_badge.scss
+++ /dev/null
@@ -1,47 +0,0 @@
-// Base class
-//
-// Requires one of the contextual, color modifier classes for `color` and
-// `background-color`.
-
-.badge {
-  display: inline-block;
-  padding: $badge-padding-y $badge-padding-x;
-  font-size: $badge-font-size;
-  font-weight: $badge-font-weight;
-  line-height: 1;
-  text-align: center;
-  white-space: nowrap;
-  vertical-align: baseline;
-  @include border-radius($badge-border-radius);
-
-  // Empty badges collapse automatically
-  &:empty {
-    display: none;
-  }
-}
-
-// Quick fix for badges in buttons
-.btn .badge {
-  position: relative;
-  top: -1px;
-}
-
-// Pill badges
-//
-// Make them extra rounded with a modifier to replace v3's badges.
-
-.badge-pill {
-  padding-right: $badge-pill-padding-x;
-  padding-left: $badge-pill-padding-x;
-  @include border-radius($badge-pill-border-radius);
-}
-
-// Colors
-//
-// Contextual variations (linked badges get darker on :hover).
-
- at each $color, $value in $theme-colors {
-  .badge-#{$color} {
-    @include badge-variant($value);
-  }
-}
diff --git a/assets/scss/_breadcrumb.scss b/assets/scss/_breadcrumb.scss
deleted file mode 100644
index 25b9d85..0000000
--- a/assets/scss/_breadcrumb.scss
+++ /dev/null
@@ -1,38 +0,0 @@
-.breadcrumb {
-  display: flex;
-  flex-wrap: wrap;
-  padding: $breadcrumb-padding-y $breadcrumb-padding-x;
-  margin-bottom: $breadcrumb-margin-bottom;
-  list-style: none;
-  background-color: $breadcrumb-bg;
-  @include border-radius($border-radius);
-}
-
-.breadcrumb-item {
-  // The separator between breadcrumbs (by default, a forward-slash: "/")
-  + .breadcrumb-item::before {
-    display: inline-block; // Suppress underlining of the separator in modern browsers
-    padding-right: $breadcrumb-item-padding;
-    padding-left: $breadcrumb-item-padding;
-    color: $breadcrumb-divider-color;
-    content: "#{$breadcrumb-divider}";
-  }
-
-  // IE9-11 hack to properly handle hyperlink underlines for breadcrumbs built
-  // without `<ul>`s. The `::before` pseudo-element generates an element
-  // *within* the .breadcrumb-item and thereby inherits the `text-decoration`.
-  //
-  // To trick IE into suppressing the underline, we give the pseudo-element an
-  // underline and then immediately remove it.
-  + .breadcrumb-item:hover::before {
-    text-decoration: underline;
-  }
-  // stylelint-disable-next-line no-duplicate-selectors
-  + .breadcrumb-item:hover::before {
-    text-decoration: none;
-  }
-
-  &.active {
-    color: $breadcrumb-active-color;
-  }
-}
diff --git a/assets/scss/_button-group.scss b/assets/scss/_button-group.scss
deleted file mode 100644
index 1a373f3..0000000
--- a/assets/scss/_button-group.scss
+++ /dev/null
@@ -1,207 +0,0 @@
-// stylelint-disable selector-no-qualifying-type
-
-// Make the div behave like a button
-.btn-group,
-.btn-group-vertical {
-  position: relative;
-  display: inline-flex;
-  vertical-align: middle; // match .btn alignment given font-size hack above
-
-  > .btn {
-    position: relative;
-    flex: 0 1 auto;
-
-    // Bring the hover, focused, and "active" buttons to the front to overlay
-    // the borders properly
-    @include hover {
-      z-index: 2;
-    }
-    &:focus,
-    &:active,
-    &.active {
-      z-index: 2;
-    }
-  }
-
-  // Prevent double borders when buttons are next to each other
-  .btn + .btn,
-  .btn + .btn-group,
-  .btn-group + .btn,
-  .btn-group + .btn-group {
-    margin-left: -$input-btn-border-width;
-  }
-}
-
-// Optional: Group multiple button groups together for a toolbar
-.btn-toolbar {
-  display: flex;
-  flex-wrap: wrap;
-  justify-content: flex-start;
-
-  .input-group {
-    width: auto;
-  }
-}
-
-.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {
-  border-radius: 0;
-}
-
-// Set corners individual because sometimes a single button can be in a .btn-group
-// and we need :first-child and :last-child to both match
-.btn-group > .btn:first-child {
-  margin-left: 0;
-
-  &:not(:last-child):not(.dropdown-toggle) {
-    @include border-right-radius(0);
-  }
-}
-// Need .dropdown-toggle since :last-child doesn't apply given a .dropdown-menu
-// immediately after it
-.btn-group > .btn:last-child:not(:first-child),
-.btn-group > .dropdown-toggle:not(:first-child) {
-  @include border-left-radius(0);
-}
-
-// Custom edits for including btn-groups within btn-groups (useful for including
-// dropdown buttons within a btn-group)
-.btn-group > .btn-group {
-  float: left;
-}
-
-.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {
-  border-radius: 0;
-}
-
-.btn-group > .btn-group:first-child:not(:last-child) {
-  > .btn:last-child,
-  > .dropdown-toggle {
-    @include border-right-radius(0);
-  }
-}
-
-.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child {
-  @include border-left-radius(0);
-}
-
-
-// Sizing
-//
-// Remix the default button sizing classes into new ones for easier manipulation.
-
-.btn-group-sm > .btn { @extend .btn-sm; }
-.btn-group-lg > .btn { @extend .btn-lg; }
-
-
-//
-// Split button dropdowns
-//
-
-.btn + .dropdown-toggle-split {
-  padding-right: $input-btn-padding-x * .75;
-  padding-left: $input-btn-padding-x * .75;
-
-  &::after {
-    margin-left: 0;
-  }
-}
-
-.btn-sm + .dropdown-toggle-split {
-  padding-right: $input-btn-padding-x-sm * .75;
-  padding-left: $input-btn-padding-x-sm * .75;
-}
-
-.btn-lg + .dropdown-toggle-split {
-  padding-right: $input-btn-padding-x-lg * .75;
-  padding-left: $input-btn-padding-x-lg * .75;
-}
-
-
-// The clickable button for toggling the menu
-// Set the same inset shadow as the :active state
-.btn-group.show .dropdown-toggle {
-  @include box-shadow($btn-active-box-shadow);
-
-  // Show no shadow for `.btn-link` since it has no other button styles.
-  &.btn-link {
-    @include box-shadow(none);
-  }
-}
-
-
-//
-// Vertical button groups
-//
-
-.btn-group-vertical {
-  flex-direction: column;
-  align-items: flex-start;
-  justify-content: center;
-
-  .btn,
-  .btn-group {
-    width: 100%;
-  }
-
-  > .btn + .btn,
-  > .btn + .btn-group,
-  > .btn-group + .btn,
-  > .btn-group + .btn-group {
-    margin-top: -$input-btn-border-width;
-    margin-left: 0;
-  }
-
-  > .btn {
-    &:not(:first-child):not(:last-child) {
-      border-radius: 0;
-    }
-
-    &:first-child:not(:last-child) {
-      @include border-bottom-radius(0);
-    }
-
-    &:last-child:not(:first-child) {
-      @include border-top-radius(0);
-    }
-  }
-
-  > .btn-group:not(:first-child):not(:last-child) > .btn {
-    border-radius: 0;
-  }
-
-  > .btn-group:first-child:not(:last-child) {
-    > .btn:last-child,
-    > .dropdown-toggle {
-      @include border-bottom-radius(0);
-    }
-  }
-
-  > .btn-group:last-child:not(:first-child) > .btn:first-child {
-    @include border-top-radius(0);
-  }
-}
-
-
-// Checkbox and radio options
-//
-// In order to support the browser's form validation feedback, powered by the
-// `required` attribute, we have to "hide" the inputs via `clip`. We cannot use
-// `display: none;` or `visibility: hidden;` as that also hides the popover.
-// Simply visually hiding the inputs via `opacity` would leave them clickable in
-// certain cases which is prevented by using `clip` and `pointer-events`.
-// This way, we ensure a DOM element is visible to position the popover from.
-//
-// See https://github.com/twbs/bootstrap/pull/12794 and
-// https://github.com/twbs/bootstrap/pull/14559 for more information.
-
-[data-toggle="buttons"] {
-  > .btn,
-  > .btn-group > .btn {
-    input[type="radio"],
-    input[type="checkbox"] {
-      position: absolute;
-      clip: rect(0,0,0,0);
-      pointer-events: none;
-    }
-  }
-}
diff --git a/assets/scss/_buttons.scss b/assets/scss/_buttons.scss
deleted file mode 100644
index 7cd2783..0000000
--- a/assets/scss/_buttons.scss
+++ /dev/null
@@ -1,136 +0,0 @@
-// stylelint-disable selector-no-qualifying-type
-
-//
-// Base styles
-//
-
-.btn {
-  display: inline-block;
-  font-weight: $btn-font-weight;
-  text-align: center;
-  white-space: nowrap;
-  vertical-align: middle;
-  user-select: none;
-  border: $input-btn-border-width solid transparent;
-  @include button-size($input-btn-padding-y, $input-btn-padding-x, $font-size-base, $input-btn-line-height, $btn-border-radius);
-  @include transition($btn-transition);
-
-  // Share hover and focus styles
-  @include hover-focus {
-    text-decoration: none;
-  }
-  &:focus,
-  &.focus {
-    outline: 0;
-    box-shadow: $input-btn-focus-box-shadow;
-  }
-
-  // Disabled comes first so active can properly restyle
-  &.disabled,
-  &:disabled {
-    opacity: .65;
-    @include box-shadow(none);
-  }
-
-  &:not([disabled]):not(.disabled):active,
-  &:not([disabled]):not(.disabled).active {
-    background-image: none;
-    @include box-shadow($input-btn-focus-box-shadow, $btn-active-box-shadow);
-  }
-}
-
-// Future-proof disabling of clicks on `<a>` elements
-a.btn.disabled,
-fieldset[disabled] a.btn {
-  pointer-events: none;
-}
-
-
-//
-// Alternate buttons
-//
-
- at each $color, $value in $theme-colors {
-  .btn-#{$color} {
-    @include button-variant($value, $value);
-  }
-}
-
- at each $color, $value in $theme-colors {
-  .btn-outline-#{$color} {
-    @if $color == "light" {
-      @include button-outline-variant($value, $gray-900);
-    } @else {
-      @include button-outline-variant($value, $white);
-    }
-  }
-}
-
-
-//
-// Link buttons
-//
-
-// Make a button look and behave like a link
-.btn-link {
-  font-weight: $font-weight-normal;
-  color: $link-color;
-  background-color: transparent;
-
-  @include hover {
-    color: $link-hover-color;
-    text-decoration: $link-hover-decoration;
-    background-color: transparent;
-    border-color: transparent;
-  }
-
-  &:focus,
-  &.focus {
-    border-color: transparent;
-    box-shadow: none;
-  }
-
-  &:disabled,
-  &.disabled {
-    color: $btn-link-disabled-color;
-  }
-
-  // No need for an active state here
-}
-
-
-//
-// Button Sizes
-//
-
-.btn-lg {
-  @include button-size($input-btn-padding-y-lg, $input-btn-padding-x-lg, $font-size-lg, $input-btn-line-height-lg, $btn-border-radius-lg);
-}
-
-.btn-sm {
-  @include button-size($input-btn-padding-y-sm, $input-btn-padding-x-sm, $font-size-sm, $input-btn-line-height-sm, $btn-border-radius-sm);
-}
-
-
-//
-// Block button
-//
-
-.btn-block {
-  display: block;
-  width: 100%;
-}
-
-// Vertically space out multiple block buttons
-.btn-block + .btn-block {
-  margin-top: $btn-block-spacing-y;
-}
-
-// Specificity overrides
-input[type="submit"],
-input[type="reset"],
-input[type="button"] {
-  &.btn-block {
-    width: 100%;
-  }
-}
diff --git a/assets/scss/_card.scss b/assets/scss/_card.scss
deleted file mode 100644
index a739f19..0000000
--- a/assets/scss/_card.scss
+++ /dev/null
@@ -1,259 +0,0 @@
-//
-// Base styles
-//
-
-.card {
-  position: relative;
-  display: flex;
-  flex-direction: column;
-  min-width: 0;
-  word-wrap: break-word;
-  background-color: $card-bg;
-  background-clip: border-box;
-  border: $card-border-width solid $card-border-color;
-  @include border-radius($card-border-radius);
-
-  > hr {
-    margin-right: 0;
-    margin-left: 0;
-  }
-
-  > .list-group:first-child {
-    .list-group-item:first-child {
-      @include border-top-radius($card-border-radius);
-    }
-  }
-
-  > .list-group:last-child {
-    .list-group-item:last-child {
-      @include border-bottom-radius($card-border-radius);
-    }
-  }
-}
-
-.card-body {
-  // Enable `flex-grow: 1` for decks and groups so that card blocks take up
-  // as much space as possible, ensuring footers are aligned to the bottom.
-  flex: 1 1 auto;
-  padding: $card-spacer-x;
-}
-
-.card-title {
-  margin-bottom: $card-spacer-y;
-}
-
-.card-subtitle {
-  margin-top: -($card-spacer-y / 2);
-  margin-bottom: 0;
-}
-
-.card-text:last-child {
-  margin-bottom: 0;
-}
-
-.card-link {
-  @include hover {
-    text-decoration: none;
-  }
-
-  + .card-link {
-    margin-left: $card-spacer-x;
-  }
-}
-
-//
-// Optional textual caps
-//
-
-.card-header {
-  padding: $card-spacer-y $card-spacer-x;
-  margin-bottom: 0; // Removes the default margin-bottom of <hN>
-  background-color: $card-cap-bg;
-  border-bottom: $card-border-width solid $card-border-color;
-
-  &:first-child {
-    @include border-radius($card-inner-border-radius $card-inner-border-radius 0 0);
-  }
-
-  + .list-group {
-    .list-group-item:first-child {
-      border-top: 0;
-    }
-  }
-}
-
-.card-footer {
-  padding: $card-spacer-y $card-spacer-x;
-  background-color: $card-cap-bg;
-  border-top: $card-border-width solid $card-border-color;
-
-  &:last-child {
-    @include border-radius(0 0 $card-inner-border-radius $card-inner-border-radius);
-  }
-}
-
-
-//
-// Header navs
-//
-
-.card-header-tabs {
-  margin-right: -($card-spacer-x / 2);
-  margin-bottom: -$card-spacer-y;
-  margin-left: -($card-spacer-x / 2);
-  border-bottom: 0;
-}
-
-.card-header-pills {
-  margin-right: -($card-spacer-x / 2);
-  margin-left: -($card-spacer-x / 2);
-}
-
-// Card image
-.card-img-overlay {
-  position: absolute;
-  top: 0;
-  right: 0;
-  bottom: 0;
-  left: 0;
-  padding: $card-img-overlay-padding;
-}
-
-.card-img {
-  width: 100%; // Required because we use flexbox and this inherently applies align-self: stretch
-  @include border-radius($card-inner-border-radius);
-}
-
-// Card image caps
-.card-img-top {
-  width: 100%; // Required because we use flexbox and this inherently applies align-self: stretch
-  @include border-top-radius($card-inner-border-radius);
-}
-
-.card-img-bottom {
-  width: 100%; // Required because we use flexbox and this inherently applies align-self: stretch
-  @include border-bottom-radius($card-inner-border-radius);
-}
-
-
-// Card deck
-
-.card-deck {
-  display: flex;
-  flex-direction: column;
-
-  .card {
-    margin-bottom: $card-deck-margin;
-  }
-
-  @include media-breakpoint-up(sm) {
-    flex-flow: row wrap;
-    margin-right: -$card-deck-margin;
-    margin-left: -$card-deck-margin;
-
-    .card {
-      display: flex;
-      // Flexbugs #4: https://github.com/philipwalton/flexbugs#4-flex-shorthand-declarations-with-unitless-flex-basis-values-are-ignored
-      flex: 1 0 0%;
-      flex-direction: column;
-      margin-right: $card-deck-margin;
-      margin-bottom: 0; // Override the default
-      margin-left: $card-deck-margin;
-    }
-  }
-}
-
-
-//
-// Card groups
-//
-
-.card-group {
-  display: flex;
-  flex-direction: column;
-
-  .card {
-    margin-bottom: $card-group-margin;
-  }
-
-  @include media-breakpoint-up(sm) {
-    flex-flow: row wrap;
-
-    .card {
-      // Flexbugs #4: https://github.com/philipwalton/flexbugs#4-flex-shorthand-declarations-with-unitless-flex-basis-values-are-ignored
-      flex: 1 0 0%;
-      margin-bottom: 0;
-
-      + .card {
-        margin-left: 0;
-        border-left: 0;
-      }
-
-      // Handle rounded corners
-      @if $enable-rounded {
-        &:first-child {
-          @include border-right-radius(0);
-
-          .card-img-top {
-            border-top-right-radius: 0;
-          }
-          .card-img-bottom {
-            border-bottom-right-radius: 0;
-          }
-        }
-
-        &:last-child {
-          @include border-left-radius(0);
-
-          .card-img-top {
-            border-top-left-radius: 0;
-          }
-          .card-img-bottom {
-            border-bottom-left-radius: 0;
-          }
-        }
-
-        &:only-child {
-          @include border-radius($card-border-radius);
-
-          .card-img-top {
-            @include border-top-radius($card-border-radius);
-          }
-          .card-img-bottom {
-            @include border-bottom-radius($card-border-radius);
-          }
-        }
-
-        &:not(:first-child):not(:last-child):not(:only-child) {
-          border-radius: 0;
-
-          .card-img-top,
-          .card-img-bottom {
-            border-radius: 0;
-          }
-        }
-      }
-    }
-  }
-}
-
-
-//
-// Columns
-//
-
-.card-columns {
-  .card {
-    margin-bottom: $card-columns-margin;
-  }
-
-  @include media-breakpoint-up(sm) {
-    column-count: $card-columns-count;
-    column-gap: $card-columns-gap;
-
-    .card {
-      display: inline-block; // Don't let them vertically span multiple columns
-      width: 100%; // Don't let their width change
-    }
-  }
-}
diff --git a/assets/scss/_carousel.scss b/assets/scss/_carousel.scss
deleted file mode 100644
index c3c2073..0000000
--- a/assets/scss/_carousel.scss
+++ /dev/null
@@ -1,191 +0,0 @@
-// Wrapper for the slide container and indicators
-.carousel {
-  position: relative;
-}
-
-.carousel-inner {
-  position: relative;
-  width: 100%;
-  overflow: hidden;
-}
-
-.carousel-item {
-  position: relative;
-  display: none;
-  align-items: center;
-  width: 100%;
-  @include transition($carousel-transition);
-  backface-visibility: hidden;
-  perspective: 1000px;
-}
-
-.carousel-item.active,
-.carousel-item-next,
-.carousel-item-prev {
-  display: block;
-}
-
-.carousel-item-next,
-.carousel-item-prev {
-  position: absolute;
-  top: 0;
-}
-
-// CSS3 transforms when supported by the browser
-.carousel-item-next.carousel-item-left,
-.carousel-item-prev.carousel-item-right {
-  transform: translateX(0);
-
-  @supports (transform-style: preserve-3d) {
-    transform: translate3d(0, 0, 0);
-  }
-}
-
-.carousel-item-next,
-.active.carousel-item-right {
-  transform: translateX(100%);
-
-  @supports (transform-style: preserve-3d) {
-    transform: translate3d(100%, 0, 0);
-  }
-}
-
-.carousel-item-prev,
-.active.carousel-item-left {
-  transform: translateX(-100%);
-
-  @supports (transform-style: preserve-3d) {
-    transform: translate3d(-100%, 0, 0);
-  }
-}
-
-
-//
-// Left/right controls for nav
-//
-
-.carousel-control-prev,
-.carousel-control-next {
-  position: absolute;
-  top: 0;
-  bottom: 0;
-  // Use flex for alignment (1-3)
-  display: flex; // 1. allow flex styles
-  align-items: center; // 2. vertically center contents
-  justify-content: center; // 3. horizontally center contents
-  width: $carousel-control-width;
-  color: $carousel-control-color;
-  text-align: center;
-  opacity: $carousel-control-opacity;
-  // We can't have a transition here because WebKit cancels the carousel
-  // animation if you trip this while in the middle of another animation.
-
-  // Hover/focus state
-  @include hover-focus {
-    color: $carousel-control-color;
-    text-decoration: none;
-    outline: 0;
-    opacity: .9;
-  }
-}
-.carousel-control-prev {
-  left: 0;
-  @if $enable-gradients {
-    background: linear-gradient(90deg, rgba(0,0,0,.25), rgba(0,0,0,.001));
-  }
-}
-.carousel-control-next {
-  right: 0;
-  @if $enable-gradients {
-    background: linear-gradient(270deg, rgba(0,0,0,.25), rgba(0,0,0,.001));
-  }
-}
-
-// Icons for within
-.carousel-control-prev-icon,
-.carousel-control-next-icon {
-  display: inline-block;
-  width: $carousel-control-icon-width;
-  height: $carousel-control-icon-width;
-  background: transparent no-repeat center center;
-  background-size: 100% 100%;
-}
-.carousel-control-prev-icon {
-  background-image: $carousel-control-prev-icon-bg;
-}
-.carousel-control-next-icon {
-  background-image: $carousel-control-next-icon-bg;
-}
-
-
-// Optional indicator pips
-//
-// Add an ordered list with the following class and add a list item for each
-// slide your carousel holds.
-
-.carousel-indicators {
-  position: absolute;
-  right: 0;
-  bottom: 10px;
-  left: 0;
-  z-index: 15;
-  display: flex;
-  justify-content: center;
-  padding-left: 0; // override <ol> default
-  // Use the .carousel-control's width as margin so we don't overlay those
-  margin-right: $carousel-control-width;
-  margin-left: $carousel-control-width;
-  list-style: none;
-
-  li {
-    position: relative;
-    flex: 0 1 auto;
-    width: $carousel-indicator-width;
-    height: $carousel-indicator-height;
-    margin-right: $carousel-indicator-spacer;
-    margin-left: $carousel-indicator-spacer;
-    text-indent: -999px;
-    background-color: rgba($carousel-indicator-active-bg, .5);
-
-    // Use pseudo classes to increase the hit area by 10px on top and bottom.
-    &::before {
-      position: absolute;
-      top: -10px;
-      left: 0;
-      display: inline-block;
-      width: 100%;
-      height: 10px;
-      content: "";
-    }
-    &::after {
-      position: absolute;
-      bottom: -10px;
-      left: 0;
-      display: inline-block;
-      width: 100%;
-      height: 10px;
-      content: "";
-    }
-  }
-
-  .active {
-    background-color: $carousel-indicator-active-bg;
-  }
-}
-
-
-// Optional captions
-//
-//
-
-.carousel-caption {
-  position: absolute;
-  right: ((100% - $carousel-caption-width) / 2);
-  bottom: 20px;
-  left: ((100% - $carousel-caption-width) / 2);
-  z-index: 10;
-  padding-top: 20px;
-  padding-bottom: 20px;
-  color: $carousel-caption-color;
-  text-align: center;
-}
diff --git a/assets/scss/_close.scss b/assets/scss/_close.scss
deleted file mode 100644
index 897d486..0000000
--- a/assets/scss/_close.scss
+++ /dev/null
@@ -1,29 +0,0 @@
-.close {
-  float: right;
-  font-size: $close-font-size;
-  font-weight: $close-font-weight;
-  line-height: 1;
-  color: $close-color;
-  text-shadow: $close-text-shadow;
-  opacity: .5;
-
-  @include hover-focus {
-    color: $close-color;
-    text-decoration: none;
-    opacity: .75;
-  }
-}
-
-// Additional properties for button version
-// iOS requires the button element instead of an anchor tag.
-// If you want the anchor version, it requires `href="#"`.
-// See https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile
-
-// stylelint-disable property-no-vendor-prefix, selector-no-qualifying-type
-button.close {
-  padding: 0;
-  background: transparent;
-  border: 0;
-  -webkit-appearance: none;
-}
-// stylelint-enable
diff --git a/assets/scss/_code.scss b/assets/scss/_code.scss
deleted file mode 100644
index 759da15..0000000
--- a/assets/scss/_code.scss
+++ /dev/null
@@ -1,64 +0,0 @@
-// Inline and block code styles
-code,
-kbd,
-pre,
-samp {
-  font-family: $font-family-monospace;
-}
-
-// Inline code
-code {
-  padding: $code-padding-y $code-padding-x;
-  font-size: $code-font-size;
-  color: $code-color;
-  background-color: $code-bg;
-  @include border-radius($border-radius);
-
-  // Streamline the style when inside anchors to avoid broken underline and more
-  a > & {
-    padding: 0;
-    color: inherit;
-    background-color: inherit;
-  }
-}
-
-// User input typically entered via keyboard
-kbd {
-  padding: $code-padding-y $code-padding-x;
-  font-size: $code-font-size;
-  color: $kbd-color;
-  background-color: $kbd-bg;
-  @include border-radius($border-radius-sm);
-  @include box-shadow($kbd-box-shadow);
-
-  kbd {
-    padding: 0;
-    font-size: 100%;
-    font-weight: $nested-kbd-font-weight;
-    @include box-shadow(none);
-  }
-}
-
-// Blocks of code
-pre {
-  display: block;
-  margin-top: 0;
-  margin-bottom: 1rem;
-  font-size: $code-font-size;
-  color: $pre-color;
-
-  // Account for some code outputs that place code tags in pre tags
-  code {
-    padding: 0;
-    font-size: inherit;
-    color: inherit;
-    background-color: transparent;
-    border-radius: 0;
-  }
-}
-
-// Enable scrollable blocks of code
-.pre-scrollable {
-  max-height: $pre-scrollable-max-height;
-  overflow-y: scroll;
-}
diff --git a/assets/scss/_component-examples.scss b/assets/scss/_component-examples.scss
deleted file mode 100644
index cb9b54f..0000000
--- a/assets/scss/_component-examples.scss
+++ /dev/null
@@ -1,438 +0,0 @@
-// stylelint-disable no-duplicate-selectors, selector-no-qualifying-type
-
-//
-// Grid examples
-//
-
-.bd-example-row {
-  .row {
-    > .col,
-    > [class^="col-"] {
-      padding-top: .75rem;
-      padding-bottom: .75rem;
-      background-color: rgba(86, 61, 124, .15);
-      border: 1px solid rgba(86, 61, 124, .2);
-    }
-  }
-
-  .row + .row {
-    margin-top: 1rem;
-  }
-
-  .flex-items-top,
-  .flex-items-middle,
-  .flex-items-bottom {
-    min-height: 6rem;
-    background-color: rgba(255, 0, 0, .1);
-  }
-}
-
-.bd-example-row-flex-cols .row {
-  min-height: 10rem;
-  background-color: rgba(255, 0, 0, .1);
-}
-
-.bd-highlight {
-  background-color: rgba($bd-purple, .15);
-  border: 1px solid rgba($bd-purple, .15);
-}
-
-// Grid mixins
-.example-container {
-  width: 800px;
-  @include make-container();
-}
-
-.example-row {
-  @include make-row();
-}
-
-.example-content-main {
-  @include make-col-ready();
-
-  @include media-breakpoint-up(sm) {
-    @include make-col(6);
-  }
-
-  @include media-breakpoint-up(lg) {
-    @include make-col(8);
-  }
-}
-
-.example-content-secondary {
-  @include make-col-ready();
-
-  @include media-breakpoint-up(sm) {
-    @include make-col(6);
-  }
-
-  @include media-breakpoint-up(lg) {
-    @include make-col(4);
-  }
-}
-
-
-//
-// Container illustrations
-//
-
-.bd-example-container {
-  min-width: 16rem;
-  max-width: 25rem;
-  margin-right: auto;
-  margin-left: auto;
-}
-
-.bd-example-container-header {
-  height: 3rem;
-  margin-bottom: .5rem;
-  background-color: lighten($blue, 50%);
-  border-radius: .25rem;
-}
-
-.bd-example-container-sidebar {
-  float: right;
-  width: 4rem;
-  height: 8rem;
-  background-color: lighten($blue, 25%);
-  border-radius: .25rem;
-}
-
-.bd-example-container-body {
-  height: 8rem;
-  margin-right: 4.5rem;
-  background-color: lighten($bd-purple, 25%);
-  border-radius: .25rem;
-}
-
-.bd-example-container-fluid {
-  max-width: none;
-}
-
-
-//
-// Docs examples
-//
-
-.bd-example {
-  position: relative;
-  padding: 1rem;
-  margin: 1rem (-$grid-gutter-width / 2);
-  overflow: auto;
-  border: solid #f7f7f9;
-  border-width: .2rem 0 0;
-  @include clearfix();
-
-  @include media-breakpoint-up(sm) {
-    padding: 1.5rem;
-    margin-right: 0;
-    margin-bottom: 0;
-    margin-left: 0;
-    border-width: .2rem;
-  }
-
-  + .highlight,
-  + .clipboard + .highlight {
-    margin-top: 0;
-  }
-
-  + p {
-    margin-top: 2rem;
-  }
-
-  .pos-f-t {
-    position: relative;
-    margin: -1rem;
-
-    @include media-breakpoint-up(sm) {
-      margin: -1.5rem;
-    }
-  }
-
-  > .form-control {
-    + .form-control {
-      margin-top: .5rem;
-    }
-  }
-
-  > .nav + .nav,
-  > .alert + .alert,
-  > .navbar + .navbar,
-  > .progress + .progress,
-  > .progress + .btn {
-    margin-top: 1rem;
-  }
-
-  > .dropdown-menu:first-child {
-    position: static;
-    display: block;
-  }
-
-  > .form-group:last-child {
-    margin-bottom: 0;
-  }
-
-  > .close {
-    float: none;
-  }
-}
-
-// Typography
-.bd-example-type {
-  .table {
-    .type-info {
-      color: #999;
-      vertical-align: middle;
-    }
-    td {
-      padding: 1rem 0;
-      border-color: #eee;
-    }
-    tr:first-child td {
-      border-top: 0;
-    }
-  }
-
-  h1,
-  h2,
-  h3,
-  h4,
-  h5,
-  h6 {
-    margin-top: 0;
-    margin-bottom: 0;
-  }
-}
-
-// Contextual background colors
-.bd-example-bg-classes p {
-  padding: 1rem;
-}
-
-// Images
-.bd-example > img {
-  + img {
-    margin-left: .5rem;
-  }
-}
-
-// Buttons
-.bd-example {
-  > .btn-group {
-    margin-top: .25rem;
-    margin-bottom: .25rem;
-  }
-  > .btn-toolbar + .btn-toolbar {
-    margin-top: .5rem;
-  }
-}
-
-// Forms
-.bd-example-control-sizing select,
-.bd-example-control-sizing input[type="text"] + input[type="text"] {
-  margin-top: .5rem;
-}
-.bd-example-form .input-group {
-  margin-bottom: .5rem;
-}
-.bd-example > textarea.form-control {
-  resize: vertical;
-}
-
-// List groups
-.bd-example > .list-group {
-  max-width: 400px;
-}
-
-// Navbars
-.bd-example {
-  .fixed-top,
-  .sticky-top {
-    position: static;
-    margin: -1rem -1rem 1rem;
-  }
-  .fixed-bottom {
-    position: static;
-    margin: 1rem -1rem -1rem;
-  }
-
-  @include media-breakpoint-up(sm) {
-    .fixed-top,
-    .sticky-top {
-      margin: -1.5rem -1.5rem 1rem;
-    }
-    .fixed-bottom {
-      margin: 1rem -1.5rem -1.5rem;
-    }
-  }
-}
-
-// Pagination
-.bd-example .pagination {
-  margin-top: .5rem;
-  margin-bottom: .5rem;
-}
-
-// Example modals
-.modal {
-  z-index: 1072;
-
-  .tooltip,
-  .popover {
-    z-index: 1073;
-  }
-}
-
-.modal-backdrop {
-  z-index: 1071;
-}
-
-.bd-example-modal {
-  background-color: #fafafa;
-
-  .modal {
-    position: relative;
-    top: auto;
-    right: auto;
-    bottom: auto;
-    left: auto;
-    z-index: 1;
-    display: block;
-  }
-
-  .modal-dialog {
-    left: auto;
-    margin-right: auto;
-    margin-left: auto;
-  }
-}
-
-// Example tabbable tabs
-.bd-example-tabs .nav-tabs {
-  margin-bottom: 1rem;
-}
-
-// Tooltips
-.bd-example-tooltips {
-  text-align: center;
-
-  > .btn {
-    margin-top: .25rem;
-    margin-bottom: .25rem;
-  }
-}
-.bs-tooltip-top-docs,
-.bs-tooltip-bottom-docs {
-  .arrow {
-    left: 50%;
-  }
-}
-.bs-tooltip-right-docs,
-.bs-tooltip-left-docs {
-  .arrow {
-    top: 50%;
-  }
-}
-
-// Popovers
-.bd-example-popover-static {
-  padding-bottom: 1.5rem;
-  background-color: #f9f9f9;
-
-  .popover {
-    position: relative;
-    display: block;
-    float: left;
-    width: 260px;
-    margin: 1.25rem;
-  }
-}
-.bs-popover-top-docs,
-.bs-popover-bottom-docs {
-  .arrow {
-    left: 50%;
-  }
-}
-.bs-popover-right-docs,
-.bs-popover-left-docs {
-  .arrow {
-    top: 50%;
-  }
-}
-
-// Tooltips
-.tooltip-demo a {
-  white-space: nowrap;
-}
-
-.bd-example-tooltip-static .tooltip {
-  position: relative;
-  display: inline-block;
-  margin: 10px 20px;
-  opacity: 1;
-}
-
-// Scrollspy demo on fixed height div
-.scrollspy-example {
-  position: relative;
-  height: 200px;
-  margin-top: .5rem;
-  overflow: auto;
-}
-
-.scrollspy-example-2 {
-  position: relative;
-  height: 350px;
-  overflow: auto;
-}
-
-.bd-example-border-utils {
-  [class^="border"] {
-    display: inline-block;
-    width: 5rem;
-    height: 5rem;
-    margin: .25rem;
-    background-color: #f5f5f5;
-    border: 1px solid;
-  }
-}
-
-//
-// Code snippets
-//
-
-.highlight {
-  padding: 1rem;
-  margin-top: 1rem;
-  margin-bottom: 1rem;
-  background-color: #f7f7f9;
-  -ms-overflow-style: -ms-autohiding-scrollbar;
-
-  @include media-breakpoint-up(sm) {
-    padding: 1.5rem;
-  }
-}
-
-.bd-content .highlight {
-  margin-right: (-$grid-gutter-width / 2);
-  margin-left: (-$grid-gutter-width / 2);
-
-  @include media-breakpoint-up(sm) {
-    margin-right: 0;
-    margin-left: 0;
-  }
-}
-
-.highlight {
-  pre {
-    padding: 0;
-    margin-top: 0;
-    margin-bottom: 0;
-    background-color: transparent;
-    border: 0;
-  }
-  pre code {
-    font-size: inherit;
-    color: $gray-900; // Effectively the base text color
-  }
-}
diff --git a/assets/scss/_custom-forms.scss b/assets/scss/_custom-forms.scss
deleted file mode 100644
index a521dbd..0000000
--- a/assets/scss/_custom-forms.scss
+++ /dev/null
@@ -1,257 +0,0 @@
-// Embedded icons from Open Iconic.
-// Released under MIT and copyright 2014 Waybury.
-// https://useiconic.com/open
-
-
-// Checkboxes and radios
-//
-// Base class takes care of all the key behavioral aspects.
-
-.custom-control {
-  position: relative;
-  display: inline-flex;
-  min-height: (1rem * $line-height-base);
-  padding-left: $custom-control-gutter;
-  margin-right: $custom-control-spacer-x;
-}
-
-.custom-control-input {
-  position: absolute;
-  z-index: -1; // Put the input behind the label so it doesn't overlay text
-  opacity: 0;
-
-  &:checked ~ .custom-control-indicator {
-    color: $custom-control-indicator-checked-color;
-    @include gradient-bg($custom-control-indicator-checked-bg);
-    @include box-shadow($custom-control-indicator-checked-box-shadow);
-  }
-
-  &:focus ~ .custom-control-indicator {
-    // the mixin is not used here to make sure there is feedback
-    box-shadow: $custom-control-indicator-focus-box-shadow;
-  }
-
-  &:active ~ .custom-control-indicator {
-    color: $custom-control-indicator-active-color;
-    @include gradient-bg($custom-control-indicator-active-bg);
-    @include box-shadow($custom-control-indicator-active-box-shadow);
-  }
-
-  &:disabled {
-    ~ .custom-control-indicator {
-      background-color: $custom-control-indicator-disabled-bg;
-    }
-
-    ~ .custom-control-description {
-      color: $custom-control-description-disabled-color;
-    }
-  }
-}
-
-// Custom indicator
-//
-// Generates a shadow element to create our makeshift checkbox/radio background.
-
-.custom-control-indicator {
-  position: absolute;
-  top: (($line-height-base - $custom-control-indicator-size) / 2);
-  left: 0;
-  display: block;
-  width: $custom-control-indicator-size;
-  height: $custom-control-indicator-size;
-  pointer-events: none;
-  user-select: none;
-  background-color: $custom-control-indicator-bg;
-  background-repeat: no-repeat;
-  background-position: center center;
-  background-size: $custom-control-indicator-bg-size;
-  @include box-shadow($custom-control-indicator-box-shadow);
-}
-
-// Checkboxes
-//
-// Tweak just a few things for checkboxes.
-
-.custom-checkbox {
-  .custom-control-indicator {
-    @include border-radius($custom-checkbox-indicator-border-radius);
-  }
-
-  .custom-control-input:checked ~ .custom-control-indicator {
-    background-image: $custom-checkbox-indicator-icon-checked;
-  }
-
-  .custom-control-input:indeterminate ~ .custom-control-indicator {
-    background-color: $custom-checkbox-indicator-indeterminate-bg;
-    background-image: $custom-checkbox-indicator-icon-indeterminate;
-    @include box-shadow($custom-checkbox-indicator-indeterminate-box-shadow);
-  }
-}
-
-// Radios
-//
-// Tweak just a few things for radios.
-
-.custom-radio {
-  .custom-control-indicator {
-    border-radius: $custom-radio-indicator-border-radius;
-  }
-
-  .custom-control-input:checked ~ .custom-control-indicator {
-    background-image: $custom-radio-indicator-icon-checked;
-  }
-}
-
-
-// Layout options
-//
-// By default radios and checkboxes are `inline-block` with no additional spacing
-// set. Use these optional classes to tweak the layout.
-
-.custom-controls-stacked {
-  display: flex;
-  flex-direction: column;
-
-  .custom-control {
-    margin-bottom: $custom-control-spacer-y;
-
-    + .custom-control {
-      margin-left: 0;
-    }
-  }
-}
-
-
-// Select
-//
-// Replaces the browser default select with a custom one, mostly pulled from
-// http://primercss.io.
-//
-
-.custom-select {
-  display: inline-block;
-  max-width: 100%;
-  height: $input-height;
-  padding: $custom-select-padding-y ($custom-select-padding-x + $custom-select-indicator-padding) $custom-select-padding-y $custom-select-padding-x;
-  line-height: $custom-select-line-height;
-  color: $custom-select-color;
-  vertical-align: middle;
-  background: $custom-select-bg $custom-select-indicator no-repeat right $custom-select-padding-x center;
-  background-size: $custom-select-bg-size;
-  border: $custom-select-border-width solid $custom-select-border-color;
-  @if $enable-rounded {
-    border-radius: $custom-select-border-radius;
-  } @else {
-    border-radius: 0;
-  }
-  appearance: none;
-
-  &:focus {
-    border-color: $custom-select-focus-border-color;
-    outline: none;
-    @include box-shadow($custom-select-focus-box-shadow);
-
-    &::-ms-value {
-      // For visual consistency with other platforms/browsers,
-      // supress the default white text on blue background highlight given to
-      // the selected option text when the (still closed) <select> receives focus
-      // in IE and (under certain conditions) Edge.
-      // See https://github.com/twbs/bootstrap/issues/19398.
-      color: $input-color;
-      background-color: $input-bg;
-    }
-  }
-
-  &[multiple] {
-    height: auto;
-    background-image: none;
-  }
-
-  &:disabled {
-    color: $custom-select-disabled-color;
-    background-color: $custom-select-disabled-bg;
-  }
-
-  // Hides the default caret in IE11
-  &::-ms-expand {
-    opacity: 0;
-  }
-}
-
-.custom-select-sm {
-  height: $custom-select-height-sm;
-  padding-top: $custom-select-padding-y;
-  padding-bottom: $custom-select-padding-y;
-  font-size: $custom-select-font-size-sm;
-}
-
-
-// File
-//
-// Custom file input.
-
-.custom-file {
-  position: relative;
-  display: inline-block;
-  max-width: 100%;
-  height: $custom-file-height;
-  margin-bottom: 0;
-}
-
-.custom-file-input {
-  min-width: $custom-file-width;
-  max-width: 100%;
-  height: $custom-file-height;
-  margin: 0;
-  opacity: 0;
-
-  &:focus ~ .custom-file-control {
-    box-shadow: $custom-file-focus-box-shadow;
-  }
-}
-
-.custom-file-control {
-  position: absolute;
-  top: 0;
-  right: 0;
-  left: 0;
-  z-index: 5;
-  height: $custom-file-height;
-  padding: $custom-file-padding-y $custom-file-padding-x;
-  line-height: $custom-file-line-height;
-  color: $custom-file-color;
-  pointer-events: none;
-  user-select: none;
-  background-color: $custom-file-bg;
-  border: $custom-file-border-width solid $custom-file-border-color;
-  @include border-radius($custom-file-border-radius);
-  @include box-shadow($custom-file-box-shadow);
-
-  @each $lang, $text in map-get($custom-file-text, placeholder) {
-    &:lang(#{$lang}):empty::after {
-      content: $text;
-    }
-  }
-
-  &::before {
-    position: absolute;
-    top: -$custom-file-border-width;
-    right: -$custom-file-border-width;
-    bottom: -$custom-file-border-width;
-    z-index: 6;
-    display: block;
-    height: $custom-file-height;
-    padding: $custom-file-padding-y $custom-file-padding-x;
-    line-height: $custom-file-line-height;
-    color: $custom-file-button-color;
-    @include gradient-bg($custom-file-button-bg);
-    border: $custom-file-border-width solid $custom-file-border-color;
-    @include border-radius(0 $custom-file-border-radius $custom-file-border-radius 0);
-  }
-
-  @each $lang, $text in map-get($custom-file-text, button-label) {
-    &:lang(#{$lang})::before {
-      content: $text;
-    }
-  }
-}
diff --git a/assets/scss/_dropdown.scss b/assets/scss/_dropdown.scss
deleted file mode 100644
index daa867a..0000000
--- a/assets/scss/_dropdown.scss
+++ /dev/null
@@ -1,103 +0,0 @@
-// The dropdown wrapper (`<div>`)
-.dropup,
-.dropdown {
-  position: relative;
-}
-
-.dropdown-toggle {
-  // Generate the caret automatically
-  @include caret;
-}
-
-// The dropdown menu
-.dropdown-menu {
-  position: absolute;
-  top: 100%;
-  left: 0;
-  z-index: $zindex-dropdown;
-  display: none; // none by default, but block on "open" of the menu
-  float: left;
-  min-width: $dropdown-min-width;
-  padding: $dropdown-padding-y 0;
-  margin: $dropdown-spacer 0 0; // override default ul
-  font-size: $font-size-base; // Redeclare because nesting can cause inheritance issues
-  color: $body-color;
-  text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer)
-  list-style: none;
-  background-color: $dropdown-bg;
-  background-clip: padding-box;
-  border: $dropdown-border-width solid $dropdown-border-color;
-  @include border-radius($border-radius);
-  @include box-shadow($dropdown-box-shadow);
-}
-
-// Allow for dropdowns to go bottom up (aka, dropup-menu)
-// Just add .dropup after the standard .dropdown class and you're set.
-.dropup {
-  .dropdown-menu {
-    margin-top: 0;
-    margin-bottom: $dropdown-spacer;
-  }
-
-  .dropdown-toggle {
-    @include caret(up);
-  }
-}
-
-// Dividers (basically an `<hr>`) within the dropdown
-.dropdown-divider {
-  @include nav-divider($dropdown-divider-bg);
-}
-
-// Links, buttons, and more within the dropdown menu
-//
-// `<button>`-specific styles are denoted with `// For <button>s`
-.dropdown-item {
-  display: block;
-  width: 100%; // For `<button>`s
-  padding: $dropdown-item-padding-y $dropdown-item-padding-x;
-  clear: both;
-  font-weight: $font-weight-normal;
-  color: $dropdown-link-color;
-  text-align: inherit; // For `<button>`s
-  white-space: nowrap; // prevent links from randomly breaking onto new lines
-  background: none; // For `<button>`s
-  border: 0; // For `<button>`s
-
-  @include hover-focus {
-    color: $dropdown-link-hover-color;
-    text-decoration: none;
-    @include gradient-bg($dropdown-link-hover-bg);
-  }
-
-  &.active,
-  &:active {
-    color: $dropdown-link-active-color;
-    text-decoration: none;
-    @include gradient-bg($dropdown-link-active-bg);
-  }
-
-  &.disabled,
-  &:disabled {
-    color: $dropdown-link-disabled-color;
-    background-color: transparent;
-    // Remove CSS gradients if they're enabled
-    @if $enable-gradients {
-      background-image: none;
-    }
-  }
-}
-
-.dropdown-menu.show {
-  display: block;
-}
-
-// Dropdown section headers
-.dropdown-header {
-  display: block;
-  padding: $dropdown-padding-y $dropdown-item-padding-x;
-  margin-bottom: 0; // for use with heading elements
-  font-size: $font-size-sm;
-  color: $dropdown-header-color;
-  white-space: nowrap; // as with > li > a
-}
diff --git a/assets/scss/_forms.scss b/assets/scss/_forms.scss
deleted file mode 100644
index 80bc7f3..0000000
--- a/assets/scss/_forms.scss
+++ /dev/null
@@ -1,358 +0,0 @@
-// stylelint-disable selector-no-qualifying-type
-
-//
-// Textual form controls
-//
-
-.form-control {
-  display: block;
-  width: 100%;
-  padding: $input-btn-padding-y $input-btn-padding-x;
-  font-size: $font-size-base;
-  line-height: $input-btn-line-height;
-  color: $input-color;
-  background-color: $input-bg;
-  // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214.
-  background-image: none;
-  background-clip: padding-box;
-  border: $input-btn-border-width solid $input-border-color;
-
-  // Note: This has no effect on <select>s in some browsers, due to the limited stylability of `<select>`s in CSS.
-  @if $enable-rounded {
-    // Manually use the if/else instead of the mixin to account for iOS override
-    border-radius: $input-border-radius;
-  } @else {
-    // Otherwise undo the iOS default
-    border-radius: 0;
-  }
-
-  @include box-shadow($input-box-shadow);
-  @include transition($input-transition);
-
-  // Unstyle the caret on `<select>`s in IE10+.
-  &::-ms-expand {
-    background-color: transparent;
-    border: 0;
-  }
-
-  // Customize the `:focus` state to imitate native WebKit styles.
-  @include form-control-focus();
-
-  // Placeholder
-  &::placeholder {
-    color: $input-placeholder-color;
-    // Override Firefox's unusual default opacity; see https://github.com/twbs/bootstrap/pull/11526.
-    opacity: 1;
-  }
-
-  // Disabled and read-only inputs
-  //
-  // HTML5 says that controls under a fieldset > legend:first-child won't be
-  // disabled if the fieldset is disabled. Due to implementation difficulty, we
-  // don't honor that edge case; we style them as disabled anyway.
-  &:disabled,
-  &[readonly] {
-    background-color: $input-disabled-bg;
-    // iOS fix for unreadable disabled content; see https://github.com/twbs/bootstrap/issues/11655.
-    opacity: 1;
-  }
-}
-
-select.form-control {
-  &:not([size]):not([multiple]) {
-    height: $input-height;
-  }
-
-  &:focus::-ms-value {
-    // Suppress the nested default white text on blue background highlight given to
-    // the selected option text when the (still closed) <select> receives focus
-    // in IE and (under certain conditions) Edge, as it looks bad and cannot be made to
-    // match the appearance of the native widget.
-    // See https://github.com/twbs/bootstrap/issues/19398.
-    color: $input-color;
-    background-color: $input-bg;
-  }
-}
-
-// Make file inputs better match text inputs by forcing them to new lines.
-.form-control-file,
-.form-control-range {
-  display: block;
-}
-
-
-//
-// Labels
-//
-
-// For use with horizontal and inline forms, when you need the label text to
-// align with the form controls.
-.col-form-label {
-  padding-top: calc(#{$input-btn-padding-y} + #{$input-btn-border-width});
-  padding-bottom: calc(#{$input-btn-padding-y} + #{$input-btn-border-width});
-  margin-bottom: 0; // Override the `<label>` default
-  line-height: $input-btn-line-height;
-}
-
-.col-form-label-lg {
-  padding-top: calc(#{$input-btn-padding-y-lg} + #{$input-btn-border-width});
-  padding-bottom: calc(#{$input-btn-padding-y-lg} + #{$input-btn-border-width});
-  font-size: $font-size-lg;
-  line-height: $input-btn-line-height-lg;
-}
-
-.col-form-label-sm {
-  padding-top: calc(#{$input-btn-padding-y-sm} + #{$input-btn-border-width});
-  padding-bottom: calc(#{$input-btn-padding-y-sm} + #{$input-btn-border-width});
-  font-size: $font-size-sm;
-  line-height: $input-btn-line-height-sm;
-}
-
-
-//
-// Legends
-//
-
-// For use with horizontal and inline forms, when you need the legend text to
-// be the same size as regular labels, and to align with the form controls.
-.col-form-legend {
-  padding-top: $input-btn-padding-y;
-  padding-bottom: $input-btn-padding-y;
-  margin-bottom: 0;
-  font-size: $font-size-base;
-}
-
-
-// Readonly controls as plain text
-//
-// Apply class to a readonly input to make it appear like regular plain
-// text (without any border, background color, focus indicator)
-
-.form-control-plaintext {
-  padding-top: $input-btn-padding-y;
-  padding-bottom: $input-btn-padding-y;
-  margin-bottom: 0; // match inputs if this class comes on inputs with default margins
-  line-height: $input-btn-line-height;
-  background-color: transparent;
-  border: solid transparent;
-  border-width: $input-btn-border-width 0;
-
-  &.form-control-sm,
-  &.form-control-lg {
-    padding-right: 0;
-    padding-left: 0;
-  }
-}
-
-
-// Form control sizing
-//
-// Build on `.form-control` with modifier classes to decrease or increase the
-// height and font-size of form controls.
-//
-// The `.form-group-* form-control` variations are sadly duplicated to avoid the
-// issue documented in https://github.com/twbs/bootstrap/issues/15074.
-
-.form-control-sm {
-  padding: $input-btn-padding-y-sm $input-btn-padding-x-sm;
-  font-size: $font-size-sm;
-  line-height: $input-btn-line-height-sm;
-  @include border-radius($input-border-radius-sm);
-}
-
-select.form-control-sm {
-  &:not([size]):not([multiple]) {
-    height: $input-height-sm;
-  }
-}
-
-.form-control-lg {
-  padding: $input-btn-padding-y-lg $input-btn-padding-x-lg;
-  font-size: $font-size-lg;
-  line-height: $input-btn-line-height-lg;
-  @include border-radius($input-border-radius-lg);
-}
-
-select.form-control-lg {
-  &:not([size]):not([multiple]) {
-    height: $input-height-lg;
-  }
-}
-
-
-// Form groups
-//
-// Designed to help with the organization and spacing of vertical forms. For
-// horizontal forms, use the predefined grid classes.
-
-.form-group {
-  margin-bottom: $form-group-margin-bottom;
-}
-
-.form-text {
-  display: block;
-  margin-top: $form-text-margin-top;
-}
-
-
-// Form grid
-//
-// Special replacement for our grid system's `.row` for tighter form layouts.
-
-.form-row {
-  display: flex;
-  flex-wrap: wrap;
-  margin-right: -5px;
-  margin-left: -5px;
-
-  > .col,
-  > [class*="col-"] {
-    padding-right: 5px;
-    padding-left: 5px;
-  }
-}
-
-
-// Checkboxes and radios
-//
-// Indent the labels to position radios/checkboxes as hanging controls.
-
-.form-check {
-  position: relative;
-  display: block;
-  margin-bottom: $form-check-margin-bottom;
-
-  &.disabled {
-    .form-check-label {
-      color: $text-muted;
-    }
-  }
-}
-
-.form-check-label {
-  padding-left: $form-check-input-gutter;
-  margin-bottom: 0; // Override default `<label>` bottom margin
-}
-
-.form-check-input {
-  position: absolute;
-  margin-top: $form-check-input-margin-y;
-  margin-left: -$form-check-input-gutter;
-}
-
-// Radios and checkboxes on same line
-.form-check-inline {
-  display: inline-block;
-  margin-right: $form-check-inline-margin-x;
-
-  .form-check-label {
-    vertical-align: middle;
-  }
-}
-
-
-// Form validation
-//
-// Provide feedback to users when form field values are valid or invalid. Works
-// primarily for client-side validation via scoped `:invalid` and `:valid`
-// pseudo-classes but also includes `.is-invalid` and `.is-valid` classes for
-// server side validation.
-
- at include form-validation-state("valid", $form-feedback-valid-color);
- at include form-validation-state("invalid", $form-feedback-invalid-color);
-
-// Inline forms
-//
-// Make forms appear inline(-block) by adding the `.form-inline` class. Inline
-// forms begin stacked on extra small (mobile) devices and then go inline when
-// viewports reach <768px.
-//
-// Requires wrapping inputs and labels with `.form-group` for proper display of
-// default HTML form controls and our custom form controls (e.g., input groups).
-
-.form-inline {
-  display: flex;
-  flex-flow: row wrap;
-  align-items: center; // Prevent shorter elements from growing to same height as others (e.g., small buttons growing to normal sized button height)
-
-  // Because we use flex, the initial sizing of checkboxes is collapsed and
-  // doesn't occupy the full-width (which is what we want for xs grid tier),
-  // so we force that here.
-  .form-check {
-    width: 100%;
-  }
-
-  // Kick in the inline
-  @include media-breakpoint-up(sm) {
-    label {
-      display: flex;
-      align-items: center;
-      justify-content: center;
-      margin-bottom: 0;
-    }
-
-    // Inline-block all the things for "inline"
-    .form-group {
-      display: flex;
-      flex: 0 0 auto;
-      flex-flow: row wrap;
-      align-items: center;
-      margin-bottom: 0;
-    }
-
-    // Allow folks to *not* use `.form-group`
-    .form-control {
-      display: inline-block;
-      width: auto; // Prevent labels from stacking above inputs in `.form-group`
-      vertical-align: middle;
-    }
-
-    // Make static controls behave like regular ones
-    .form-control-plaintext {
-      display: inline-block;
-    }
-
-    .input-group {
-      width: auto;
-    }
-
-    // Remove default margin on radios/checkboxes that were used for stacking, and
-    // then undo the floating of radios and checkboxes to match.
-    .form-check {
-      display: flex;
-      align-items: center;
-      justify-content: center;
-      width: auto;
-      margin-top: 0;
-      margin-bottom: 0;
-    }
-    .form-check-label {
-      padding-left: 0;
-    }
-    .form-check-input {
-      position: relative;
-      margin-top: 0;
-      margin-right: $form-check-input-margin-x;
-      margin-left: 0;
-    }
-
-    // Custom form controls
-    .custom-control {
-      display: flex;
-      align-items: center;
-      justify-content: center;
-      padding-left: 0;
-    }
-    .custom-control-indicator {
-      position: static;
-      display: inline-block;
-      margin-right: $form-check-input-margin-x; // Flexbox alignment means we lose our HTML space here, so we compensate.
-      vertical-align: text-bottom;
-    }
-
-    // Re-override the feedback icon.
-    .has-feedback .form-control-feedback {
-      top: 0;
-    }
-  }
-}
diff --git a/assets/scss/_functions.scss b/assets/scss/_functions.scss
deleted file mode 100644
index 43210f7..0000000
--- a/assets/scss/_functions.scss
+++ /dev/null
@@ -1,86 +0,0 @@
-// Bootstrap functions
-//
-// Utility mixins and functions for evalutating source code across our variables, maps, and mixins.
-
-// Ascending
-// Used to evaluate Sass maps like our grid breakpoints.
- at mixin _assert-ascending($map, $map-name) {
-  $prev-key: null;
-  $prev-num: null;
-  @each $key, $num in $map {
-    @if $prev-num == null {
-      // Do nothing
-    } @else if not comparable($prev-num, $num) {
-      @warn "Potentially invalid value for #{$map-name}: This map must be in ascending order, but key '#{$key}' has value #{$num} whose unit makes it incomparable to #{$prev-num}, the value of the previous key '#{$prev-key}' !";
-    } @else if $prev-num >= $num {
-      @warn "Invalid value for #{$map-name}: This map must be in ascending order, but key '#{$key}' has value #{$num} which isn't greater than #{$prev-num}, the value of the previous key '#{$prev-key}' !";
-    }
-    $prev-key: $key;
-    $prev-num: $num;
-  }
-}
-
-// Starts at zero
-// Another grid mixin that ensures the min-width of the lowest breakpoint starts at 0.
- at mixin _assert-starts-at-zero($map) {
-  $values: map-values($map);
-  $first-value: nth($values, 1);
-  @if $first-value != 0 {
-    @warn "First breakpoint in `$grid-breakpoints` must start at 0, but starts at #{$first-value}.";
-  }
-}
-
-// Replace `$search` with `$replace` in `$string`
-// Used on our SVG icon backgrounds for custom forms.
-//
-// @author Hugo Giraudel
-// @param {String} $string - Initial string
-// @param {String} $search - Substring to replace
-// @param {String} $replace ('') - New value
-// @return {String} - Updated string
- at function str-replace($string, $search, $replace: "") {
-  $index: str-index($string, $search);
-
-  @if $index {
-    @return str-slice($string, 1, $index - 1) + $replace + str-replace(str-slice($string, $index + str-length($search)), $search, $replace);
-  }
-
-  @return $string;
-}
-
-// Color contrast
- at function color-yiq($color) {
-  $r: red($color);
-  $g: green($color);
-  $b: blue($color);
-
-  $yiq: (($r * 299) + ($g * 587) + ($b * 114)) / 1000;
-
-  @if ($yiq >= 150) {
-    @return #111;
-  } @else {
-    @return #fff;
-  }
-}
-
-// Retreive color Sass maps
- at function color($key: "blue") {
-  @return map-get($colors, $key);
-}
-
- at function theme-color($key: "primary") {
-  @return map-get($theme-colors, $key);
-}
-
- at function gray($key: "100") {
-  @return map-get($grays, $key);
-}
-
-// Request a theme color level
- at function theme-color-level($color-name: "primary", $level: 0) {
-  $color: theme-color($color-name);
-  $color-base: if($level > 0, #000, #fff);
-  $level: abs($level);
-
-  @return mix($color-base, $color, $level * $theme-color-interval);
-}
diff --git a/assets/scss/_grid.scss b/assets/scss/_grid.scss
deleted file mode 100644
index a227515..0000000
--- a/assets/scss/_grid.scss
+++ /dev/null
@@ -1,52 +0,0 @@
-// Container widths
-//
-// Set the container width, and override it for fixed navbars in media queries.
-
- at if $enable-grid-classes {
-  .container {
-    @include make-container();
-    @include make-container-max-widths();
-  }
-}
-
-// Fluid container
-//
-// Utilizes the mixin meant for fixed width containers, but with 100% width for
-// fluid, full width layouts.
-
- at if $enable-grid-classes {
-  .container-fluid {
-    @include make-container();
-  }
-}
-
-// Row
-//
-// Rows contain and clear the floats of your columns.
-
- at if $enable-grid-classes {
-  .row {
-    @include make-row();
-  }
-
-  // Remove the negative margin from default .row, then the horizontal padding
-  // from all immediate children columns (to prevent runaway style inheritance).
-  .no-gutters {
-    margin-right: 0;
-    margin-left: 0;
-
-    > .col,
-    > [class*="col-"] {
-      padding-right: 0;
-      padding-left: 0;
-    }
-  }
-}
-
-// Columns
-//
-// Common styles for small and large grid columns
-
- at if $enable-grid-classes {
-  @include make-grid-columns();
-}
diff --git a/assets/scss/_icons.scss b/assets/scss/_icons.scss
deleted file mode 100644
index a4e87aa..0000000
--- a/assets/scss/_icons.scss
+++ /dev/null
@@ -1,237 +0,0 @@
-.fa-arrow-down-png {
-  background-image: url('/static/fonts/fontawesome/png/white/solid/arrow-down.png');
-  width: 1em;
-  height: 1em;
-  background-size: cover;
-}
-
-a:hover .fa-arrow-down-png {
-  background-image: url('/static/fonts/fontawesome/png/dark/solid/arrow-down.png');
-}
-
-.fa-arrow-down-png-purple {
-  background-image: url('/static/fonts/fontawesome/png/primary/solid/arrow-down.png');
-  width: 1em;
-  height: 1em;
-  background-size: cover;
-}
-
-.fa-arrow-right-png {
-  background-image: url('/static/fonts/fontawesome/png/primary/solid/arrow-right.png');
-  width: 1em;
-  height: 1em;
-  background-size: cover;
-}
-
-a:hover .fa-arrow-right-png {
-  background-image: url('/static/fonts/fontawesome/png/white/solid/arrow-right.png');
-}
-
-.fa-android-png {
-  background-image: url('/static/fonts/fontawesome/png/white/brands/android.png');
-  width: 1.0em;
-  height: 1.0em;
-  background-size: cover;
-  margin: 22%;;
-}
-
-.fa-apple-png {
-  background-image: url('/static/fonts/fontawesome/png/white/brands/apple.png');
-  width: 1.0em;
-  height: 1.0em;
-  background-size: cover;
-  margin: 22%;;
-}
-
-
-.fa-windows-png {
-  background-image: url('/static/fonts/fontawesome/png/white/brands/windows.png');
-  width: 1.0em;
-  height: 1.0em;
-  background-size: cover;
-  margin: 22%;;
-}
-
-
-.fa-linux-png {
-  background-image: url('/static/fonts/fontawesome/png/white/brands/linux.png');
-  width: 1.0em;
-  height: 1.0em;
-  background-size: cover;
-  margin: 22%;;
-}
-
-.fa-facebook-png {
-  background-image: url('/static/fonts/fontawesome/png/white/brands/facebook.png');
-  width: 1em;
-  height: 1em;
-  background-size: cover;
-}
-
-.fa-mastodon-png {
-  background-image: url('/static/fonts/fontawesome/png/white/brands/mastodon.png');
-  width: 1em;
-  height: 1em;
-  background-size: cover;
-}
-
-.fa-twitter-png {
-  background-image: url('/static/fonts/fontawesome/png/white/brands/twitter.png');
-  width: 1em;
-  height: 1em;
-  background-size: cover;
-}
-
-.fa-instagram-png {
-  background-image: url('/static/fonts/fontawesome/png/white/brands/instagram.png');
-  width: 1em;
-  height: 1em;
-  background-size: cover;
-}
-
-.fa-linkedin-png {
-  background-image: url('/static/fonts/fontawesome/png/white/brands/linkedin.png');
-  width: 1em;
-  height: 1em;
-  background-size: cover;
-}
-
-.fa-github-png {
-  background-image: url('/static/fonts/fontawesome/png/white/brands/github.png');
-  width: 1em;
-  height: 1em;
-  background-size: cover;
-}
-
-.fa-facebook-png-purple {
-  background-image: url('/static/fonts/fontawesome/png/primary/brands/facebook.png');
-  width: 1em;
-  height: 1em;
-  background-size: cover;
-}
-
-.fa-mastodon-png-purple {
-  background-image: url('/static/fonts/fontawesome/png/primary/brands/mastodon.png');
-  width: 1em;
-  height: 1em;
-  background-size: cover;
-}
-
-.fa-twitter-png-purple {
-  background-image: url('/static/fonts/fontawesome/png/primary/brands/twitter.png');
-  width: 1em;
-  height: 1em;
-  background-size: cover;
-}
-
-.fa-instagram-png-purple {
-  background-image: url('/static/fonts/fontawesome/png/primary/brands/instagram.png');
-  width: 1em;
-  height: 1em;
-  background-size: cover;
-}
-
-.fa-linkedin-png-purple {
-  background-image: url('/static/fonts/fontawesome/png/primary/brands/linkedin.png');
-  width: 1em;
-  height: 1em;
-  background-size: cover;
-}
-
-.fa-youtube-png-purple {
-  background-image: url('/static/fonts/fontawesome/png/primary/brands/youtube.png');
-  width: 1em;
-  height: 1em;
-  background-size: cover;
-}
-
-.fa-table-tennis-png {
-  background-image: url('/static/fonts/fontawesome/png/primary/solid/table-tennis.png');
-  width: 1em;
-  height: 1em;
-  background-size: cover;
-}
-
-.fa-comments-png {
-  background-image: url('/static/fonts/fontawesome/png/primary/solid/comments.png');
-  width: 1em;
-  height: 1em;
-  background-size: cover;
-}
-
-.fa-lock-png {
-  background-image: url('/static/fonts/fontawesome/png/primary/solid/lock.png');
-  width: 1em;
-  height: 1em;
-  background-size: cover;
-}
-
-.fa-flag-png {
-  background-image: url('/static/fonts/fontawesome/png/primary/solid/flag.png');
-  width: 1em;
-  height: 1em;
-  background-size: cover;
-}
-
-.fa-spider-png {
-  background-image: url('/static/fonts/fontawesome/png/primary/solid/spider.png');
-  width: 1em;
-  height: 1em;
-  background-size: cover;
-}
-
-.fa-file-alt-png {
-  background-image: url('/static/fonts/fontawesome/png/primary/regular/file-alt.png');
-  width: 1em;
-  height: 1em;
-  background-size: cover;
-}
-
-.fa-signature-png {
-  background-image: url('/static/fonts/fontawesome/png/primary/solid/signature.png');
-  width: 1em;
-  height: 1em;
-  background-size: cover;
-}
-
-.fa-key-png {
-  background-image: url('/static/fonts/fontawesome/png/primary/solid/key.png');
-  width: 1em;
-  height: 1em;
-  background-size: cover;
-}
-
-.fa-life-ring-png {
-  background-image: url('/static/fonts/fontawesome/png/primary/solid/life-ring.png');
-  width: 1em;
-  height: 1em;
-  background-size: cover;
-}
-
-.fa-folder-open-png {
-  background-image: url('/static/fonts/fontawesome/png/primary/solid/folder-open.png');
-  width: 1em;
-  height: 1em;
-  background-size: cover;
-}
-
-.fa-paper-plane-png {
-  background-image: url('/static/fonts/fontawesome/png/primary/solid/paper-plane.png');
-  width: 1em;
-  height: 1em;
-  background-size: cover;
-}
-
-.fa-hands-helping-png {
-  background-image: url('/static/fonts/fontawesome/png/primary/solid/hands-helping.png');
-  width: 1em;
-  height: 1em;
-  background-size: cover;
-}
-
-.fa-cube-png {
-  background-image: url('/static/fonts/fontawesome/png/primary/solid/cube.png');
-  width: 1em;
-  height: 1em;
-  background-size: cover;
-}
diff --git a/assets/scss/_illos.scss b/assets/scss/_illos.scss
deleted file mode 100644
index d511a40..0000000
--- a/assets/scss/_illos.scss
+++ /dev/null
@@ -1,15 +0,0 @@
-.illo-container {
-  padding-top: 7%;
-  padding-left: 3% !important;
-  padding-right: 3% !important;
-  text-align: center;
-  img {
-    width: 75%;
-  }
-}
-
-.navbar-brand {
-  img {
-    max-width: 4em;
-  }
-}
diff --git a/assets/scss/_images.scss b/assets/scss/_images.scss
deleted file mode 100644
index 50c5610..0000000
--- a/assets/scss/_images.scss
+++ /dev/null
@@ -1,43 +0,0 @@
-// Responsive images (ensure images don't scale beyond their parents)
-//
-// This is purposefully opt-in via an explicit class rather than being the default for all `<img>`s.
-// We previously tried the "images are responsive by default" approach in Bootstrap v2,
-// and abandoned it in Bootstrap v3 because it breaks lots of third-party widgets (including Google Maps)
-// which weren't expecting the images within themselves to be involuntarily resized.
-// See also https://github.com/twbs/bootstrap/issues/18178
-.img-fluid {
-  @include img-fluid;
-}
-
-
-// Image thumbnails
-.img-thumbnail {
-  padding: $thumbnail-padding;
-  background-color: $thumbnail-bg;
-  border: $thumbnail-border-width solid $thumbnail-border-color;
-  @include border-radius($thumbnail-border-radius);
-  @include transition($thumbnail-transition);
-  @include box-shadow($thumbnail-box-shadow);
-
-  // Keep them at most 100% wide
-  @include img-fluid;
-}
-
-//
-// Figures
-//
-
-.figure {
-  // Ensures the caption's text aligns with the image.
-  display: inline-block;
-}
-
-.figure-img {
-  margin-bottom: ($spacer / 2);
-  line-height: 1;
-}
-
-.figure-caption {
-  font-size: $figure-caption-font-size;
-  color: $figure-caption-color;
-}
diff --git a/assets/scss/_input-group.scss b/assets/scss/_input-group.scss
deleted file mode 100644
index a1d16e3..0000000
--- a/assets/scss/_input-group.scss
+++ /dev/null
@@ -1,186 +0,0 @@
-// stylelint-disable selector-no-qualifying-type
-
-//
-// Base styles
-//
-
-.input-group {
-  position: relative;
-  display: flex;
-  align-items: stretch;
-  width: 100%;
-
-  .form-control {
-    // Ensure that the input is always above the *appended* addon button for
-    // proper border colors.
-    position: relative;
-    z-index: 2;
-    flex: 1 1 auto;
-    // Add width 1% and flex-basis auto to ensure that button will not wrap out
-    // the column. Applies to IE Edge+ and Firefox. Chrome does not require this.
-    width: 1%;
-    margin-bottom: 0;
-
-    // Bring the "active" form control to the front
-    @include hover-focus-active {
-      z-index: 3;
-    }
-  }
-}
-
-.input-group-addon,
-.input-group-btn,
-.input-group .form-control {
-  display: flex;
-  align-items: center;
-  &:not(:first-child):not(:last-child) {
-    @include border-radius(0);
-  }
-}
-
-.input-group-addon,
-.input-group-btn {
-  white-space: nowrap;
-}
-
-
-// Sizing options
-//
-// Remix the default form control sizing classes into new ones for easier
-// manipulation.
-
-.input-group-lg > .form-control,
-.input-group-lg > .input-group-addon,
-.input-group-lg > .input-group-btn > .btn {
-  @extend .form-control-lg;
-}
-.input-group-sm > .form-control,
-.input-group-sm > .input-group-addon,
-.input-group-sm > .input-group-btn > .btn {
-  @extend .form-control-sm;
-}
-
-
-//
-// Text input groups
-//
-
-.input-group-addon {
-  padding: $input-btn-padding-y $input-btn-padding-x;
-  margin-bottom: 0; // Allow use of <label> elements by overriding our default margin-bottom
-  font-size: $font-size-base; // Match inputs
-  font-weight: $font-weight-normal;
-  line-height: $input-btn-line-height;
-  color: $input-group-addon-color;
-  text-align: center;
-  background-color: $input-group-addon-bg;
-  border: $input-btn-border-width solid $input-group-addon-border-color;
-  @include border-radius($input-border-radius);
-
-  // Sizing
-  &.form-control-sm {
-    padding: $input-btn-padding-y-sm $input-btn-padding-x-sm;
-    font-size: $font-size-sm;
-    @include border-radius($input-border-radius-sm);
-  }
-
-  &.form-control-lg {
-    padding: $input-btn-padding-y-lg $input-btn-padding-x-lg;
-    font-size: $font-size-lg;
-    @include border-radius($input-border-radius-lg);
-  }
-
-  // Nuke default margins from checkboxes and radios to vertically center within.
-  input[type="radio"],
-  input[type="checkbox"] {
-    margin-top: 0;
-  }
-}
-
-
-//
-// Reset rounded corners
-//
-
-.input-group .form-control:not(:last-child),
-.input-group-addon:not(:last-child),
-.input-group-btn:not(:last-child) > .btn,
-.input-group-btn:not(:last-child) > .btn-group > .btn,
-.input-group-btn:not(:last-child) > .dropdown-toggle,
-.input-group-btn:not(:first-child) > .btn:not(:last-child):not(.dropdown-toggle),
-.input-group-btn:not(:first-child) > .btn-group:not(:last-child) > .btn {
-  @include border-right-radius(0);
-}
-.input-group-addon:not(:last-child) {
-  border-right: 0;
-}
-.input-group .form-control:not(:first-child),
-.input-group-addon:not(:first-child),
-.input-group-btn:not(:first-child) > .btn,
-.input-group-btn:not(:first-child) > .btn-group > .btn,
-.input-group-btn:not(:first-child) > .dropdown-toggle,
-.input-group-btn:not(:last-child) > .btn:not(:first-child),
-.input-group-btn:not(:last-child) > .btn-group:not(:first-child) > .btn {
-  @include border-left-radius(0);
-}
-.form-control + .input-group-addon:not(:first-child) {
-  border-left: 0;
-}
-
-//
-// Button input groups
-//
-
-.input-group-btn {
-  position: relative;
-  align-items: stretch;
-  // Jankily prevent input button groups from wrapping with `white-space` and
-  // `font-size` in combination with `inline-block` on buttons.
-  font-size: 0;
-  white-space: nowrap;
-
-  // Negative margin for spacing, position for bringing hovered/focused/actived
-  // element above the siblings.
-  > .btn {
-    position: relative;
-
-    + .btn {
-      margin-left: (-$input-btn-border-width);
-    }
-
-    // Bring the "active" button to the front
-    @include hover-focus-active {
-      z-index: 3;
-    }
-  }
-
-  &:first-child > .btn + .btn {
-    margin-left: 0;
-  }
-
-  // Negative margin to only have a single, shared border between the two
-  &:not(:last-child) {
-    > .btn,
-    > .btn-group {
-      margin-right: (-$input-btn-border-width);
-    }
-  }
-  &:not(:first-child) {
-    > .btn,
-    > .btn-group {
-      z-index: 2;
-      // remove nagative margin ($input-btn-border-width) to solve overlapping issue with button.
-      margin-left: 0;
-
-      // When input is first, overlap the right side of it with the button(-group)
-      &:first-child {
-        margin-left: (-$input-btn-border-width);
-      }
-
-      // Because specificity
-      @include hover-focus-active {
-        z-index: 3;
-      }
-    }
-  }
-}
diff --git a/assets/scss/_jumbotron.scss b/assets/scss/_jumbotron.scss
deleted file mode 100644
index 7966bba..0000000
--- a/assets/scss/_jumbotron.scss
+++ /dev/null
@@ -1,16 +0,0 @@
-.jumbotron {
-  padding: $jumbotron-padding ($jumbotron-padding / 2);
-  margin-bottom: $jumbotron-padding;
-  background-color: $jumbotron-bg;
-  @include border-radius($border-radius-lg);
-
-  @include media-breakpoint-up(sm) {
-    padding: ($jumbotron-padding * 2) $jumbotron-padding;
-  }
-}
-
-.jumbotron-fluid {
-  padding-right: 0;
-  padding-left: 0;
-  @include border-radius(0);
-}
diff --git a/assets/scss/_list-group.scss b/assets/scss/_list-group.scss
deleted file mode 100644
index 7e0b19e..0000000
--- a/assets/scss/_list-group.scss
+++ /dev/null
@@ -1,114 +0,0 @@
-// Base class
-//
-// Easily usable on <ul>, <ol>, or <div>.
-
-.list-group {
-  display: flex;
-  flex-direction: column;
-
-  // No need to set list-style: none; since .list-group-item is block level
-  padding-left: 0; // reset padding because ul and ol
-  margin-bottom: 0;
-}
-
-
-// Interactive list items
-//
-// Use anchor or button elements instead of `li`s or `div`s to create interactive
-// list items. Includes an extra `.active` modifier class for selected items.
-
-.list-group-item-action {
-  width: 100%; // For `<button>`s (anchors become 100% by default though)
-  color: $list-group-action-color;
-  text-align: inherit; // For `<button>`s (anchors inherit)
-
-  // Hover state
-  @include hover-focus {
-    color: $list-group-action-hover-color;
-    text-decoration: none;
-    background-color: $list-group-hover-bg;
-  }
-
-  &:active {
-    color: $list-group-action-active-color;
-    background-color: $list-group-action-active-bg;
-  }
-}
-
-
-// Individual list items
-//
-// Use on `li`s or `div`s within the `.list-group` parent.
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: $list-group-item-padding-y $list-group-item-padding-x;
-  // Place the border on the list items and negative margin up for better styling
-  margin-bottom: -$list-group-border-width;
-  background-color: $list-group-bg;
-  border: $list-group-border-width solid $list-group-border-color;
-
-  &:first-child {
-    @include border-top-radius($list-group-border-radius);
-  }
-
-  &:last-child {
-    margin-bottom: 0;
-    @include border-bottom-radius($list-group-border-radius);
-  }
-
-  @include hover-focus {
-    text-decoration: none;
-  }
-
-  &.disabled,
-  &:disabled {
-    color: $list-group-disabled-color;
-    background-color: $list-group-disabled-bg;
-  }
-
-  // Include both here for `<a>`s and `<button>`s
-  &.active {
-    z-index: 2; // Place active items above their siblings for proper border styling
-    color: $list-group-active-color;
-    background-color: $list-group-active-bg;
-    border-color: $list-group-active-border-color;
-  }
-}
-
-
-// Flush list items
-//
-// Remove borders and border-radius to keep list group items edge-to-edge. Most
-// useful within other components (e.g., cards).
-
-.list-group-flush {
-  .list-group-item {
-    border-right: 0;
-    border-left: 0;
-    border-radius: 0;
-  }
-
-  &:first-child {
-    .list-group-item:first-child {
-      border-top: 0;
-    }
-  }
-
-  &:last-child {
-    .list-group-item:last-child {
-      border-bottom: 0;
-    }
-  }
-}
-
-
-// Contextual variants
-//
-// Add modifier classes to change text and background color on individual items.
-// Organizationally, this must come after the `:hover` states.
-
- at each $color, $value in $theme-colors {
-  @include list-group-item-variant($color, theme-color-level($color, -9), theme-color-level($color, 6));
-}
diff --git a/assets/scss/_media.scss b/assets/scss/_media.scss
deleted file mode 100644
index b573052..0000000
--- a/assets/scss/_media.scss
+++ /dev/null
@@ -1,8 +0,0 @@
-.media {
-  display: flex;
-  align-items: flex-start;
-}
-
-.media-body {
-  flex: 1;
-}
diff --git a/assets/scss/_mixins.scss b/assets/scss/_mixins.scss
deleted file mode 100644
index d9a1774..0000000
--- a/assets/scss/_mixins.scss
+++ /dev/null
@@ -1,42 +0,0 @@
-// Toggles
-//
-// Used in conjunction with global variables to enable certain theme features.
-
-// Utilities
- at import "mixins/breakpoints";
- at import "mixins/hover";
- at import "mixins/image";
- at import "mixins/badge";
- at import "mixins/resize";
- at import "mixins/screen-reader";
- at import "mixins/size";
- at import "mixins/reset-text";
- at import "mixins/text-emphasis";
- at import "mixins/text-hide";
- at import "mixins/text-truncate";
- at import "mixins/visibility";
-
-// // Components
- at import "mixins/alert";
- at import "mixins/buttons";
- at import "mixins/caret";
- at import "mixins/pagination";
- at import "mixins/lists";
- at import "mixins/list-group";
- at import "mixins/nav-divider";
- at import "mixins/forms";
- at import "mixins/table-row";
-
-// // Skins
- at import "mixins/background-variant";
- at import "mixins/border-radius";
- at import "mixins/box-shadow";
- at import "mixins/gradients";
- at import "mixins/transition";
-
-// // Layout
- at import "mixins/clearfix";
-// @import "mixins/navbar-align";
- at import "mixins/grid-framework";
- at import "mixins/grid";
- at import "mixins/float";
diff --git a/assets/scss/_modal.scss b/assets/scss/_modal.scss
deleted file mode 100644
index e655850..0000000
--- a/assets/scss/_modal.scss
+++ /dev/null
@@ -1,153 +0,0 @@
-// .modal-open      - body class for killing the scroll
-// .modal           - container to scroll within
-// .modal-dialog    - positioning shell for the actual modal
-// .modal-content   - actual modal w/ bg and corners and stuff
-
-
-// Kill the scroll on the body
-.modal-open {
-  overflow: hidden;
-}
-
-// Container that the modal scrolls within
-.modal {
-  position: fixed;
-  top: 0;
-  right: 0;
-  bottom: 0;
-  left: 0;
-  z-index: $zindex-modal;
-  display: none;
-  overflow: hidden;
-  // Prevent Chrome on Windows from adding a focus outline. For details, see
-  // https://github.com/twbs/bootstrap/pull/10951.
-  outline: 0;
-  // We deliberately don't use `-webkit-overflow-scrolling: touch;` due to a
-  // gnarly iOS Safari bug: https://bugs.webkit.org/show_bug.cgi?id=158342
-  // See also https://github.com/twbs/bootstrap/issues/17695
-
-  // When fading in the modal, animate it to slide down
-  &.fade .modal-dialog {
-    @include transition($modal-transition);
-    transform: translate(0, -25%);
-  }
-  &.show .modal-dialog { transform: translate(0, 0); }
-}
-.modal-open .modal {
-  overflow-x: hidden;
-  overflow-y: auto;
-}
-
-// Shell div to position the modal with bottom padding
-.modal-dialog {
-  position: relative;
-  width: auto;
-  margin: $modal-dialog-margin;
-  // allow clicks to pass through for custom click handling to close modal
-  pointer-events: none;
-}
-
-// Actual modal
-.modal-content {
-  position: relative;
-  display: flex;
-  flex-direction: column;
-  // counteract the pointer-events: none; in the .modal-dialog
-  pointer-events: auto;
-  background-color: $modal-content-bg;
-  background-clip: padding-box;
-  border: $modal-content-border-width solid $modal-content-border-color;
-  @include border-radius($border-radius-lg);
-  @include box-shadow($modal-content-box-shadow-xs);
-  // Remove focus outline from opened modal
-  outline: 0;
-}
-
-// Modal background
-.modal-backdrop {
-  position: fixed;
-  top: 0;
-  right: 0;
-  bottom: 0;
-  left: 0;
-  z-index: $zindex-modal-backdrop;
-  background-color: $modal-backdrop-bg;
-
-  // Fade for backdrop
-  &.fade { opacity: 0; }
-  &.show { opacity: $modal-backdrop-opacity; }
-}
-
-// Modal header
-// Top section of the modal w/ title and dismiss
-.modal-header {
-  display: flex;
-  align-items: flex-start; // so the close btn always stays on the upper right corner
-  justify-content: space-between; // Put modal header elements (title and dismiss) on opposite ends
-  padding: $modal-header-padding;
-  border-bottom: $modal-header-border-width solid $modal-header-border-color;
-  @include border-top-radius($border-radius-lg);
-
-  .close {
-    padding: $modal-header-padding;
-    // auto on the left force icon to the right even when there is no .modal-title
-    margin: (-$modal-header-padding) (-$modal-header-padding) (-$modal-header-padding) auto;
-  }
-}
-
-// Title text within header
-.modal-title {
-  margin-bottom: 0;
-  line-height: $modal-title-line-height;
-}
-
-// Modal body
-// Where all modal content resides (sibling of .modal-header and .modal-footer)
-.modal-body {
-  position: relative;
-  // Enable `flex-grow: 1` so that the body take up as much space as possible
-  // when should there be a fixed height on `.modal-dialog`.
-  flex: 1 1 auto;
-  padding: $modal-inner-padding;
-}
-
-// Footer (for actions)
-.modal-footer {
-  display: flex;
-  align-items: center; // vertically center
-  justify-content: flex-end; // Right align buttons with flex property because text-align doesn't work on flex items
-  padding: $modal-inner-padding;
-  border-top: $modal-footer-border-width solid $modal-footer-border-color;
-
-  // Easily place margin between footer elements
-  > :not(:first-child) { margin-left: .25rem; }
-  > :not(:last-child) { margin-right: .25rem; }
-}
-
-// Measure scrollbar width for padding body during modal show/hide
-.modal-scrollbar-measure {
-  position: absolute;
-  top: -9999px;
-  width: 50px;
-  height: 50px;
-  overflow: scroll;
-}
-
-// Scale up the modal
- at include media-breakpoint-up(sm) {
-  // Automatically set modal's width for larger viewports
-  .modal-dialog {
-    max-width: $modal-md;
-    margin: $modal-dialog-margin-y-sm-up auto;
-  }
-
-  .modal-content {
-    @include box-shadow($modal-content-box-shadow-sm-up);
-  }
-
-  .modal-sm { max-width: $modal-sm; }
-}
-
- at include media-breakpoint-up(lg) {
-  .modal-lg { max-width: $modal-lg; }
-}
diff --git a/assets/scss/_nav.scss b/assets/scss/_nav.scss
deleted file mode 100644
index 14e76c9..0000000
--- a/assets/scss/_nav.scss
+++ /dev/null
@@ -1,118 +0,0 @@
-// Base class
-//
-// Kickstart any navigation component with a set of style resets. Works with
-// `<nav>`s or `<ul>`s.
-
-.nav {
-  display: flex;
-  flex-wrap: wrap;
-  padding-left: 0;
-  margin-bottom: 0;
-  list-style: none;
-}
-
-.nav-link {
-  display: block;
-  padding: $nav-link-padding-y $nav-link-padding-x;
-
-  @include hover-focus {
-    text-decoration: none;
-  }
-
-  // Disabled state lightens text
-  &.disabled {
-    color: $nav-link-disabled-color;
-  }
-}
-
-//
-// Tabs
-//
-
-.nav-tabs {
-  border-bottom: $nav-tabs-border-width solid $nav-tabs-border-color;
-
-  .nav-item {
-    margin-bottom: -$nav-tabs-border-width;
-  }
-
-  .nav-link {
-    border: $nav-tabs-border-width solid transparent;
-    @include border-top-radius($nav-tabs-border-radius);
-
-    @include hover-focus {
-      border-color: $nav-tabs-link-hover-border-color $nav-tabs-link-hover-border-color $nav-tabs-border-color;
-    }
-
-    &.disabled {
-      color: $nav-link-disabled-color;
-      background-color: transparent;
-      border-color: transparent;
-    }
-  }
-
-  .nav-link.active,
-  .nav-item.show .nav-link {
-    color: $nav-tabs-link-active-color;
-    background-color: $nav-tabs-link-active-bg;
-    border-color: $nav-tabs-link-active-border-color $nav-tabs-link-active-border-color $nav-tabs-link-active-bg;
-  }
-
-  .dropdown-menu {
-    // Make dropdown border overlap tab border
-    margin-top: -$nav-tabs-border-width;
-    // Remove the top rounded corners here since there is a hard edge above the menu
-    @include border-top-radius(0);
-  }
-}
-
-
-//
-// Pills
-//
-
-.nav-pills {
-  .nav-link {
-    @include border-radius($nav-pills-border-radius);
-  }
-
-  .nav-link.active,
-  .show > .nav-link {
-    color: $nav-pills-link-active-color;
-    background-color: $nav-pills-link-active-bg;
-  }
-}
-
-
-//
-// Justified variants
-//
-
-.nav-fill {
-  .nav-item {
-    flex: 1 1 auto;
-    text-align: center;
-  }
-}
-
-.nav-justified {
-  .nav-item {
-    flex-basis: 0;
-    flex-grow: 1;
-    text-align: center;
-  }
-}
-
-
-// Tabbable tabs
-//
-// Hide tabbable panes to start, show them when `.active`
-
-.tab-content {
-  > .tab-pane {
-    display: none;
-  }
-  > .active {
-    display: block;
-  }
-}
diff --git a/assets/scss/_navbar.scss b/assets/scss/_navbar.scss
deleted file mode 100644
index 6b023e8..0000000
--- a/assets/scss/_navbar.scss
+++ /dev/null
@@ -1,306 +0,0 @@
-// Contents
-//
-// Navbar
-// Navbar brand
-// Navbar nav
-// Navbar text
-// Navbar divider
-// Responsive navbar
-// Navbar position
-// Navbar themes
-
-
-// Navbar
-//
-// Provide a static navbar from which we expand to create full-width, fixed, and
-// other navbar variations.
-
-.navbar {
-  position: relative;
-  display: flex;
-  flex-wrap: wrap; // allow us to do the line break for collapsing content
-  align-items: center;
-  justify-content: space-between; // space out brand from logo
-  padding: $navbar-padding-y $navbar-padding-x;
-
-  // Because flex properties aren't inherited, we need to redeclare these first
-  // few properities so that content nested within behave properly.
-  > .container,
-  > .container-fluid {
-    display: flex;
-    flex-wrap: wrap;
-    align-items: center;
-    justify-content: space-between;
-  }
-}
-
-
-// Navbar brand
-//
-// Used for brand, project, or site names.
-
-.navbar-brand {
-  display: inline-block;
-  padding-top: $navbar-brand-padding-y;
-  padding-bottom: $navbar-brand-padding-y;
-  margin-right: $navbar-padding-x;
-  font-size: $navbar-brand-font-size;
-  line-height: inherit;
-  white-space: nowrap;
-
-  @include hover-focus {
-    text-decoration: none;
-  }
-}
-
-
-// Navbar nav
-//
-// Custom navbar navigation (doesn't require `.nav`, but does make use of `.nav-link`).
-
-.navbar-nav {
-  display: flex;
-  flex-direction: column; // cannot use `inherit` to get the `.navbar`s value
-  padding-left: 0;
-  margin-bottom: 0;
-  list-style: none;
-
-  .nav-link {
-    padding-right: 0;
-    padding-left: 0;
-  }
-
-  .dropdown-menu {
-    position: static;
-    float: none;
-  }
-}
-
-
-// Navbar text
-//
-//
-
-.navbar-text {
-  display: inline-block;
-  padding-top: $nav-link-padding-y;
-  padding-bottom: $nav-link-padding-y;
-}
-
-
-// Responsive navbar
-//
-// Custom styles for responsive collapsing and toggling of navbar contents.
-// Powered by the collapse Bootstrap JavaScript plugin.
-
-// When collapsed, prevent the toggleable navbar contents from appearing in
-// the default flexbox row orienation. Requires the use of `flex-wrap: wrap`
-// on the `.navbar` parent.
-.navbar-collapse {
-  flex-basis: 100%;
-  flex-grow: 1;
-  // For always expanded or extra full navbars, ensure content aligns itself
-  // properly vertically. Can be easily overridden with flex utilities.
-  align-items: center;
-}
-
-// Button for toggling the navbar when in its collapsed state
-.navbar-toggler {
-  padding: $navbar-toggler-padding-y $navbar-toggler-padding-x;
-  font-size: $navbar-toggler-font-size;
-  line-height: 1;
-  background: transparent; // remove default button style
-  border: $border-width solid transparent; // remove default button style
-  @include border-radius($navbar-toggler-border-radius);
-
-  @include hover-focus {
-    text-decoration: none;
-  }
-}
-
-// Keep as a separate element so folks can easily override it with another icon
-// or image file as needed.
-.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%;
-}
-
-// Generate series of `.navbar-expand-*` responsive classes for configuring
-// where your navbar collapses.
-.navbar-expand {
-  @each $breakpoint in map-keys($grid-breakpoints) {
-    $next: breakpoint-next($breakpoint, $grid-breakpoints);
-    $infix: breakpoint-infix($next, $grid-breakpoints);
-
-    &#{$infix} {
-      @include media-breakpoint-down($breakpoint) {
-        > .container,
-        > .container-fluid {
-          padding-right: 0;
-          padding-left: 0;
-        }
-      }
-
-      @include media-breakpoint-up($next) {
-        flex-flow: row nowrap;
-        justify-content: flex-start;
-
-        .navbar-nav {
-          flex-direction: row;
-
-          .dropdown-menu {
-            position: absolute;
-          }
-
-          .dropdown-menu-right {
-            right: 0;
-            left: auto; // Reset the default from `.dropdown-menu`
-          }
-
-          .nav-link {
-            padding-right: .5rem;
-            padding-left: .5rem;
-          }
-        }
-
-        // For nesting containers, have to redeclare for alignment purposes
-        > .container,
-        > .container-fluid {
-          flex-wrap: nowrap;
-        }
-
-        .navbar-collapse {
-          display: flex !important;  // stylelint-disable-line declaration-no-important
-
-          // Changes flex-bases to auto because of an IE10 bug
-          flex-basis: auto;
-        }
-
-        .navbar-toggler {
-          display: none;
-        }
-
-        .dropup {
-          .dropdown-menu {
-            top: auto;
-            bottom: 100%;
-          }
-        }
-      }
-    }
-  }
-}
-
-
-// Navbar themes
-//
-// Styles for switching between navbars with light or dark background.
-
-// Dark links against a light background
-.navbar-light {
-  .navbar-brand {
-    color: $navbar-light-active-color;
-
-    @include hover-focus {
-      color: $navbar-light-active-color;
-    }
-  }
-
-  .navbar-nav {
-    .nav-link {
-      color: $navbar-light-color;
-
-      @include hover-focus {
-        color: $navbar-light-hover-color;
-      }
-
-      &.disabled {
-        color: $navbar-light-disabled-color;
-      }
-    }
-
-    .show > .nav-link,
-    .active > .nav-link,
-    .nav-link.show,
-    .nav-link.active {
-      color: $navbar-light-active-color;
-    }
-  }
-
-  .navbar-toggler {
-    color: $navbar-light-color;
-    border-color: $navbar-light-toggler-border-color;
-  }
-
-  .navbar-toggler-icon {
-    background-image: $navbar-light-toggler-icon-bg;
-  }
-
-  .navbar-text {
-    color: $navbar-light-color;
-    a {
-      color: $navbar-light-active-color;
-
-      @include hover-focus {
-        color: $navbar-light-active-color;
-      }
-    }
-  }
-}
-
-// White links against a dark background
-.navbar-dark {
-  .navbar-brand {
-    color: $navbar-dark-active-color;
-
-    @include hover-focus {
-      color: $navbar-dark-active-color;
-    }
-  }
-
-  .navbar-nav {
-    .nav-link {
-      color: $navbar-dark-color;
-
-      @include hover-focus {
-        color: $navbar-dark-hover-color;
-      }
-
-      &.disabled {
-        color: $navbar-dark-disabled-color;
-      }
-    }
-
-    .show > .nav-link,
-    .active > .nav-link,
-    .nav-link.show,
-    .nav-link.active {
-      color: $navbar-dark-active-color;
-    }
-  }
-
-  .navbar-toggler {
-    color: $navbar-dark-color;
-    border-color: $navbar-dark-toggler-border-color;
-  }
-
-  .navbar-toggler-icon {
-    background-image: $navbar-dark-toggler-icon-bg;
-  }
-
-  .navbar-text {
-    color: $navbar-dark-color;
-    a {
-      color: $navbar-dark-active-color;
-
-      @include hover-focus {
-        color: $navbar-dark-active-color;
-      }
-    }
-  }
-}
diff --git a/assets/scss/_pagination.scss b/assets/scss/_pagination.scss
deleted file mode 100644
index 69a36ff..0000000
--- a/assets/scss/_pagination.scss
+++ /dev/null
@@ -1,64 +0,0 @@
-.pagination {
-  display: flex;
-  @include list-unstyled();
-  @include border-radius();
-}
-
-.page-item {
-  &:first-child {
-    .page-link {
-      margin-left: 0;
-      @include border-left-radius($border-radius);
-    }
-  }
-  &:last-child {
-    .page-link {
-      @include border-right-radius($border-radius);
-    }
-  }
-
-  &.active .page-link {
-    z-index: 2;
-    color: $pagination-active-color;
-    background-color: $pagination-active-bg;
-    border-color: $pagination-active-border-color;
-  }
-
-  &.disabled .page-link {
-    color: $pagination-disabled-color;
-    pointer-events: none;
-    background-color: $pagination-disabled-bg;
-    border-color: $pagination-disabled-border-color;
-  }
-}
-
-.page-link {
-  position: relative;
-  display: block;
-  padding: $pagination-padding-y $pagination-padding-x;
-  margin-left: -$pagination-border-width;
-  line-height: $pagination-line-height;
-  color: $pagination-color;
-  background-color: $pagination-bg;
-  border: $pagination-border-width solid $pagination-border-color;
-
-  @include hover-focus {
-    color: $pagination-hover-color;
-    text-decoration: none;
-    background-color: $pagination-hover-bg;
-    border-color: $pagination-hover-border-color;
-  }
-}
-
-
-//
-// Sizing
-//
-
-.pagination-lg {
-  @include pagination-size($pagination-padding-y-lg, $pagination-padding-x-lg, $font-size-lg, $line-height-lg, $border-radius-lg);
-}
-
-.pagination-sm {
-  @include pagination-size($pagination-padding-y-sm, $pagination-padding-x-sm, $font-size-sm, $line-height-sm, $border-radius-sm);
-}
diff --git a/assets/scss/_popover.scss b/assets/scss/_popover.scss
deleted file mode 100644
index 4503767..0000000
--- a/assets/scss/_popover.scss
+++ /dev/null
@@ -1,194 +0,0 @@
-.popover {
-  position: absolute;
-  top: 0;
-  left: 0;
-  z-index: $zindex-popover;
-  display: block;
-  max-width: $popover-max-width;
-  // Our parent element can be arbitrary since tooltips are by default inserted as a sibling of their target element.
-  // So reset our font and text properties to avoid inheriting weird values.
-  @include reset-text();
-  font-size: $font-size-sm;
-  // Allow breaking very long words so they don't overflow the popover's bounds
-  word-wrap: break-word;
-  background-color: $popover-bg;
-  background-clip: padding-box;
-  border: $popover-border-width solid $popover-border-color;
-  @include border-radius($border-radius-lg);
-  @include box-shadow($popover-box-shadow);
-
-  // Arrows
-  //
-  // .arrow is outer, .arrow::after is inner
-
-  .arrow {
-    position: absolute;
-    display: block;
-    width: $popover-arrow-width;
-    height: $popover-arrow-height;
-  }
-
-  .arrow::before,
-  .arrow::after {
-    position: absolute;
-    display: block;
-    border-color: transparent;
-    border-style: solid;
-  }
-
-  .arrow::before {
-    content: "";
-    border-width: $popover-arrow-width;
-  }
-  .arrow::after {
-    content: "";
-    border-width: $popover-arrow-width;
-  }
-
-  // Popover directions
-
-  &.bs-popover-top {
-    margin-bottom: $popover-arrow-width;
-
-    .arrow {
-      bottom: 0;
-    }
-
-    .arrow::before,
-    .arrow::after {
-      border-bottom-width: 0;
-    }
-
-    .arrow::before {
-      bottom: -$popover-arrow-width;
-      margin-left: -$popover-arrow-width;
-      border-top-color: $popover-arrow-outer-color;
-    }
-
-    .arrow::after {
-      bottom: calc((#{$popover-arrow-width} - #{$popover-border-width}) * -1);
-      margin-left: -$popover-arrow-width;
-      border-top-color: $popover-arrow-color;
-    }
-  }
-
-  &.bs-popover-right {
-    margin-left: $popover-arrow-width;
-
-    .arrow {
-      left: 0;
-    }
-
-    .arrow::before,
-    .arrow::after {
-      margin-top: -$popover-arrow-width;
-      border-left-width: 0;
-    }
-
-    .arrow::before {
-      left: -$popover-arrow-width;
-      border-right-color: $popover-arrow-outer-color;
-    }
-
-    .arrow::after {
-      left: calc((#{$popover-arrow-width} - #{$popover-border-width}) * -1);
-      border-right-color: $popover-arrow-color;
-    }
-  }
-
-  &.bs-popover-bottom {
-    margin-top: $popover-arrow-width;
-
-    .arrow {
-      top: 0;
-    }
-
-    .arrow::before,
-    .arrow::after {
-      margin-left: -$popover-arrow-width;
-      border-top-width: 0;
-    }
-
-    .arrow::before {
-      top: -$popover-arrow-width;
-      border-bottom-color: $popover-arrow-outer-color;
-    }
-
-    .arrow::after {
-      top: calc((#{$popover-arrow-width} - #{$popover-border-width}) * -1);
-      border-bottom-color: $popover-arrow-color;
-    }
-
-    // This will remove the popover-header's border just below the arrow
-    .popover-header::before {
-      position: absolute;
-      top: 0;
-      left: 50%;
-      display: block;
-      width: 20px;
-      margin-left: -10px;
-      content: "";
-      border-bottom: $popover-border-width solid $popover-header-bg;
-    }
-  }
-
-  &.bs-popover-left {
-    margin-right: $popover-arrow-width;
-
-    .arrow {
-      right: 0;
-    }
-
-    .arrow::before,
-    .arrow::after {
-      margin-top: -$popover-arrow-width;
-      border-right-width: 0;
-    }
-
-    .arrow::before {
-      right: -$popover-arrow-width;
-      border-left-color: $popover-arrow-outer-color;
-    }
-
-    .arrow::after {
-      right: calc((#{$popover-arrow-width} - #{$popover-border-width}) * -1);
-      border-left-color: $popover-arrow-color;
-    }
-  }
-  &.bs-popover-auto {
-    &[x-placement^="top"] {
-      @extend .bs-popover-top;
-    }
-    &[x-placement^="right"] {
-      @extend .bs-popover-right;
-    }
-    &[x-placement^="bottom"] {
-      @extend .bs-popover-bottom;
-    }
-    &[x-placement^="left"] {
-      @extend .bs-popover-left;
-    }
-  }
-}
-
-
-// Offset the popover to account for the popover arrow
-.popover-header {
-  padding: $popover-header-padding-y $popover-header-padding-x;
-  margin-bottom: 0; // Reset the default from Reboot
-  font-size: $font-size-base;
-  color: $popover-header-color;
-  background-color: $popover-header-bg;
-  border-bottom: $popover-border-width solid darken($popover-header-bg, 5%);
-  $offset-border-width: calc(#{$border-radius-lg} - #{$popover-border-width});
-  @include border-top-radius($offset-border-width);
-
-  &:empty {
-    display: none;
-  }
-}
-
-.popover-body {
-  padding: $popover-body-padding-y $popover-body-padding-x;
-  color: $popover-body-color;
-}
diff --git a/assets/scss/_portal.scss b/assets/scss/_portal.scss
deleted file mode 100644
index 7352f74..0000000
--- a/assets/scss/_portal.scss
+++ /dev/null
@@ -1,136 +0,0 @@
-/* General Portal Styles
-*
-*/
-.content {
-  font-family: Source Serif Pro;
-  color: #333333 !important;
-  font-size: 22px;
-  font-weight: 400;
-  line-height: 36px;
-  text-align: left;
-}
-.preamble p {
-  color: #777777;
-  font-family: Source Sans Pro;
-  font-size: 2em;
-  line-height: 1.3em;
-  font-weight: $font-weight-light;
-}
-
-.human-name {
-  font-family: Source Sans Pro;
-  font-size: 28px;
-  font-weight: 300;
-  width: 95%;
-  text-align: left;
-}
-
-.human-name-small {
-  font-size: 24px;
-  width: 95%;
-}
-
-.nick {
-  font-family: $font-family-monospace;
-  font-size: 14px;
-  font-weight: 400;
-  text-align: left;
-}
-
-.description {
-  font-family: Source Sans Pro;
-  font-size: 18px;
-  font-weight: 400;
-  line-height: 25px;
-  width: 95%;
-  text-align: left;
-}
-
-.description-small, .description-small p {
-  font-size: 16px;
-  width: 95%;
-}
-
-.jobs-ul {
-  color: #272755;
-  font-family: $font-family-monospace;
-  font-size: 14px;
-  font-weight: 400;
-  line-height: 19px;
-  text-align: left;
-  list-style: none;
-}
-
-.section-nav {
-  padding-top: 0 !important;
-  border: 0 !important;
-}
-
-#sidenav-topics .nav-pills .nav-link.active, .nav-pills .show > .nav-link {
-    color: #7D4698;
-    background-color: #fff;
-    font-weight: bold;
-}
-.toc-entry a:hover {
-  color: $purple !important;
-}
-
-.sidetopics {
-  background: transparent;
-  position: sticky;
-  top: 114px;
-  padding-top: inherit;
-}
-
-#topics {
-  min-height: 500px;
-  margin-bottom: 200px;
-}
-
-#topics h5{
-  padding-top: 7rem;
-}
-
-.question {
-  padding: 0.75rem 0;
-}
-
-.border-active {
-  border-bottom: 3px solid !important;
-  border-color: $primary !important;
-}
-
-.footer {
-  position: relative;
-  z-index:99999999999;
-}
-.footer a.nav-link {
-  padding: 0.2rem;
-}
-
-.border-bottom {
-  box-shadow: 0 1px 0 0 #E5E5E5 !important;
-}
-
-footer .border{
-  border: 0 !important;
-  border-bottom: 1px solid rgba(255,255,255,0.3) !important;
-}
-
- @include media-breakpoint-down(sm) {
-   .display-4 {
-     font-size: 2rem;
-   }
-   .toc-entry a {
-       display: block;
-       padding: 0.4rem 0 !important;
-       font-size: 1.3rem;
-   }
- }
-
- @include media-breakpoint-up(md) {
- }
-
- @include media-breakpoint-up(lg) {
-
- }
diff --git a/assets/scss/_print.scss b/assets/scss/_print.scss
deleted file mode 100644
index 6505d3e..0000000
--- a/assets/scss/_print.scss
+++ /dev/null
@@ -1,110 +0,0 @@
-// stylelint-disable declaration-no-important, selector-no-qualifying-type
-
-// Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css
-
-// ==========================================================================
-// Print styles.
-// Inlined to avoid the additional HTTP request:
-// http://www.phpied.com/delay-loading-your-print-css/
-// ==========================================================================
-
- at if $enable-print-styles {
-  @media print {
-    *,
-    *::before,
-    *::after {
-      // Bootstrap specific; comment out `color` and `background`
-      //color: #000 !important; // Black prints faster: http://www.sanbeiji.com/archives/953
-      text-shadow: none !important;
-      //background: transparent !important;
-      box-shadow: none !important;
-    }
-
-    a,
-    a:visited {
-      text-decoration: underline;
-    }
-
-    // Bootstrap specific; comment the following selector out
-    //a[href]::after {
-    //  content: " (" attr(href) ")";
-    //}
-
-    abbr[title]::after {
-      content: " (" attr(title) ")";
-    }
-
-    // Bootstrap specific; comment the following selector out
-    //
-    // Don't show links that are fragment identifiers,
-    // or use the `javascript:` pseudo protocol
-    //
-
-    //a[href^="#"]::after,
-    //a[href^="javascript:"]::after {
-    // content: "";
-    //}
-
-    pre {
-      white-space: pre-wrap !important;
-    }
-    pre,
-    blockquote {
-      border: $border-width solid #999;   // Bootstrap custom code; using `$border-width` instead of 1px
-      page-break-inside: avoid;
-    }
-
-    //
-    // Printing Tables:
-    // http://css-discuss.incutio.com/wiki/Printing_Tables
-    //
-
-    thead {
-      display: table-header-group;
-    }
-
-    tr,
-    img {
-      page-break-inside: avoid;
-    }
-
-    p,
-    h2,
-    h3 {
-      orphans: 3;
-      widows: 3;
-    }
-
-    h2,
-    h3 {
-      page-break-after: avoid;
-    }
-
-    // Bootstrap specific changes start
-
-    // Bootstrap components
-    .navbar {
-      display: none;
-    }
-    .badge {
-      border: $border-width solid #000;
-    }
-
-    .table {
-      border-collapse: collapse !important;
-
-      td,
-      th {
-        background-color: #fff !important;
-      }
-    }
-    .table-bordered {
-      th,
-      td {
-        border: 1px solid #ddd !important;
-      }
-    }
-
-    // Bootstrap specific changes end
-  }
-}
diff --git a/assets/scss/_progress.scss b/assets/scss/_progress.scss
deleted file mode 100644
index efbb440..0000000
--- a/assets/scss/_progress.scss
+++ /dev/null
@@ -1,30 +0,0 @@
- at keyframes progress-bar-stripes {
-  from { background-position: $progress-height 0; }
-  to { background-position: 0 0; }
-}
-
-.progress {
-  display: flex;
-  height: $progress-height;
-  overflow: hidden; // force rounded corners by cropping it
-  font-size: $progress-font-size;
-  background-color: $progress-bg;
-  @include border-radius($progress-border-radius);
-}
-
-.progress-bar {
-  display: flex;
-  align-items: center;
-  justify-content: center;
-  color: $progress-bar-color;
-  background-color: $progress-bar-bg;
-}
-
-.progress-bar-striped {
-  @include gradient-striped();
-  background-size: $progress-height $progress-height;
-}
-
-.progress-bar-animated {
-  animation: progress-bar-stripes $progress-bar-animation-timing;
-}
diff --git a/assets/scss/_reboot.scss b/assets/scss/_reboot.scss
deleted file mode 100644
index 3055cc3..0000000
--- a/assets/scss/_reboot.scss
+++ /dev/null
@@ -1,504 +0,0 @@
-// stylelint-disable at-rule-no-vendor-prefix, declaration-no-important, selector-no-qualifying-type, property-no-vendor-prefix
-
-// Reboot
-//
-// Normalization of HTML elements, manually forked from Normalize.css to remove
-// styles targeting irrelevant browsers while applying new styles.
-//
-// Normalize is licensed MIT. https://github.com/necolas/normalize.css
-
-
-// Document
-//
-// 1. Change from `box-sizing: content-box` so that `width` is not affected by `padding` or `border`.
-// 2. Change the default font family in all browsers.
-// 3. Correct the line height in all browsers.
-// 4. Prevent adjustments of font size after orientation changes in IE on Windows Phone and in iOS.
-// 5. Setting @viewport causes scrollbars to overlap content in IE11 and Edge, so
-//    we force a non-overlapping, non-auto-hiding scrollbar to counteract.
-// 6. Change the default tap highlight to be completely transparent in iOS.
-
-*,
-*::before,
-*::after {
-  box-sizing: border-box; // 1
-}
-
-html {
-  font-family: sans-serif; // 2
-  line-height: 1.15; // 3
-  -webkit-text-size-adjust: 100%; // 4
-  -ms-text-size-adjust: 100%; // 4
-  -ms-overflow-style: scrollbar; // 5
-  -webkit-tap-highlight-color: rgba(0,0,0,0); // 6
-}
-
-// IE10+ doesn't honor `<meta name="viewport">` in some cases.
- at at-root {
-  @-ms-viewport {
-    width: device-width;
-  }
-}
-
-// stylelint-disable selector-list-comma-newline-after
-// Shim for "new" HTML5 structural elements to display correctly (IE10, older browsers)
-article, aside, dialog, figcaption, figure, footer, header, hgroup, main, nav, section {
-  display: block;
-}
-// stylelint-enable selector-list-comma-newline-after
-
-// Body
-//
-// 1. Remove the margin in all browsers.
-// 2. As a best practice, apply a default `background-color`.
-// 3. Set an explicit initial text-align value so that we can later use the
-//    the `inherit` value on things like `<th>` elements.
-
-body {
-  margin: 0; // 1
-  font-family: $font-family-base;
-  font-size: $font-size-base;
-  font-weight: $font-weight-base;
-  line-height: $line-height-base;
-  color: $body-color;
-  text-align: left; // 3
-  background-color: $body-bg; // 2
-}
-
-// Suppress the focus outline on elements that cannot be accessed via keyboard.
-// This prevents an unwanted focus outline from appearing around elements that
-// might still respond to pointer events.
-//
-// Credit: https://github.com/suitcss/base
-[tabindex="-1"]:focus {
-  outline: none !important;
-}
-
-
-// Content grouping
-//
-// 1. Add the correct box sizing in Firefox.
-// 2. Show the overflow in Edge and IE.
-
-hr {
-  box-sizing: content-box; // 1
-  height: 0; // 1
-  overflow: visible; // 2
-}
-
-
-//
-// Typography
-//
-
-// Remove top margins from headings
-//
-// By default, `<h1>`-`<h6>` all receive top and bottom margins. We nuke the top
-// margin for easier control within type scales as it avoids margin collapsing.
-// stylelint-disable selector-list-comma-newline-after
-h1, h2, h3, h4, h5, h6 {
-  margin-top: 0;
-  margin-bottom: $headings-margin-bottom;
-}
-// stylelint-enable selector-list-comma-newline-after
-
-// Reset margins on paragraphs
-//
-// Similarly, the top margin on `<p>`s get reset. However, we also reset the
-// bottom margin to use `rem` units instead of `em`.
-p {
-  margin-top: 0;
-  margin-bottom: $paragraph-margin-bottom;
-}
-
-// Abbreviations
-//
-// 1. Remove the bottom border in Firefox 39-.
-// 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.
-// 3. Add explicit cursor to indicate changed behavior.
-// 4. Duplicate behavior to the data-* attribute for our tooltip plugin
-
-abbr[title],
-abbr[data-original-title] { // 4
-  text-decoration: underline; // 2
-  text-decoration: underline dotted; // 2
-  cursor: help; // 3
-  border-bottom: 0; // 1
-}
-
-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: $dt-font-weight;
-}
-
-dd {
-  margin-bottom: .5rem;
-  margin-left: 0; // Undo browser default
-}
-
-blockquote {
-  margin: 0 0 1rem;
-}
-
-dfn {
-  font-style: italic; // Add the correct font style in Android 4.3-
-}
-
-// stylelint-disable font-weight-notation
-b,
-strong {
-  font-weight: bolder; // Add the correct font weight in Chrome, Edge, and Safari
-}
-// stylelint-enable font-weight-notation
-
-small {
-  font-size: 80%; // Add the correct font size in all browsers
-}
-
-//
-// Prevent `sub` and `sup` elements from affecting the line height in
-// all browsers.
-//
-
-sub,
-sup {
-  position: relative;
-  font-size: 75%;
-  line-height: 0;
-  vertical-align: baseline;
-}
-
-sub { bottom: -.25em; }
-sup { top: -.5em; }
-
-
-//
-// Links
-//
-
-a {
-  color: $link-color;
-  text-decoration: $link-decoration;
-  background-color: transparent; // Remove the gray background on active links in IE 10.
-  -webkit-text-decoration-skip: objects; // Remove gaps in links underline in iOS 8+ and Safari 8+.
-
-  @include hover {
-    color: $link-hover-color;
-    text-decoration: $link-hover-decoration;
-  }
-}
-
-// And undo these styles for placeholder links/named anchors (without href)
-// which have not been made explicitly keyboard-focusable (without tabindex).
-// It would be more straightforward to just use a[href] in previous block, but that
-// causes specificity issues in many other styles that are too complex to fix.
-// See https://github.com/twbs/bootstrap/issues/19402
-
-a:not([href]):not([tabindex]) {
-  color: inherit;
-  text-decoration: none;
-
-  @include hover-focus {
-    color: inherit;
-    text-decoration: none;
-  }
-
-  &:focus {
-    outline: 0;
-  }
-}
-
-
-//
-// Code
-//
-
-// stylelint-disable font-family-no-duplicate-names
-pre,
-code,
-kbd,
-samp {
-  font-family: monospace, monospace; // Correct the inheritance and scaling of font size in all browsers.
-  font-size: 1em; // Correct the odd `em` font sizing in all browsers.
-}
-// stylelint-enable font-family-no-duplicate-names
-
-pre {
-  // Remove browser default top margin
-  margin-top: 0;
-  // Reset browser default of `1em` to use `rem`s
-  margin-bottom: 1rem;
-  // Don't allow content to break outside
-  overflow: auto;
-  // We have @viewport set which causes scrollbars to overlap content in IE11 and Edge, so
-  // we force a non-overlapping, non-auto-hiding scrollbar to counteract.
-  -ms-overflow-style: scrollbar;
-}
-
-
-//
-// Figures
-//
-
-figure {
-  // Apply a consistent margin strategy (matches our type styles).
-  margin: 0 0 1rem;
-}
-
-
-//
-// Images and content
-//
-
-img {
-  vertical-align: middle;
-  border-style: none; // Remove the border on images inside links in IE 10-.
-}
-
-svg:not(:root) {
-  overflow: hidden; // Hide the overflow in IE
-}
-
-
-// Avoid 300ms click delay on touch devices that support the `touch-action` CSS property.
-//
-// In particular, unlike most other browsers, IE11+Edge on Windows 10 on touch devices and IE Mobile 10-11
-// DON'T remove the click delay when `<meta name="viewport" content="width=device-width">` is present.
-// However, they DO support removing the click delay via `touch-action: manipulation`.
-// See:
-// * https://getbootstrap.com/docs/4.0/content/reboot/#click-delay-optimization-for-touch
-// * https://caniuse.com/#feat=css-touch-action
-// * https://patrickhlauke.github.io/touch/tests/results/#suppressing-300ms-delay
-
-a,
-area,
-button,
-[role="button"],
-input:not([type="range"]),
-label,
-select,
-summary,
-textarea {
-  touch-action: manipulation;
-}
-
-
-//
-// Tables
-//
-
-table {
-  border-collapse: collapse; // Prevent double borders
-}
-
-caption {
-  padding-top: $table-cell-padding;
-  padding-bottom: $table-cell-padding;
-  color: $text-muted;
-  text-align: left;
-  caption-side: bottom;
-}
-
-th {
-  // Matches default `<td>` alignment by inheriting from the `<body>`, or the
-  // closest parent with a set `text-align`.
-  text-align: inherit;
-}
-
-
-//
-// Forms
-//
-
-label {
-  // Allow labels to use `margin` for spacing.
-  display: inline-block;
-  margin-bottom: .5rem;
-}
-
-// Remove the default `border-radius` that macOS Chrome adds.
-//
-// Details at https://github.com/twbs/bootstrap/issues/24093
-button {
-  border-radius: 0;
-}
-
-// Work around a Firefox/IE bug where the transparent `button` background
-// results in a loss of the default `button` focus styles.
-//
-// Credit: https://github.com/suitcss/base/
-button:focus {
-  outline: 1px dotted;
-  outline: 5px auto -webkit-focus-ring-color;
-}
-
-input,
-button,
-select,
-optgroup,
-textarea {
-  margin: 0; // Remove the margin in Firefox and Safari
-  font-family: inherit;
-  font-size: inherit;
-  line-height: inherit;
-}
-
-button,
-input {
-  overflow: visible; // Show the overflow in Edge
-}
-
-button,
-select {
-  text-transform: none; // Remove the inheritance of text transform in Firefox
-}
-
-// 1. Prevent a WebKit bug where (2) destroys native `audio` and `video`
-//    controls in Android 4.
-// 2. Correct the inability to style clickable types in iOS and Safari.
-button,
-html [type="button"], // 1
-[type="reset"],
-[type="submit"] {
-  -webkit-appearance: button; // 2
-}
-
-// Remove inner border and padding from Firefox, but don't restore the outline like Normalize.
-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; // 1. Add the correct box sizing in IE 10-
-  padding: 0; // 2. Remove the padding in IE 10-
-}
-
-
-input[type="date"],
-input[type="time"],
-input[type="datetime-local"],
-input[type="month"] {
-  // Remove the default appearance of temporal inputs to avoid a Mobile Safari
-  // bug where setting a custom line-height prevents text from being vertically
-  // centered within the input.
-  // See https://bugs.webkit.org/show_bug.cgi?id=139848
-  // and https://github.com/twbs/bootstrap/issues/11266
-  -webkit-appearance: listbox;
-}
-
-textarea {
-  overflow: auto; // Remove the default vertical scrollbar in IE.
-  // Textareas should really only resize vertically so they don't break their (horizontal) containers.
-  resize: vertical;
-}
-
-fieldset {
-  // Browsers set a default `min-width: min-content;` on fieldsets,
-  // unlike e.g. `<div>`s, which have `min-width: 0;` by default.
-  // So we reset that to ensure fieldsets behave more like a standard block element.
-  // See https://github.com/twbs/bootstrap/issues/12359
-  // and https://html.spec.whatwg.org/multipage/#the-fieldset-and-legend-elements
-  min-width: 0;
-  // Reset the default outline behavior of fieldsets so they don't affect page layout.
-  padding: 0;
-  margin: 0;
-  border: 0;
-}
-
-// 1. Correct the text wrapping in Edge and IE.
-// 2. Correct the color inheritance from `fieldset` elements in IE.
-legend {
-  display: block;
-  width: 100%;
-  max-width: 100%; // 1
-  padding: 0;
-  margin-bottom: .5rem;
-  font-size: 1.5rem;
-  line-height: inherit;
-  color: inherit; // 2
-  white-space: normal; // 1
-}
-
-progress {
-  vertical-align: baseline; // Add the correct vertical alignment in Chrome, Firefox, and Opera.
-}
-
-// Correct the cursor style of increment and decrement buttons in Chrome.
-[type="number"]::-webkit-inner-spin-button,
-[type="number"]::-webkit-outer-spin-button {
-  height: auto;
-}
-
-[type="search"] {
-  // This overrides the extra rounded corners on search inputs in iOS so that our
-  // `.form-control` class can properly style them. Note that this cannot simply
-  // be added to `.form-control` as it's not specific enough. For details, see
-  // https://github.com/twbs/bootstrap/issues/11586.
-  outline-offset: -2px; // 2. Correct the outline style in Safari.
-  -webkit-appearance: none;
-}
-
-//
-// Remove the inner padding and cancel buttons in Chrome and Safari on macOS.
-//
-
-[type="search"]::-webkit-search-cancel-button,
-[type="search"]::-webkit-search-decoration {
-  -webkit-appearance: none;
-}
-
-//
-// 1. Correct the inability to style clickable types in iOS and Safari.
-// 2. Change font properties to `inherit` in Safari.
-//
-
-::-webkit-file-upload-button {
-  font: inherit; // 2
-  -webkit-appearance: button; // 1
-}
-
-//
-// Correct element displays
-//
-
-output {
-  display: inline-block;
-}
-
-summary {
-  display: list-item; // Add the correct display in all browsers
-}
-
-template {
-  display: none; // Add the correct display in IE
-}
-
-// Always hide an element with the `hidden` HTML attribute (from PureCSS).
-// Needed for proper display in IE 10-.
-[hidden] {
-  display: none !important;
-}
diff --git a/assets/scss/_root.scss b/assets/scss/_root.scss
deleted file mode 100644
index ad550df..0000000
--- a/assets/scss/_root.scss
+++ /dev/null
@@ -1,19 +0,0 @@
-:root {
-  // Custom variable values only support SassScript inside `#{}`.
-  @each $color, $value in $colors {
-    --#{$color}: #{$value};
-  }
-
-  @each $color, $value in $theme-colors {
-    --#{$color}: #{$value};
-  }
-
-  @each $bp, $value in $grid-breakpoints {
-    --breakpoint-#{$bp}: #{$value};
-  }
-
-  // Use `inspect` for lists so that quoted items keep the quotes.
-  // See https://github.com/sass/sass/issues/2383#issuecomment-336349172
-  --font-family-sans-serif: #{inspect($font-family-sans-serif)};
-  --font-family-monospace: #{inspect($font-family-monospace)};
-}
diff --git a/assets/scss/_sidebar.scss b/assets/scss/_sidebar.scss
deleted file mode 100644
index 385cb8c..0000000
--- a/assets/scss/_sidebar.scss
+++ /dev/null
@@ -1,166 +0,0 @@
-// stylelint-disable declaration-no-important
-
-//
-// Right side table of contents
-//
-
-.bd-toc {
-  @supports (position: sticky) {
-    position: sticky;
-    top: 4rem;
-    height: calc(100vh - 4rem);
-    overflow-y: auto;
-  }
-  order: 2;
-  padding-top: 1.5rem;
-  padding-bottom: 1.5rem;
-  font-size: .875rem;
-}
-
-.section-nav {
-  padding-left: 0;
-  border-left: 1px solid #eee;
-
-  ul {
-    padding-left: 1rem;
-
-    ul {
-      display: none;
-    }
-  }
-}
-
-.toc-entry {
-  display: block;
-
-  a {
-    display: block;
-    padding: .125rem 1.5rem;
-    color: #99979c;
-
-    &:hover {
-      color: $blue;
-      text-decoration: none;
-    }
-  }
-}
-
-//
-// Left side navigation
-//
-
-.bd-sidebar {
-  order: 0;
-  // background-color: #f5f2f9;
-  border-bottom: 1px solid rgba(0, 0, 0, .1);
-
-  @include media-breakpoint-up(md) {
-    @supports (position: sticky) {
-      position: sticky;
-      top: 4rem;
-      z-index: 1000;
-      height: calc(100vh - 4rem);
-    }
-    border-right: 1px solid rgba(0, 0, 0, .1);
-  }
-
-  @include media-breakpoint-up(xl) {
-    max-width: 320px;
-  }
-}
-
-.bd-links {
-  padding-top: 1rem;
-  padding-bottom: 1rem;
-  margin-right: -15px;
-  margin-left: -15px;
-
-  @include media-breakpoint-up(md) {
-    @supports (position: sticky) {
-      max-height: calc(100vh - 9rem);
-      overflow-y: auto;
-    }
-  }
-
-  // Override collapse behaviors
-  @include media-breakpoint-up(md) {
-    display: block !important;
-  }
-}
-
-.bd-search {
-  position: relative; // To contain the Algolia search
-  padding: 1rem 15px;
-  margin-right: -15px;
-  margin-left: -15px;
-  border-bottom: 1px solid rgba(0, 0, 0, .05);
-
-  .form-control:focus {
-    border-color: $bd-purple-bright;
-    box-shadow: 0 0 0 3px rgba($bd-purple-bright, .25);
-  }
-}
-
-.bd-search-docs-toggle {
-  line-height: 1;
-  color: $gray-900;
-}
-
-.bd-sidenav {
-  display: none;
-}
-
-.bd-toc-link {
-  display: block;
-  padding: .25rem 1.5rem;
-  font-weight: 500;
-  color: rgba(0, 0, 0, .65);
-
-  &:hover {
-    color: rgba(0, 0, 0, .85);
-    text-decoration: none;
-  }
-}
-
-.bd-toc-item {
-  &.active {
-    margin-bottom: 1rem;
-
-    &:not(:first-child) {
-      margin-top: 1rem;
-    }
-
-    > .bd-toc-link {
-      color: rgba(0, 0, 0, .85);
-
-      &:hover {
-        background-color: transparent;
-      }
-    }
-
-    > .bd-sidenav {
-      display: block;
-    }
-  }
-}
-
-// All levels of nav
-.bd-sidebar .nav > li > a {
-  display: block;
-  padding: .25rem 1.5rem;
-  font-size: 90%;
-  color: rgba(0, 0, 0, .65);
-}
-
-.bd-sidebar .nav > li > a:hover {
-  color: rgba(0, 0, 0, .85);
-  text-decoration: none;
-  background-color: transparent;
-}
-
-.bd-sidebar .nav > .active > a,
-.bd-sidebar .nav > .active:hover > a {
-  font-weight: 500;
-  color: rgba(0, 0, 0, .85);
-  background-color: transparent;
-}
diff --git a/assets/scss/_tables.scss b/assets/scss/_tables.scss
deleted file mode 100644
index 6bd0b91..0000000
--- a/assets/scss/_tables.scss
+++ /dev/null
@@ -1,180 +0,0 @@
-//
-// Basic Bootstrap table
-//
-
-.table {
-  width: 100%;
-  max-width: 100%;
-  margin-bottom: $spacer;
-  background-color: $table-bg; // Reset for nesting within parents with `background-color`.
-
-  th,
-  td {
-    padding: $table-cell-padding;
-    vertical-align: top;
-    border-top: $table-border-width solid $table-border-color;
-  }
-
-  thead th {
-    vertical-align: bottom;
-    border-bottom: (2 * $table-border-width) solid $table-border-color;
-  }
-
-  tbody + tbody {
-    border-top: (2 * $table-border-width) solid $table-border-color;
-  }
-
-  .table {
-    background-color: $body-bg;
-  }
-}
-
-
-//
-// Condensed table w/ half padding
-//
-
-.table-sm {
-  th,
-  td {
-    padding: $table-cell-padding-sm;
-  }
-}
-
-
-// Bordered version
-//
-// Add borders all around the table and between all the columns.
-
-.table-bordered {
-  border: $table-border-width solid $table-border-color;
-
-  th,
-  td {
-    border: $table-border-width solid $table-border-color;
-  }
-
-  thead {
-    th,
-    td {
-      border-bottom-width: (2 * $table-border-width);
-    }
-  }
-}
-
-
-// Zebra-striping
-//
-// Default zebra-stripe styles (alternating gray and transparent backgrounds)
-
-.table-striped {
-  tbody tr:nth-of-type(odd) {
-    background-color: $table-accent-bg;
-  }
-}
-
-
-// Hover effect
-//
-// Placed here since it has to come after the potential zebra striping
-
-.table-hover {
-  tbody tr {
-    @include hover {
-      background-color: $table-hover-bg;
-    }
-  }
-}
-
-
-// Table backgrounds
-//
-// Exact selectors below required to override `.table-striped` and prevent
-// inheritance to nested tables.
-
- at each $color, $value in $theme-colors {
-  @include table-row-variant($color, theme-color-level($color, -9));
-}
-
- at include table-row-variant(active, $table-active-bg);
-
-
-// Dark styles
-//
-// Same table markup, but inverted color scheme: dark background and light text.
-
-// stylelint-disable-next-line no-duplicate-selectors
-.table {
-  .thead-dark {
-    th {
-      color: $table-dark-color;
-      background-color: $table-dark-bg;
-      border-color: $table-dark-border-color;
-    }
-  }
-
-  .thead-light {
-    th {
-      color: $table-head-color;
-      background-color: $table-head-bg;
-      border-color: $table-border-color;
-    }
-  }
-}
-
-.table-dark {
-  color: $table-dark-color;
-  background-color: $table-dark-bg;
-
-  th,
-  td,
-  thead th {
-    border-color: $table-dark-border-color;
-  }
-
-  &.table-bordered {
-    border: 0;
-  }
-
-  &.table-striped {
-    tbody tr:nth-of-type(odd) {
-      background-color: $table-dark-accent-bg;
-    }
-  }
-
-  &.table-hover {
-    tbody tr {
-      @include hover {
-        background-color: $table-dark-hover-bg;
-      }
-    }
-  }
-}
-
-
-// Responsive tables
-//
-// Generate series of `.table-responsive-*` classes for configuring the screen
-// size of where your table will overflow.
-
-.table-responsive {
-  @each $breakpoint in map-keys($grid-breakpoints) {
-    $next: breakpoint-next($breakpoint, $grid-breakpoints);
-    $infix: breakpoint-infix($next, $grid-breakpoints);
-
-    &#{$infix} {
-      @include media-breakpoint-down($breakpoint) {
-        display: block;
-        width: 100%;
-        overflow-x: auto;
-        -webkit-overflow-scrolling: touch;
-        -ms-overflow-style: -ms-autohiding-scrollbar; // See https://github.com/twbs/bootstrap/pull/10057
-
-        // Prevent double border on horizontal scroll due to use of `display: block;`
-        &.table-bordered {
-          border: 0;
-        }
-      }
-    }
-  }
-}
diff --git a/assets/scss/_tooltip.scss b/assets/scss/_tooltip.scss
deleted file mode 100644
index 7b5db1c..0000000
--- a/assets/scss/_tooltip.scss
+++ /dev/null
@@ -1,107 +0,0 @@
-// Base class
-.tooltip {
-  position: absolute;
-  z-index: $zindex-tooltip;
-  display: block;
-  margin: $tooltip-margin;
-  // Our parent element can be arbitrary since tooltips are by default inserted as a sibling of their target element.
-  // So reset our font and text properties to avoid inheriting weird values.
-  @include reset-text();
-  font-size: $font-size-sm;
-  // Allow breaking very long words so they don't overflow the tooltip's bounds
-  word-wrap: break-word;
-  opacity: 0;
-
-  &.show { opacity: $tooltip-opacity; }
-
-  .arrow {
-    position: absolute;
-    display: block;
-    width: $tooltip-arrow-width;
-    height: $tooltip-arrow-height;
-  }
-
-  .arrow::before {
-    position: absolute;
-    border-color: transparent;
-    border-style: solid;
-  }
-
-  &.bs-tooltip-top {
-    padding: $tooltip-arrow-width 0;
-    .arrow {
-      bottom: 0;
-    }
-
-    .arrow::before {
-      margin-left: -($tooltip-arrow-width - 2);
-      content: "";
-      border-width: $tooltip-arrow-width $tooltip-arrow-width 0;
-      border-top-color: $tooltip-arrow-color;
-    }
-  }
-  &.bs-tooltip-right {
-    padding: 0 $tooltip-arrow-width;
-    .arrow {
-      left: 0;
-    }
-
-    .arrow::before {
-      margin-top: -($tooltip-arrow-width - 2);
-      content: "";
-      border-width: $tooltip-arrow-width $tooltip-arrow-width $tooltip-arrow-width 0;
-      border-right-color: $tooltip-arrow-color;
-    }
-  }
-  &.bs-tooltip-bottom {
-    padding: $tooltip-arrow-width 0;
-    .arrow {
-      top: 0;
-    }
-
-    .arrow::before {
-      margin-left: -($tooltip-arrow-width - 2);
-      content: "";
-      border-width: 0 $tooltip-arrow-width $tooltip-arrow-width;
-      border-bottom-color: $tooltip-arrow-color;
-    }
-  }
-  &.bs-tooltip-left {
-    padding: 0 $tooltip-arrow-width;
-    .arrow {
-      right: 0;
-    }
-
-    .arrow::before {
-      right: 0;
-      margin-top: -($tooltip-arrow-width - 2);
-      content: "";
-      border-width: $tooltip-arrow-width 0 $tooltip-arrow-width $tooltip-arrow-width;
-      border-left-color: $tooltip-arrow-color;
-    }
-  }
-  &.bs-tooltip-auto {
-    &[x-placement^="top"] {
-      @extend .bs-tooltip-top;
-    }
-    &[x-placement^="right"] {
-      @extend .bs-tooltip-right;
-    }
-    &[x-placement^="bottom"] {
-      @extend .bs-tooltip-bottom;
-    }
-    &[x-placement^="left"] {
-      @extend .bs-tooltip-left;
-    }
-  }
-}
-
-// Wrapper for the tooltip content
-.tooltip-inner {
-  max-width: $tooltip-max-width;
-  padding: $tooltip-padding-y $tooltip-padding-x;
-  color: $tooltip-color;
-  text-align: center;
-  background-color: $tooltip-bg;
-  @include border-radius($border-radius);
-}
diff --git a/assets/scss/_tor-variables.scss b/assets/scss/_tor-variables.scss
deleted file mode 100644
index fce8579..0000000
--- a/assets/scss/_tor-variables.scss
+++ /dev/null
@@ -1,62 +0,0 @@
-// Tor Main Color Palette
-$purple:      #7D4698 !default;
-$purple-dark: #59316B !default;
-$green:       #68B030 !default;
-$gray-dark:   #333A41 !default;
-$white:       #FFFFFF !default;
-$purple-darker: #401753 !default;
-
-// Other Colors
-$blue:    #007bff !default;
-$indigo:  #6610f2 !default;
-$pink:    #e83e8c !default;
-$red:     #EF243E !default;
-$orange:  #fd7e14 !default;
-$yellow:  #FFBF00 !default;
-$teal:    #20c997 !default;
-$cyan:    #00A5BB !default;
-
-$gray-100: #F8F9FA !default;
-$gray-200: #e9ecef !default;
-$gray-300: #dee2e6 !default;
-$gray-400: #ced4da !default;
-$gray-500: #adb5bd !default;
-$gray-600: #848E97 !default;
-$gray-700: #495057 !default;
-$gray-800: #333A41 !default;
-$gray-900: #212529 !default;
-$black:    #000 !default;
-
-$primary:       $purple !default;
-$secondary:     $gray-800 !default;
-$success:       $green !default;
-$info:          $cyan !default;
-$warning:       $yellow !default;
-$danger:        $red !default;
-$light:         $gray-100 !default;
-$dark:          $purple-dark !default;
-$darker:        $purple-darker !default;
-
-$navbar-dark-color:                 $white !default;
-$navbar-light-color:                $purple-dark !default;
-
-// Local docs variables
-$bd-purple:        #7D4698 !default;
-$bd-purple-bright: lighten(saturate($bd-purple, 5%), 15%) !default;
-$bd-purple-light:  lighten(saturate($bd-purple, 5%), 45%) !default;
-$bd-dark:          #59316B !default;
-$bd-download:      #ffe484 !default;
-$bd-info:          #5bc0de !default;
-$bd-warning:       #f0ad4e !default;
-$bd-danger:        #d9534f !default;
-
-// Fonts -  Source Sans Pro
-$font-family-sans:      "Source Sans Pro", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol" !default;
-$font-family-serif:     "Source Serif Pro", -apple-system, "Georgia", serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol" !default;
-$font-family-monospace: "Source Code Pro", Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace !default;
-$font-family-base:      $font-family-sans !default;
-
-$mark-bg:               $bd-purple-light;
-
-// Tables
-$table-accent-bg: $bd-purple-light;
diff --git a/assets/scss/_tor.scss b/assets/scss/_tor.scss
deleted file mode 100644
index 3d6b4c5..0000000
--- a/assets/scss/_tor.scss
+++ /dev/null
@@ -1,738 +0,0 @@
-/*
- * Base structure
- */
-
-/* Move down content because we have a fixed navbar that is 3.5rem tall */
-.page {
-  padding-top: 3.5rem;
-}
-
-/* Reset */
-
-.no-border {
-  border: none;
-}
-
-.no-background {
-  background-image: none !important;
-}
-
-.content-scroll {
-  position: relative;
-}
-
-.dropdown-select select {
-   -webkit-appearance: none;
-   -moz-appearance: none;
-   appearance: none; /* remove default arrow */
-}
-
-.dropdown-select:after {
-    content: '⏷';
-    position: absolute;
-    left: 85%;
-    right: 0;
-    top: 15%;
-    bottom: 0;
-    color: $white;
-}
-
-// Define darker background
-.bg-darker{
-  background-color: $purple-darker;
-}
-
-/*
- * Typography
- */
-
- at font-face {
-  font-family: Source Sans Pro;
-  src: url('fonts/SourceSansPro/SourceSansPro-Regular.ttf');
-}
-
- at font-face {
-  font-family: Source Sans Pro Light;
-  src: url('fonts/SourceSansPro/SourceSansPro-Light.ttf');
-}
-
- at font-face {
-  font-family: Source Sans Pro Bold;
-  src: url('fonts/SourceSansPro/SourceSansPro-Bold.ttf');
-}
-
- at font-face {
-  font-family: Source Serif Pro;
-  src: url('fonts/SourceSerifPro/SourceSerifPro-Regular.ttf');
-}
-
- at font-face {
-  font-family: Source Code Pro;
-  src: url('fonts/SourceCodePro/SourceCodePro-Regular.ttf');
-}
-
- at font-face {
-  font-family: Tor Icons;
-  src: url('fonts/TorIcons/tor-icons.eot?#iefix') format('embedded-opentype'),
-  url('fonts/TorIcons/tor-icons.woff2') format('woff2'),
-  url('fonsts/TorIcons/tor-icons.woff') format('woff'),
-  url('fonts/TorIcons/tor-icons.ttf') format('truetype'),
-  url('fonts/TorIcons/tor-icons.svg?#tor-icons') format('svg');
-}
-
-.ti:before {
-    font-family: Tor Icons !important;
-    font-style: normal;
-    font-weight: normal !important;
-    vertical-align: top;
-}
-
-.ti-authority:before {
-    content: "\f101";
-}
-.ti-badexit:before {
-    content: "\f102";
-}
-.ti-bridge:before {
-    content: "\f103";
-}
-.ti-country:before {
-    content: "\f104";
-}
-.ti-directory:before {
-    content: "\f105";
-}
-.ti-exit:before {
-    content: "\f106";
-}
-.ti-fallbackdir:before {
-    content: "\f107";
-}
-.ti-fast:before {
-    content: "\f108";
-}
-.ti-fingerprint:before {
-    content: "\f109";
-}
-.ti-guard:before {
-    content: "\f10a";
-}
-.ti-hibernating:before {
-    content: "\f10b";
-}
-.ti-hsdir:before {
-    content: "\f10c";
-}
-.ti-ipv4:before {
-    content: "\f10d";
-}
-.ti-ipv6:before {
-    content: "\f10e";
-}
-.ti-ipv6exit:before {
-    content: "\f10f";
-}
-.ti-noedconsensus:before {
-    content: "\f110";
-}
-.ti-notrecommended:before {
-    content: "\f111";
-}
-.ti-onion-alt:before {
-    content: "\f112";
-}
-.ti-onion:before {
-    content: "\f113";
-}
-.ti-reachableipv4:before {
-    content: "\f114";
-}
-.ti-reachableipv6:before {
-    content: "\f115";
-}
-.ti-relay:before {
-    content: "\f116";
-}
-.ti-running:before {
-    content: "\f117";
-}
-.ti-stable:before {
-    content: "\f118";
-}
-.ti-tshirt:before {
-    content: "\f119";
-}
-.ti-unmeasured:before {
-    content: "\f11a";
-}
-.ti-unreachableipv4:before {
-    content: "\f11b";
-}
-.ti-unreachableipv6:before {
-    content: "\f11c";
-}
-.ti-v2dir:before {
-    content: "\f11d";
-}
-.ti-valid:before {
-    content: "\f11e";
-}
-
-.display-1,
-.display-2,
-.display-3,
-.display-4 {
-    font-family: Source Sans Pro Light;
-}
-
-.font-family-serif {
-  font-family: $font-family-serif !important;
-}
-.font-weight-light {
-  font-family: Source Sans Pro Light
-}
-.font-weight-bold {
-  font-family: Source Sans Pro Bold
- }
-
-small, .small{
-  font-size: 90%;
-}
-
-h6 {
-  text-transform: none !important;
-  font-weight: bold;
-  color: $purple;
-}
-p {
-  font-size: 1.3rem; // We need at least 18px minuim +_+
-  color: $gray-900;
-  line-height: 2rem;
-}
-.display-5 {
-  font-size: 1.5em;
-}
-.display-6 {
-  font-size: 1.3em
-}
-mark, .mark {
-  color: $purple;
-}
-
-.bd-sidebar{
-  border: 0 !important;
-}
-.bd-toc{
-  order: 0 !important;
-}
-
-#components-nav .nav-pills .nav-link,
-#visuals-nav .nav-pills .nav-link{
-  border-radius: 0;
-}
-#components-nav .nav-pills .nav-link.active,
-#visuals-nav .nav-pills .nav-link.active{
-  background-color: $white;
-  color: $purple;
-  border-left: 2px solid $purple;
-  font-weight: bold;
-}
-
-/*
- * Nav
- */
-.navbar {
-  background-image: url('./images/onion-bg.svg');
-  background-repeat: no-repeat;
-  background-position: 10px 12px;
-}
-
-.navbar-brand {
-  span {
-    font-size: 0.6em;
-    display: flex;
-  }
-}
-
-.nav-link {
-    display: block;
-    padding: 1rem;
-}
-
-/*
- * Sidebar
- */
-
-.sidetopics {
-  z-index: 1000;
-  padding: 20px 0;
-  border-right: 1px solid #eee;
-}
-
-.sidetopics .nav {
-  margin-bottom: 20px;
-}
-
-.sidetopics .nav-item {
-  width: 100%;
-}
-
-.sidetopics .nav-item + .nav-item {
-  margin-left: 0;
-}
-
-.sidetopics .nav-link {
-  border-radius: 0;
-}
-
-.toc-h4 {
-  padding-left: 0.8em;
-  font-size: 0.9em;
-}
-
-// Styleguide Nav Update
-
-// All levels of nav
-.bd-sidebar .nav > li > a {
-  font-size: 100%;
-  color: rgba(0, 0, 0, .85);
-}
-
-.bd-sidebar .nav > li > a:hover {
-  color: $purple !important;
-  text-decoration: none;
-}
-
-#bd-docs-nav{
-  padding-top: 2rem;
-}
-
-.dropdown{
-  display: block;
-}
-
-.dropdown-menu {
-    margin: 0;
-    display: none;
-}
-
-.dropdown:hover .dropdown-menu {
-    display: block;
-    overflow-y: scroll;
-    max-height: 350px;
-}
-
-.dropdown .btn {
-    border-radius: 0;
-}
-
-.btn {text-transform: none !important;}
-
-label {
-  cursor: pointer;
-}
-
-#menu-toggle {
-  display: none; /* hide the checkbox */
-}
-
-#nav-toggle {
-  display: none; /* hide the checkbox */
-}
-
-.side-toggler {
-  float:right !important;
-}
-
-#menu-toggle:checked + .burger-menu {
-  display: block;
-}
-
-#nav-toggle:checked + .hamburger-menu {
-  display: block;
-}
-
-.navbar-toggler:hover .chevron-up {
-    display: block !important;
-}
-
-.navbar-toggler:hover .chevron-down {
-    display: none;
-}
-
-a.side-nav.active {
-    color: $primary !important;
-}
-
-.smalltopics {
-    display: none;
-}
-
-.chevron {
-    height: 50px;
-    width: 50px;
-    margin: -10px -1px 1px -1px;
-}
-
-.chevron-up {
-    display: none !important;
-    top: 10px !important;
-}
-
-.chevron-down {
-    display: block;
-    top: 10px !important;
-}
-
-/*
- * Dashboard
- */
-
-/* Placeholders */
-.placeholders {
-  padding-bottom: 3rem;
-}
-
-.placeholder img {
-  padding-top: 1.5rem;
-  padding-bottom: 1.5rem;
-}
-
-/*
- * Forms
- */
-.form-wide {
-  width: 100% !important;
-
-  input {
-    padding: 20px !important;
-  }
-}
-
-//
-// Text variations
-//
-
-.text-tpo {
-  font-family: $font-family-sans;
-  font-size: 1.1rem;
-  font-weight: 400;
-  line-height: 1.7rem;
-}
-
-
-//
-// Badges
-//
-.badge{
-  text-transform: none !important;
-}
-
-//
-// Breadcrumbs
-//
-.breadcrumb{
-  background-color: $white;
-}
-
-//
-// Cards
-//
-.card-body p{
-  font-size: 1.1rem;
-  line-height: 1.7rem;
-}
-
-//
-// Tables
-//
-.table-striped td{
-  border: 0 !important;
-}
-
-//
-// Callouts
-//
-.bd-callout {
-  padding: 1.25rem;
-  margin-top: 1.25rem;
-  margin-bottom: 1.25rem;
-  border: 1px solid #eee;
-  border-left-width: .25rem;
-  border-radius: .25rem;
-}
-
-.bd-callout h4 {
-  margin-top: 0;
-  margin-bottom: .25rem;
-}
-
-.bd-callout p:last-child {
-  margin-bottom: 0;
-}
-
-.bd-callout code {
-  border-radius: .25rem;
-}
-
-.bd-callout + .bd-callout {
-  margin-top: -.25rem;
-}
-
-// Images
-
-.image-thumb {
-  object-fit: cover;
-  width: 100px;
-  height: 100px;
-}
-
-// Variations
- at mixin bs-callout-variant($color) {
-  border-left-color: $color;
-
-  h4 { color: $color; }
-}
-
-.bd-callout-info { @include bs-callout-variant($bd-info); }
-.bd-callout-warning { @include bs-callout-variant($bd-warning); }
-.bd-callout-danger { @include bs-callout-variant($bd-danger); }
-
-// Styleguide Nav Update
-
-// All levels of nav
-.bd-sidebar .nav > li > a {
-  color: rgba(0, 0, 0, .85);
-}
-
-.bd-sidebar .nav > li > a:hover {
-  color: $purple !important;
-  text-decoration: none;
-}
-
-#bd-docs-nav{
-  padding-top: 2rem;
-}
-
-// stylelint-disable declaration-block-single-line-max-declarations
-
-.hll { background-color: #ffc; }
-.c { color: #999; }
-.k { color: #069; }
-.o { color: #555; }
-.cm { color: #999; }
-.cp { color: #099; }
-.c1 { color: #999; }
-.cs { color: #999; }
-.gd { background-color: #fcc; border: 1px solid #c00; }
-.ge { font-style: italic; }
-.gr { color: #f00; }
-.gh { color: #030; }
-.gi { background-color: #cfc; border: 1px solid #0c0; }
-.go { color: #aaa; }
-.gp { color: #009; }
-.gu { color: #030; }
-.gt { color: #9c6; }
-.kc { color: #069; }
-.kd { color: #069; }
-.kn { color: #069; }
-.kp { color: #069; }
-.kr { color: #069; }
-.kt { color: #078; }
-.m { color: #f60; }
-.s { color: #d44950; }
-.na { color: #4f9fcf; }
-.nb { color: #366; }
-.nc { color: #0a8; }size
-.no { color: #360; }
-.nd { color: #99f; }
-.ni { color: #999; }
-.ne { color: #c00; }
-.nf { color: #c0f; }
-.nl { color: #99f; }
-.nn { color: #0cf; }
-.nt { color: #2f6f9f; }
-.nv { color: #033; }
-.ow { color: #000; }
-.w { color: #bbb; }
-.mf { color: #f60; }
-.mh { color: #f60; }
-.mi { color: #f60; }
-.mo { color: #f60; }
-.sb { color: #c30; }
-.sc { color: #c30; }
-.sd { font-style: italic; color: #c30; }
-.s2 { color: #c30; }
-.se { color: #c30; }
-.sh { color: #c30; }
-.si { color: #a00; }
-.sx { color: #c30; }
-.sr { color: #3aa; }
-.s1 { color: #c30; }
-.ss { color: #fc3; }
-.bp { color: #366; }
-.vc { color: #033; }
-.vg { color: #033; }
-.vi { color: #033; }
-.il { color: #f60; }
-
-.css .o,
-.css .o + .nt,
-.css .nt + .nt { color: #999; }
-
-.language-bash::before,
-.language-sh::before {
-  color: #009;
-  content: "$ ";
-  user-select: none;
-}
-
-.language-powershell::before {
-  color: #009;
-  content: "PM> ";
-  user-select: none;
-}
-
-.text-primary-light {
-  color: $bd-purple-light;
-}
-
-.dropdown{
-  display: block;
-}
-
-.dropdown-menu {
-    display: none;
-}
-
-.dropdown:hover .dropdown-menu {
-    display: block;
-}
-
-.mobile {
-    display: none !important;
-}
-
-// Small devices (landscape phones, less than 768px)
- at include media-breakpoint-down(sm) {
-    .mobile {
-        display: block !important;
-	      padding-top: 50px;
-    }
-
-    .display-1 {
-      font-size: 4rem;
-    }
-
-    .display-2 {
-      font-size: 3.5rem;
-    }
-
-    .display-3{
-      font-size: 2.5rem;
-    }
-
-    .display-4{
-      font-size: 2rem;
-    }
-
-}
-
-// Footer //
-
-.footer a.nav-link {
-  padding: 0.2rem;
-}
-footer .border{
-  border: 0 !important;
-  border-bottom: 1px solid rgba(255,255,255,0.3) !important;
-}
-.footer a.nav-link {
-  padding: 0.2rem;
-}
-
-label {
-  cursor: pointer;
-}
-
-#menu-toggle {
-  display: none; /* hide the checkbox */
-}
-
-#nav-toggle {
-  display: none; /* hide the checkbox */
-}
-
-.side-toggler {
-  float:right !important;
-}
-
-#menu-toggle:checked + .burger-menu {
-  display: block;
-}
-
-#nav-toggle:checked + .hamburger-menu {
-  display: block;
-}
-
-.navbar-toggler:hover .chevron-up {
-  display: block !important;
-}
-
-.navbar-toggler:hover .chevron-down {
-  display: none;
-}
-
-
-a.side-nav.active {
-  color: $primary !important;
-}
-
-.smalltopics {
-  display: none;
-}
-
-.chevron {
-  height: 50px;
-  width: 50px;
-  margin: -10px -1px 1px -1px;
-}
-
-.chevron-up {
-  display: none !important;
-  top: 10px !important;
-}
-.chevron-down {
-  display: block;
-  top: 10px !important;
-}
-
-
-// Small devices (landscape phones, less than 768px)
- at include media-breakpoint-down(sm) {
-  nav.sidetopics {
-    display: none !important;
-    visibility: hidden !important;
-  }
-
-  nav.smalltopics {
-    display: block;
-    width:100%;
-    position: sticky;
-    padding-top: inherit;
-  }
-}
-
-
-// Tablet and Mobile menu
- at include media-breakpoint-down(md) {
-  .nav-link {
-    padding-bottom: 1rem;
-    padding-top: 2rem;
-    font-size: 150%;
-  }
-}
-
-.no-gutters {
-  margin-bottom: 0 !important;
-}
diff --git a/assets/scss/_tpo.scss b/assets/scss/_tpo.scss
deleted file mode 100644
index 1f1481f..0000000
--- a/assets/scss/_tpo.scss
+++ /dev/null
@@ -1,145 +0,0 @@
-/* TPO Styles
-*
-*/
-
-#sidenav-topics .nav-pills .nav-link.active, .nav-pills .show > .nav-link {
-    color: #7D4698;
-    background-color: #fff;
-    font-weight: bold;
-}
-
-#wrapper {
-  width: 100%;
-  position: relative !important;
-  bottom: 0;
-}
-
-.shape {
-  padding: 35%;
-}
-
-.section-nav {
-  padding-top: 0 !important;
-  border: 0 !important;
-}
-
-.toc-entry a:hover {
-  color: $purple !important;
-}
-
-.footer {
-  position: relative;
-  z-index:99999999999;
-  a.text-light:hover {
-    color: #fff !important;
-  }
-}
-
-.footer a.nav-link {
-  padding: 0.2rem;
-}
-
-footer .border{
-  border: 0 !important;
-  border-bottom: 1px solid rgba(255,255,255,0.3) !important;
-}
-
-main{
-  padding-bottom: 5em;
-}
-
-.window-bg {
-  background-image: url("images/tb85/tb85 at 2x.png");
-  background-repeat: no-repeat;
-  background-size: cover;
-}
-
-.onion-bg{
-  background: url("images/circle-pattern.png");
-  background-color: rgba(0, 0, 0, 0);
-  background-position-x: -85%;
-  background-repeat: no-repeat;
-  background-size: 65%;
-}
-
-.btn-shadow {
-  box-shadow: 0 2px 0 0 rgba(0, 0, 0, 0.20000000298023224);
-  opacity: 0.8;
-  border: 2px solid #FFFFFF;
-  border-radius: 2px;
- }
-
- .oval {
-  background-color: #D8D8D8;
-  border-radius: 100%;
-  width: 390px;
-  height: 390px;
-}
-
- .oval-2 {
-  background-color: #D8D8D8;
-  border-radius: 100%;
-  width: 150px;
-  height: 150px;
-}
-
-.oval-3 {
-    background-color: #D8D8D8;
-    border-radius: 100%;
-    width: 50px;
-    height: 50px;
-}
-
-.oval-2 i{
-   font-size: 5em;
-   padding: 0.4em 0.5em;
-   text-align: center;
- }
-
-.oval-3 i {
-  padding: 1em;
-}
-
-.oval-right {
-  float: right;
-}
-
-.hero > p{
-  color: #484848;
-  font-family: Source Sans Pro Light;
-  font-size: 4.5rem;
-  line-height: 5rem;
-  text-align: left;
-}
-
-.row--limit-overflow {
-  position: relative;
-  overflow: hidden;
-  width: 100vw;
-  left: -($grid-gutter-width/2);
-}
-
-
- at include media-breakpoint-down(sm) {
-   .display-4 {
-     font-size: 2rem;
-   }
-   .toc-entry a {
-       display: block;
-       padding: 0.4rem 0 !important;
-       font-size: 1.3rem;
-   }
-  .window-bg,
-  .onion-bg {
-      background: none;
-  }
-  .hero > p{
-    font-size: 2.5rem;
-    line-height: 3rem;
-  }
- }
-
- at include media-breakpoint-up(md) {
-
-}
- at include media-breakpoint-up(lg) {}
diff --git a/assets/scss/_transitions.scss b/assets/scss/_transitions.scss
deleted file mode 100644
index df5744b..0000000
--- a/assets/scss/_transitions.scss
+++ /dev/null
@@ -1,36 +0,0 @@
-// stylelint-disable selector-no-qualifying-type
-
-.fade {
-  opacity: 0;
-  @include transition($transition-fade);
-
-  &.show {
-    opacity: 1;
-  }
-}
-
-.collapse {
-  display: none;
-  &.show {
-    display: block;
-  }
-}
-
-tr {
-  &.collapse.show {
-    display: table-row;
-  }
-}
-
-tbody {
-  &.collapse.show {
-    display: table-row-group;
-  }
-}
-
-.collapsing {
-  position: relative;
-  height: 0;
-  overflow: hidden;
-  @include transition($transition-collapse);
-}
diff --git a/assets/scss/_type.scss b/assets/scss/_type.scss
deleted file mode 100644
index b1b8f61..0000000
--- a/assets/scss/_type.scss
+++ /dev/null
@@ -1,125 +0,0 @@
-// stylelint-disable declaration-no-important, selector-list-comma-newline-after
-
-//
-// Headings
-//
-
-h1, h2, h3, h4, h5, h6,
-.h1, .h2, .h3, .h4, .h5, .h6 {
-  margin-bottom: $headings-margin-bottom;
-  font-family: $headings-font-family;
-  font-weight: $headings-font-weight;
-  line-height: $headings-line-height;
-  color: $headings-color;
-}
-
-h1, .h1 { font-size: $h1-font-size; }
-h2, .h2 { font-size: $h2-font-size; }
-h3, .h3 { font-size: $h3-font-size; }
-h4, .h4 { font-size: $h4-font-size; }
-h5, .h5 { font-size: $h5-font-size; }
-h6, .h6 { font-size: $h6-font-size; }
-
-.lead {
-  font-size: $lead-font-size;
-  font-weight: $lead-font-weight;
-}
-
-// Type display classes
-.display-1 {
-  font-size: $display1-size;
-  font-weight: $display1-weight;
-  line-height: $display-line-height;
-}
-.display-2 {
-  font-size: $display2-size;
-  font-weight: $display2-weight;
-  line-height: $display-line-height;
-}
-.display-3 {
-  font-size: $display3-size;
-  font-weight: $display3-weight;
-  line-height: $display-line-height;
-}
-.display-4 {
-  font-size: $display4-size;
-  font-weight: $display4-weight;
-  line-height: $display-line-height;
-}
-
-
-//
-// Horizontal rules
-//
-
-hr {
-  margin-top: 1rem;
-  margin-bottom: 1rem;
-  border: 0;
-  border-top: $hr-border-width solid $hr-border-color;
-}
-
-
-//
-// Emphasis
-//
-
-small,
-.small {
-  font-size: $small-font-size;
-  font-weight: $font-weight-normal;
-}
-
-mark,
-.mark {
-  padding: $mark-padding;
-  background-color: $mark-bg;
-}
-
-
-//
-// Lists
-//
-
-.list-unstyled {
-  @include list-unstyled;
-}
-
-// Inline turns list items into inline-block
-.list-inline {
-  @include list-unstyled;
-}
-.list-inline-item {
-  display: inline-block;
-
-  &:not(:last-child) {
-    margin-right: $list-inline-padding;
-  }
-}
-
-
-//
-// Misc
-//
-
-// Builds on `abbr`
-.initialism {
-  font-size: 90%;
-  text-transform: uppercase;
-}
-
-// Blockquotes
-.blockquote {
-  margin-bottom: $spacer;
-  font-size: $blockquote-font-size;
-}
-
-.blockquote-footer {
-  display: block;
-  font-size: 80%; // back to default font-size
-  color: $blockquote-small-color;
-
-  &::before {
-    content: "\2014 \00A0"; // em dash, nbsp
-  }
-}
diff --git a/assets/scss/_utilities.scss b/assets/scss/_utilities.scss
deleted file mode 100644
index 7b2a1eb..0000000
--- a/assets/scss/_utilities.scss
+++ /dev/null
@@ -1,14 +0,0 @@
- at import "utilities/align";
- at import "utilities/background";
- at import "utilities/borders";
- at import "utilities/clearfix";
- at import "utilities/display";
- at import "utilities/embed";
- at import "utilities/flex";
- at import "utilities/float";
- at import "utilities/position";
- at import "utilities/screenreaders";
- at import "utilities/sizing";
- at import "utilities/spacing";
- at import "utilities/text";
- at import "utilities/visibility";
diff --git a/assets/scss/_variables.scss b/assets/scss/_variables.scss
deleted file mode 100644
index 0fcb36d..0000000
--- a/assets/scss/_variables.scss
+++ /dev/null
@@ -1,828 +0,0 @@
-// Variables
-//
-// Variables should follow the `$component-state-property-size` formula for
-// consistent naming. Ex: $nav-link-disabled-color and $modal-content-box-shadow-xs.
-
-
-//
-// Color system
-//
-
-// stylelint-disable
-$white:    #fff !default;
-$gray-100: #f8f9fa !default;
-$gray-200: #e9ecef !default;
-$gray-300: #dee2e6 !default;
-$gray-400: #ced4da !default;
-$gray-500: #adb5bd !default;
-$gray-600: #868e96 !default;
-$gray-700: #495057 !default;
-$gray-800: #343a40 !default;
-$gray-900: #212529 !default;
-$black:    #000 !default;
-
-$grays: () !default;
-$grays: map-merge((
-  "100": $gray-100,
-  "200": $gray-200,
-  "300": $gray-300,
-  "400": $gray-400,
-  "500": $gray-500,
-  "600": $gray-600,
-  "700": $gray-700,
-  "800": $gray-800,
-  "900": $gray-900
-), $grays);
-
-$blue:    #007bff !default;
-$indigo:  #6610f2 !default;
-$purple:  #6f42c1 !default;
-$pink:    #e83e8c !default;
-$red:     #dc3545 !default;
-$orange:  #fd7e14 !default;
-$yellow:  #ffc107 !default;
-$green:   #28a745 !default;
-$teal:    #20c997 !default;
-$cyan:    #17a2b8 !default;
-
-$colors: () !default;
-$colors: map-merge((
-  "blue":       $blue,
-  "indigo":     $indigo,
-  "purple":     $purple,
-  "pink":       $pink,
-  "red":        $red,
-  "orange":     $orange,
-  "yellow":     $yellow,
-  "green":      $green,
-  "teal":       $teal,
-  "cyan":       $cyan,
-  "white":      $white,
-  "gray":       $gray-600,
-  "gray-dark":  $gray-800
-), $colors);
-
-$primary:       $blue !default;
-$secondary:     $gray-600 !default;
-$success:       $green !default;
-$info:          $cyan !default;
-$warning:       $yellow !default;
-$danger:        $red !default;
-$light:         $gray-100 !default;
-$dark:          $gray-800 !default;
-
-$theme-colors: () !default;
-$theme-colors: map-merge((
-  "primary":    $primary,
-  "secondary":  $secondary,
-  "success":    $success,
-  "info":       $info,
-  "warning":    $warning,
-  "danger":     $danger,
-  "light":      $light,
-  "dark":       $dark
-), $theme-colors);
-// stylelint-enable
-
-// Set a specific jump point for requesting color jumps
-$theme-color-interval:      8% !default;
-
-
-// Options
-//
-// Quickly modify global styling by enabling or disabling optional features.
-
-$enable-caret:              true !default;
-$enable-rounded:            true !default;
-$enable-shadows:            false !default;
-$enable-gradients:          false !default;
-$enable-transitions:        true !default;
-$enable-hover-media-query:  false !default;
-$enable-grid-classes:       true !default;
-$enable-print-styles:       true !default;
-
-
-// Spacing
-//
-// Control the default styling of most Bootstrap elements by modifying these
-// variables. Mostly focused on spacing.
-// You can add more entries to the $spacers map, should you need more variation.
-
-$spacer: 1rem !default;
-$spacers: (
-  0: 0,
-  1: ($spacer * .25),
-  2: ($spacer * .5),
-  3: $spacer,
-  4: ($spacer * 1.5),
-  5: ($spacer * 3)
-) !default;
-
-// This variable affects the `.h-*` and `.w-*` classes.
-$sizes: (
-  25: 25%,
-  50: 50%,
-  75: 75%,
-  100: 100%
-) !default;
-
-// Body
-//
-// Settings for the `<body>` element.
-
-$body-bg:                   $white !default;
-$body-color:                $gray-900 !default;
-
-// Links
-//
-// Style anchor elements.
-
-$link-color:                theme-color("primary") !default;
-$link-decoration:           none !default;
-$link-hover-color:          darken($link-color, 15%) !default;
-$link-hover-decoration:     underline !default;
-
-// Paragraphs
-//
-// Style p element.
-
-$paragraph-margin-bottom:   1rem !default;
-
-
-// Grid breakpoints
-//
-// Define the minimum dimensions at which your layout will change,
-// adapting to different screen sizes, for use in media queries.
-
-$grid-breakpoints: (
-  xs: 0,
-  sm: 576px,
-  md: 768px,
-  lg: 992px,
-  xl: 1200px
-) !default;
-
- at include _assert-ascending($grid-breakpoints, "$grid-breakpoints");
- at include _assert-starts-at-zero($grid-breakpoints);
-
-
-// Grid containers
-//
-// Define the maximum width of `.container` for different screen sizes.
-
-$container-max-widths: (
-  sm: 540px,
-  md: 720px,
-  lg: 960px,
-  xl: 1140px
-) !default;
-
- at include _assert-ascending($container-max-widths, "$container-max-widths");
-
-
-// Grid columns
-//
-// Set the number of columns and specify the width of the gutters.
-
-$grid-columns:                12 !default;
-$grid-gutter-width:           30px !default;
-
-// Components
-//
-// Define common padding and border radius sizes and more.
-
-$line-height-lg:              1.5 !default;
-$line-height-sm:              1.5 !default;
-
-$border-width:                1px !default;
-$border-color:                $gray-200 !default;
-
-$border-radius:               .25rem !default;
-$border-radius-lg:            .3rem !default;
-$border-radius-sm:            .2rem !default;
-
-$component-active-color:      $white !default;
-$component-active-bg:         theme-color("primary") !default;
-
-$caret-width:                 .3em !default;
-
-$transition-base:             all .2s ease-in-out !default;
-$transition-fade:             opacity .15s linear !default;
-$transition-collapse:         height .35s ease !default;
-
-
-// Fonts
-//
-// Font, line-height, and color for body text, headings, and more.
-
-// stylelint-disable value-keyword-case
-$font-family-sans-serif:      -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol" !default;
-$font-family-monospace:       Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace !default;
-$font-family-base:            $font-family-sans-serif !default;
-// stylelint-enable value-keyword-case
-
-$font-size-base:              1rem !default; // Assumes the browser default, typically `16px`
-$font-size-lg:                ($font-size-base * 1.25) !default;
-$font-size-sm:                ($font-size-base * .875) !default;
-
-$font-weight-light:           300 !default;
-$font-weight-normal:          400 !default;
-$font-weight-bold:            700 !default;
-
-$font-weight-base:            $font-weight-normal !default;
-$line-height-base:            1.5 !default;
-
-$h1-font-size:                $font-size-base * 2.5 !default;
-$h2-font-size:                $font-size-base * 2 !default;
-$h3-font-size:                $font-size-base * 1.75 !default;
-$h4-font-size:                $font-size-base * 1.5 !default;
-$h5-font-size:                $font-size-base * 1.25 !default;
-$h6-font-size:                $font-size-base !default;
-
-$headings-margin-bottom:      ($spacer / 2) !default;
-$headings-font-family:        inherit !default;
-$headings-font-weight:        500 !default;
-$headings-line-height:        1.2 !default;
-$headings-color:              inherit !default;
-
-$display1-size:               6rem !default;
-$display2-size:               5.5rem !default;
-$display3-size:               4.5rem !default;
-$display4-size:               3.5rem !default;
-
-$display1-weight:             300 !default;
-$display2-weight:             300 !default;
-$display3-weight:             300 !default;
-$display4-weight:             300 !default;
-$display-line-height:         $headings-line-height !default;
-
-$lead-font-size:              ($font-size-base * 1.25) !default;
-$lead-font-weight:            300 !default;
-
-$small-font-size:             80% !default;
-
-$text-muted:                  $gray-600 !default;
-
-$blockquote-small-color:      $gray-600 !default;
-$blockquote-font-size:        ($font-size-base * 1.25) !default;
-
-$hr-border-color:             rgba($black,.1) !default;
-$hr-border-width:             $border-width !default;
-
-$mark-padding:                .2em !default;
-
-$dt-font-weight:              $font-weight-bold !default;
-
-$kbd-box-shadow:              inset 0 -.1rem 0 rgba($black,.25) !default;
-$nested-kbd-font-weight:      $font-weight-bold !default;
-
-$list-inline-padding:         5px !default;
-
-$mark-bg: #fcf8e3 !default;
-
-
-// Tables
-//
-// Customizes the `.table` component with basic values, each used across all table variations.
-
-$table-cell-padding:          .75rem !default;
-$table-cell-padding-sm:       .3rem !default;
-
-$table-bg:                    transparent !default;
-$table-accent-bg:             rgba($black,.05) !default;
-$table-hover-bg:              rgba($black,.075) !default;
-$table-active-bg:             $table-hover-bg !default;
-
-$table-border-width:          $border-width !default;
-$table-border-color:          $gray-200 !default;
-
-$table-head-bg:               $gray-200 !default;
-$table-head-color:            $gray-700 !default;
-
-$table-dark-bg:               $gray-900 !default;
-$table-dark-accent-bg:        rgba($white, .05) !default;
-$table-dark-hover-bg:         rgba($white, .075) !default;
-$table-dark-border-color:     lighten($gray-900, 7.5%) !default;
-$table-dark-color:            $body-bg !default;
-
-
-// Buttons
-//
-// For each of Bootstrap's buttons, define text, background and border color.
-
-$input-btn-padding-y:         .375rem !default;
-$input-btn-padding-x:         .75rem !default;
-$input-btn-line-height:       $line-height-base !default;
-
-$input-btn-focus-width:       .2rem !default;
-$input-btn-focus-color:       rgba(theme-color("primary"), .25) !default;
-$input-btn-focus-box-shadow:  0 0 0 $input-btn-focus-width $input-btn-focus-color !default;
-
-$input-btn-padding-y-sm:      .25rem !default;
-$input-btn-padding-x-sm:      .5rem !default;
-$input-btn-line-height-sm:    $line-height-sm !default;
-
-$input-btn-padding-y-lg:      .5rem !default;
-$input-btn-padding-x-lg:      1rem !default;
-$input-btn-line-height-lg:    $line-height-lg !default;
-
-$btn-font-weight:             $font-weight-normal !default;
-$btn-box-shadow:              inset 0 1px 0 rgba($white,.15), 0 1px 1px rgba($black,.075) !default;
-$btn-active-box-shadow:       inset 0 3px 5px rgba($black,.125) !default;
-
-$btn-link-disabled-color:     $gray-600 !default;
-
-$btn-block-spacing-y:         .5rem !default;
-
-// Allows for customizing button radius independently from global border radius
-$btn-border-radius:           $border-radius !default;
-$btn-border-radius-lg:        $border-radius-lg !default;
-$btn-border-radius-sm:        $border-radius-sm !default;
-
-$btn-transition:              background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;
-
-
-// Forms
-
-$input-bg:                              $white !default;
-$input-disabled-bg:                     $gray-200 !default;
-
-$input-color:                           $gray-700 !default;
-$input-border-color:                    $gray-400 !default;
-$input-btn-border-width:                $border-width !default; // For form controls and buttons
-$input-box-shadow:                      inset 0 1px 1px rgba($black,.075) !default;
-
-$input-border-radius:                   $border-radius !default;
-$input-border-radius-lg:                $border-radius-lg !default;
-$input-border-radius-sm:                $border-radius-sm !default;
-
-$input-focus-bg:                        $input-bg !default;
-$input-focus-border-color:              lighten(theme-color("primary"), 25%) !default;
-$input-focus-color:                     $input-color !default;
-
-$input-placeholder-color:               $gray-600 !default;
-
-$input-height-border:                   $input-btn-border-width * 2 !default;
-
-$input-height-inner:                    ($font-size-base * $input-btn-line-height) + ($input-btn-padding-y * 2) !default;
-$input-height:                          calc(#{$input-height-inner} + #{$input-height-border}) !default;
-
-$input-height-inner-sm:                 ($font-size-sm * $input-btn-line-height-sm) + ($input-btn-padding-y-sm * 2) !default;
-$input-height-sm:                       calc(#{$input-height-inner-sm} + #{$input-height-border}) !default;
-
-$input-height-inner-lg:                 ($font-size-lg * $input-btn-line-height-lg) + ($input-btn-padding-y-lg * 2) !default;
-$input-height-lg:                       calc(#{$input-height-inner-lg} + #{$input-height-border}) !default;
-
-$input-transition:                      border-color ease-in-out .15s, box-shadow ease-in-out .15s !default;
-
-$form-text-margin-top:                  .25rem !default;
-
-$form-check-margin-bottom:              .5rem !default;
-$form-check-input-gutter:               1.25rem !default;
-$form-check-input-margin-y:             .25rem !default;
-$form-check-input-margin-x:             .25rem !default;
-
-$form-check-inline-margin-x:            .75rem !default;
-
-$form-group-margin-bottom:              1rem !default;
-
-$input-group-addon-color:               $input-color !default;
-$input-group-addon-bg:                  $gray-200 !default;
-$input-group-addon-border-color:        $input-border-color !default;
-
-$custom-control-gutter:                 1.5rem !default;
-$custom-control-spacer-y:               .25rem !default;
-$custom-control-spacer-x:               1rem !default;
-
-$custom-control-indicator-size:         1rem !default;
-$custom-control-indicator-bg:           #ddd !default;
-$custom-control-indicator-bg-size:      50% 50% !default;
-$custom-control-indicator-box-shadow:   inset 0 .25rem .25rem rgba($black,.1) !default;
-
-$custom-control-indicator-disabled-bg:          $gray-200 !default;
-$custom-control-description-disabled-color:     $gray-600 !default;
-
-$custom-control-indicator-checked-color:        $white !default;
-$custom-control-indicator-checked-bg:           theme-color("primary") !default;
-$custom-control-indicator-checked-box-shadow:   none !default;
-
-$custom-control-indicator-focus-box-shadow:     0 0 0 1px $body-bg, $input-btn-focus-box-shadow !default;
-
-$custom-control-indicator-active-color:         $white !default;
-$custom-control-indicator-active-bg:            lighten(theme-color("primary"), 35%) !default;
-$custom-control-indicator-active-box-shadow:    none !default;
-
-$custom-checkbox-indicator-border-radius:       $border-radius !default;
-$custom-checkbox-indicator-icon-checked:        str-replace(url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='#{$custom-control-indicator-checked-color}' 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"), "#", "%23") !default;
-
-$custom-checkbox-indicator-indeterminate-bg:    theme-color("primary") !default;
-$custom-checkbox-indicator-indeterminate-color: $custom-control-indicator-checked-color !default;
-$custom-checkbox-indicator-icon-indeterminate:  str-replace(url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3E%3Cpath stroke='#{$custom-checkbox-indicator-indeterminate-color}' d='M0 2h4'/%3E%3C/svg%3E"), "#", "%23") !default;
-$custom-checkbox-indicator-indeterminate-box-shadow: none !default;
-
-$custom-radio-indicator-border-radius:          50% !default;
-$custom-radio-indicator-icon-checked:           str-replace(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='#{$custom-control-indicator-checked-color}'/%3E%3C/svg%3E"), "#", "%23") !default;
-
-$custom-select-padding-y:           .375rem !default;
-$custom-select-padding-x:          .75rem !default;
-$custom-select-height:              $input-height !default;
-$custom-select-indicator-padding:   1rem !default; // Extra padding to account for the presence of the background-image based indicator
-$custom-select-line-height:         $input-btn-line-height !default;
-$custom-select-color:               $input-color !default;
-$custom-select-disabled-color:      $gray-600 !default;
-$custom-select-bg:                  $white !default;
-$custom-select-disabled-bg:         $gray-200 !default;
-$custom-select-bg-size:             8px 10px !default; // In pixels because image dimensions
-$custom-select-indicator-color:     #333 !default;
-$custom-select-indicator:           str-replace(url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3E%3Cpath fill='#{$custom-select-indicator-color}' d='M2 0L0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E"), "#", "%23") !default;
-$custom-select-border-width:        $input-btn-border-width !default;
-$custom-select-border-color:        $input-border-color !default;
-$custom-select-border-radius:       $border-radius !default;
-
-$custom-select-focus-border-color:  lighten(theme-color("primary"), 25%) !default;
-$custom-select-focus-box-shadow:    inset 0 1px 2px rgba($black, .075), 0 0 5px rgba($custom-select-focus-border-color, .5) !default;
-
-$custom-select-font-size-sm:        75% !default;
-$custom-select-height-sm:           $input-height-sm !default;
-
-$custom-file-height:                $input-height !default;
-$custom-file-width:                 14rem !default;
-$custom-file-focus-box-shadow:      0 0 0 .075rem $white, 0 0 0 .2rem theme-color("primary") !default;
-
-$custom-file-padding-y:             $input-btn-padding-y !default;
-$custom-file-padding-x:             $input-btn-padding-x !default;
-$custom-file-line-height:           $input-btn-line-height !default;
-$custom-file-color:                 $input-color !default;
-$custom-file-bg:                    $input-bg !default;
-$custom-file-border-width:          $input-btn-border-width !default;
-$custom-file-border-color:          $input-border-color !default;
-$custom-file-border-radius:         $input-border-radius !default;
-$custom-file-box-shadow:            $input-box-shadow !default;
-$custom-file-button-color:          $custom-file-color !default;
-$custom-file-button-bg:             $input-group-addon-bg !default;
-$custom-file-text: (
-  placeholder: (
-    en: "Choose file..."
-  ),
-  button-label: (
-    en: "Browse"
-  )
-) !default;
-
-
-// Form validation
-$form-feedback-valid-color:         theme-color("success") !default;
-$form-feedback-invalid-color:       theme-color("danger") !default;
-
-
-// Dropdowns
-//
-// Dropdown menu container and contents.
-
-$dropdown-min-width:                10rem !default;
-$dropdown-padding-y:                .5rem !default;
-$dropdown-spacer:                   .125rem !default;
-$dropdown-bg:                       $white !default;
-$dropdown-border-color:             rgba($black,.15) !default;
-$dropdown-border-width:             $border-width !default;
-$dropdown-divider-bg:               $gray-200 !default;
-$dropdown-box-shadow:               0 .5rem 1rem rgba($black,.175) !default;
-
-$dropdown-link-color:               $gray-900 !default;
-$dropdown-link-hover-color:         darken($gray-900, 5%) !default;
-$dropdown-link-hover-bg:            $gray-100 !default;
-
-$dropdown-link-active-color:        $component-active-color !default;
-$dropdown-link-active-bg:           $component-active-bg !default;
-
-$dropdown-link-disabled-color:      $gray-600 !default;
-
-$dropdown-item-padding-y:           .25rem !default;
-$dropdown-item-padding-x:           1.5rem !default;
-
-$dropdown-header-color:             $gray-600 !default;
-
-
-// Z-index master list
-//
-// Warning: Avoid customizing these values. They're used for a bird's eye view
-// of components dependent on the z-axis and are designed to all work together.
-
-$zindex-dropdown:                   1000 !default;
-$zindex-sticky:                     1020 !default;
-$zindex-fixed:                      1030 !default;
-$zindex-modal-backdrop:             1040 !default;
-$zindex-modal:                      1050 !default;
-$zindex-popover:                    1060 !default;
-$zindex-tooltip:                    1070 !default;
-
-// Navs
-
-$nav-link-padding-y:                .5rem !default;
-$nav-link-padding-x:                1rem !default;
-$nav-link-disabled-color:           $gray-600 !default;
-
-$nav-tabs-border-color:             #ddd !default;
-$nav-tabs-border-width:             $border-width !default;
-$nav-tabs-border-radius:            $border-radius !default;
-$nav-tabs-link-hover-border-color:  $gray-200 !default;
-$nav-tabs-link-active-color:        $gray-700 !default;
-$nav-tabs-link-active-bg:           $body-bg !default;
-$nav-tabs-link-active-border-color: #ddd !default;
-
-$nav-pills-border-radius:           $border-radius !default;
-$nav-pills-link-active-color:       $component-active-color !default;
-$nav-pills-link-active-bg:          $component-active-bg !default;
-
-// Navbar
-
-$navbar-padding-y:                  ($spacer / 2) !default;
-$navbar-padding-x:                  $spacer !default;
-
-$navbar-brand-font-size:            $font-size-lg !default;
-// Compute the navbar-brand padding-y so the navbar-brand will have the same height as navbar-text and nav-link
-$nav-link-height:                   ($font-size-base * $line-height-base + $nav-link-padding-y * 2) !default;
-$navbar-brand-height:               $navbar-brand-font-size * $line-height-base !default;
-$navbar-brand-padding-y:            ($nav-link-height - $navbar-brand-height) / 2 !default;
-
-$navbar-toggler-padding-y:          .25rem !default;
-$navbar-toggler-padding-x:          .75rem !default;
-$navbar-toggler-font-size:          $font-size-lg !default;
-$navbar-toggler-border-radius:      $btn-border-radius !default;
-
-$navbar-dark-color:                 rgba($white,.5) !default;
-$navbar-dark-hover-color:           rgba($white,.75) !default;
-$navbar-dark-active-color:          $white !default;
-$navbar-dark-disabled-color:        rgba($white,.25) !default;
-$navbar-dark-toggler-icon-bg:       str-replace(url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='#{$navbar-dark-color}' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E"), "#", "%23") !default;
-$navbar-dark-toggler-border-color:  rgba($white,.1) !default;
-
-$navbar-light-color:                rgba($black,.5) !default;
-$navbar-light-hover-color:          rgba($black,.7) !default;
-$navbar-light-active-color:         rgba($black,.9) !default;
-$navbar-light-disabled-color:       rgba($black,.3) !default;
-$navbar-light-toggler-icon-bg:      str-replace(url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='#{$navbar-light-color}' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E"), "#", "%23") !default;
-$navbar-light-toggler-border-color: rgba($black,.1) !default;
-
-// Pagination
-
-$pagination-padding-y:              .5rem !default;
-$pagination-padding-x:              .75rem !default;
-$pagination-padding-y-sm:           .25rem !default;
-$pagination-padding-x-sm:           .5rem !default;
-$pagination-padding-y-lg:           .75rem !default;
-$pagination-padding-x-lg:           1.5rem !default;
-$pagination-line-height:            1.25 !default;
-
-$pagination-color:                  $link-color !default;
-$pagination-bg:                     $white !default;
-$pagination-border-width:           $border-width !default;
-$pagination-border-color:           #ddd !default;
-
-$pagination-hover-color:            $link-hover-color !default;
-$pagination-hover-bg:               $gray-200 !default;
-$pagination-hover-border-color:     #ddd !default;
-
-$pagination-active-color:           $white !default;
-$pagination-active-bg:              theme-color("primary") !default;
-$pagination-active-border-color:    theme-color("primary") !default;
-
-$pagination-disabled-color:         $gray-600 !default;
-$pagination-disabled-bg:            $white !default;
-$pagination-disabled-border-color:  #ddd !default;
-
-
-// Jumbotron
-
-$jumbotron-padding:                 2rem !default;
-$jumbotron-bg:                      $gray-200 !default;
-
-
-// Cards
-
-$card-spacer-y:                     .75rem !default;
-$card-spacer-x:                     1.25rem !default;
-$card-border-width:                 $border-width !default;
-$card-border-radius:                $border-radius !default;
-$card-border-color:                 rgba($black,.125) !default;
-$card-inner-border-radius:          calc(#{$card-border-radius} - #{$card-border-width}) !default;
-$card-cap-bg:                       rgba($black, .03) !default;
-$card-bg:                           $white !default;
-
-$card-img-overlay-padding:          1.25rem !default;
-
-$card-group-margin:                 ($grid-gutter-width / 2) !default;
-$card-deck-margin:                  $card-group-margin !default;
-
-$card-columns-count:                3 !default;
-$card-columns-gap:                  1.25rem !default;
-$card-columns-margin:               $card-spacer-y !default;
-
-
-// Tooltips
-
-$tooltip-max-width:                 200px !default;
-$tooltip-color:                     $white !default;
-$tooltip-bg:                        $black !default;
-$tooltip-opacity:                   .9 !default;
-$tooltip-padding-y:                 3px !default;
-$tooltip-padding-x:                 8px !default;
-$tooltip-margin:                    0 !default;
-
-
-$tooltip-arrow-width:               5px !default;
-$tooltip-arrow-height:              5px !default;
-$tooltip-arrow-color:               $tooltip-bg !default;
-
-
-// Popovers
-
-$popover-bg:                        $white !default;
-$popover-max-width:                 276px !default;
-$popover-border-width:              $border-width !default;
-$popover-border-color:              rgba($black,.2) !default;
-$popover-box-shadow:                0 .25rem .5rem rgba($black,.2) !default;
-
-$popover-header-bg:                 darken($popover-bg, 3%) !default;
-$popover-header-color:              $headings-color !default;
-$popover-header-padding-y:          .5rem !default;
-$popover-header-padding-x:          .75rem !default;
-
-$popover-body-color:                $body-color !default;
-$popover-body-padding-y:            $popover-header-padding-y !default;
-$popover-body-padding-x:            $popover-header-padding-x !default;
-
-$popover-arrow-width:               .8rem !default;
-$popover-arrow-height:              .4rem !default;
-$popover-arrow-color:               $popover-bg !default;
-
-$popover-arrow-outer-color:         fade-in($popover-border-color, .05) !default;
-
-
-// Badges
-
-$badge-font-size:                   75% !default;
-$badge-font-weight:                 $font-weight-bold !default;
-$badge-padding-y:                   .25em !default;
-$badge-padding-x:                   .4em !default;
-$badge-border-radius:               $border-radius !default;
-
-$badge-pill-padding-x:              .6em !default;
-// Use a higher than normal value to ensure completely rounded edges when
-// customizing padding or font-size on labels.
-$badge-pill-border-radius:          10rem !default;
-
-
-// Modals
-
-// Padding applied to the modal body
-$modal-inner-padding:               15px !default;
-
-$modal-dialog-margin:               10px !default;
-$modal-dialog-margin-y-sm-up:       30px !default;
-
-$modal-title-line-height:           $line-height-base !default;
-
-$modal-content-bg:                  $white !default;
-$modal-content-border-color:        rgba($black,.2) !default;
-$modal-content-border-width:        $border-width !default;
-$modal-content-box-shadow-xs:       0 3px 9px rgba($black,.5) !default;
-$modal-content-box-shadow-sm-up:    0 5px 15px rgba($black,.5) !default;
-
-$modal-backdrop-bg:                 $black !default;
-$modal-backdrop-opacity:            .5 !default;
-$modal-header-border-color:         $gray-200 !default;
-$modal-footer-border-color:         $modal-header-border-color !default;
-$modal-header-border-width:         $modal-content-border-width !default;
-$modal-footer-border-width:         $modal-header-border-width !default;
-$modal-header-padding:              15px !default;
-
-$modal-lg:                          800px !default;
-$modal-md:                          500px !default;
-$modal-sm:                          300px !default;
-
-$modal-transition:                  transform .3s ease-out !default;
-
-
-// Alerts
-//
-// Define alert colors, border radius, and padding.
-
-$alert-padding-y:                   .75rem !default;
-$alert-padding-x:                   1.25rem !default;
-$alert-margin-bottom:               1rem !default;
-$alert-border-radius:               $border-radius !default;
-$alert-link-font-weight:            $font-weight-bold !default;
-$alert-border-width:                $border-width !default;
-
-
-// Progress bars
-
-$progress-height:                   1rem !default;
-$progress-font-size:                ($font-size-base * .75) !default;
-$progress-bg:                       $gray-200 !default;
-$progress-border-radius:            $border-radius !default;
-$progress-box-shadow:               inset 0 .1rem .1rem rgba($black,.1) !default;
-$progress-bar-color:                $white !default;
-$progress-bar-bg:                   theme-color("primary") !default;
-$progress-bar-animation-timing:     1s linear infinite !default;
-$progress-bar-transition:           width .6s ease !default;
-
-// List group
-
-$list-group-bg:                     $white !default;
-$list-group-border-color:           rgba($black,.125) !default;
-$list-group-border-width:           $border-width !default;
-$list-group-border-radius:          $border-radius !default;
-
-$list-group-item-padding-y:         .75rem !default;
-$list-group-item-padding-x:         1.25rem !default;
-
-$list-group-hover-bg:               $gray-100 !default;
-$list-group-active-color:           $component-active-color !default;
-$list-group-active-bg:              $component-active-bg !default;
-$list-group-active-border-color:    $list-group-active-bg !default;
-
-$list-group-disabled-color:         $gray-600 !default;
-$list-group-disabled-bg:            $list-group-bg !default;
-
-$list-group-action-color:           $gray-700 !default;
-$list-group-action-hover-color:     $list-group-action-color !default;
-
-$list-group-action-active-color:    $body-color !default;
-$list-group-action-active-bg:       $gray-200 !default;
-
-
-// Image thumbnails
-
-$thumbnail-padding:                 .25rem !default;
-$thumbnail-bg:                      $body-bg !default;
-$thumbnail-border-width:            $border-width !default;
-$thumbnail-border-color:            #ddd !default;
-$thumbnail-border-radius:           $border-radius !default;
-$thumbnail-box-shadow:              0 1px 2px rgba($black,.075) !default;
-$thumbnail-transition:              all .2s ease-in-out !default;
-
-
-// Figures
-
-$figure-caption-font-size:          90% !default;
-$figure-caption-color:              $gray-600 !default;
-
-
-// Breadcrumbs
-
-$breadcrumb-padding-y:              .75rem !default;
-$breadcrumb-padding-x:              1rem !default;
-$breadcrumb-item-padding:           .5rem !default;
-
-$breadcrumb-margin-bottom:          1rem !default;
-
-$breadcrumb-bg:                     $gray-200 !default;
-$breadcrumb-divider-color:          $gray-600 !default;
-$breadcrumb-active-color:           $gray-600 !default;
-$breadcrumb-divider:                "/" !default;
-
-
-// Carousel
-
-$carousel-control-color:            $white !default;
-$carousel-control-width:            15% !default;
-$carousel-control-opacity:          .5 !default;
-
-$carousel-indicator-width:          30px !default;
-$carousel-indicator-height:         3px !default;
-$carousel-indicator-spacer:         3px !default;
-$carousel-indicator-active-bg:      $white !default;
-
-$carousel-caption-width:            70% !default;
-$carousel-caption-color:            $white !default;
-
-$carousel-control-icon-width:       20px !default;
-
-$carousel-control-prev-icon-bg:     str-replace(url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='#{$carousel-control-color}' 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"), "#", "%23") !default;
-$carousel-control-next-icon-bg:     str-replace(url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='#{$carousel-control-color}' 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"), "#", "%23") !default;
-
-$carousel-transition:               transform .6s ease !default;
-
-
-// Close
-
-$close-font-size:                   $font-size-base * 1.5 !default;
-$close-font-weight:                 $font-weight-bold !default;
-$close-color:                       $black !default;
-$close-text-shadow:                 0 1px 0 $white !default;
-
-// Code
-
-$code-font-size:                    90% !default;
-$code-padding-y:                    .2rem !default;
-$code-padding-x:                    .4rem !default;
-$code-color:                        #bd4147 !default;
-$code-bg:                           $gray-100 !default;
-
-$kbd-color:                         $white !default;
-$kbd-bg:                            $gray-900 !default;
-
-$pre-color:                         $gray-900 !default;
-$pre-scrollable-max-height:         340px !default;
diff --git a/assets/scss/bootstrap-grid.css b/assets/scss/bootstrap-grid.css
deleted file mode 100644
index 1a2aecf..0000000
--- a/assets/scss/bootstrap-grid.css
+++ /dev/null
@@ -1,1168 +0,0 @@
-/*!
- * Bootstrap Grid v4.0.0-beta.2 (https://getbootstrap.com)
- * Copyright 2011-2017 The Bootstrap Authors
- * Copyright 2011-2017 Twitter, Inc.
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- */
- at -ms-viewport {
-  width: device-width; }
-html {
-  box-sizing: border-box;
-  -ms-overflow-style: scrollbar; }
-
-*,
-*::before,
-*::after {
-  box-sizing: inherit; }
-
-.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-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%; }
-
- at 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-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%; } }
- at 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-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%; } }
- at 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-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%; } }
- at 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-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%; } }
-.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; }
-
-.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; }
-
- at 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; }
-
-  .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; } }
- at 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; }
-
-  .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; } }
- at 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; }
-
-  .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; } }
- at 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; }
-
-  .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; } }
-
-/*# sourceMappingURL=bootstrap-grid.css.map */
diff --git a/assets/scss/bootstrap-grid.css.map b/assets/scss/bootstrap-grid.css.map
deleted file mode 100644
index cff8345..0000000
--- a/assets/scss/bootstrap-grid.css.map
+++ /dev/null
@@ -1,7 +0,0 @@
-{
-"version": 3,
-"mappings": "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",
-"sources": ["bootstrap-grid.scss","_grid.scss","mixins/_grid.scss","mixins/_breakpoints.scss","_functions.scss","mixins/_grid-framework.scss","utilities/_flex.scss"],
-"names": [],
-"file": "bootstrap-grid.css"
-}
\ No newline at end of file
diff --git a/assets/scss/bootstrap-grid.scss b/assets/scss/bootstrap-grid.scss
deleted file mode 100644
index d7d4e78..0000000
--- a/assets/scss/bootstrap-grid.scss
+++ /dev/null
@@ -1,35 +0,0 @@
-/*!
- * Bootstrap Grid v4.0.0-beta.2 (https://getbootstrap.com)
- * Copyright 2011-2017 The Bootstrap Authors
- * Copyright 2011-2017 Twitter, Inc.
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- */
-
- at at-root {
-  @-ms-viewport { width: device-width; } // stylelint-disable-line at-rule-no-vendor-prefix
-}
-
-html {
-  box-sizing: border-box;
-  -ms-overflow-style: scrollbar;
-}
-
-*,
-*::before,
-*::after {
-  box-sizing: inherit;
-}
-
- at import "functions";
- at import "variables";
-
-//
-// Grid mixins
-//
-
- at import "mixins/breakpoints";
- at import "mixins/grid-framework";
- at import "mixins/grid";
-
- at import "grid";
- at import "utilities/flex";
diff --git a/assets/scss/bootstrap-reboot.css b/assets/scss/bootstrap-reboot.css
deleted file mode 100644
index 07cb40c..0000000
--- a/assets/scss/bootstrap-reboot.css
+++ /dev/null
@@ -1,279 +0,0 @@
-/*!
- * Bootstrap Reboot v4.0.0-beta.2 (https://getbootstrap.com)
- * Copyright 2011-2017 The Bootstrap Authors
- * Copyright 2011-2017 Twitter, Inc.
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md)
- */
-*,
-*::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: rgba(0, 0, 0, 0); }
-
- at -ms-viewport {
-  width: device-width; }
-article, aside, dialog, 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";
-  font-size: 1rem;
-  font-weight: 400;
-  line-height: 1.5;
-  color: #212529;
-  text-align: left;
-  background-color: #fff; }
-
-[tabindex="-1"]:focus {
-  outline: none !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;
-  text-decoration: underline dotted;
-  cursor: help;
-  border-bottom: 0; }
-
-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]):focus, a:not([href]):not([tabindex]):hover {
-    color: inherit;
-    text-decoration: none; }
-  a:not([href]):not([tabindex]):focus {
-    outline: 0; }
-
-pre,
-code,
-kbd,
-samp {
-  font-family: monospace, 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:not(:root) {
-  overflow: hidden; }
-
-a,
-area,
-button,
-[role="button"],
-input:not([type="range"]),
-label,
-select,
-summary,
-textarea {
-  touch-action: manipulation; }
-
-table {
-  border-collapse: collapse; }
-
-caption {
-  padding-top: 0.75rem;
-  padding-bottom: 0.75rem;
-  color: #868e96;
-  text-align: left;
-  caption-side: bottom; }
-
-th {
-  text-align: inherit; }
-
-label {
-  display: inline-block;
-  margin-bottom: .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; }
-
-template {
-  display: none; }
-
-[hidden] {
-  display: none !important; }
-
-/*# sourceMappingURL=bootstrap-reboot.css.map */
diff --git a/assets/scss/bootstrap-reboot.css.map b/assets/scss/bootstrap-reboot.css.map
deleted file mode 100644
index 220cd09..0000000
--- a/assets/scss/bootstrap-reboot.css.map
+++ /dev/null
@@ -1,7 +0,0 @@
-{
-"version": 3,
-"mappings": "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",
-"sources": ["bootstrap-reboot.scss","_reboot.scss","_variables.scss","mixins/_hover.scss"],
-"names": [],
-"file": "bootstrap-reboot.css"
-}
\ No newline at end of file
diff --git a/assets/scss/bootstrap-reboot.scss b/assets/scss/bootstrap-reboot.scss
deleted file mode 100644
index 3bc8760..0000000
--- a/assets/scss/bootstrap-reboot.scss
+++ /dev/null
@@ -1,12 +0,0 @@
-/*!
- * Bootstrap Reboot v4.0.0-beta.2 (https://getbootstrap.com)
- * Copyright 2011-2017 The Bootstrap Authors
- * Copyright 2011-2017 Twitter, Inc.
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md)
- */
-
- at import "functions";
- at import "variables";
- at import "mixins";
- at import "reboot";
diff --git a/assets/scss/bootstrap.css b/assets/scss/bootstrap.css
deleted file mode 100644
index 2ffd799..0000000
--- a/assets/scss/bootstrap.css
+++ /dev/null
@@ -1,7392 +0,0 @@
-/*!
- * Bootstrap v4.0.0-beta.2 (https://getbootstrap.com)
- * Copyright 2011-2017 The Bootstrap Authors
- * Copyright 2011-2017 Twitter, Inc.
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- */
-:root {
-  --blue: #007bff;
-  --indigo: #6610f2;
-  --purple: #7D4698;
-  --pink: #e83e8c;
-  --red: #EF243E;
-  --orange: #fd7e14;
-  --yellow: #FFBF00;
-  --green: #68B044;
-  --teal: #20c997;
-  --cyan: #00A5BB;
-  --white: #fff;
-  --gray: #848E97;
-  --gray-dark: #333A41;
-  --primary: #7D4698;
-  --secondary: #333A41;
-  --success: #68B044;
-  --info: #00A5BB;
-  --warning: #FFBF00;
-  --danger: #EF243E;
-  --light: #F8F9FA;
-  --dark: #59316B;
-  --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";
-  --font-family-monospace: "Source Code Pro", Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; }
-
- at media print {
-  *,
-  *::before,
-  *::after {
-    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 {
-    border: 1px solid #000; }
-
-  .table {
-    border-collapse: collapse !important; }
-    .table td,
-    .table th {
-      background-color: #fff !important; }
-
-  .table-bordered th,
-  .table-bordered td {
-    border: 1px solid #ddd !important; } }
-*,
-*::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: rgba(0, 0, 0, 0); }
-
- at -ms-viewport {
-  width: device-width; }
-article, aside, dialog, figcaption, figure, footer, header, hgroup, main, nav, section {
-  display: block; }
-
-body {
-  margin: 0;
-  font-family: "Source Sans Pro", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
-  font-size: 1rem;
-  font-weight: 400;
-  line-height: 1.5;
-  color: #212529;
-  text-align: left;
-  background-color: #fff; }
-
-[tabindex="-1"]:focus {
-  outline: none !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;
-  text-decoration: underline dotted;
-  cursor: help;
-  border-bottom: 0; }
-
-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: #7D4698;
-  text-decoration: none;
-  background-color: transparent;
-  -webkit-text-decoration-skip: objects; }
-  a:hover {
-    color: #522e64;
-    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,
-code,
-kbd,
-samp {
-  font-family: monospace, 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:not(:root) {
-  overflow: hidden; }
-
-a,
-area,
-button,
-[role="button"],
-input:not([type="range"]),
-label,
-select,
-summary,
-textarea {
-  touch-action: manipulation; }
-
-table {
-  border-collapse: collapse; }
-
-caption {
-  padding-top: 0.75rem;
-  padding-bottom: 0.75rem;
-  color: #848E97;
-  text-align: left;
-  caption-side: bottom; }
-
-th {
-  text-align: inherit; }
-
-label {
-  display: inline-block;
-  margin-bottom: .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; }
-
-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: #e6d5ee; }
-
-.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 {
-  margin-bottom: 1rem;
-  font-size: 1.25rem; }
-
-.blockquote-footer {
-  display: block;
-  font-size: 80%;
-  color: #848E97; }
-  .blockquote-footer::before {
-    content: "\2014 \00A0"; }
-
-.img-fluid {
-  max-width: 100%;
-  height: auto; }
-
-.img-thumbnail {
-  padding: 0.25rem;
-  background-color: #fff;
-  border: 1px solid #ddd;
-  border-radius: 0.25rem;
-  transition: all 0.2s ease-in-out;
-  max-width: 100%;
-  height: auto; }
-
-.figure {
-  display: inline-block; }
-
-.figure-img {
-  margin-bottom: 0.5rem;
-  line-height: 1; }
-
-.figure-caption {
-  font-size: 90%;
-  color: #848E97; }
-
-code,
-kbd,
-pre,
-samp {
-  font-family: "Source Code Pro", Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; }
-
-code {
-  padding: 0.5rem 0.5rem;
-  font-size: 80%;
-  color: lightgreen;
-  background-color: black;
-  border-radius: 0.25rem; }
-  a > code {
-    padding: 0;
-    color: inherit;
-    background-color: inherit; }
-
-kbd {
-  padding: 0.5rem 0.5rem;
-  font-size: 80%;
-  color: #fff;
-  background-color: #212529;
-  border-radius: 0.2rem; }
-  kbd kbd {
-    padding: 0;
-    font-size: 100%;
-    font-weight: 700; }
-
-pre {
-  display: block;
-  margin-top: 0;
-  margin-bottom: 1rem;
-  font-size: 80%;
-  color: lightgreen; }
-  pre code {
-    padding: 0;
-    font-size: inherit;
-    color: inherit;
-    background-color: transparent;
-    border-radius: 0; }
-
-.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-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%; }
-
- at 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-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%; } }
- at 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-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%; } }
- at 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-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%; } }
- at 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-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%;
-  max-width: 100%;
-  margin-bottom: 1rem;
-  background-color: transparent; }
-  .table th,
-  .table td {
-    padding: 0.75rem;
-    vertical-align: top;
-    border-top: 1px solid #e9ecef; }
-  .table thead th {
-    vertical-align: bottom;
-    border-bottom: 2px solid #e9ecef; }
-  .table tbody + tbody {
-    border-top: 2px solid #e9ecef; }
-  .table .table {
-    background-color: #fff; }
-
-.table-sm th,
-.table-sm td {
-  padding: 0.3rem; }
-
-.table-bordered {
-  border: 1px solid #e9ecef; }
-  .table-bordered th,
-  .table-bordered td {
-    border: 1px solid #e9ecef; }
-  .table-bordered thead th,
-  .table-bordered thead td {
-    border-bottom-width: 2px; }
-
-.table-striped tbody tr:nth-of-type(odd) {
-  background-color: #e6d5ee; }
-
-.table-hover tbody tr:hover {
-  background-color: rgba(0, 0, 0, 0.075); }
-
-.table-primary,
-.table-primary > th,
-.table-primary > td {
-  background-color: #dbcbe2; }
-
-.table-hover .table-primary:hover {
-  background-color: #d0bbd9; }
-  .table-hover .table-primary:hover > td,
-  .table-hover .table-primary:hover > th {
-    background-color: #d0bbd9; }
-
-.table-secondary,
-.table-secondary > th,
-.table-secondary > td {
-  background-color: #c6c8ca; }
-
-.table-hover .table-secondary:hover {
-  background-color: #b9bbbe; }
-  .table-hover .table-secondary:hover > td,
-  .table-hover .table-secondary:hover > th {
-    background-color: #b9bbbe; }
-
-.table-success,
-.table-success > th,
-.table-success > td {
-  background-color: #d5e9cb; }
-
-.table-hover .table-success:hover {
-  background-color: #c7e1b9; }
-  .table-hover .table-success:hover > td,
-  .table-hover .table-success:hover > th {
-    background-color: #c7e1b9; }
-
-.table-info,
-.table-info > th,
-.table-info > td {
-  background-color: #b8e6ec; }
-
-.table-hover .table-info:hover {
-  background-color: #a4dfe7; }
-  .table-hover .table-info:hover > td,
-  .table-hover .table-info:hover > th {
-    background-color: #a4dfe7; }
-
-.table-warning,
-.table-warning > th,
-.table-warning > td {
-  background-color: #ffedb8; }
-
-.table-hover .table-warning:hover {
-  background-color: #ffe79f; }
-  .table-hover .table-warning:hover > td,
-  .table-hover .table-warning:hover > th {
-    background-color: #ffe79f; }
-
-.table-danger,
-.table-danger > th,
-.table-danger > td {
-  background-color: #fbc2c9; }
-
-.table-hover .table-danger:hover {
-  background-color: #f9aab4; }
-  .table-hover .table-danger:hover > td,
-  .table-hover .table-danger:hover > th {
-    background-color: #f9aab4; }
-
-.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: #d1c5d6; }
-
-.table-hover .table-dark:hover {
-  background-color: #c5b6cb; }
-  .table-hover .table-dark:hover > td,
-  .table-hover .table-dark:hover > th {
-    background-color: #c5b6cb; }
-
-.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: #e9ecef; }
-
-.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); }
-
- at media (max-width: 575px) {
-  .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; } }
- at media (max-width: 767px) {
-  .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; } }
- at media (max-width: 991px) {
-  .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; } }
- at media (max-width: 1199px) {
-  .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%;
-  padding: 0.375rem 0.75rem;
-  font-size: 1rem;
-  line-height: 1.5;
-  color: #495057;
-  background-color: #fff;
-  background-image: none;
-  background-clip: padding-box;
-  border: 1px solid #ced4da;
-  border-radius: 0.25rem;
-  transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s; }
-  .form-control::-ms-expand {
-    background-color: transparent;
-    border: 0; }
-  .form-control:focus {
-    color: #495057;
-    background-color: #fff;
-    border-color: #b991cc;
-    outline: none;
-    box-shadow: 0 0 0 0.2rem rgba(125, 70, 152, 0.25); }
-  .form-control::placeholder {
-    color: #848E97;
-    opacity: 1; }
-  .form-control:disabled, .form-control[readonly] {
-    background-color: #e9ecef;
-    opacity: 1; }
-
-select.form-control:not([size]):not([multiple]) {
-  height: calc(2.25rem + 2px); }
-select.form-control:focus::-ms-value {
-  color: #495057;
-  background-color: #fff; }
-
-.form-control-file,
-.form-control-range {
-  display: block; }
-
-.col-form-label {
-  padding-top: calc(0.375rem + 1px);
-  padding-bottom: calc(0.375rem + 1px);
-  margin-bottom: 0;
-  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; }
-
-.col-form-legend {
-  padding-top: 0.375rem;
-  padding-bottom: 0.375rem;
-  margin-bottom: 0;
-  font-size: 1rem; }
-
-.form-control-plaintext {
-  padding-top: 0.375rem;
-  padding-bottom: 0.375rem;
-  margin-bottom: 0;
-  line-height: 1.5;
-  background-color: transparent;
-  border: solid transparent;
-  border-width: 1px 0; }
-  .form-control-plaintext.form-control-sm, .input-group-sm > .form-control-plaintext.form-control,
-  .input-group-sm > .form-control-plaintext.input-group-addon,
-  .input-group-sm > .input-group-btn > .form-control-plaintext.btn, .form-control-plaintext.form-control-lg, .input-group-lg > .form-control-plaintext.form-control,
-  .input-group-lg > .form-control-plaintext.input-group-addon,
-  .input-group-lg > .input-group-btn > .form-control-plaintext.btn {
-    padding-right: 0;
-    padding-left: 0; }
-
-.form-control-sm, .input-group-sm > .form-control,
-.input-group-sm > .input-group-addon,
-.input-group-sm > .input-group-btn > .btn {
-  padding: 0.25rem 0.5rem;
-  font-size: 0.875rem;
-  line-height: 1.5;
-  border-radius: 0.2rem; }
-
-select.form-control-sm:not([size]):not([multiple]), .input-group-sm > select.form-control:not([size]):not([multiple]),
-.input-group-sm > select.input-group-addon:not([size]):not([multiple]),
-.input-group-sm > .input-group-btn > select.btn:not([size]):not([multiple]) {
-  height: calc(1.8125rem + 2px); }
-
-.form-control-lg, .input-group-lg > .form-control,
-.input-group-lg > .input-group-addon,
-.input-group-lg > .input-group-btn > .btn {
-  padding: 0.5rem 1rem;
-  font-size: 1.25rem;
-  line-height: 1.5;
-  border-radius: 0.3rem; }
-
-select.form-control-lg:not([size]):not([multiple]), .input-group-lg > select.form-control:not([size]):not([multiple]),
-.input-group-lg > select.input-group-addon:not([size]):not([multiple]),
-.input-group-lg > .input-group-btn > select.btn:not([size]):not([multiple]) {
-  height: calc(2.875rem + 2px); }
-
-.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;
-  margin-bottom: 0.5rem; }
-  .form-check.disabled .form-check-label {
-    color: #848E97; }
-
-.form-check-label {
-  padding-left: 1.25rem;
-  margin-bottom: 0; }
-
-.form-check-input {
-  position: absolute;
-  margin-top: 0.25rem;
-  margin-left: -1.25rem; }
-
-.form-check-inline {
-  display: inline-block;
-  margin-right: 0.75rem; }
-  .form-check-inline .form-check-label {
-    vertical-align: middle; }
-
-.valid-feedback {
-  display: none;
-  margin-top: .25rem;
-  font-size: .875rem;
-  color: #68B044; }
-
-.valid-tooltip {
-  position: absolute;
-  top: 100%;
-  z-index: 5;
-  display: none;
-  width: 250px;
-  padding: .5rem;
-  margin-top: .1rem;
-  font-size: .875rem;
-  line-height: 1;
-  color: #fff;
-  background-color: rgba(104, 176, 68, 0.8);
-  border-radius: .2rem; }
-
-.was-validated .form-control:valid, .form-control.is-valid,
-.was-validated .custom-select:valid,
-.custom-select.is-valid {
-  border-color: #68B044; }
-  .was-validated .form-control:valid:focus, .form-control.is-valid:focus,
-  .was-validated .custom-select:valid:focus,
-  .custom-select.is-valid:focus {
-    box-shadow: 0 0 0 0.2rem rgba(104, 176, 68, 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-check-input:valid + .form-check-label, .form-check-input.is-valid + .form-check-label {
-  color: #68B044; }
-
-.was-validated .custom-control-input:valid ~ .custom-control-indicator, .custom-control-input.is-valid ~ .custom-control-indicator {
-  background-color: rgba(104, 176, 68, 0.25); }
-.was-validated .custom-control-input:valid ~ .custom-control-description, .custom-control-input.is-valid ~ .custom-control-description {
-  color: #68B044; }
-
-.was-validated .custom-file-input:valid ~ .custom-file-control, .custom-file-input.is-valid ~ .custom-file-control {
-  border-color: #68B044; }
-  .was-validated .custom-file-input:valid ~ .custom-file-control::before, .custom-file-input.is-valid ~ .custom-file-control::before {
-    border-color: inherit; }
-.was-validated .custom-file-input:valid:focus, .custom-file-input.is-valid:focus {
-  box-shadow: 0 0 0 0.2rem rgba(104, 176, 68, 0.25); }
-
-.invalid-feedback {
-  display: none;
-  margin-top: .25rem;
-  font-size: .875rem;
-  color: #EF243E; }
-
-.invalid-tooltip {
-  position: absolute;
-  top: 100%;
-  z-index: 5;
-  display: none;
-  width: 250px;
-  padding: .5rem;
-  margin-top: .1rem;
-  font-size: .875rem;
-  line-height: 1;
-  color: #fff;
-  background-color: rgba(239, 36, 62, 0.8);
-  border-radius: .2rem; }
-
-.was-validated .form-control:invalid, .form-control.is-invalid,
-.was-validated .custom-select:invalid,
-.custom-select.is-invalid {
-  border-color: #EF243E; }
-  .was-validated .form-control:invalid:focus, .form-control.is-invalid:focus,
-  .was-validated .custom-select:invalid:focus,
-  .custom-select.is-invalid:focus {
-    box-shadow: 0 0 0 0.2rem rgba(239, 36, 62, 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-check-input:invalid + .form-check-label, .form-check-input.is-invalid + .form-check-label {
-  color: #EF243E; }
-
-.was-validated .custom-control-input:invalid ~ .custom-control-indicator, .custom-control-input.is-invalid ~ .custom-control-indicator {
-  background-color: rgba(239, 36, 62, 0.25); }
-.was-validated .custom-control-input:invalid ~ .custom-control-description, .custom-control-input.is-invalid ~ .custom-control-description {
-  color: #EF243E; }
-
-.was-validated .custom-file-input:invalid ~ .custom-file-control, .custom-file-input.is-invalid ~ .custom-file-control {
-  border-color: #EF243E; }
-  .was-validated .custom-file-input:invalid ~ .custom-file-control::before, .custom-file-input.is-invalid ~ .custom-file-control::before {
-    border-color: inherit; }
-.was-validated .custom-file-input:invalid:focus, .custom-file-input.is-invalid:focus {
-  box-shadow: 0 0 0 0.2rem rgba(239, 36, 62, 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 {
-      width: auto; }
-    .form-inline .form-check {
-      display: flex;
-      align-items: center;
-      justify-content: center;
-      width: auto;
-      margin-top: 0;
-      margin-bottom: 0; }
-    .form-inline .form-check-label {
-      padding-left: 0; }
-    .form-inline .form-check-input {
-      position: relative;
-      margin-top: 0;
-      margin-right: 0.25rem;
-      margin-left: 0; }
-    .form-inline .custom-control {
-      display: flex;
-      align-items: center;
-      justify-content: center;
-      padding-left: 0; }
-    .form-inline .custom-control-indicator {
-      position: static;
-      display: inline-block;
-      margin-right: 0.25rem;
-      vertical-align: text-bottom; }
-    .form-inline .has-feedback .form-control-feedback {
-      top: 0; } }
-
-.btn {
-  display: inline-block;
-  font-weight: 400;
-  text-align: center;
-  white-space: nowrap;
-  vertical-align: middle;
-  user-select: none;
-  border: 1px solid transparent;
-  padding: 0.375rem 0.75rem;
-  font-size: 1rem;
-  line-height: 1.5;
-  border-radius: 0.25rem;
-  transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; }
-  .btn:focus, .btn:hover {
-    text-decoration: none; }
-  .btn:focus, .btn.focus {
-    outline: 0;
-    box-shadow: 0 0 0 0.2rem rgba(125, 70, 152, 0.25); }
-  .btn.disabled, .btn:disabled {
-    opacity: .65; }
-  .btn:not([disabled]):not(.disabled):active, .btn:not([disabled]):not(.disabled).active {
-    background-image: none; }
-
-a.btn.disabled,
-fieldset[disabled] a.btn {
-  pointer-events: none; }
-
-.btn-primary {
-  color: #fff;
-  background-color: #7D4698;
-  border-color: #7D4698; }
-  .btn-primary:hover {
-    color: #fff;
-    background-color: #673a7e;
-    border-color: #603675; }
-  .btn-primary:focus, .btn-primary.focus {
-    box-shadow: 0 0 0 0.2rem rgba(125, 70, 152, 0.5); }
-  .btn-primary.disabled, .btn-primary:disabled {
-    background-color: #7D4698;
-    border-color: #7D4698; }
-  .btn-primary:not([disabled]):not(.disabled):active, .btn-primary:not([disabled]):not(.disabled).active, .show > .btn-primary.dropdown-toggle {
-    color: #fff;
-    background-color: #603675;
-    border-color: #59326c;
-    box-shadow: 0 0 0 0.2rem rgba(125, 70, 152, 0.5); }
-
-.btn-secondary {
-  color: #fff;
-  background-color: #333A41;
-  border-color: #333A41; }
-  .btn-secondary:hover {
-    color: #fff;
-    background-color: #22272c;
-    border-color: #1d2124; }
-  .btn-secondary:focus, .btn-secondary.focus {
-    box-shadow: 0 0 0 0.2rem rgba(51, 58, 65, 0.5); }
-  .btn-secondary.disabled, .btn-secondary:disabled {
-    background-color: #333A41;
-    border-color: #333A41; }
-  .btn-secondary:not([disabled]):not(.disabled):active, .btn-secondary:not([disabled]):not(.disabled).active, .show > .btn-secondary.dropdown-toggle {
-    color: #fff;
-    background-color: #1d2124;
-    border-color: #171a1d;
-    box-shadow: 0 0 0 0.2rem rgba(51, 58, 65, 0.5); }
-
-.btn-success {
-  color: #fff;
-  background-color: #68B044;
-  border-color: #68B044; }
-  .btn-success:hover {
-    color: #fff;
-    background-color: #589439;
-    border-color: #528b36; }
-  .btn-success:focus, .btn-success.focus {
-    box-shadow: 0 0 0 0.2rem rgba(104, 176, 68, 0.5); }
-  .btn-success.disabled, .btn-success:disabled {
-    background-color: #68B044;
-    border-color: #68B044; }
-  .btn-success:not([disabled]):not(.disabled):active, .btn-success:not([disabled]):not(.disabled).active, .show > .btn-success.dropdown-toggle {
-    color: #fff;
-    background-color: #528b36;
-    border-color: #4d8232;
-    box-shadow: 0 0 0 0.2rem rgba(104, 176, 68, 0.5); }
-
-.btn-info {
-  color: #fff;
-  background-color: #00A5BB;
-  border-color: #00A5BB; }
-  .btn-info:hover {
-    color: #fff;
-    background-color: #008395;
-    border-color: #007888; }
-  .btn-info:focus, .btn-info.focus {
-    box-shadow: 0 0 0 0.2rem rgba(0, 165, 187, 0.5); }
-  .btn-info.disabled, .btn-info:disabled {
-    background-color: #00A5BB;
-    border-color: #00A5BB; }
-  .btn-info:not([disabled]):not(.disabled):active, .btn-info:not([disabled]):not(.disabled).active, .show > .btn-info.dropdown-toggle {
-    color: #fff;
-    background-color: #007888;
-    border-color: #006d7b;
-    box-shadow: 0 0 0 0.2rem rgba(0, 165, 187, 0.5); }
-
-.btn-warning {
-  color: #111;
-  background-color: #FFBF00;
-  border-color: #FFBF00; }
-  .btn-warning:hover {
-    color: #111;
-    background-color: #d9a200;
-    border-color: #cc9900; }
-  .btn-warning:focus, .btn-warning.focus {
-    box-shadow: 0 0 0 0.2rem rgba(255, 191, 0, 0.5); }
-  .btn-warning.disabled, .btn-warning:disabled {
-    background-color: #FFBF00;
-    border-color: #FFBF00; }
-  .btn-warning:not([disabled]):not(.disabled):active, .btn-warning:not([disabled]):not(.disabled).active, .show > .btn-warning.dropdown-toggle {
-    color: #111;
-    background-color: #cc9900;
-    border-color: #bf8f00;
-    box-shadow: 0 0 0 0.2rem rgba(255, 191, 0, 0.5); }
-
-.btn-danger {
-  color: #fff;
-  background-color: #EF243E;
-  border-color: #EF243E; }
-  .btn-danger:hover {
-    color: #fff;
-    background-color: #dd102a;
-    border-color: #d10f28; }
-  .btn-danger:focus, .btn-danger.focus {
-    box-shadow: 0 0 0 0.2rem rgba(239, 36, 62, 0.5); }
-  .btn-danger.disabled, .btn-danger:disabled {
-    background-color: #EF243E;
-    border-color: #EF243E; }
-  .btn-danger:not([disabled]):not(.disabled):active, .btn-danger:not([disabled]):not(.disabled).active, .show > .btn-danger.dropdown-toggle {
-    color: #fff;
-    background-color: #d10f28;
-    border-color: #c50e26;
-    box-shadow: 0 0 0 0.2rem rgba(239, 36, 62, 0.5); }
-
-.btn-light {
-  color: #111;
-  background-color: #F8F9FA;
-  border-color: #F8F9FA; }
-  .btn-light:hover {
-    color: #111;
-    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 {
-    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: #111;
-    background-color: #dae0e5;
-    border-color: #d3d9df;
-    box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5); }
-
-.btn-dark {
-  color: #fff;
-  background-color: #59316B;
-  border-color: #59316B; }
-  .btn-dark:hover {
-    color: #fff;
-    background-color: #432551;
-    border-color: #3c2148; }
-  .btn-dark:focus, .btn-dark.focus {
-    box-shadow: 0 0 0 0.2rem rgba(89, 49, 107, 0.5); }
-  .btn-dark.disabled, .btn-dark:disabled {
-    background-color: #59316B;
-    border-color: #59316B; }
-  .btn-dark:not([disabled]):not(.disabled):active, .btn-dark:not([disabled]):not(.disabled).active, .show > .btn-dark.dropdown-toggle {
-    color: #fff;
-    background-color: #3c2148;
-    border-color: #351d3f;
-    box-shadow: 0 0 0 0.2rem rgba(89, 49, 107, 0.5); }
-
-.btn-outline-primary {
-  color: #7D4698;
-  background-color: transparent;
-  background-image: none;
-  border-color: #7D4698; }
-  .btn-outline-primary:hover {
-    color: #fff;
-    background-color: #7D4698;
-    border-color: #7D4698; }
-  .btn-outline-primary:focus, .btn-outline-primary.focus {
-    box-shadow: 0 0 0 0.2rem rgba(125, 70, 152, 0.5); }
-  .btn-outline-primary.disabled, .btn-outline-primary:disabled {
-    color: #7D4698;
-    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: #7D4698;
-    border-color: #7D4698;
-    box-shadow: 0 0 0 0.2rem rgba(125, 70, 152, 0.5); }
-
-.btn-outline-secondary {
-  color: #333A41;
-  background-color: transparent;
-  background-image: none;
-  border-color: #333A41; }
-  .btn-outline-secondary:hover {
-    color: #fff;
-    background-color: #333A41;
-    border-color: #333A41; }
-  .btn-outline-secondary:focus, .btn-outline-secondary.focus {
-    box-shadow: 0 0 0 0.2rem rgba(51, 58, 65, 0.5); }
-  .btn-outline-secondary.disabled, .btn-outline-secondary:disabled {
-    color: #333A41;
-    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: #333A41;
-    border-color: #333A41;
-    box-shadow: 0 0 0 0.2rem rgba(51, 58, 65, 0.5); }
-
-.btn-outline-success {
-  color: #68B044;
-  background-color: transparent;
-  background-image: none;
-  border-color: #68B044; }
-  .btn-outline-success:hover {
-    color: #fff;
-    background-color: #68B044;
-    border-color: #68B044; }
-  .btn-outline-success:focus, .btn-outline-success.focus {
-    box-shadow: 0 0 0 0.2rem rgba(104, 176, 68, 0.5); }
-  .btn-outline-success.disabled, .btn-outline-success:disabled {
-    color: #68B044;
-    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: #68B044;
-    border-color: #68B044;
-    box-shadow: 0 0 0 0.2rem rgba(104, 176, 68, 0.5); }
-
-.btn-outline-info {
-  color: #00A5BB;
-  background-color: transparent;
-  background-image: none;
-  border-color: #00A5BB; }
-  .btn-outline-info:hover {
-    color: #fff;
-    background-color: #00A5BB;
-    border-color: #00A5BB; }
-  .btn-outline-info:focus, .btn-outline-info.focus {
-    box-shadow: 0 0 0 0.2rem rgba(0, 165, 187, 0.5); }
-  .btn-outline-info.disabled, .btn-outline-info:disabled {
-    color: #00A5BB;
-    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: #00A5BB;
-    border-color: #00A5BB;
-    box-shadow: 0 0 0 0.2rem rgba(0, 165, 187, 0.5); }
-
-.btn-outline-warning {
-  color: #FFBF00;
-  background-color: transparent;
-  background-image: none;
-  border-color: #FFBF00; }
-  .btn-outline-warning:hover {
-    color: #fff;
-    background-color: #FFBF00;
-    border-color: #FFBF00; }
-  .btn-outline-warning:focus, .btn-outline-warning.focus {
-    box-shadow: 0 0 0 0.2rem rgba(255, 191, 0, 0.5); }
-  .btn-outline-warning.disabled, .btn-outline-warning:disabled {
-    color: #FFBF00;
-    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: #fff;
-    background-color: #FFBF00;
-    border-color: #FFBF00;
-    box-shadow: 0 0 0 0.2rem rgba(255, 191, 0, 0.5); }
-
-.btn-outline-danger {
-  color: #EF243E;
-  background-color: transparent;
-  background-image: none;
-  border-color: #EF243E; }
-  .btn-outline-danger:hover {
-    color: #fff;
-    background-color: #EF243E;
-    border-color: #EF243E; }
-  .btn-outline-danger:focus, .btn-outline-danger.focus {
-    box-shadow: 0 0 0 0.2rem rgba(239, 36, 62, 0.5); }
-  .btn-outline-danger.disabled, .btn-outline-danger:disabled {
-    color: #EF243E;
-    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: #EF243E;
-    border-color: #EF243E;
-    box-shadow: 0 0 0 0.2rem rgba(239, 36, 62, 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;
-    box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5); }
-
-.btn-outline-dark {
-  color: #59316B;
-  background-color: transparent;
-  background-image: none;
-  border-color: #59316B; }
-  .btn-outline-dark:hover {
-    color: #fff;
-    background-color: #59316B;
-    border-color: #59316B; }
-  .btn-outline-dark:focus, .btn-outline-dark.focus {
-    box-shadow: 0 0 0 0.2rem rgba(89, 49, 107, 0.5); }
-  .btn-outline-dark.disabled, .btn-outline-dark:disabled {
-    color: #59316B;
-    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: #59316B;
-    border-color: #59316B;
-    box-shadow: 0 0 0 0.2rem rgba(89, 49, 107, 0.5); }
-
-.btn-link {
-  font-weight: 400;
-  color: #7D4698;
-  background-color: transparent; }
-  .btn-link:hover {
-    color: #522e64;
-    text-decoration: underline;
-    background-color: transparent;
-    border-color: transparent; }
-  .btn-link:focus, .btn-link.focus {
-    border-color: transparent;
-    box-shadow: none; }
-  .btn-link:disabled, .btn-link.disabled {
-    color: #848E97; }
-
-.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 {
-  opacity: 0;
-  transition: opacity 0.15s linear; }
-  .fade.show {
-    opacity: 1; }
-
-.collapse {
-  display: none; }
-  .collapse.show {
-    display: block; }
-
-tr.collapse.show {
-  display: table-row; }
-
-tbody.collapse.show {
-  display: table-row-group; }
-
-.collapsing {
-  position: relative;
-  height: 0;
-  overflow: hidden;
-  transition: height 0.35s ease; }
-
-.dropup,
-.dropdown {
-  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; }
-
-.dropup .dropdown-menu {
-  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; }
-
-.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: none;
-  border: 0; }
-  .dropdown-item:focus, .dropdown-item:hover {
-    color: #16181b;
-    text-decoration: none;
-    background-color: #F8F9FA; }
-  .dropdown-item.active, .dropdown-item:active {
-    color: #fff;
-    text-decoration: none;
-    background-color: #7D4698; }
-  .dropdown-item.disabled, .dropdown-item:disabled {
-    color: #848E97;
-    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: #848E97;
-  white-space: nowrap; }
-
-.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: 2; }
-    .btn-group > .btn:focus, .btn-group > .btn:active, .btn-group > .btn.active,
-    .btn-group-vertical > .btn:focus,
-    .btn-group-vertical > .btn:active,
-    .btn-group-vertical > .btn.active {
-      z-index: 2; }
-  .btn-group .btn + .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:not(:first-child):not(:last-child):not(.dropdown-toggle) {
-  border-radius: 0; }
-
-.btn-group > .btn:first-child {
-  margin-left: 0; }
-  .btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {
-    border-top-right-radius: 0;
-    border-bottom-right-radius: 0; }
-
-.btn-group > .btn:last-child:not(:first-child),
-.btn-group > .dropdown-toggle:not(:first-child) {
-  border-top-left-radius: 0;
-  border-bottom-left-radius: 0; }
-
-.btn-group > .btn-group {
-  float: left; }
-
-.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {
-  border-radius: 0; }
-
-.btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child,
-.btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle {
-  border-top-right-radius: 0;
-  border-bottom-right-radius: 0; }
-
-.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child {
-  border-top-left-radius: 0;
-  border-bottom-left-radius: 0; }
-
-.btn + .dropdown-toggle-split {
-  padding-right: 0.5625rem;
-  padding-left: 0.5625rem; }
-  .btn + .dropdown-toggle-split::after {
-    margin-left: 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(:first-child):not(:last-child) {
-    border-radius: 0; }
-  .btn-group-vertical > .btn:first-child:not(:last-child) {
-    border-bottom-right-radius: 0;
-    border-bottom-left-radius: 0; }
-  .btn-group-vertical > .btn:last-child:not(:first-child) {
-    border-top-left-radius: 0;
-    border-top-right-radius: 0; }
-  .btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {
-    border-radius: 0; }
-  .btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child,
-  .btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle {
-    border-bottom-right-radius: 0;
-    border-bottom-left-radius: 0; }
-  .btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {
-    border-top-left-radius: 0;
-    border-top-right-radius: 0; }
-
-[data-toggle="buttons"] > .btn input[type="radio"],
-[data-toggle="buttons"] > .btn input[type="checkbox"],
-[data-toggle="buttons"] > .btn-group > .btn input[type="radio"],
-[data-toggle="buttons"] > .btn-group > .btn input[type="checkbox"] {
-  position: absolute;
-  clip: rect(0, 0, 0, 0);
-  pointer-events: none; }
-
-.input-group {
-  position: relative;
-  display: flex;
-  align-items: stretch;
-  width: 100%; }
-  .input-group .form-control {
-    position: relative;
-    z-index: 2;
-    flex: 1 1 auto;
-    width: 1%;
-    margin-bottom: 0; }
-    .input-group .form-control:focus, .input-group .form-control:active, .input-group .form-control:hover {
-      z-index: 3; }
-
-.input-group-addon,
-.input-group-btn,
-.input-group .form-control {
-  display: flex;
-  align-items: center; }
-  .input-group-addon:not(:first-child):not(:last-child),
-  .input-group-btn:not(:first-child):not(:last-child),
-  .input-group .form-control:not(:first-child):not(:last-child) {
-    border-radius: 0; }
-
-.input-group-addon,
-.input-group-btn {
-  white-space: nowrap; }
-
-.input-group-addon {
-  padding: 0.375rem 0.75rem;
-  margin-bottom: 0;
-  font-size: 1rem;
-  font-weight: 400;
-  line-height: 1.5;
-  color: #495057;
-  text-align: center;
-  background-color: #e9ecef;
-  border: 1px solid #ced4da;
-  border-radius: 0.25rem; }
-  .input-group-addon.form-control-sm,
-  .input-group-sm > .input-group-addon,
-  .input-group-sm > .input-group-btn > .input-group-addon.btn {
-    padding: 0.25rem 0.5rem;
-    font-size: 0.875rem;
-    border-radius: 0.2rem; }
-  .input-group-addon.form-control-lg,
-  .input-group-lg > .input-group-addon,
-  .input-group-lg > .input-group-btn > .input-group-addon.btn {
-    padding: 0.5rem 1rem;
-    font-size: 1.25rem;
-    border-radius: 0.3rem; }
-  .input-group-addon input[type="radio"],
-  .input-group-addon input[type="checkbox"] {
-    margin-top: 0; }
-
-.input-group .form-control:not(:last-child),
-.input-group-addon:not(:last-child),
-.input-group-btn:not(:last-child) > .btn,
-.input-group-btn:not(:last-child) > .btn-group > .btn,
-.input-group-btn:not(:last-child) > .dropdown-toggle,
-.input-group-btn:not(:first-child) > .btn:not(:last-child):not(.dropdown-toggle),
-.input-group-btn:not(:first-child) > .btn-group:not(:last-child) > .btn {
-  border-top-right-radius: 0;
-  border-bottom-right-radius: 0; }
-
-.input-group-addon:not(:last-child) {
-  border-right: 0; }
-
-.input-group .form-control:not(:first-child),
-.input-group-addon:not(:first-child),
-.input-group-btn:not(:first-child) > .btn,
-.input-group-btn:not(:first-child) > .btn-group > .btn,
-.input-group-btn:not(:first-child) > .dropdown-toggle,
-.input-group-btn:not(:last-child) > .btn:not(:first-child),
-.input-group-btn:not(:last-child) > .btn-group:not(:first-child) > .btn {
-  border-top-left-radius: 0;
-  border-bottom-left-radius: 0; }
-
-.form-control + .input-group-addon:not(:first-child) {
-  border-left: 0; }
-
-.input-group-btn {
-  position: relative;
-  align-items: stretch;
-  font-size: 0;
-  white-space: nowrap; }
-  .input-group-btn > .btn {
-    position: relative; }
-    .input-group-btn > .btn + .btn {
-      margin-left: -1px; }
-    .input-group-btn > .btn:focus, .input-group-btn > .btn:active, .input-group-btn > .btn:hover {
-      z-index: 3; }
-  .input-group-btn:first-child > .btn + .btn {
-    margin-left: 0; }
-  .input-group-btn:not(:last-child) > .btn,
-  .input-group-btn:not(:last-child) > .btn-group {
-    margin-right: -1px; }
-  .input-group-btn:not(:first-child) > .btn,
-  .input-group-btn:not(:first-child) > .btn-group {
-    z-index: 2;
-    margin-left: 0; }
-    .input-group-btn:not(:first-child) > .btn:first-child,
-    .input-group-btn:not(:first-child) > .btn-group:first-child {
-      margin-left: -1px; }
-    .input-group-btn:not(:first-child) > .btn:focus, .input-group-btn:not(:first-child) > .btn:active, .input-group-btn:not(:first-child) > .btn:hover,
-    .input-group-btn:not(:first-child) > .btn-group:focus,
-    .input-group-btn:not(:first-child) > .btn-group:active,
-    .input-group-btn:not(:first-child) > .btn-group:hover {
-      z-index: 3; }
-
-.custom-control {
-  position: relative;
-  display: inline-flex;
-  min-height: 1.5rem;
-  padding-left: 1.5rem;
-  margin-right: 1rem; }
-
-.custom-control-input {
-  position: absolute;
-  z-index: -1;
-  opacity: 0; }
-  .custom-control-input:checked ~ .custom-control-indicator {
-    color: #fff;
-    background-color: #7D4698; }
-  .custom-control-input:focus ~ .custom-control-indicator {
-    box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(125, 70, 152, 0.25); }
-  .custom-control-input:active ~ .custom-control-indicator {
-    color: #fff;
-    background-color: #cfb4dc; }
-  .custom-control-input:disabled ~ .custom-control-indicator {
-    background-color: #e9ecef; }
-  .custom-control-input:disabled ~ .custom-control-description {
-    color: #848E97; }
-
-.custom-control-indicator {
-  position: absolute;
-  top: 0.25rem;
-  left: 0;
-  display: block;
-  width: 1rem;
-  height: 1rem;
-  pointer-events: none;
-  user-select: none;
-  background-color: #ddd;
-  background-repeat: no-repeat;
-  background-position: center center;
-  background-size: 50% 50%; }
-
-.custom-checkbox .custom-control-indicator {
-  border-radius: 0.25rem; }
-.custom-checkbox .custom-control-input:checked ~ .custom-control-indicator {
-  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-indicator {
-  background-color: #7D4698;
-  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-radio .custom-control-indicator {
-  border-radius: 50%; }
-.custom-radio .custom-control-input:checked ~ .custom-control-indicator {
-  background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='%23fff'/%3E%3C/svg%3E"); }
-
-.custom-controls-stacked {
-  display: flex;
-  flex-direction: column; }
-  .custom-controls-stacked .custom-control {
-    margin-bottom: 0.25rem; }
-    .custom-controls-stacked .custom-control + .custom-control {
-      margin-left: 0; }
-
-.custom-select {
-  display: inline-block;
-  max-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='%23333' 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;
-  appearance: none; }
-  .custom-select:focus {
-    border-color: #b991cc;
-    outline: none; }
-    .custom-select:focus::-ms-value {
-      color: #495057;
-      background-color: #fff; }
-  .custom-select[multiple] {
-    height: auto;
-    background-image: none; }
-  .custom-select:disabled {
-    color: #848E97;
-    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-file {
-  position: relative;
-  display: inline-block;
-  max-width: 100%;
-  height: calc(2.25rem + 2px);
-  margin-bottom: 0; }
-
-.custom-file-input {
-  min-width: 14rem;
-  max-width: 100%;
-  height: calc(2.25rem + 2px);
-  margin: 0;
-  opacity: 0; }
-  .custom-file-input:focus ~ .custom-file-control {
-    box-shadow: 0 0 0 0.075rem #fff, 0 0 0 0.2rem #7D4698; }
-
-.custom-file-control {
-  position: absolute;
-  top: 0;
-  right: 0;
-  left: 0;
-  z-index: 5;
-  height: calc(2.25rem + 2px);
-  padding: 0.375rem 0.75rem;
-  line-height: 1.5;
-  color: #495057;
-  pointer-events: none;
-  user-select: none;
-  background-color: #fff;
-  border: 1px solid #ced4da;
-  border-radius: 0.25rem; }
-  .custom-file-control:lang(en):empty::after {
-    content: "Choose file..."; }
-  .custom-file-control::before {
-    position: absolute;
-    top: -1px;
-    right: -1px;
-    bottom: -1px;
-    z-index: 6;
-    display: block;
-    height: calc(2.25rem + 2px);
-    padding: 0.375rem 0.75rem;
-    line-height: 1.5;
-    color: #495057;
-    background-color: #e9ecef;
-    border: 1px solid #ced4da;
-    border-radius: 0 0.25rem 0.25rem 0; }
-  .custom-file-control:lang(en)::before {
-    content: "Browse"; }
-
-.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:focus, .nav-link:hover {
-    text-decoration: none; }
-  .nav-link.disabled {
-    color: #848E97; }
-
-.nav-tabs {
-  border-bottom: 1px solid #ddd; }
-  .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:focus, .nav-tabs .nav-link:hover {
-      border-color: #e9ecef #e9ecef #ddd; }
-    .nav-tabs .nav-link.disabled {
-      color: #848E97;
-      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: #ddd #ddd #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: #7D4698; }
-
-.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:focus, .navbar-brand:hover {
-    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: transparent;
-  border: 1px solid transparent;
-  border-radius: 0.25rem; }
-  .navbar-toggler:focus, .navbar-toggler:hover {
-    text-decoration: none; }
-
-.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%; }
-
- at media (max-width: 575px) {
-  .navbar-expand-sm > .container,
-  .navbar-expand-sm > .container-fluid {
-    padding-right: 0;
-    padding-left: 0; } }
- at 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 .dropdown-menu-right {
-        right: 0;
-        left: auto; }
-      .navbar-expand-sm .navbar-nav .nav-link {
-        padding-right: .5rem;
-        padding-left: .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; }
-    .navbar-expand-sm .dropup .dropdown-menu {
-      top: auto;
-      bottom: 100%; } }
- at media (max-width: 767px) {
-  .navbar-expand-md > .container,
-  .navbar-expand-md > .container-fluid {
-    padding-right: 0;
-    padding-left: 0; } }
- at 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 .dropdown-menu-right {
-        right: 0;
-        left: auto; }
-      .navbar-expand-md .navbar-nav .nav-link {
-        padding-right: .5rem;
-        padding-left: .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; }
-    .navbar-expand-md .dropup .dropdown-menu {
-      top: auto;
-      bottom: 100%; } }
- at media (max-width: 991px) {
-  .navbar-expand-lg > .container,
-  .navbar-expand-lg > .container-fluid {
-    padding-right: 0;
-    padding-left: 0; } }
- at 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 .dropdown-menu-right {
-        right: 0;
-        left: auto; }
-      .navbar-expand-lg .navbar-nav .nav-link {
-        padding-right: .5rem;
-        padding-left: .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; }
-    .navbar-expand-lg .dropup .dropdown-menu {
-      top: auto;
-      bottom: 100%; } }
- at media (max-width: 1199px) {
-  .navbar-expand-xl > .container,
-  .navbar-expand-xl > .container-fluid {
-    padding-right: 0;
-    padding-left: 0; } }
- at 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 .dropdown-menu-right {
-        right: 0;
-        left: auto; }
-      .navbar-expand-xl .navbar-nav .nav-link {
-        padding-right: .5rem;
-        padding-left: .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-xl .dropup .dropdown-menu {
-      top: auto;
-      bottom: 100%; } }
-.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 .dropdown-menu-right {
-      right: 0;
-      left: auto; }
-    .navbar-expand .navbar-nav .nav-link {
-      padding-right: .5rem;
-      padding-left: .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-expand .dropup .dropdown-menu {
-    top: auto;
-    bottom: 100%; }
-
-.navbar-light .navbar-brand {
-  color: rgba(0, 0, 0, 0.9); }
-  .navbar-light .navbar-brand:focus, .navbar-light .navbar-brand:hover {
-    color: rgba(0, 0, 0, 0.9); }
-.navbar-light .navbar-nav .nav-link {
-  color: #59316B; }
-  .navbar-light .navbar-nav .nav-link:focus, .navbar-light .navbar-nav .nav-link:hover {
-    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: #59316B;
-  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='%2359316B' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E"); }
-.navbar-light .navbar-text {
-  color: #59316B; }
-  .navbar-light .navbar-text a {
-    color: rgba(0, 0, 0, 0.9); }
-    .navbar-light .navbar-text a:focus, .navbar-light .navbar-text a:hover {
-      color: rgba(0, 0, 0, 0.9); }
-
-.navbar-dark .navbar-brand {
-  color: #fff; }
-  .navbar-dark .navbar-brand:focus, .navbar-dark .navbar-brand:hover {
-    color: #fff; }
-.navbar-dark .navbar-nav .nav-link {
-  color: #fff; }
-  .navbar-dark .navbar-nav .nav-link:focus, .navbar-dark .navbar-nav .nav-link:hover {
-    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: #fff;
-  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='%23fff' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E"); }
-.navbar-dark .navbar-text {
-  color: #fff; }
-  .navbar-dark .navbar-text a {
-    color: #fff; }
-    .navbar-dark .navbar-text a:focus, .navbar-dark .navbar-text a:hover {
-      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 {
-            border-top-right-radius: 0; }
-          .card-group .card:first-child .card-img-bottom {
-            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 {
-            border-top-left-radius: 0; }
-          .card-group .card:last-child .card-img-bottom {
-            border-bottom-left-radius: 0; }
-        .card-group .card:only-child {
-          border-radius: 0.25rem; }
-          .card-group .card:only-child .card-img-top {
-            border-top-left-radius: 0.25rem;
-            border-top-right-radius: 0.25rem; }
-          .card-group .card:only-child .card-img-bottom {
-            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 {
-            border-radius: 0; } }
-
-.card-columns .card {
-  margin-bottom: 0.75rem; }
- at media (min-width: 576px) {
-  .card-columns {
-    column-count: 3;
-    column-gap: 1.25rem; }
-    .card-columns .card {
-      display: inline-block;
-      width: 100%; } }
-
-.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::before {
-  display: inline-block;
-  padding-right: 0.5rem;
-  padding-left: 0.5rem;
-  color: #848E97;
-  content: "/"; }
-.breadcrumb-item + .breadcrumb-item:hover::before {
-  text-decoration: underline; }
-.breadcrumb-item + .breadcrumb-item:hover::before {
-  text-decoration: none; }
-.breadcrumb-item.active {
-  color: #848E97; }
-
-.pagination {
-  display: flex;
-  padding-left: 0;
-  list-style: none;
-  border-radius: 0.25rem; }
-
-.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: 2;
-  color: #fff;
-  background-color: #7D4698;
-  border-color: #7D4698; }
-.page-item.disabled .page-link {
-  color: #848E97;
-  pointer-events: none;
-  background-color: #fff;
-  border-color: #ddd; }
-
-.page-link {
-  position: relative;
-  display: block;
-  padding: 0.5rem 0.75rem;
-  margin-left: -1px;
-  line-height: 1.25;
-  color: #7D4698;
-  background-color: #fff;
-  border: 1px solid #ddd; }
-  .page-link:focus, .page-link:hover {
-    color: #522e64;
-    text-decoration: none;
-    background-color: #e9ecef;
-    border-color: #ddd; }
-
-.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: #7D4698; }
-  .badge-primary[href]:focus, .badge-primary[href]:hover {
-    color: #fff;
-    text-decoration: none;
-    background-color: #603675; }
-
-.badge-secondary {
-  color: #fff;
-  background-color: #333A41; }
-  .badge-secondary[href]:focus, .badge-secondary[href]:hover {
-    color: #fff;
-    text-decoration: none;
-    background-color: #1d2124; }
-
-.badge-success {
-  color: #fff;
-  background-color: #68B044; }
-  .badge-success[href]:focus, .badge-success[href]:hover {
-    color: #fff;
-    text-decoration: none;
-    background-color: #528b36; }
-
-.badge-info {
-  color: #fff;
-  background-color: #00A5BB; }
-  .badge-info[href]:focus, .badge-info[href]:hover {
-    color: #fff;
-    text-decoration: none;
-    background-color: #007888; }
-
-.badge-warning {
-  color: #111;
-  background-color: #FFBF00; }
-  .badge-warning[href]:focus, .badge-warning[href]:hover {
-    color: #111;
-    text-decoration: none;
-    background-color: #cc9900; }
-
-.badge-danger {
-  color: #fff;
-  background-color: #EF243E; }
-  .badge-danger[href]:focus, .badge-danger[href]:hover {
-    color: #fff;
-    text-decoration: none;
-    background-color: #d10f28; }
-
-.badge-light {
-  color: #111;
-  background-color: #F8F9FA; }
-  .badge-light[href]:focus, .badge-light[href]:hover {
-    color: #111;
-    text-decoration: none;
-    background-color: #dae0e5; }
-
-.badge-dark {
-  color: #fff;
-  background-color: #59316B; }
-  .badge-dark[href]:focus, .badge-dark[href]:hover {
-    color: #fff;
-    text-decoration: none;
-    background-color: #3c2148; }
-
-.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 .close {
-  position: absolute;
-  top: 0;
-  right: 0;
-  padding: 0.75rem 1.25rem;
-  color: inherit; }
-
-.alert-primary {
-  color: #41244f;
-  background-color: #e5daea;
-  border-color: #dbcbe2; }
-  .alert-primary hr {
-    border-top-color: #d0bbd9; }
-  .alert-primary .alert-link {
-    color: #24142c; }
-
-.alert-secondary {
-  color: #1b1e22;
-  background-color: #d6d8d9;
-  border-color: #c6c8ca; }
-  .alert-secondary hr {
-    border-top-color: #b9bbbe; }
-  .alert-secondary .alert-link {
-    color: #040506; }
-
-.alert-success {
-  color: #365c23;
-  background-color: #e1efda;
-  border-color: #d5e9cb; }
-  .alert-success hr {
-    border-top-color: #c7e1b9; }
-  .alert-success .alert-link {
-    color: #203715; }
-
-.alert-info {
-  color: #005661;
-  background-color: #ccedf1;
-  border-color: #b8e6ec; }
-  .alert-info hr {
-    border-top-color: #a4dfe7; }
-  .alert-info .alert-link {
-    color: #00292e; }
-
-.alert-warning {
-  color: #856300;
-  background-color: #fff2cc;
-  border-color: #ffedb8; }
-  .alert-warning hr {
-    border-top-color: #ffe79f; }
-  .alert-warning .alert-link {
-    color: #523d00; }
-
-.alert-danger {
-  color: #7c1320;
-  background-color: #fcd3d8;
-  border-color: #fbc2c9; }
-  .alert-danger hr {
-    border-top-color: #f9aab4; }
-  .alert-danger .alert-link {
-    color: #500c15; }
-
-.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: #2e1938;
-  background-color: #ded6e1;
-  border-color: #d1c5d6; }
-  .alert-dark hr {
-    border-top-color: #c5b6cb; }
-  .alert-dark .alert-link {
-    color: #110915; }
-
- at 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;
-  align-items: center;
-  justify-content: center;
-  color: #fff;
-  background-color: #7D4698; }
-
-.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 {
-  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:focus, .list-group-item-action:hover {
-    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:focus, .list-group-item:hover {
-    text-decoration: none; }
-  .list-group-item.disabled, .list-group-item:disabled {
-    color: #848E97;
-    background-color: #fff; }
-  .list-group-item.active {
-    z-index: 2;
-    color: #fff;
-    background-color: #7D4698;
-    border-color: #7D4698; }
-
-.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: #41244f;
-  background-color: #dbcbe2; }
-
-a.list-group-item-primary,
-button.list-group-item-primary {
-  color: #41244f; }
-  a.list-group-item-primary:focus, a.list-group-item-primary:hover,
-  button.list-group-item-primary:focus,
-  button.list-group-item-primary:hover {
-    color: #41244f;
-    background-color: #d0bbd9; }
-  a.list-group-item-primary.active,
-  button.list-group-item-primary.active {
-    color: #fff;
-    background-color: #41244f;
-    border-color: #41244f; }
-
-.list-group-item-secondary {
-  color: #1b1e22;
-  background-color: #c6c8ca; }
-
-a.list-group-item-secondary,
-button.list-group-item-secondary {
-  color: #1b1e22; }
-  a.list-group-item-secondary:focus, a.list-group-item-secondary:hover,
-  button.list-group-item-secondary:focus,
-  button.list-group-item-secondary:hover {
-    color: #1b1e22;
-    background-color: #b9bbbe; }
-  a.list-group-item-secondary.active,
-  button.list-group-item-secondary.active {
-    color: #fff;
-    background-color: #1b1e22;
-    border-color: #1b1e22; }
-
-.list-group-item-success {
-  color: #365c23;
-  background-color: #d5e9cb; }
-
-a.list-group-item-success,
-button.list-group-item-success {
-  color: #365c23; }
-  a.list-group-item-success:focus, a.list-group-item-success:hover,
-  button.list-group-item-success:focus,
-  button.list-group-item-success:hover {
-    color: #365c23;
-    background-color: #c7e1b9; }
-  a.list-group-item-success.active,
-  button.list-group-item-success.active {
-    color: #fff;
-    background-color: #365c23;
-    border-color: #365c23; }
-
-.list-group-item-info {
-  color: #005661;
-  background-color: #b8e6ec; }
-
-a.list-group-item-info,
-button.list-group-item-info {
-  color: #005661; }
-  a.list-group-item-info:focus, a.list-group-item-info:hover,
-  button.list-group-item-info:focus,
-  button.list-group-item-info:hover {
-    color: #005661;
-    background-color: #a4dfe7; }
-  a.list-group-item-info.active,
-  button.list-group-item-info.active {
-    color: #fff;
-    background-color: #005661;
-    border-color: #005661; }
-
-.list-group-item-warning {
-  color: #856300;
-  background-color: #ffedb8; }
-
-a.list-group-item-warning,
-button.list-group-item-warning {
-  color: #856300; }
-  a.list-group-item-warning:focus, a.list-group-item-warning:hover,
-  button.list-group-item-warning:focus,
-  button.list-group-item-warning:hover {
-    color: #856300;
-    background-color: #ffe79f; }
-  a.list-group-item-warning.active,
-  button.list-group-item-warning.active {
-    color: #fff;
-    background-color: #856300;
-    border-color: #856300; }
-
-.list-group-item-danger {
-  color: #7c1320;
-  background-color: #fbc2c9; }
-
-a.list-group-item-danger,
-button.list-group-item-danger {
-  color: #7c1320; }
-  a.list-group-item-danger:focus, a.list-group-item-danger:hover,
-  button.list-group-item-danger:focus,
-  button.list-group-item-danger:hover {
-    color: #7c1320;
-    background-color: #f9aab4; }
-  a.list-group-item-danger.active,
-  button.list-group-item-danger.active {
-    color: #fff;
-    background-color: #7c1320;
-    border-color: #7c1320; }
-
-.list-group-item-light {
-  color: #818182;
-  background-color: #fdfdfe; }
-
-a.list-group-item-light,
-button.list-group-item-light {
-  color: #818182; }
-  a.list-group-item-light:focus, a.list-group-item-light:hover,
-  button.list-group-item-light:focus,
-  button.list-group-item-light:hover {
-    color: #818182;
-    background-color: #ececf6; }
-  a.list-group-item-light.active,
-  button.list-group-item-light.active {
-    color: #fff;
-    background-color: #818182;
-    border-color: #818182; }
-
-.list-group-item-dark {
-  color: #2e1938;
-  background-color: #d1c5d6; }
-
-a.list-group-item-dark,
-button.list-group-item-dark {
-  color: #2e1938; }
-  a.list-group-item-dark:focus, a.list-group-item-dark:hover,
-  button.list-group-item-dark:focus,
-  button.list-group-item-dark:hover {
-    color: #2e1938;
-    background-color: #c5b6cb; }
-  a.list-group-item-dark.active,
-  button.list-group-item-dark.active {
-    color: #fff;
-    background-color: #2e1938;
-    border-color: #2e1938; }
-
-.close {
-  float: right;
-  font-size: 1.5rem;
-  font-weight: 700;
-  line-height: 1;
-  color: #000;
-  text-shadow: 0 1px 0 #fff;
-  opacity: .5; }
-  .close:focus, .close:hover {
-    color: #000;
-    text-decoration: none;
-    opacity: .75; }
-
-button.close {
-  padding: 0;
-  background: transparent;
-  border: 0;
-  -webkit-appearance: none; }
-
-.modal-open {
-  overflow: hidden; }
-
-.modal {
-  position: fixed;
-  top: 0;
-  right: 0;
-  bottom: 0;
-  left: 0;
-  z-index: 1050;
-  display: none;
-  overflow: hidden;
-  outline: 0; }
-  .modal.fade .modal-dialog {
-    transition: transform 0.3s ease-out;
-    transform: translate(0, -25%); }
-  .modal.show .modal-dialog {
-    transform: translate(0, 0); }
-
-.modal-open .modal {
-  overflow-x: hidden;
-  overflow-y: auto; }
-
-.modal-dialog {
-  position: relative;
-  width: auto;
-  margin: 10px;
-  pointer-events: none; }
-
-.modal-content {
-  position: relative;
-  display: flex;
-  flex-direction: column;
-  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: 15px;
-  border-bottom: 1px solid #e9ecef;
-  border-top-left-radius: 0.3rem;
-  border-top-right-radius: 0.3rem; }
-  .modal-header .close {
-    padding: 15px;
-    margin: -15px -15px -15px auto; }
-
-.modal-title {
-  margin-bottom: 0;
-  line-height: 1.5; }
-
-.modal-body {
-  position: relative;
-  flex: 1 1 auto;
-  padding: 15px; }
-
-.modal-footer {
-  display: flex;
-  align-items: center;
-  justify-content: flex-end;
-  padding: 15px;
-  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; }
-
- at media (min-width: 576px) {
-  .modal-dialog {
-    max-width: 500px;
-    margin: 30px auto; }
-
-  .modal-sm {
-    max-width: 300px; } }
- at media (min-width: 992px) {
-  .modal-lg {
-    max-width: 800px; } }
-.tooltip {
-  position: absolute;
-  z-index: 1070;
-  display: block;
-  margin: 0;
-  font-family: "Source Sans Pro", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
-  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: 5px;
-    height: 5px; }
-  .tooltip .arrow::before {
-    position: absolute;
-    border-color: transparent;
-    border-style: solid; }
-  .tooltip.bs-tooltip-top, .tooltip.bs-tooltip-auto[x-placement^="top"] {
-    padding: 5px 0; }
-    .tooltip.bs-tooltip-top .arrow, .tooltip.bs-tooltip-auto[x-placement^="top"] .arrow {
-      bottom: 0; }
-    .tooltip.bs-tooltip-top .arrow::before, .tooltip.bs-tooltip-auto[x-placement^="top"] .arrow::before {
-      margin-left: -3px;
-      content: "";
-      border-width: 5px 5px 0;
-      border-top-color: #000; }
-  .tooltip.bs-tooltip-right, .tooltip.bs-tooltip-auto[x-placement^="right"] {
-    padding: 0 5px; }
-    .tooltip.bs-tooltip-right .arrow, .tooltip.bs-tooltip-auto[x-placement^="right"] .arrow {
-      left: 0; }
-    .tooltip.bs-tooltip-right .arrow::before, .tooltip.bs-tooltip-auto[x-placement^="right"] .arrow::before {
-      margin-top: -3px;
-      content: "";
-      border-width: 5px 5px 5px 0;
-      border-right-color: #000; }
-  .tooltip.bs-tooltip-bottom, .tooltip.bs-tooltip-auto[x-placement^="bottom"] {
-    padding: 5px 0; }
-    .tooltip.bs-tooltip-bottom .arrow, .tooltip.bs-tooltip-auto[x-placement^="bottom"] .arrow {
-      top: 0; }
-    .tooltip.bs-tooltip-bottom .arrow::before, .tooltip.bs-tooltip-auto[x-placement^="bottom"] .arrow::before {
-      margin-left: -3px;
-      content: "";
-      border-width: 0 5px 5px;
-      border-bottom-color: #000; }
-  .tooltip.bs-tooltip-left, .tooltip.bs-tooltip-auto[x-placement^="left"] {
-    padding: 0 5px; }
-    .tooltip.bs-tooltip-left .arrow, .tooltip.bs-tooltip-auto[x-placement^="left"] .arrow {
-      right: 0; }
-    .tooltip.bs-tooltip-left .arrow::before, .tooltip.bs-tooltip-auto[x-placement^="left"] .arrow::before {
-      right: 0;
-      margin-top: -3px;
-      content: "";
-      border-width: 5px 0 5px 5px;
-      border-left-color: #000; }
-
-.tooltip-inner {
-  max-width: 200px;
-  padding: 3px 8px;
-  color: #fff;
-  text-align: center;
-  background-color: #000;
-  border-radius: 0.25rem; }
-
-.popover {
-  position: absolute;
-  top: 0;
-  left: 0;
-  z-index: 1060;
-  display: block;
-  max-width: 276px;
-  font-family: "Source Sans Pro", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
-  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: 0.8rem;
-    height: 0.4rem; }
-  .popover .arrow::before,
-  .popover .arrow::after {
-    position: absolute;
-    display: block;
-    border-color: transparent;
-    border-style: solid; }
-  .popover .arrow::before {
-    content: "";
-    border-width: 0.8rem; }
-  .popover .arrow::after {
-    content: "";
-    border-width: 0.8rem; }
-  .popover.bs-popover-top, .popover.bs-popover-auto[x-placement^="top"] {
-    margin-bottom: 0.8rem; }
-    .popover.bs-popover-top .arrow, .popover.bs-popover-auto[x-placement^="top"] .arrow {
-      bottom: 0; }
-    .popover.bs-popover-top .arrow::before, .popover.bs-popover-auto[x-placement^="top"] .arrow::before,
-    .popover.bs-popover-top .arrow::after,
-    .popover.bs-popover-auto[x-placement^="top"] .arrow::after {
-      border-bottom-width: 0; }
-    .popover.bs-popover-top .arrow::before, .popover.bs-popover-auto[x-placement^="top"] .arrow::before {
-      bottom: -0.8rem;
-      margin-left: -0.8rem;
-      border-top-color: rgba(0, 0, 0, 0.25); }
-    .popover.bs-popover-top .arrow::after, .popover.bs-popover-auto[x-placement^="top"] .arrow::after {
-      bottom: calc((0.8rem - 1px) * -1);
-      margin-left: -0.8rem;
-      border-top-color: #fff; }
-  .popover.bs-popover-right, .popover.bs-popover-auto[x-placement^="right"] {
-    margin-left: 0.8rem; }
-    .popover.bs-popover-right .arrow, .popover.bs-popover-auto[x-placement^="right"] .arrow {
-      left: 0; }
-    .popover.bs-popover-right .arrow::before, .popover.bs-popover-auto[x-placement^="right"] .arrow::before,
-    .popover.bs-popover-right .arrow::after,
-    .popover.bs-popover-auto[x-placement^="right"] .arrow::after {
-      margin-top: -0.8rem;
-      border-left-width: 0; }
-    .popover.bs-popover-right .arrow::before, .popover.bs-popover-auto[x-placement^="right"] .arrow::before {
-      left: -0.8rem;
-      border-right-color: rgba(0, 0, 0, 0.25); }
-    .popover.bs-popover-right .arrow::after, .popover.bs-popover-auto[x-placement^="right"] .arrow::after {
-      left: calc((0.8rem - 1px) * -1);
-      border-right-color: #fff; }
-  .popover.bs-popover-bottom, .popover.bs-popover-auto[x-placement^="bottom"] {
-    margin-top: 0.8rem; }
-    .popover.bs-popover-bottom .arrow, .popover.bs-popover-auto[x-placement^="bottom"] .arrow {
-      top: 0; }
-    .popover.bs-popover-bottom .arrow::before, .popover.bs-popover-auto[x-placement^="bottom"] .arrow::before,
-    .popover.bs-popover-bottom .arrow::after,
-    .popover.bs-popover-auto[x-placement^="bottom"] .arrow::after {
-      margin-left: -0.8rem;
-      border-top-width: 0; }
-    .popover.bs-popover-bottom .arrow::before, .popover.bs-popover-auto[x-placement^="bottom"] .arrow::before {
-      top: -0.8rem;
-      border-bottom-color: rgba(0, 0, 0, 0.25); }
-    .popover.bs-popover-bottom .arrow::after, .popover.bs-popover-auto[x-placement^="bottom"] .arrow::after {
-      top: calc((0.8rem - 1px) * -1);
-      border-bottom-color: #fff; }
-    .popover.bs-popover-bottom .popover-header::before, .popover.bs-popover-auto[x-placement^="bottom"] .popover-header::before {
-      position: absolute;
-      top: 0;
-      left: 50%;
-      display: block;
-      width: 20px;
-      margin-left: -10px;
-      content: "";
-      border-bottom: 1px solid #f7f7f7; }
-  .popover.bs-popover-left, .popover.bs-popover-auto[x-placement^="left"] {
-    margin-right: 0.8rem; }
-    .popover.bs-popover-left .arrow, .popover.bs-popover-auto[x-placement^="left"] .arrow {
-      right: 0; }
-    .popover.bs-popover-left .arrow::before, .popover.bs-popover-auto[x-placement^="left"] .arrow::before,
-    .popover.bs-popover-left .arrow::after,
-    .popover.bs-popover-auto[x-placement^="left"] .arrow::after {
-      margin-top: -0.8rem;
-      border-right-width: 0; }
-    .popover.bs-popover-left .arrow::before, .popover.bs-popover-auto[x-placement^="left"] .arrow::before {
-      right: -0.8rem;
-      border-left-color: rgba(0, 0, 0, 0.25); }
-    .popover.bs-popover-left .arrow::after, .popover.bs-popover-auto[x-placement^="left"] .arrow::after {
-      right: calc((0.8rem - 1px) * -1);
-      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%;
-  transition: transform 0.6s ease;
-  backface-visibility: hidden;
-  perspective: 1000px; }
-
-.carousel-item.active,
-.carousel-item-next,
-.carousel-item-prev {
-  display: block; }
-
-.carousel-item-next,
-.carousel-item-prev {
-  position: absolute;
-  top: 0; }
-
-.carousel-item-next.carousel-item-left,
-.carousel-item-prev.carousel-item-right {
-  transform: translateX(0); }
-  @supports (transform-style: preserve-3d) {
-    .carousel-item-next.carousel-item-left,
-    .carousel-item-prev.carousel-item-right {
-      transform: translate3d(0, 0, 0); } }
-
-.carousel-item-next,
-.active.carousel-item-right {
-  transform: translateX(100%); }
-  @supports (transform-style: preserve-3d) {
-    .carousel-item-next,
-    .active.carousel-item-right {
-      transform: translate3d(100%, 0, 0); } }
-
-.carousel-item-prev,
-.active.carousel-item-left {
-  transform: translateX(-100%); }
-  @supports (transform-style: preserve-3d) {
-    .carousel-item-prev,
-    .active.carousel-item-left {
-      transform: translate3d(-100%, 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:focus, .carousel-control-prev:hover,
-  .carousel-control-next:focus,
-  .carousel-control-next:hover {
-    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;
-    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: #7D4698 !important; }
-
-a.bg-primary:focus, a.bg-primary:hover {
-  background-color: #603675 !important; }
-
-.bg-secondary {
-  background-color: #333A41 !important; }
-
-a.bg-secondary:focus, a.bg-secondary:hover {
-  background-color: #1d2124 !important; }
-
-.bg-success {
-  background-color: #68B044 !important; }
-
-a.bg-success:focus, a.bg-success:hover {
-  background-color: #528b36 !important; }
-
-.bg-info {
-  background-color: #00A5BB !important; }
-
-a.bg-info:focus, a.bg-info:hover {
-  background-color: #007888 !important; }
-
-.bg-warning {
-  background-color: #FFBF00 !important; }
-
-a.bg-warning:focus, a.bg-warning:hover {
-  background-color: #cc9900 !important; }
-
-.bg-danger {
-  background-color: #EF243E !important; }
-
-a.bg-danger:focus, a.bg-danger:hover {
-  background-color: #d10f28 !important; }
-
-.bg-light {
-  background-color: #F8F9FA !important; }
-
-a.bg-light:focus, a.bg-light:hover {
-  background-color: #dae0e5 !important; }
-
-.bg-dark {
-  background-color: #59316B !important; }
-
-a.bg-dark:focus, a.bg-dark:hover {
-  background-color: #3c2148 !important; }
-
-.bg-white {
-  background-color: #fff !important; }
-
-.bg-transparent {
-  background-color: transparent !important; }
-
-.border {
-  border: 1px solid #e9ecef !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: #7D4698 !important; }
-
-.border-secondary {
-  border-color: #333A41 !important; }
-
-.border-success {
-  border-color: #68B044 !important; }
-
-.border-info {
-  border-color: #00A5BB !important; }
-
-.border-warning {
-  border-color: #FFBF00 !important; }
-
-.border-danger {
-  border-color: #EF243E !important; }
-
-.border-light {
-  border-color: #F8F9FA !important; }
-
-.border-dark {
-  border-color: #59316B !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; }
-
- at 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; } }
- at 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; } }
- at 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; } }
- at 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; } }
-.d-print-block {
-  display: none !important; }
-  @media print {
-    .d-print-block {
-      display: block !important; } }
-
-.d-print-inline {
-  display: none !important; }
-  @media print {
-    .d-print-inline {
-      display: inline !important; } }
-
-.d-print-inline-block {
-  display: none !important; }
-  @media print {
-    .d-print-inline-block {
-      display: inline-block !important; } }
-
- at media print {
-  .d-print-none {
-    display: none !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; }
-
-.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; }
-
- at 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; }
-
-  .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; } }
- at 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; }
-
-  .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; } }
- at 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; }
-
-  .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; } }
- at 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; }
-
-  .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; }
-
- at media (min-width: 576px) {
-  .float-sm-left {
-    float: left !important; }
-
-  .float-sm-right {
-    float: right !important; }
-
-  .float-sm-none {
-    float: none !important; } }
- at media (min-width: 768px) {
-  .float-md-left {
-    float: left !important; }
-
-  .float-md-right {
-    float: right !important; }
-
-  .float-md-none {
-    float: none !important; } }
- at media (min-width: 992px) {
-  .float-lg-left {
-    float: left !important; }
-
-  .float-lg-right {
-    float: right !important; }
-
-  .float-lg-none {
-    float: none !important; } }
- at 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: 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; }
-
- at supports (position: sticky) {
-  .sticky-top {
-    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;
-  clip-path: inset(50%);
-  border: 0; }
-
-.sr-only-focusable:active, .sr-only-focusable:focus {
-  position: static;
-  width: auto;
-  height: auto;
-  overflow: visible;
-  clip: auto;
-  white-space: normal;
-  clip-path: none; }
-
-.w-25 {
-  width: 25% !important; }
-
-.w-50 {
-  width: 50% !important; }
-
-.w-75 {
-  width: 75% !important; }
-
-.w-100 {
-  width: 100% !important; }
-
-.h-25 {
-  height: 25% !important; }
-
-.h-50 {
-  height: 50% !important; }
-
-.h-75 {
-  height: 75% !important; }
-
-.h-100 {
-  height: 100% !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; }
-
- at 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; } }
- at 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; } }
- at 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; } }
- at 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-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; }
-
- at 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; } }
- at 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; } }
- at 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; } }
- at 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: #7D4698 !important; }
-
-a.text-primary:focus, a.text-primary:hover {
-  color: #603675 !important; }
-
-.text-secondary {
-  color: #333A41 !important; }
-
-a.text-secondary:focus, a.text-secondary:hover {
-  color: #1d2124 !important; }
-
-.text-success {
-  color: #68B044 !important; }
-
-a.text-success:focus, a.text-success:hover {
-  color: #528b36 !important; }
-
-.text-info {
-  color: #00A5BB !important; }
-
-a.text-info:focus, a.text-info:hover {
-  color: #007888 !important; }
-
-.text-warning {
-  color: #FFBF00 !important; }
-
-a.text-warning:focus, a.text-warning:hover {
-  color: #cc9900 !important; }
-
-.text-danger {
-  color: #EF243E !important; }
-
-a.text-danger:focus, a.text-danger:hover {
-  color: #d10f28 !important; }
-
-.text-light {
-  color: #F8F9FA !important; }
-
-a.text-light:focus, a.text-light:hover {
-  color: #dae0e5 !important; }
-
-.text-dark {
-  color: #59316B !important; }
-
-a.text-dark:focus, a.text-dark:hover {
-  color: #3c2148 !important; }
-
-.text-muted {
-  color: #848E97 !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; }
-
-/*
- * Base structure
- */
-/* Move down content because we have a fixed navbar that is 4.5rem tall */
-.page {
-  padding-top: 4.5rem; }
-
-/* Reset */
-.no-border {
-  border: none; }
-
-.no-background {
-  background-image: none !important; }
-
-.content-scroll {
-  position: relative; }
-
-/*
- * Typography
- */
- at font-face {
-  font-family: Source Sans Pro;
-  src: url("fonts/SourceSansPro/SourceSansPro-Regular.ttf"); }
- at font-face {
-  font-family: Source Sans Pro Light;
-  src: url("fonts/SourceSansPro/SourceSansPro-Light.ttf"); }
- at font-face {
-  font-family: Source Sans Pro Bold;
-  src: url("fonts/SourceSansPro/SourceSansPro-Bold.ttf"); }
- at font-face {
-  font-family: Source Serif Pro;
-  src: url("fonts/SourceSerifPro/SourceSerifPro-Regular.ttf"); }
- at font-face {
-  font-family: Source Code Pro;
-  src: url("fonts/SourceCodePro/SourceCodePro-Regular.ttf"); }
- at font-face {
-  font-family: Tor Icons;
-  src: url("fonts/TorIcons/tor-icons.eot?#iefix") format("embedded-opentype"), url("fonts/TorIcons/tor-icons.woff2") format("woff2"), url("fonsts/TorIcons/tor-icons.woff") format("woff"), url("fonts/TorIcons/tor-icons.ttf") format("truetype"), url("fonts/TorIcons/tor-icons.svg?#tor-icons") format("svg"); }
-.font-family-serif {
-  font-family: "Source Serif Pro", -apple-system, "Georgia", serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol" !important; }
-
-.font-weight-light {
-  font-family: Source Sans Pro Light; }
-
-.font-weight-bold {
-  font-family: Source Sans Pro Bold; }
-
-h6 {
-  text-transform: uppercase;
-  font-weight: bold;
-  color: #7D4698; }
-
-p {
-  font-size: 1.3rem;
-  color: #212529;
-  line-height: 2rem; }
-
-mark, .mark {
-  color: #7D4698; }
-
-/** Icons **/
-.ti:before {
-  font-family: Tor Icons !important;
-  font-style: normal;
-  font-weight: normal !important;
-  vertical-align: top; }
-
-.ti-authority:before {
-  content: "\f101"; }
-
-.ti-badexit:before {
-  content: "\f102"; }
-
-.ti-bridge:before {
-  content: "\f103"; }
-
-.ti-country:before {
-  content: "\f104"; }
-
-.ti-directory:before {
-  content: "\f105"; }
-
-.ti-exit:before {
-  content: "\f106"; }
-
-.ti-fallbackdir:before {
-  content: "\f107"; }
-
-.ti-fast:before {
-  content: "\f108"; }
-
-.ti-fingerprint:before {
-  content: "\f109"; }
-
-.ti-guard:before {
-  content: "\f10a"; }
-
-.ti-hibernating:before {
-  content: "\f10b"; }
-
-.ti-hsdir:before {
-  content: "\f10c"; }
-
-.ti-ipv4:before {
-  content: "\f10d"; }
-
-.ti-ipv6:before {
-  content: "\f10e"; }
-
-.ti-ipv6exit:before {
-  content: "\f10f"; }
-
-.ti-noedconsensus:before {
-  content: "\f110"; }
-
-.ti-notrecommended:before {
-  content: "\f111"; }
-
-.ti-onion-alt:before {
-  content: "\f112"; }
-
-.ti-onion:before {
-  content: "\f113"; }
-
-.ti-reachableipv4:before {
-  content: "\f114"; }
-
-.ti-reachableipv6:before {
-  content: "\f115"; }
-
-.ti-relay:before {
-  content: "\f116"; }
-
-.ti-running:before {
-  content: "\f117"; }
-
-.ti-stable:before {
-  content: "\f118"; }
-
-.ti-tshirt:before {
-  content: "\f119"; }
-
-.ti-unmeasured:before {
-  content: "\f11a"; }
-
-.ti-unreachableipv4:before {
-  content: "\f11b"; }
-
-.ti-unreachableipv6:before {
-  content: "\f11c"; }
-
-.ti-v2dir:before {
-  content: "\f11d"; }
-
-.ti-valid:before {
-  content: "\f11e"; }
-
-.bd-sidebar {
-  border: 0 !important; }
-
-.bd-toc {
-  order: 0 !important; }
-
-#components-nav .nav-pills .nav-link,
-#visuals-nav .nav-pills .nav-link {
-  border-radius: 0; }
-
-#components-nav .nav-pills .nav-link.active,
-#visuals-nav .nav-pills .nav-link.active {
-  background-color: #fff;
-  color: #7D4698;
-  border-left: 2px solid #7D4698;
-  font-weight: bold; }
-
-.jumbotron {
-  margin-top: -50px; }
-
-/*
- * Nav
- */
-.navbar {
-  background-image: url("./images/onion-bg.svg");
-  background-repeat: no-repeat;
-  background-position: 10px 12px; }
-
-.navbar-brand {
-  /*padding-left: 80px;*/ }
-  .navbar-brand span {
-    font-size: 0.6em;
-    display: flex; }
-
-/*
- * Sidebar
- */
-.sidebar {
-  position: fixed;
-  top: 51px;
-  bottom: 0;
-  left: 0;
-  z-index: 1000;
-  padding: 20px 0;
-  overflow-x: hidden;
-  overflow-y: auto;
-  /* Scrollable contents if viewport is shorter than content. */
-  border-right: 1px solid #eee; }
-
-.sidebar .nav {
-  margin-bottom: 20px; }
-
-.sidebar .nav-item {
-  width: 100%; }
-
-.sidebar .nav-item + .nav-item {
-  margin-left: 0; }
-
-.sidebar .nav-link {
-  border-radius: 0; }
-
-.toc-h4 {
-  padding-left: 0.8em;
-  font-size: 0.9em; }
-
-/*
- * Dashboard
- */
-/* Placeholders */
-.placeholders {
-  padding-bottom: 3rem; }
-
-.placeholder img {
-  padding-top: 1.5rem;
-  padding-bottom: 1.5rem; }
-
-/*
- * Forms
- */
-.form-wide {
-  width: 100% !important; }
-  .form-wide input {
-    padding: 20px !important; }
-
-.badge {
-  text-transform: uppercase; }
-
-.breadcrumb {
-  background-color: #fff; }
-
-.table-striped td {
-  border: 0 !important; }
-
-.bd-callout {
-  padding: 1.25rem;
-  margin-top: 1.25rem;
-  margin-bottom: 1.25rem;
-  border: 1px solid #eee;
-  border-left-width: .25rem;
-  border-radius: .25rem; }
-
-.bd-callout h4 {
-  margin-top: 0;
-  margin-bottom: .25rem; }
-
-.bd-callout p:last-child {
-  margin-bottom: 0; }
-
-.bd-callout code {
-  border-radius: .25rem; }
-
-.bd-callout + .bd-callout {
-  margin-top: -.25rem; }
-
-pre {
-  padding: 0.5rem;
-  margin-top: 1rem;
-  color: lightgreen;
-  background: black; }
-
-.bd-callout-info {
-  border-left-color: #5bc0de; }
-  .bd-callout-info h4 {
-    color: #5bc0de; }
-
-.bd-callout-warning {
-  border-left-color: #f0ad4e; }
-  .bd-callout-warning h4 {
-    color: #f0ad4e; }
-
-.bd-callout-danger {
-  border-left-color: #d9534f; }
-  .bd-callout-danger h4 {
-    color: #d9534f; }
-
-.bd-sidebar .nav > li > a {
-  font-size: 100%;
-  color: rgba(0, 0, 0, 0.85); }
-
-.bd-sidebar .nav > li > a:hover {
-  color: #7D4698 !important;
-  text-decoration: none; }
-
-#bd-docs-nav {
-  padding-top: 2rem; }
-
-.hll {
-  background-color: #ffc; }
-
-.c {
-  color: #999; }
-
-.k {
-  color: #069; }
-
-.o {
-  color: #555; }
-
-.cm {
-  color: #999; }
-
-.cp {
-  color: #099; }
-
-.c1 {
-  color: #999; }
-
-.cs {
-  color: #999; }
-
-.gd {
-  background-color: #fcc;
-  border: 1px solid #c00; }
-
-.ge {
-  font-style: italic; }
-
-.gr {
-  color: #f00; }
-
-.gh {
-  color: #030; }
-
-.gi {
-  background-color: #cfc;
-  border: 1px solid #0c0; }
-
-.go {
-  color: #aaa; }
-
-.gp {
-  color: #009; }
-
-.gu {
-  color: #030; }
-
-.gt {
-  color: #9c6; }
-
-.kc {
-  color: #069; }
-
-.kd {
-  color: #069; }
-
-.kn {
-  color: #069; }
-
-.kp {
-  color: #069; }
-
-.kr {
-  color: #069; }
-
-.kt {
-  color: #078; }
-
-.m {
-  color: #f60; }
-
-.s {
-  color: #d44950; }
-
-.na {
-  color: #4f9fcf; }
-
-.nb {
-  color: #366; }
-
-.nc {
-  color: #0a8; }
-
-.no {
-  color: #360; }
-
-.nd {
-  color: #99f; }
-
-.ni {
-  color: #999; }
-
-.ne {
-  color: #c00; }
-
-.nf {
-  color: #c0f; }
-
-.nl {
-  color: #99f; }
-
-.nn {
-  color: #0cf; }
-
-.nt {
-  color: #2f6f9f; }
-
-.nv {
-  color: #033; }
-
-.ow {
-  color: #000; }
-
-.w {
-  color: #bbb; }
-
-.mf {
-  color: #f60; }
-
-.mh {
-  color: #f60; }
-
-.mi {
-  color: #f60; }
-
-.mo {
-  color: #f60; }
-
-.sb {
-  color: #c30; }
-
-.sc {
-  color: #c30; }
-
-.sd {
-  font-style: italic;
-  color: #c30; }
-
-.s2 {
-  color: #c30; }
-
-.se {
-  color: #c30; }
-
-.sh {
-  color: #c30; }
-
-.si {
-  color: #a00; }
-
-.sx {
-  color: #c30; }
-
-.sr {
-  color: #3aa; }
-
-.s1 {
-  color: #c30; }
-
-.ss {
-  color: #fc3; }
-
-.bp {
-  color: #366; }
-
-.vc {
-  color: #033; }
-
-.vg {
-  color: #033; }
-
-.vi {
-  color: #033; }
-
-.il {
-  color: #f60; }
-
-.css .o,
-.css .o + .nt,
-.css .nt + .nt {
-  color: #999; }
-
-.language-bash::before,
-.language-sh::before {
-  color: #009;
-  content: "$ ";
-  user-select: none; }
-
-.language-powershell::before {
-  color: #009;
-  content: "PM> ";
-  user-select: none; }
-
-.text-primary-light {
-  color: #e6d5ee; }
-
-#topics {
-  margin: 0 auto;
-  display: block;
-  overflow-y: scroll;
-  height: 950px;
-  width: 97;
-  scroll-behavior: smooth; }
-
-.dropdown {
-  display: block; }
-
-.dropdown-menu {
-  display: none; }
-
-.dropdown:hover .dropdown-menu {
-  display: block; }
-
-.hamburger .navbar-toggler {
-  margin-left: 93%;
-  margin-top: -10%; }
-
-.hamburger:hover .hamburger-menu {
-  display: block; }
-
-a.side-nav.active {
-  color: #7D4698 !important; }
-
-.smalltopics {
-  display: none; }
-
-.chevron {
-  height: 50px;
-  width: 50px; }
-
-.chevron-up {
-  display: none !important; }
-
-.chevron-down {
-  display: block; }
-
- at media (max-width: 991px) {
-  nav.sidetopics {
-    display: none !important;
-    visibility: hidden !important; }
-
-  nav.smalltopics {
-    display: block;
-    width: 100%; }
-
-  .burger button {
-    float: right !important;
-    margin-top: -50px; }
-
-  .burger:hover .burger-menu {
-    display: block; }
-
-  .burger:hover .chevron-up {
-    display: block !important; }
-
-  .burger:hover .chevron-down {
-    display: none; } }
-/* Support Portal Styles
-*
-*/
-.section-nav {
-  padding-top: 0 !important;
-  border: 0 !important; }
-
-nav-pills .nav-link.active, .nav-pills .show > .nav-link {
-  color: #7D4698;
-  background-color: #fff;
-  font-weight: bold; }
-
-.toc-entry a:hover {
-  color: #59316B !important; }
-
-.sidetopics {
-  position: fixed !important;
-  margin-top: 353px;
-  height: 500px;
-  background: transparent; }
-
-#topics {
-  min-height: 500px;
-  margin-bottom: 200px; }
-
-#topics h5 {
-  padding-top: 7rem; }
-
-.question {
-  padding: 0.75rem 0; }
-
-.footer {
-  position: relative;
-  z-index: 99999999999; }
-
-.footer a.nav-link {
-  padding: 0.2rem; }
-
-footer .border {
-  border: 0 !important;
-  border-bottom: 1px solid rgba(255, 255, 255, 0.3) !important; }
-
- at media (max-width: 767px) {
-  .display-4 {
-    font-size: 2rem; } }
-.bd-toc {
-  order: 2;
-  padding-top: 1.5rem;
-  padding-bottom: 1.5rem;
-  font-size: .875rem; }
-  @supports (position: sticky) {
-    .bd-toc {
-      position: sticky;
-      top: 4rem;
-      height: calc(100vh - 4rem);
-      overflow-y: auto; } }
-
-.section-nav {
-  padding-left: 0;
-  border-left: 1px solid #eee; }
-  .section-nav ul {
-    padding-left: 1rem; }
-    .section-nav ul ul {
-      display: none; }
-
-.toc-entry {
-  display: block; }
-  .toc-entry a {
-    display: block;
-    padding: .125rem 1.5rem;
-    color: #99979c; }
-    .toc-entry a:hover {
-      color: #007bff;
-      text-decoration: none; }
-
-.bd-sidebar {
-  order: 0;
-  border-bottom: 1px solid rgba(0, 0, 0, 0.1); }
-  @media (min-width: 768px) {
-    .bd-sidebar {
-      border-right: 1px solid rgba(0, 0, 0, 0.1); }
-      @supports (position: sticky) {
-        .bd-sidebar {
-          position: sticky;
-          top: 4rem;
-          z-index: 1000;
-          height: calc(100vh - 4rem); } } }
-  @media (min-width: 1200px) {
-    .bd-sidebar {
-      max-width: 320px; } }
-
-.bd-links {
-  padding-top: 1rem;
-  padding-bottom: 1rem;
-  margin-right: -15px;
-  margin-left: -15px; }
-  @media (min-width: 768px) {
-    @supports (position: sticky) {
-      .bd-links {
-        max-height: calc(100vh - 9rem);
-        overflow-y: auto; } } }
-  @media (min-width: 768px) {
-    .bd-links {
-      display: block !important; } }
-
-.bd-search {
-  position: relative;
-  padding: 1rem 15px;
-  margin-right: -15px;
-  margin-left: -15px;
-  border-bottom: 1px solid rgba(0, 0, 0, 0.05); }
-  .bd-search .form-control:focus {
-    border-color: #a469c2;
-    box-shadow: 0 0 0 3px rgba(164, 105, 194, 0.25); }
-
-.bd-search-docs-toggle {
-  line-height: 1;
-  color: #212529; }
-
-.bd-sidenav {
-  display: none; }
-
-.bd-toc-link {
-  display: block;
-  padding: .25rem 1.5rem;
-  font-weight: 500;
-  color: rgba(0, 0, 0, 0.65); }
-  .bd-toc-link:hover {
-    color: rgba(0, 0, 0, 0.85);
-    text-decoration: none; }
-
-.bd-toc-item.active {
-  margin-bottom: 1rem; }
-  .bd-toc-item.active:not(:first-child) {
-    margin-top: 1rem; }
-  .bd-toc-item.active > .bd-toc-link {
-    color: rgba(0, 0, 0, 0.85); }
-    .bd-toc-item.active > .bd-toc-link:hover {
-      background-color: transparent; }
-  .bd-toc-item.active > .bd-sidenav {
-    display: block; }
-
-.bd-sidebar .nav > li > a {
-  display: block;
-  padding: .25rem 1.5rem;
-  font-size: 90%;
-  color: rgba(0, 0, 0, 0.65); }
-
-.bd-sidebar .nav > li > a:hover {
-  color: rgba(0, 0, 0, 0.85);
-  text-decoration: none;
-  background-color: transparent; }
-
-.bd-sidebar .nav > .active > a,
-.bd-sidebar .nav > .active:hover > a {
-  font-weight: 500;
-  color: rgba(0, 0, 0, 0.85);
-  background-color: transparent; }
-
-.bd-example-row .row > .col,
-.bd-example-row .row > [class^="col-"] {
-  padding-top: .75rem;
-  padding-bottom: .75rem;
-  background-color: rgba(86, 61, 124, 0.15);
-  border: 1px solid rgba(86, 61, 124, 0.2); }
-.bd-example-row .row + .row {
-  margin-top: 1rem; }
-.bd-example-row .flex-items-top,
-.bd-example-row .flex-items-middle,
-.bd-example-row .flex-items-bottom {
-  min-height: 6rem;
-  background-color: rgba(255, 0, 0, 0.1); }
-
-.bd-example-row-flex-cols .row {
-  min-height: 10rem;
-  background-color: rgba(255, 0, 0, 0.1); }
-
-.bd-highlight {
-  background-color: rgba(125, 70, 152, 0.15);
-  border: 1px solid rgba(125, 70, 152, 0.15); }
-
-.example-container {
-  width: 800px;
-  width: 100%;
-  padding-right: 15px;
-  padding-left: 15px;
-  margin-right: auto;
-  margin-left: auto; }
-
-.example-row {
-  display: flex;
-  flex-wrap: wrap;
-  margin-right: -15px;
-  margin-left: -15px; }
-
-.example-content-main {
-  position: relative;
-  width: 100%;
-  min-height: 1px;
-  padding-right: 15px;
-  padding-left: 15px; }
-  @media (min-width: 576px) {
-    .example-content-main {
-      flex: 0 0 50%;
-      max-width: 50%; } }
-  @media (min-width: 992px) {
-    .example-content-main {
-      flex: 0 0 66.6666666667%;
-      max-width: 66.6666666667%; } }
-
-.example-content-secondary {
-  position: relative;
-  width: 100%;
-  min-height: 1px;
-  padding-right: 15px;
-  padding-left: 15px; }
-  @media (min-width: 576px) {
-    .example-content-secondary {
-      flex: 0 0 50%;
-      max-width: 50%; } }
-  @media (min-width: 992px) {
-    .example-content-secondary {
-      flex: 0 0 33.3333333333%;
-      max-width: 33.3333333333%; } }
-
-.bd-example-container {
-  min-width: 16rem;
-  max-width: 25rem;
-  margin-right: auto;
-  margin-left: auto; }
-
-.bd-example-container-header {
-  height: 3rem;
-  margin-bottom: .5rem;
-  background-color: white;
-  border-radius: .25rem; }
-
-.bd-example-container-sidebar {
-  float: right;
-  width: 4rem;
-  height: 8rem;
-  background-color: #80bdff;
-  border-radius: .25rem; }
-
-.bd-example-container-body {
-  height: 8rem;
-  margin-right: 4.5rem;
-  background-color: #b991cc;
-  border-radius: .25rem; }
-
-.bd-example-container-fluid {
-  max-width: none; }
-
-.bd-example {
-  position: relative;
-  padding: 1rem;
-  margin: 1rem -15px;
-  overflow: auto;
-  border: solid #f7f7f9;
-  border-width: .2rem 0 0; }
-  .bd-example::after {
-    display: block;
-    clear: both;
-    content: ""; }
-  @media (min-width: 576px) {
-    .bd-example {
-      padding: 1.5rem;
-      margin-right: 0;
-      margin-bottom: 0;
-      margin-left: 0;
-      border-width: .2rem; } }
-  .bd-example + .highlight,
-  .bd-example + .clipboard + .highlight {
-    margin-top: 0; }
-  .bd-example + p {
-    margin-top: 2rem; }
-  .bd-example .pos-f-t {
-    position: relative;
-    margin: -1rem; }
-    @media (min-width: 576px) {
-      .bd-example .pos-f-t {
-        margin: -1.5rem; } }
-  .bd-example > .form-control + .form-control {
-    margin-top: .5rem; }
-  .bd-example > .nav + .nav,
-  .bd-example > .alert + .alert,
-  .bd-example > .navbar + .navbar,
-  .bd-example > .progress + .progress,
-  .bd-example > .progress + .btn {
-    margin-top: 1rem; }
-  .bd-example > .dropdown-menu:first-child {
-    position: static;
-    display: block; }
-  .bd-example > .form-group:last-child {
-    margin-bottom: 0; }
-  .bd-example > .close {
-    float: none; }
-
-.bd-example-type .table .type-info {
-  color: #999;
-  vertical-align: middle; }
-.bd-example-type .table td {
-  padding: 1rem 0;
-  border-color: #eee; }
-.bd-example-type .table tr:first-child td {
-  border-top: 0; }
-.bd-example-type h1,
-.bd-example-type h2,
-.bd-example-type h3,
-.bd-example-type h4,
-.bd-example-type h5,
-.bd-example-type h6 {
-  margin-top: 0;
-  margin-bottom: 0; }
-
-.bd-example-bg-classes p {
-  padding: 1rem; }
-
-.bd-example > img + img {
-  margin-left: .5rem; }
-
-.bd-example > .btn-group {
-  margin-top: .25rem;
-  margin-bottom: .25rem; }
-.bd-example > .btn-toolbar + .btn-toolbar {
-  margin-top: .5rem; }
-
-.bd-example-control-sizing select,
-.bd-example-control-sizing input[type="text"] + input[type="text"] {
-  margin-top: .5rem; }
-
-.bd-example-form .input-group {
-  margin-bottom: .5rem; }
-
-.bd-example > textarea.form-control {
-  resize: vertical; }
-
-.bd-example > .list-group {
-  max-width: 400px; }
-
-.bd-example .fixed-top,
-.bd-example .sticky-top {
-  position: static;
-  margin: -1rem -1rem 1rem; }
-.bd-example .fixed-bottom {
-  position: static;
-  margin: 1rem -1rem -1rem; }
- at media (min-width: 576px) {
-  .bd-example .fixed-top,
-  .bd-example .sticky-top {
-    margin: -1.5rem -1.5rem 1rem; }
-  .bd-example .fixed-bottom {
-    margin: 1rem -1.5rem -1.5rem; } }
-
-.bd-example .pagination {
-  margin-top: .5rem;
-  margin-bottom: .5rem; }
-
-.modal {
-  z-index: 1072; }
-  .modal .tooltip,
-  .modal .popover {
-    z-index: 1073; }
-
-.modal-backdrop {
-  z-index: 1071; }
-
-.bd-example-modal {
-  background-color: #fafafa; }
-  .bd-example-modal .modal {
-    position: relative;
-    top: auto;
-    right: auto;
-    bottom: auto;
-    left: auto;
-    z-index: 1;
-    display: block; }
-  .bd-example-modal .modal-dialog {
-    left: auto;
-    margin-right: auto;
-    margin-left: auto; }
-
-.bd-example-tabs .nav-tabs {
-  margin-bottom: 1rem; }
-
-.bd-example-tooltips {
-  text-align: center; }
-  .bd-example-tooltips > .btn {
-    margin-top: .25rem;
-    margin-bottom: .25rem; }
-
-.bs-tooltip-top-docs .arrow,
-.bs-tooltip-bottom-docs .arrow {
-  left: 50%; }
-
-.bs-tooltip-right-docs .arrow,
-.bs-tooltip-left-docs .arrow {
-  top: 50%; }
-
-.bd-example-popover-static {
-  padding-bottom: 1.5rem;
-  background-color: #f9f9f9; }
-  .bd-example-popover-static .popover {
-    position: relative;
-    display: block;
-    float: left;
-    width: 260px;
-    margin: 1.25rem; }
-
-.bs-popover-top-docs .arrow,
-.bs-popover-bottom-docs .arrow {
-  left: 50%; }
-
-.bs-popover-right-docs .arrow,
-.bs-popover-left-docs .arrow {
-  top: 50%; }
-
-.tooltip-demo a {
-  white-space: nowrap; }
-
-.bd-example-tooltip-static .tooltip {
-  position: relative;
-  display: inline-block;
-  margin: 10px 20px;
-  opacity: 1; }
-
-.scrollspy-example {
-  position: relative;
-  height: 200px;
-  margin-top: .5rem;
-  overflow: auto; }
-
-.scrollspy-example-2 {
-  position: relative;
-  height: 350px;
-  overflow: auto; }
-
-.bd-example-border-utils [class^="border"] {
-  display: inline-block;
-  width: 5rem;
-  height: 5rem;
-  margin: .25rem;
-  background-color: #f5f5f5;
-  border: 1px solid; }
-
-.highlight {
-  padding: 1rem;
-  margin-top: 1rem;
-  margin-bottom: 1rem;
-  background-color: #f7f7f9;
-  -ms-overflow-style: -ms-autohiding-scrollbar; }
-  @media (min-width: 576px) {
-    .highlight {
-      padding: 1.5rem; } }
-
-.bd-content .highlight {
-  margin-right: -15px;
-  margin-left: -15px; }
-  @media (min-width: 576px) {
-    .bd-content .highlight {
-      margin-right: 0;
-      margin-left: 0; } }
-
-.highlight pre {
-  padding: 0;
-  margin-top: 0;
-  margin-bottom: 0;
-  background-color: transparent;
-  border: 0; }
-.highlight pre code {
-  font-size: inherit;
-  color: #212529; }
-
-/*# sourceMappingURL=bootstrap.css.map */
diff --git a/assets/scss/bootstrap.css.map b/assets/scss/bootstrap.css.map
deleted file mode 100644
index 003d615..0000000
--- a/assets/scss/bootstrap.css.map
+++ /dev/null
@@ -1,7 +0,0 @@
-{
-"version": 3,
-"mappings": "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",
-"sources": ["bootstrap.scss","_root.scss","_print.scss","_reboot.scss","_tor-variables.scss","_variables.scss","mixins/_hover.scss","_type.scss","mixins/_lists.scss","_images.scss","mixins/_image.scss","mixins/_border-radius.scss","mixins/_transition.scss","_code.scss","_grid.scss","mixins/_grid.scss","mixins/_breakpoints.scss","_functions.scss","mixins/_grid-framework.scss","_tables.scss","mixins/_table-row.scss","_forms.scss","mixins/_forms.scss","_buttons.scss","mixins/_buttons.scss","mixins/_gradients.scss","_transitions.scss","_dropdown.scss","mixins/_caret.scss","mixins/_nav-divider.scss","_button-group.scss","_input-group.scss","_custom-forms.scss","_nav.scss","_navbar.scss","_card.scss","_breadcrumb.scss","_pagination.scss","mixins/_pagination.scss","_badge.scss","mixins/_badge.scss","_jumbotron.scss","_alert.scss","mixins/_alert.scss","_progress.scss","_media.scss","_list-group.scss","mixins/_list-group.scss","_close.scss","_modal.scss","_tooltip.scss","mixins/_reset-text.s
 css","_popover.scss","_carousel.scss","utilities/_align.scss","mixins/_background-variant.scss","utilities/_background.scss","utilities/_borders.scss","mixins/_clearfix.scss","utilities/_display.scss","utilities/_embed.scss","utilities/_flex.scss","utilities/_float.scss","mixins/_float.scss","utilities/_position.scss","utilities/_screenreaders.scss","mixins/_screen-reader.scss","utilities/_sizing.scss","utilities/_spacing.scss","utilities/_text.scss","mixins/_text-truncate.scss","mixins/_text-emphasis.scss","mixins/_text-hide.scss","utilities/_visibility.scss","mixins/_visibility.scss","_tor.scss","_portal.scss","_sidebar.scss","_component-examples.scss"],
-"names": [],
-"file": "bootstrap.css"
-}
\ No newline at end of file
diff --git a/assets/scss/bootstrap.scss b/assets/scss/bootstrap.scss
deleted file mode 100644
index 9701759..0000000
--- a/assets/scss/bootstrap.scss
+++ /dev/null
@@ -1,49 +0,0 @@
-/*!
- * Bootstrap v4.0.0-beta.2 (https://getbootstrap.com)
- * Copyright 2011-2017 The Bootstrap Authors
- * Copyright 2011-2017 Twitter, Inc.
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- */
- at import "tor-variables";
- at import "icons";
- at import "illos";
- at import "functions";
- at import "variables";
- at import "mixins";
- at import "root";
- at import "print";
- at import "reboot";
- at import "type";
- at import "images";
- at import "code";
- at import "grid";
- at import "tables";
- at import "forms";
- at import "buttons";
- at import "transitions";
- at import "dropdown";
- at import "button-group";
- at import "input-group";
- at import "custom-forms";
- at import "nav";
- at import "navbar";
- at import "card";
- at import "breadcrumb";
- at import "pagination";
- at import "badge";
- at import "jumbotron";
- at import "alert";
- at import "progress";
- at import "media";
- at import "list-group";
- at import "close";
- at import "modal";
- at import "tooltip";
- at import "popover";
- at import "carousel";
- at import "utilities";
- at import "sidebar";
- at import "component-examples";
- at import "portal";
- at import "tpo";
- at import "tor";
diff --git a/assets/scss/mixins/_alert.scss b/assets/scss/mixins/_alert.scss
deleted file mode 100644
index db5a7eb..0000000
--- a/assets/scss/mixins/_alert.scss
+++ /dev/null
@@ -1,13 +0,0 @@
- at mixin alert-variant($background, $border, $color) {
-  color: $color;
-  @include gradient-bg($background);
-  border-color: $border;
-
-  hr {
-    border-top-color: darken($border, 5%);
-  }
-
-  .alert-link {
-    color: darken($color, 10%);
-  }
-}
diff --git a/assets/scss/mixins/_background-variant.scss b/assets/scss/mixins/_background-variant.scss
deleted file mode 100644
index 7d1bc97..0000000
--- a/assets/scss/mixins/_background-variant.scss
+++ /dev/null
@@ -1,20 +0,0 @@
-// stylelint-disable declaration-no-important
-
-// Contextual backgrounds
-
- at mixin bg-variant($parent, $color) {
-  #{$parent} {
-    background-color: $color !important;
-  }
-  a#{$parent} {
-    @include hover-focus {
-      background-color: darken($color, 10%) !important;
-    }
-  }
-}
-
- at mixin bg-gradient-variant($parent, $color) {
-  #{$parent} {
-    background: $color linear-gradient(180deg, mix($body-bg, $color, 15%), $color) repeat-x !important;
-  }
-}
diff --git a/assets/scss/mixins/_badge.scss b/assets/scss/mixins/_badge.scss
deleted file mode 100644
index eeca0b4..0000000
--- a/assets/scss/mixins/_badge.scss
+++ /dev/null
@@ -1,12 +0,0 @@
- at mixin badge-variant($bg) {
-  color: color-yiq($bg);
-  background-color: $bg;
-
-  &[href] {
-    @include hover-focus {
-      color: color-yiq($bg);
-      text-decoration: none;
-      background-color: darken($bg, 10%);
-    }
-  }
-}
diff --git a/assets/scss/mixins/_border-radius.scss b/assets/scss/mixins/_border-radius.scss
deleted file mode 100644
index 2024feb..0000000
--- a/assets/scss/mixins/_border-radius.scss
+++ /dev/null
@@ -1,35 +0,0 @@
-// Single side border-radius
-
- at mixin border-radius($radius: $border-radius) {
-  @if $enable-rounded {
-    border-radius: $radius;
-  }
-}
-
- at mixin border-top-radius($radius) {
-  @if $enable-rounded {
-    border-top-left-radius: $radius;
-    border-top-right-radius: $radius;
-  }
-}
-
- at mixin border-right-radius($radius) {
-  @if $enable-rounded {
-    border-top-right-radius: $radius;
-    border-bottom-right-radius: $radius;
-  }
-}
-
- at mixin border-bottom-radius($radius) {
-  @if $enable-rounded {
-    border-bottom-right-radius: $radius;
-    border-bottom-left-radius: $radius;
-  }
-}
-
- at mixin border-left-radius($radius) {
-  @if $enable-rounded {
-    border-top-left-radius: $radius;
-    border-bottom-left-radius: $radius;
-  }
-}
diff --git a/assets/scss/mixins/_box-shadow.scss b/assets/scss/mixins/_box-shadow.scss
deleted file mode 100644
index b2410e5..0000000
--- a/assets/scss/mixins/_box-shadow.scss
+++ /dev/null
@@ -1,5 +0,0 @@
- at mixin box-shadow($shadow...) {
-  @if $enable-shadows {
-    box-shadow: $shadow;
-  }
-}
diff --git a/assets/scss/mixins/_breakpoints.scss b/assets/scss/mixins/_breakpoints.scss
deleted file mode 100644
index a9866bd..0000000
--- a/assets/scss/mixins/_breakpoints.scss
+++ /dev/null
@@ -1,119 +0,0 @@
-// Breakpoint viewport sizes and media queries.
-//
-// Breakpoints are defined as a map of (name: minimum width), order from small to large:
-//
-//    (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px)
-//
-// The map defined in the `$grid-breakpoints` global variable is used as the `$breakpoints` argument by default.
-
-// Name of the next breakpoint, or null for the last breakpoint.
-//
-//    >> breakpoint-next(sm)
-//    md
-//    >> breakpoint-next(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))
-//    md
-//    >> breakpoint-next(sm, $breakpoint-names: (xs sm md lg xl))
-//    md
- at function breakpoint-next($name, $breakpoints: $grid-breakpoints, $breakpoint-names: map-keys($breakpoints)) {
-  $n: index($breakpoint-names, $name);
-  @return if($n < length($breakpoint-names), nth($breakpoint-names, $n + 1), null);
-}
-
-// Minimum breakpoint width. Null for the smallest (first) breakpoint.
-//
-//    >> breakpoint-min(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))
-//    576px
- at function breakpoint-min($name, $breakpoints: $grid-breakpoints) {
-  $min: map-get($breakpoints, $name);
-  @return if($min != 0, $min, null);
-}
-
-// Maximum breakpoint width. Null for the largest (last) breakpoint.
-// The maximum value is calculated as the minimum of the next one less 0.1.
-//
-//    >> breakpoint-max(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))
-//    767px
- at function breakpoint-max($name, $breakpoints: $grid-breakpoints) {
-  $next: breakpoint-next($name, $breakpoints);
-  @return if($next, breakpoint-min($next, $breakpoints) - 1px, null);
-}
-
-// Returns a blank string if smallest breakpoint, otherwise returns the name with a dash infront.
-// Useful for making responsive utilities.
-//
-//    >> breakpoint-infix(xs, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))
-//    ""  (Returns a blank string)
-//    >> breakpoint-infix(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))
-//    "-sm"
- at function breakpoint-infix($name, $breakpoints: $grid-breakpoints) {
-  @return if(breakpoint-min($name, $breakpoints) == null, "", "-#{$name}");
-}
-
-// Media of at least the minimum breakpoint width. No query for the smallest breakpoint.
-// Makes the @content apply to the given breakpoint and wider.
- at mixin media-breakpoint-up($name, $breakpoints: $grid-breakpoints) {
-  $min: breakpoint-min($name, $breakpoints);
-  @if $min {
-    @media (min-width: $min) {
-      @content;
-    }
-  } @else {
-    @content;
-  }
-}
-
-// Media of at most the maximum breakpoint width. No query for the largest breakpoint.
-// Makes the @content apply to the given breakpoint and narrower.
- at mixin media-breakpoint-down($name, $breakpoints: $grid-breakpoints) {
-  $max: breakpoint-max($name, $breakpoints);
-  @if $max {
-    @media (max-width: $max) {
-      @content;
-    }
-  } @else {
-    @content;
-  }
-}
-
-// Media that spans multiple breakpoint widths.
-// Makes the @content apply between the min and max breakpoints
- at mixin media-breakpoint-between($lower, $upper, $breakpoints: $grid-breakpoints) {
-  $min: breakpoint-min($lower, $breakpoints);
-  $max: breakpoint-max($upper, $breakpoints);
-
-  @if $min != null and $max != null {
-    @media (min-width: $min) and (max-width: $max) {
-      @content;
-    }
-  } @else if $max == null {
-    @include media-breakpoint-up($lower) {
-      @content;
-    }
-  } @else if $min == null {
-    @include media-breakpoint-down($upper) {
-      @content;
-    }
-  }
-}
-
-// Media between the breakpoint's minimum and maximum widths.
-// No minimum for the smallest breakpoint, and no maximum for the largest one.
-// Makes the @content apply only to the given breakpoint, not viewports any wider or narrower.
- at mixin media-breakpoint-only($name, $breakpoints: $grid-breakpoints) {
-  $min: breakpoint-min($name, $breakpoints);
-  $max: breakpoint-max($name, $breakpoints);
-
-  @if $min != null and $max != null {
-    @media (min-width: $min) and (max-width: $max) {
-      @content;
-    }
-  } @else if $max == null {
-    @include media-breakpoint-up($name) {
-      @content;
-    }
-  } @else if $min == null {
-    @include media-breakpoint-down($name) {
-      @content;
-    }
-  }
-}
diff --git a/assets/scss/mixins/_buttons.scss b/assets/scss/mixins/_buttons.scss
deleted file mode 100644
index 9e06261..0000000
--- a/assets/scss/mixins/_buttons.scss
+++ /dev/null
@@ -1,94 +0,0 @@
-// Button variants
-//
-// Easily pump out default styles, as well as :hover, :focus, :active,
-// and disabled options for all buttons
-
- at mixin button-variant($background, $border, $hover-background: darken($background, 7.5%), $hover-border: darken($border, 10%), $active-background: darken($background, 10%), $active-border: darken($border, 12.5%)) {
-  color: color-yiq($background);
-  @include gradient-bg($background);
-  border-color: $border;
-  @include box-shadow($btn-box-shadow);
-
-  @include hover {
-    color: color-yiq($hover-background);
-    @include gradient-bg($hover-background);
-    border-color: $hover-border;
-  }
-
-  &:focus,
-  &.focus {
-    // Avoid using mixin so we can pass custom focus shadow properly
-    @if $enable-shadows {
-      box-shadow: $btn-box-shadow, 0 0 0 $input-btn-focus-width rgba($border, .5);
-    } @else {
-      box-shadow: 0 0 0 $input-btn-focus-width rgba($border, .5);
-    }
-  }
-
-  // Disabled comes first so active can properly restyle
-  &.disabled,
-  &:disabled {
-    background-color: $background;
-    border-color: $border;
-  }
-
-  &:not([disabled]):not(.disabled):active,
-  &:not([disabled]):not(.disabled).active,
-  .show > &.dropdown-toggle {
-    color: color-yiq($active-background);
-    background-color: $active-background;
-    @if $enable-gradients {
-      background-image: none; // Remove the gradient for the pressed/active state
-    }
-    border-color: $active-border;
-
-    // Avoid using mixin so we can pass custom focus shadow properly
-    @if $enable-shadows {
-      box-shadow: $btn-active-box-shadow, 0 0 0 $input-btn-focus-width rgba($border, .5);
-    } @else {
-      box-shadow: 0 0 0 $input-btn-focus-width rgba($border, .5);
-    }
-  }
-}
-
- at mixin button-outline-variant($color, $color-hover: #fff) {
-  color: $color;
-  background-color: transparent;
-  background-image: none;
-  border-color: $color;
-
-  @include hover {
-    color: $color-hover;
-    background-color: $color;
-    border-color: $color;
-  }
-
-  &:focus,
-  &.focus {
-    box-shadow: 0 0 0 $input-btn-focus-width rgba($color, .5);
-  }
-
-  &.disabled,
-  &:disabled {
-    color: $color;
-    background-color: transparent;
-  }
-
-  &:not([disabled]):not(.disabled):active,
-  &:not([disabled]):not(.disabled).active,
-  .show > &.dropdown-toggle {
-    color: $color-hover;
-    background-color: $color;
-    border-color: $color;
-    // Avoid using mixin so we can pass custom focus shadow properly
-    box-shadow: 0 0 0 $input-btn-focus-width rgba($color, .5);
-  }
-}
-
-// Button sizes
- at mixin button-size($padding-y, $padding-x, $font-size, $line-height, $border-radius) {
-  padding: $padding-y $padding-x;
-  font-size: $font-size;
-  line-height: $line-height;
-  @include border-radius($border-radius);
-}
diff --git a/assets/scss/mixins/_caret.scss b/assets/scss/mixins/_caret.scss
deleted file mode 100644
index daab9d0..0000000
--- a/assets/scss/mixins/_caret.scss
+++ /dev/null
@@ -1,35 +0,0 @@
- at mixin caret-down {
-  border-top: $caret-width solid;
-  border-right: $caret-width solid transparent;
-  border-bottom: 0;
-  border-left: $caret-width solid transparent;
-}
-
- at mixin caret-up {
-  border-top: 0;
-  border-right: $caret-width solid transparent;
-  border-bottom: $caret-width solid;
-  border-left: $caret-width solid transparent;
-}
-
- at mixin caret($direction: down) {
-  @if $enable-caret {
-    &::after {
-      display: inline-block;
-      width: 0;
-      height: 0;
-      margin-left: $caret-width * .85;
-      vertical-align: $caret-width * .85;
-      content: "";
-      @if $direction == down {
-        @include caret-down;
-      } @else if $direction == up {
-        @include caret-up;
-      }
-    }
-
-    &:empty::after {
-      margin-left: 0;
-    }
-  }
-}
diff --git a/assets/scss/mixins/_clearfix.scss b/assets/scss/mixins/_clearfix.scss
deleted file mode 100644
index 11a977b..0000000
--- a/assets/scss/mixins/_clearfix.scss
+++ /dev/null
@@ -1,7 +0,0 @@
- at mixin clearfix() {
-  &::after {
-    display: block;
-    clear: both;
-    content: "";
-  }
-}
diff --git a/assets/scss/mixins/_float.scss b/assets/scss/mixins/_float.scss
deleted file mode 100644
index 48fa8b6..0000000
--- a/assets/scss/mixins/_float.scss
+++ /dev/null
@@ -1,11 +0,0 @@
-// stylelint-disable declaration-no-important
-
- at mixin float-left {
-  float: left !important;
-}
- at mixin float-right {
-  float: right !important;
-}
- at mixin float-none {
-  float: none !important;
-}
diff --git a/assets/scss/mixins/_forms.scss b/assets/scss/mixins/_forms.scss
deleted file mode 100644
index 19d5280..0000000
--- a/assets/scss/mixins/_forms.scss
+++ /dev/null
@@ -1,108 +0,0 @@
-// Form control focus state
-//
-// Generate a customized focus state and for any input with the specified color,
-// which defaults to the `$input-focus-border-color` variable.
-//
-// We highly encourage you to not customize the default value, but instead use
-// this to tweak colors on an as-needed basis. This aesthetic change is based on
-// WebKit's default styles, but applicable to a wider range of browsers. Its
-// usability and accessibility should be taken into account with any change.
-//
-// Example usage: change the default blue border and shadow to white for better
-// contrast against a dark gray background.
- at mixin form-control-focus() {
-  &:focus {
-    color: $input-focus-color;
-    background-color: $input-focus-bg;
-    border-color: $input-focus-border-color;
-    outline: none;
-    // Avoid using mixin so we can pass custom focus shadow properly
-    @if $enable-shadows {
-      box-shadow: $input-box-shadow, $input-btn-focus-box-shadow;
-    } @else {
-      box-shadow: $input-btn-focus-box-shadow;
-    }
-  }
-}
-
-
- at mixin form-validation-state($state, $color) {
-
-  .#{$state}-feedback {
-    display: none;
-    margin-top: .25rem;
-    font-size: .875rem;
-    color: $color;
-  }
-
-  .#{$state}-tooltip {
-    position: absolute;
-    top: 100%;
-    z-index: 5;
-    display: none;
-    width: 250px;
-    padding: .5rem;
-    margin-top: .1rem;
-    font-size: .875rem;
-    line-height: 1;
-    color: #fff;
-    background-color: rgba($color,.8);
-    border-radius: .2rem;
-  }
-
-  .form-control,
-  .custom-select {
-    .was-validated &:#{$state},
-    &.is-#{$state} {
-      border-color: $color;
-
-      &:focus {
-        box-shadow: 0 0 0 .2rem rgba($color,.25);
-      }
-
-      ~ .#{$state}-feedback,
-      ~ .#{$state}-tooltip {
-        display: block;
-      }
-    }
-  }
-
-
-  // TODO: redo check markup lol crap
-  .form-check-input {
-    .was-validated &:#{$state},
-    &.is-#{$state} {
-      + .form-check-label {
-        color: $color;
-      }
-    }
-  }
-
-  // custom radios and checks
-  .custom-control-input {
-    .was-validated &:#{$state},
-    &.is-#{$state} {
-      ~ .custom-control-indicator {
-        background-color: rgba($color, .25);
-      }
-      ~ .custom-control-description {
-        color: $color;
-      }
-    }
-  }
-
-  // custom file
-  .custom-file-input {
-    .was-validated &:#{$state},
-    &.is-#{$state} {
-      ~ .custom-file-control {
-        border-color: $color;
-
-        &::before { border-color: inherit; }
-      }
-      &:focus {
-        box-shadow: 0 0 0 .2rem rgba($color,.25);
-      }
-    }
-  }
-}
diff --git a/assets/scss/mixins/_gradients.scss b/assets/scss/mixins/_gradients.scss
deleted file mode 100644
index ecd01f7..0000000
--- a/assets/scss/mixins/_gradients.scss
+++ /dev/null
@@ -1,45 +0,0 @@
-// Gradients
-
- at mixin gradient-bg($color) {
-  @if $enable-gradients {
-    background: $color linear-gradient(180deg, mix($body-bg, $color, 15%), $color) repeat-x;
-  } @else {
-    background-color: $color;
-  }
-}
-
-// Horizontal gradient, from left to right
-//
-// Creates two color stops, start and end, by specifying a color and position for each color stop.
- at mixin gradient-x($start-color: #555, $end-color: #333, $start-percent: 0%, $end-percent: 100%) {
-  background-image: linear-gradient(to right, $start-color $start-percent, $end-color $end-percent);
-  background-repeat: repeat-x;
-}
-
-// Vertical gradient, from top to bottom
-//
-// Creates two color stops, start and end, by specifying a color and position for each color stop.
- at mixin gradient-y($start-color: #555, $end-color: #333, $start-percent: 0%, $end-percent: 100%) {
-  background-image: linear-gradient(to bottom, $start-color $start-percent, $end-color $end-percent);
-  background-repeat: repeat-x;
-}
-
- at mixin gradient-directional($start-color: #555, $end-color: #333, $deg: 45deg) {
-  background-image: linear-gradient($deg, $start-color, $end-color);
-  background-repeat: repeat-x;
-}
- at mixin gradient-x-three-colors($start-color: #00b3ee, $mid-color: #7a43b6, $color-stop: 50%, $end-color: #c3325f) {
-  background-image: linear-gradient(to right, $start-color, $mid-color $color-stop, $end-color);
-  background-repeat: no-repeat;
-}
- at mixin gradient-y-three-colors($start-color: #00b3ee, $mid-color: #7a43b6, $color-stop: 50%, $end-color: #c3325f) {
-  background-image: linear-gradient($start-color, $mid-color $color-stop, $end-color);
-  background-repeat: no-repeat;
-}
- at mixin gradient-radial($inner-color: #555, $outer-color: #333) {
-  background-image: radial-gradient(circle, $inner-color, $outer-color);
-  background-repeat: no-repeat;
-}
- at mixin gradient-striped($color: rgba(255,255,255,.15), $angle: 45deg) {
-  background-image: linear-gradient($angle, $color 25%, transparent 25%, transparent 50%, $color 50%, $color 75%, transparent 75%, transparent);
-}
diff --git a/assets/scss/mixins/_grid-framework.scss b/assets/scss/mixins/_grid-framework.scss
deleted file mode 100644
index 41bdf46..0000000
--- a/assets/scss/mixins/_grid-framework.scss
+++ /dev/null
@@ -1,69 +0,0 @@
-// Framework grid generation
-//
-// Used only by Bootstrap to generate the correct number of grid classes given
-// any value of `$grid-columns`.
-
- at mixin make-grid-columns($columns: $grid-columns, $gutter: $grid-gutter-width, $breakpoints: $grid-breakpoints) {
-  // Common properties for all breakpoints
-  %grid-column {
-    position: relative;
-    width: 100%;
-    min-height: 1px; // Prevent columns from collapsing when empty
-    padding-right: ($gutter / 2);
-    padding-left: ($gutter / 2);
-  }
-
-  @each $breakpoint in map-keys($breakpoints) {
-    $infix: breakpoint-infix($breakpoint, $breakpoints);
-
-    // Allow columns to stretch full width below their breakpoints
-    @for $i from 1 through $columns {
-      .col#{$infix}-#{$i} {
-        @extend %grid-column;
-      }
-    }
-    .col#{$infix},
-    .col#{$infix}-auto {
-      @extend %grid-column;
-    }
-
-    @include media-breakpoint-up($breakpoint, $breakpoints) {
-      // Provide basic `.col-{bp}` classes for equal-width flexbox columns
-      .col#{$infix} {
-        flex-basis: 0;
-        flex-grow: 1;
-        max-width: 100%;
-      }
-      .col#{$infix}-auto {
-        flex: 0 0 auto;
-        width: auto;
-        max-width: none; // Reset earlier grid tiers
-      }
-
-      @for $i from 1 through $columns {
-        .col#{$infix}-#{$i} {
-          @include make-col($i, $columns);
-        }
-      }
-
-      .order#{$infix}-first {
-        order: -1;
-      }
-
-      @for $i from 1 through $columns {
-        .order#{$infix}-#{$i} {
-          order: $i;
-        }
-      }
-
-      // `$columns - 1` because offsetting by the width of an entire row isn't possible
-      @for $i from 0 through ($columns - 1) {
-        @if not ($infix == "" and $i == 0) { // Avoid emitting useless .offset-0
-          .offset#{$infix}-#{$i} {
-            @include make-col-offset($i, $columns);
-          }
-        }
-      }
-    }
-  }
-}
diff --git a/assets/scss/mixins/_grid.scss b/assets/scss/mixins/_grid.scss
deleted file mode 100644
index b75ebcb..0000000
--- a/assets/scss/mixins/_grid.scss
+++ /dev/null
@@ -1,52 +0,0 @@
-/// Grid system
-//
-// Generate semantic grid columns with these mixins.
-
- at mixin make-container() {
-  width: 100%;
-  padding-right: ($grid-gutter-width / 2);
-  padding-left: ($grid-gutter-width / 2);
-  margin-right: auto;
-  margin-left: auto;
-}
-
-
-// For each breakpoint, define the maximum width of the container in a media query
- at mixin make-container-max-widths($max-widths: $container-max-widths, $breakpoints: $grid-breakpoints) {
-  @each $breakpoint, $container-max-width in $max-widths {
-    @include media-breakpoint-up($breakpoint, $breakpoints) {
-      max-width: $container-max-width;
-    }
-  }
-}
-
- at mixin make-row() {
-  display: flex;
-  flex-wrap: wrap;
-  margin-right: ($grid-gutter-width / -2);
-  margin-left: ($grid-gutter-width / -2);
-}
-
- at mixin make-col-ready() {
-  position: relative;
-  // Prevent columns from becoming too narrow when at smaller grid tiers by
-  // always setting `width: 100%;`. This works because we use `flex` values
-  // later on to override this initial width.
-  width: 100%;
-  min-height: 1px; // Prevent collapsing
-  padding-right: ($grid-gutter-width / 2);
-  padding-left: ($grid-gutter-width / 2);
-}
-
- at mixin make-col($size, $columns: $grid-columns) {
-  flex: 0 0 percentage($size / $columns);
-  // Add a `max-width` to ensure content within each column does not blow out
-  // the width of the column. Applies to IE10+ and Firefox. Chrome and Safari
-  // do not appear to require this.
-  max-width: percentage($size / $columns);
-}
-
- at mixin make-col-offset($size, $columns: $grid-columns) {
-  $num: $size / $columns;
-  margin-left: if($num == 0, 0, percentage($num));
-}
diff --git a/assets/scss/mixins/_hover.scss b/assets/scss/mixins/_hover.scss
deleted file mode 100644
index fd2f1e2..0000000
--- a/assets/scss/mixins/_hover.scss
+++ /dev/null
@@ -1,61 +0,0 @@
-// stylelint-disable indentation
- at mixin hover {
-  // TODO: re-enable along with mq4-hover-shim
-//  @if $enable-hover-media-query {
-//    // See Media Queries Level 4: https://drafts.csswg.org/mediaqueries/#hover
-//    // Currently shimmed by https://github.com/twbs/mq4-hover-shim
-//    @media (hover: hover) {
-//      &:hover { @content }
-//    }
-//  }
-//  @else {
-    &:hover { @content; }
-//  }
-}
-
-
- at mixin hover-focus {
-  @if $enable-hover-media-query {
-    &:focus {
-      @content;
-    }
-    @include hover { @content; }
-  } @else {
-    &:focus,
-    &:hover {
-      @content;
-    }
-  }
-}
-
- at mixin plain-hover-focus {
-  @if $enable-hover-media-query {
-    &,
-    &:focus {
-      @content;
-    }
-    @include hover { @content; }
-  } @else {
-    &,
-    &:focus,
-    &:hover {
-      @content;
-    }
-  }
-}
-
- at mixin hover-focus-active {
-  @if $enable-hover-media-query {
-    &:focus,
-    &:active {
-      @content;
-    }
-    @include hover { @content; }
-  } @else {
-    &:focus,
-    &:active,
-    &:hover {
-      @content;
-    }
-  }
-}
diff --git a/assets/scss/mixins/_image.scss b/assets/scss/mixins/_image.scss
deleted file mode 100644
index 0544f0d..0000000
--- a/assets/scss/mixins/_image.scss
+++ /dev/null
@@ -1,36 +0,0 @@
-// Image Mixins
-// - Responsive image
-// - Retina image
-
-
-// Responsive image
-//
-// Keep images from scaling beyond the width of their parents.
-
- at mixin img-fluid {
-  // Part 1: Set a maximum relative to the parent
-  max-width: 100%;
-  // Part 2: Override the height to auto, otherwise images will be stretched
-  // when setting a width and height attribute on the img element.
-  height: auto;
-}
-
-
-// Retina image
-//
-// Short retina mixin for setting background-image and -size.
-
-// stylelint-disable indentation, media-query-list-comma-newline-after
- at mixin img-retina($file-1x, $file-2x, $width-1x, $height-1x) {
-  background-image: url($file-1x);
-
-  // Autoprefixer takes care of adding -webkit-min-device-pixel-ratio and -o-min-device-pixel-ratio,
-  // but doesn't convert dppx=>dpi.
-  // There's no such thing as unprefixed min-device-pixel-ratio since it's nonstandard.
-  // Compatibility info: https://caniuse.com/#feat=css-media-resolution
-  @media only screen and (min-resolution: 192dpi), // IE9-11 don't support dppx
-  only screen and (min-resolution: 2dppx) { // Standardized
-    background-image: url($file-2x);
-    background-size: $width-1x $height-1x;
-  }
-}
diff --git a/assets/scss/mixins/_list-group.scss b/assets/scss/mixins/_list-group.scss
deleted file mode 100644
index 278787b..0000000
--- a/assets/scss/mixins/_list-group.scss
+++ /dev/null
@@ -1,24 +0,0 @@
-// List Groups
-
- at mixin list-group-item-variant($state, $background, $color) {
-  .list-group-item-#{$state} {
-    color: $color;
-    background-color: $background;
-  }
-
-  a.list-group-item-#{$state},
-  button.list-group-item-#{$state} {
-    color: $color;
-
-    @include hover-focus {
-      color: $color;
-      background-color: darken($background, 5%);
-    }
-
-    &.active {
-      color: #fff;
-      background-color: $color;
-      border-color: $color;
-    }
-  }
-}
diff --git a/assets/scss/mixins/_lists.scss b/assets/scss/mixins/_lists.scss
deleted file mode 100644
index 2518562..0000000
--- a/assets/scss/mixins/_lists.scss
+++ /dev/null
@@ -1,7 +0,0 @@
-// Lists
-
-// Unstyled keeps list items block level, just removes default browser padding and list-style
- at mixin list-unstyled {
-  padding-left: 0;
-  list-style: none;
-}
diff --git a/assets/scss/mixins/_nav-divider.scss b/assets/scss/mixins/_nav-divider.scss
deleted file mode 100644
index 493de03..0000000
--- a/assets/scss/mixins/_nav-divider.scss
+++ /dev/null
@@ -1,10 +0,0 @@
-// Horizontal dividers
-//
-// Dividers (basically an hr) within dropdowns and nav lists
-
- at mixin nav-divider($color: #e5e5e5) {
-  height: 0;
-  margin: ($spacer / 2) 0;
-  overflow: hidden;
-  border-top: 1px solid $color;
-}
diff --git a/assets/scss/mixins/_navbar-align.scss b/assets/scss/mixins/_navbar-align.scss
deleted file mode 100644
index b351660..0000000
--- a/assets/scss/mixins/_navbar-align.scss
+++ /dev/null
@@ -1,10 +0,0 @@
-// Navbar vertical align
-//
-// Vertically center elements in the navbar.
-// Example: an element has a height of 30px, so write out `.navbar-vertical-align(30px);`
-// to calculate the appropriate top margin.
-
-// @mixin navbar-vertical-align($element-height) {
-//   margin-top: (($navbar-height - $element-height) / 2);
-//   margin-bottom: (($navbar-height - $element-height) / 2);
-// }
diff --git a/assets/scss/mixins/_pagination.scss b/assets/scss/mixins/_pagination.scss
deleted file mode 100644
index ff36eb6..0000000
--- a/assets/scss/mixins/_pagination.scss
+++ /dev/null
@@ -1,22 +0,0 @@
-// Pagination
-
- at mixin pagination-size($padding-y, $padding-x, $font-size, $line-height, $border-radius) {
-  .page-link {
-    padding: $padding-y $padding-x;
-    font-size: $font-size;
-    line-height: $line-height;
-  }
-
-  .page-item {
-    &:first-child {
-      .page-link {
-        @include border-left-radius($border-radius);
-      }
-    }
-    &:last-child {
-      .page-link {
-        @include border-right-radius($border-radius);
-      }
-    }
-  }
-}
diff --git a/assets/scss/mixins/_reset-text.scss b/assets/scss/mixins/_reset-text.scss
deleted file mode 100644
index 71edb00..0000000
--- a/assets/scss/mixins/_reset-text.scss
+++ /dev/null
@@ -1,17 +0,0 @@
- at mixin reset-text {
-  font-family: $font-family-base;
-  // We deliberately do NOT reset font-size or word-wrap.
-  font-style: normal;
-  font-weight: $font-weight-normal;
-  line-height: $line-height-base;
-  text-align: left; // Fallback for where `start` is not supported
-  text-align: start; // stylelint-disable-line declaration-block-no-duplicate-properties
-  text-decoration: none;
-  text-shadow: none;
-  text-transform: none;
-  letter-spacing: normal;
-  word-break: normal;
-  word-spacing: normal;
-  white-space: normal;
-  line-break: auto;
-}
diff --git a/assets/scss/mixins/_resize.scss b/assets/scss/mixins/_resize.scss
deleted file mode 100644
index 66f233a..0000000
--- a/assets/scss/mixins/_resize.scss
+++ /dev/null
@@ -1,6 +0,0 @@
-// Resize anything
-
- at mixin resizable($direction) {
-  overflow: auto; // Per CSS3 UI, `resize` only applies when `overflow` isn't `visible`
-  resize: $direction; // Options: horizontal, vertical, both
-}
diff --git a/assets/scss/mixins/_screen-reader.scss b/assets/scss/mixins/_screen-reader.scss
deleted file mode 100644
index 31fb68a..0000000
--- a/assets/scss/mixins/_screen-reader.scss
+++ /dev/null
@@ -1,35 +0,0 @@
-// Only display content to screen readers
-//
-// See: http://a11yproject.com/posts/how-to-hide-content/
-// See: https://hugogiraudel.com/2016/10/13/css-hide-and-seek/
-
- at mixin sr-only {
-  position: absolute;
-  width: 1px;
-  height: 1px;
-  padding: 0;
-  overflow: hidden;
-  clip: rect(0,0,0,0);
-  white-space: nowrap;
-  clip-path: inset(50%);
-  border: 0;
-}
-
-// Use in conjunction with .sr-only to only display content when it's focused.
-//
-// Useful for "Skip to main content" links; see https://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1
-//
-// Credit: HTML5 Boilerplate
-
- at mixin sr-only-focusable {
-  &:active,
-  &:focus {
-    position: static;
-    width: auto;
-    height: auto;
-    overflow: visible;
-    clip: auto;
-    white-space: normal;
-    clip-path: none;
-  }
-}
diff --git a/assets/scss/mixins/_size.scss b/assets/scss/mixins/_size.scss
deleted file mode 100644
index b9dd48e..0000000
--- a/assets/scss/mixins/_size.scss
+++ /dev/null
@@ -1,6 +0,0 @@
-// Sizing shortcuts
-
- at mixin size($width, $height: $width) {
-  width: $width;
-  height: $height;
-}
diff --git a/assets/scss/mixins/_table-row.scss b/assets/scss/mixins/_table-row.scss
deleted file mode 100644
index 84f1d30..0000000
--- a/assets/scss/mixins/_table-row.scss
+++ /dev/null
@@ -1,30 +0,0 @@
-// Tables
-
- at mixin table-row-variant($state, $background) {
-  // Exact selectors below required to override `.table-striped` and prevent
-  // inheritance to nested tables.
-  .table-#{$state} {
-    &,
-    > th,
-    > td {
-      background-color: $background;
-    }
-  }
-
-  // Hover states for `.table-hover`
-  // Note: this is not available for cells or rows within `thead` or `tfoot`.
-  .table-hover {
-    $hover-background: darken($background, 5%);
-
-    .table-#{$state} {
-      @include hover {
-        background-color: $hover-background;
-
-        > td,
-        > th {
-          background-color: $hover-background;
-        }
-      }
-    }
-  }
-}
diff --git a/assets/scss/mixins/_text-emphasis.scss b/assets/scss/mixins/_text-emphasis.scss
deleted file mode 100644
index 58db3e0..0000000
--- a/assets/scss/mixins/_text-emphasis.scss
+++ /dev/null
@@ -1,14 +0,0 @@
-// stylelint-disable declaration-no-important
-
-// Typography
-
- at mixin text-emphasis-variant($parent, $color) {
-  #{$parent} {
-    color: $color !important;
-  }
-  a#{$parent} {
-    @include hover-focus {
-      color: darken($color, 10%) !important;
-    }
-  }
-}
diff --git a/assets/scss/mixins/_text-hide.scss b/assets/scss/mixins/_text-hide.scss
deleted file mode 100644
index 52a38a9..0000000
--- a/assets/scss/mixins/_text-hide.scss
+++ /dev/null
@@ -1,8 +0,0 @@
-// CSS image replacement
- at mixin text-hide() {
-  font: 0/0 a;
-  color: transparent;
-  text-shadow: none;
-  background-color: transparent;
-  border: 0;
-}
diff --git a/assets/scss/mixins/_text-truncate.scss b/assets/scss/mixins/_text-truncate.scss
deleted file mode 100644
index 3504bb1..0000000
--- a/assets/scss/mixins/_text-truncate.scss
+++ /dev/null
@@ -1,8 +0,0 @@
-// Text truncate
-// Requires inline-block or block for proper styling
-
- at mixin text-truncate() {
-  overflow: hidden;
-  text-overflow: ellipsis;
-  white-space: nowrap;
-}
diff --git a/assets/scss/mixins/_transition.scss b/assets/scss/mixins/_transition.scss
deleted file mode 100644
index 7e33dee..0000000
--- a/assets/scss/mixins/_transition.scss
+++ /dev/null
@@ -1,9 +0,0 @@
- at mixin transition($transition...) {
-  @if $enable-transitions {
-    @if length($transition) == 0 {
-      transition: $transition-base;
-    } @else {
-      transition: $transition;
-    }
-  }
-}
diff --git a/assets/scss/mixins/_visibility.scss b/assets/scss/mixins/_visibility.scss
deleted file mode 100644
index fe523d0..0000000
--- a/assets/scss/mixins/_visibility.scss
+++ /dev/null
@@ -1,7 +0,0 @@
-// stylelint-disable declaration-no-important
-
-// Visibility
-
- at mixin invisible($visibility) {
-  visibility: $visibility !important;
-}
diff --git a/assets/scss/utilities/_align.scss b/assets/scss/utilities/_align.scss
deleted file mode 100644
index 8b7df9f..0000000
--- a/assets/scss/utilities/_align.scss
+++ /dev/null
@@ -1,8 +0,0 @@
-// stylelint-disable declaration-no-important
-
-.align-baseline    { vertical-align: baseline !important; } // Browser default
-.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; }
diff --git a/assets/scss/utilities/_background.scss b/assets/scss/utilities/_background.scss
deleted file mode 100644
index 1f18b2f..0000000
--- a/assets/scss/utilities/_background.scss
+++ /dev/null
@@ -1,19 +0,0 @@
-// stylelint-disable declaration-no-important
-
- at each $color, $value in $theme-colors {
-  @include bg-variant(".bg-#{$color}", $value);
-}
-
- at if $enable-gradients {
-  @each $color, $value in $theme-colors {
-    @include bg-gradient-variant(".bg-gradient-#{$color}", $value);
-  }
-}
-
-.bg-white {
-  background-color: $white !important;
-}
-
-.bg-transparent {
-  background-color: transparent !important;
-}
diff --git a/assets/scss/utilities/_borders.scss b/assets/scss/utilities/_borders.scss
deleted file mode 100644
index ba02f04..0000000
--- a/assets/scss/utilities/_borders.scss
+++ /dev/null
@@ -1,54 +0,0 @@
-// stylelint-disable declaration-no-important
-
-//
-// Border
-//
-
-.border          { border: $border-width solid $border-color !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; }
-
- at each $color, $value in $theme-colors {
-  .border-#{$color} {
-    border-color: $value !important;
-  }
-}
-
-.border-white {
-  border-color: $white !important;
-}
-
-//
-// Border-radius
-//
-
-.rounded {
-  border-radius: $border-radius !important;
-}
-.rounded-top {
-  border-top-left-radius: $border-radius !important;
-  border-top-right-radius: $border-radius !important;
-}
-.rounded-right {
-  border-top-right-radius: $border-radius !important;
-  border-bottom-right-radius: $border-radius !important;
-}
-.rounded-bottom {
-  border-bottom-right-radius: $border-radius !important;
-  border-bottom-left-radius: $border-radius !important;
-}
-.rounded-left {
-  border-top-left-radius: $border-radius !important;
-  border-bottom-left-radius: $border-radius !important;
-}
-
-.rounded-circle {
-  border-radius: 50% !important;
-}
-
-.rounded-0 {
-  border-radius: 0 !important;
-}
diff --git a/assets/scss/utilities/_clearfix.scss b/assets/scss/utilities/_clearfix.scss
deleted file mode 100644
index e92522a..0000000
--- a/assets/scss/utilities/_clearfix.scss
+++ /dev/null
@@ -1,3 +0,0 @@
-.clearfix {
-  @include clearfix();
-}
diff --git a/assets/scss/utilities/_display.scss b/assets/scss/utilities/_display.scss
deleted file mode 100644
index 893b638..0000000
--- a/assets/scss/utilities/_display.scss
+++ /dev/null
@@ -1,56 +0,0 @@
-// stylelint-disable declaration-no-important
-
-//
-// Utilities for common `display` values
-//
-
- at each $breakpoint in map-keys($grid-breakpoints) {
-  @include media-breakpoint-up($breakpoint) {
-    $infix: breakpoint-infix($breakpoint, $grid-breakpoints);
-
-    .d#{$infix}-none         { display: none !important; }
-    .d#{$infix}-inline       { display: inline !important; }
-    .d#{$infix}-inline-block { display: inline-block !important; }
-    .d#{$infix}-block        { display: block !important; }
-    .d#{$infix}-table        { display: table !important; }
-    .d#{$infix}-table-row    { display: table-row !important; }
-    .d#{$infix}-table-cell   { display: table-cell !important; }
-    .d#{$infix}-flex         { display: flex !important; }
-    .d#{$infix}-inline-flex  { display: inline-flex !important; }
-  }
-}
-
-
-//
-// Utilities for toggling `display` in print
-//
-
-.d-print-block {
-  display: none !important;
-
-  @media print {
-    display: block !important;
-  }
-}
-
-.d-print-inline {
-  display: none !important;
-
-  @media print {
-    display: inline !important;
-  }
-}
-
-.d-print-inline-block {
-  display: none !important;
-
-  @media print {
-    display: inline-block !important;
-  }
-}
-
-.d-print-none {
-  @media print {
-    display: none !important;
-  }
-}
diff --git a/assets/scss/utilities/_embed.scss b/assets/scss/utilities/_embed.scss
deleted file mode 100644
index d3362b6..0000000
--- a/assets/scss/utilities/_embed.scss
+++ /dev/null
@@ -1,52 +0,0 @@
-// Credit: Nicolas Gallagher and SUIT CSS.
-
-.embed-responsive {
-  position: relative;
-  display: block;
-  width: 100%;
-  padding: 0;
-  overflow: hidden;
-
-  &::before {
-    display: block;
-    content: "";
-  }
-
-  .embed-responsive-item,
-  iframe,
-  embed,
-  object,
-  video {
-    position: absolute;
-    top: 0;
-    bottom: 0;
-    left: 0;
-    width: 100%;
-    height: 100%;
-    border: 0;
-  }
-}
-
-.embed-responsive-21by9 {
-  &::before {
-    padding-top: percentage(9 / 21);
-  }
-}
-
-.embed-responsive-16by9 {
-  &::before {
-    padding-top: percentage(9 / 16);
-  }
-}
-
-.embed-responsive-4by3 {
-  &::before {
-    padding-top: percentage(3 / 4);
-  }
-}
-
-.embed-responsive-1by1 {
-  &::before {
-    padding-top: percentage(1 / 1);
-  }
-}
diff --git a/assets/scss/utilities/_flex.scss b/assets/scss/utilities/_flex.scss
deleted file mode 100644
index 8e47038..0000000
--- a/assets/scss/utilities/_flex.scss
+++ /dev/null
@@ -1,46 +0,0 @@
-// stylelint-disable declaration-no-important
-
-// Flex variation
-//
-// Custom styles for additional flex alignment options.
-
- at each $breakpoint in map-keys($grid-breakpoints) {
-  @include media-breakpoint-up($breakpoint) {
-    $infix: breakpoint-infix($breakpoint, $grid-breakpoints);
-
-    .flex#{$infix}-row            { flex-direction: row !important; }
-    .flex#{$infix}-column         { flex-direction: column !important; }
-    .flex#{$infix}-row-reverse    { flex-direction: row-reverse !important; }
-    .flex#{$infix}-column-reverse { flex-direction: column-reverse !important; }
-
-    .flex#{$infix}-wrap         { flex-wrap: wrap !important; }
-    .flex#{$infix}-nowrap       { flex-wrap: nowrap !important; }
-    .flex#{$infix}-wrap-reverse { flex-wrap: wrap-reverse !important; }
-
-    .justify-content#{$infix}-start   { justify-content: flex-start !important; }
-    .justify-content#{$infix}-end     { justify-content: flex-end !important; }
-    .justify-content#{$infix}-center  { justify-content: center !important; }
-    .justify-content#{$infix}-between { justify-content: space-between !important; }
-    .justify-content#{$infix}-around  { justify-content: space-around !important; }
-
-    .align-items#{$infix}-start    { align-items: flex-start !important; }
-    .align-items#{$infix}-end      { align-items: flex-end !important; }
-    .align-items#{$infix}-center   { align-items: center !important; }
-    .align-items#{$infix}-baseline { align-items: baseline !important; }
-    .align-items#{$infix}-stretch  { align-items: stretch !important; }
-
-    .align-content#{$infix}-start   { align-content: flex-start !important; }
-    .align-content#{$infix}-end     { align-content: flex-end !important; }
-    .align-content#{$infix}-center  { align-content: center !important; }
-    .align-content#{$infix}-between { align-content: space-between !important; }
-    .align-content#{$infix}-around  { align-content: space-around !important; }
-    .align-content#{$infix}-stretch { align-content: stretch !important; }
-
-    .align-self#{$infix}-auto     { align-self: auto !important; }
-    .align-self#{$infix}-start    { align-self: flex-start !important; }
-    .align-self#{$infix}-end      { align-self: flex-end !important; }
-    .align-self#{$infix}-center   { align-self: center !important; }
-    .align-self#{$infix}-baseline { align-self: baseline !important; }
-    .align-self#{$infix}-stretch  { align-self: stretch !important; }
-  }
-}
diff --git a/assets/scss/utilities/_float.scss b/assets/scss/utilities/_float.scss
deleted file mode 100644
index 01655e9..0000000
--- a/assets/scss/utilities/_float.scss
+++ /dev/null
@@ -1,9 +0,0 @@
- at each $breakpoint in map-keys($grid-breakpoints) {
-  @include media-breakpoint-up($breakpoint) {
-    $infix: breakpoint-infix($breakpoint, $grid-breakpoints);
-
-    .float#{$infix}-left  { @include float-left; }
-    .float#{$infix}-right { @include float-right; }
-    .float#{$infix}-none  { @include float-none; }
-  }
-}
diff --git a/assets/scss/utilities/_position.scss b/assets/scss/utilities/_position.scss
deleted file mode 100644
index ef962ed..0000000
--- a/assets/scss/utilities/_position.scss
+++ /dev/null
@@ -1,36 +0,0 @@
-// stylelint-disable declaration-no-important
-
-// Common values
-
-// Sass list not in variables since it's not intended for customization.
-$positions: static, relative, absolute, fixed, sticky;
-
- at each $position in $positions {
-  .position-#{$position} { position: $position !important; }
-}
-
-// Shorthand
-
-.fixed-top {
-  position: fixed;
-  top: 0;
-  right: 0;
-  left: 0;
-  z-index: $zindex-fixed;
-}
-
-.fixed-bottom {
-  position: fixed;
-  right: 0;
-  bottom: 0;
-  left: 0;
-  z-index: $zindex-fixed;
-}
-
-.sticky-top {
-  @supports (position: sticky) {
-    position: sticky;
-    top: 0;
-    z-index: $zindex-sticky;
-  }
-}
diff --git a/assets/scss/utilities/_screenreaders.scss b/assets/scss/utilities/_screenreaders.scss
deleted file mode 100644
index 9f26fde..0000000
--- a/assets/scss/utilities/_screenreaders.scss
+++ /dev/null
@@ -1,11 +0,0 @@
-//
-// Screenreaders
-//
-
-.sr-only {
-  @include sr-only();
-}
-
-.sr-only-focusable {
-  @include sr-only-focusable();
-}
diff --git a/assets/scss/utilities/_sizing.scss b/assets/scss/utilities/_sizing.scss
deleted file mode 100644
index e95a4db..0000000
--- a/assets/scss/utilities/_sizing.scss
+++ /dev/null
@@ -1,12 +0,0 @@
-// stylelint-disable declaration-no-important
-
-// Width and height
-
- at each $prop, $abbrev in (width: w, height: h) {
-  @each $size, $length in $sizes {
-    .#{$abbrev}-#{$size} { #{$prop}: $length !important; }
-  }
-}
-
-.mw-100 { max-width: 100% !important; }
-.mh-100 { max-height: 100% !important; }
diff --git a/assets/scss/utilities/_spacing.scss b/assets/scss/utilities/_spacing.scss
deleted file mode 100644
index b2e2354..0000000
--- a/assets/scss/utilities/_spacing.scss
+++ /dev/null
@@ -1,51 +0,0 @@
-// stylelint-disable declaration-no-important
-
-// Margin and Padding
-
- at each $breakpoint in map-keys($grid-breakpoints) {
-  @include media-breakpoint-up($breakpoint) {
-    $infix: breakpoint-infix($breakpoint, $grid-breakpoints);
-
-    @each $prop, $abbrev in (margin: m, padding: p) {
-      @each $size, $length in $spacers {
-
-        .#{$abbrev}#{$infix}-#{$size} { #{$prop}: $length !important; }
-        .#{$abbrev}t#{$infix}-#{$size},
-        .#{$abbrev}y#{$infix}-#{$size} {
-          #{$prop}-top: $length !important;
-        }
-        .#{$abbrev}r#{$infix}-#{$size},
-        .#{$abbrev}x#{$infix}-#{$size} {
-          #{$prop}-right: $length !important;
-        }
-        .#{$abbrev}b#{$infix}-#{$size},
-        .#{$abbrev}y#{$infix}-#{$size} {
-          #{$prop}-bottom: $length !important;
-        }
-        .#{$abbrev}l#{$infix}-#{$size},
-        .#{$abbrev}x#{$infix}-#{$size} {
-          #{$prop}-left: $length !important;
-        }
-      }
-    }
-
-    // Some special margin utils
-    .m#{$infix}-auto { margin: auto !important; }
-    .mt#{$infix}-auto,
-    .my#{$infix}-auto {
-      margin-top: auto !important;
-    }
-    .mr#{$infix}-auto,
-    .mx#{$infix}-auto {
-      margin-right: auto !important;
-    }
-    .mb#{$infix}-auto,
-    .my#{$infix}-auto {
-      margin-bottom: auto !important;
-    }
-    .ml#{$infix}-auto,
-    .mx#{$infix}-auto {
-      margin-left: auto !important;
-    }
-  }
-}
diff --git a/assets/scss/utilities/_text.scss b/assets/scss/utilities/_text.scss
deleted file mode 100644
index f4b6e65..0000000
--- a/assets/scss/utilities/_text.scss
+++ /dev/null
@@ -1,52 +0,0 @@
-// stylelint-disable declaration-no-important
-
-//
-// Text
-//
-
-// Alignment
-
-.text-justify  { text-align: justify !important; }
-.text-nowrap   { white-space: nowrap !important; }
-.text-truncate { @include text-truncate; }
-
-// Responsive alignment
-
- at each $breakpoint in map-keys($grid-breakpoints) {
-  @include media-breakpoint-up($breakpoint) {
-    $infix: breakpoint-infix($breakpoint, $grid-breakpoints);
-
-    .text#{$infix}-left   { text-align: left !important; }
-    .text#{$infix}-right  { text-align: right !important; }
-    .text#{$infix}-center { text-align: center !important; }
-  }
-}
-
-// Transformation
-
-.text-lowercase  { text-transform: lowercase !important; }
-.text-uppercase  { text-transform: uppercase !important; }
-.text-capitalize { text-transform: capitalize !important; }
-
-// Weight and italics
-
-.font-weight-light  { font-weight: $font-weight-light !important; }
-.font-weight-normal { font-weight: $font-weight-normal !important; }
-.font-weight-bold   { font-weight: $font-weight-bold !important; }
-.font-italic        { font-style: italic !important; }
-
-// Contextual colors
-
-.text-white { color: #fff !important; }
-
- at each $color, $value in $theme-colors {
-  @include text-emphasis-variant(".text-#{$color}", $value);
-}
-
-.text-muted { color: $text-muted !important; }
-
-// Misc
-
-.text-hide {
-  @include text-hide();
-}
diff --git a/assets/scss/utilities/_visibility.scss b/assets/scss/utilities/_visibility.scss
deleted file mode 100644
index 823406d..0000000
--- a/assets/scss/utilities/_visibility.scss
+++ /dev/null
@@ -1,11 +0,0 @@
-//
-// Visibility utilities
-//
-
-.visible {
-  @include invisible(visible);
-}
-
-.invisible {
-  @include invisible(hidden);
-}





More information about the tor-commits mailing list