:root {
  /* Breakpoints */

  /* Colors */ /* Error background */

  /* Transitions */

  /* Grids */
}

/* Breakpoint Queries */

/* Breakpoint Special Cases Queries */

@-webkit-keyframes step {
  0% {
    -webkit-transform: translateX(0);
            transform: translateX(0);
  }
  50% {
    -webkit-transform: translateX(-5px);
            transform: translateX(-5px);
  }
  100% {
    -webkit-transform: translateX(0);
            transform: translateX(0);
  }
}

@keyframes step {
  0% {
    -webkit-transform: translateX(0);
            transform: translateX(0);
  }
  50% {
    -webkit-transform: translateX(-5px);
            transform: translateX(-5px);
  }
  100% {
    -webkit-transform: translateX(0);
            transform: translateX(0);
  }
}

@-webkit-keyframes spin {
  from {
    -webkit-transform: rotate(0deg);
            transform: rotate(0deg);
  }
  to {
    -webkit-transform: rotate(360deg);
            transform: rotate(360deg);
  }
}

@keyframes spin {
  from {
    -webkit-transform: rotate(0deg);
            transform: rotate(0deg);
  }
  to {
    -webkit-transform: rotate(360deg);
            transform: rotate(360deg);
  }
}

@-webkit-keyframes swing {
  from {
    -webkit-transform: rotate(0deg);
            transform: rotate(0deg);
  }
  10% {
    -webkit-transform: rotate(-15deg);
            transform: rotate(-15deg);
  }
  30% {
    -webkit-transform: rotate(15deg);
            transform: rotate(15deg);
  }
  50% {
    -webkit-transform: rotate(-15deg);
            transform: rotate(-15deg);
  }
  70% {
    -webkit-transform: rotate(15deg);
            transform: rotate(15deg);
  }
  90% {
    -webkit-transform: rotate(-15deg);
            transform: rotate(-15deg);
  }
  to {
    -webkit-transform: rotate(0);
            transform: rotate(0);
  }
}

@keyframes swing {
  from {
    -webkit-transform: rotate(0deg);
            transform: rotate(0deg);
  }
  10% {
    -webkit-transform: rotate(-15deg);
            transform: rotate(-15deg);
  }
  30% {
    -webkit-transform: rotate(15deg);
            transform: rotate(15deg);
  }
  50% {
    -webkit-transform: rotate(-15deg);
            transform: rotate(-15deg);
  }
  70% {
    -webkit-transform: rotate(15deg);
            transform: rotate(15deg);
  }
  90% {
    -webkit-transform: rotate(-15deg);
            transform: rotate(-15deg);
  }
  to {
    -webkit-transform: rotate(0);
            transform: rotate(0);
  }
}

@-webkit-keyframes nodeInserted {
	from {
    opacity: 0.99;
  }
	to {
    opacity: 1;
  }
}

@keyframes nodeInserted {
	from {
    opacity: 0.99;
  }
	to {
    opacity: 1;
  }
}

@-webkit-keyframes wabbleZoom {
  from {
    -webkit-transform: rotate3d(0, 0, 1, 0deg) scale(0);
            transform: rotate3d(0, 0, 1, 0deg) scale(0);
  }
  20% {
    -webkit-transform: rotate3d(0, 0, 1, 15deg) scale(1);
            transform: rotate3d(0, 0, 1, 15deg) scale(1);
  }
  40% {
    -webkit-transform: rotate3d(0, 0, 1, -10deg) scale(1);
            transform: rotate3d(0, 0, 1, -10deg) scale(1);
  }
  60% {
    -webkit-transform: rotate3d(0, 0, 1, 5deg) scale(1);
            transform: rotate3d(0, 0, 1, 5deg) scale(1);
  }
  80% {
    -webkit-transform: rotate3d(0, 0, 1, -5deg) scale(1);
            transform: rotate3d(0, 0, 1, -5deg) scale(1);
  }
  to {
    -webkit-transform: rotate3d(0, 0, 1, 0deg) scale(1);
            transform: rotate3d(0, 0, 1, 0deg) scale(1);
  }
}

@keyframes wabbleZoom {
  from {
    -webkit-transform: rotate3d(0, 0, 1, 0deg) scale(0);
            transform: rotate3d(0, 0, 1, 0deg) scale(0);
  }
  20% {
    -webkit-transform: rotate3d(0, 0, 1, 15deg) scale(1);
            transform: rotate3d(0, 0, 1, 15deg) scale(1);
  }
  40% {
    -webkit-transform: rotate3d(0, 0, 1, -10deg) scale(1);
            transform: rotate3d(0, 0, 1, -10deg) scale(1);
  }
  60% {
    -webkit-transform: rotate3d(0, 0, 1, 5deg) scale(1);
            transform: rotate3d(0, 0, 1, 5deg) scale(1);
  }
  80% {
    -webkit-transform: rotate3d(0, 0, 1, -5deg) scale(1);
            transform: rotate3d(0, 0, 1, -5deg) scale(1);
  }
  to {
    -webkit-transform: rotate3d(0, 0, 1, 0deg) scale(1);
            transform: rotate3d(0, 0, 1, 0deg) scale(1);
  }
}

@-webkit-keyframes wabble {
  from {
    -webkit-transform: rotate3d(0, 0, 1, 0deg);
            transform: rotate3d(0, 0, 1, 0deg);
  }
  20% {
    -webkit-transform: rotate3d(0, 0, 1, 15deg);
            transform: rotate3d(0, 0, 1, 15deg);
  }
  40% {
    -webkit-transform: rotate3d(0, 0, 1, -10deg);
            transform: rotate3d(0, 0, 1, -10deg);
  }
  60% {
    -webkit-transform: rotate3d(0, 0, 1, 5deg);
            transform: rotate3d(0, 0, 1, 5deg);
  }
  80% {
    -webkit-transform: rotate3d(0, 0, 1, -5deg);
            transform: rotate3d(0, 0, 1, -5deg);
  }
  to {
    -webkit-transform: rotate3d(0, 0, 1, 0deg);
            transform: rotate3d(0, 0, 1, 0deg);
  }
}

@keyframes wabble {
  from {
    -webkit-transform: rotate3d(0, 0, 1, 0deg);
            transform: rotate3d(0, 0, 1, 0deg);
  }
  20% {
    -webkit-transform: rotate3d(0, 0, 1, 15deg);
            transform: rotate3d(0, 0, 1, 15deg);
  }
  40% {
    -webkit-transform: rotate3d(0, 0, 1, -10deg);
            transform: rotate3d(0, 0, 1, -10deg);
  }
  60% {
    -webkit-transform: rotate3d(0, 0, 1, 5deg);
            transform: rotate3d(0, 0, 1, 5deg);
  }
  80% {
    -webkit-transform: rotate3d(0, 0, 1, -5deg);
            transform: rotate3d(0, 0, 1, -5deg);
  }
  to {
    -webkit-transform: rotate3d(0, 0, 1, 0deg);
            transform: rotate3d(0, 0, 1, 0deg);
  }
}

@-webkit-keyframes toggle {
  from {
    -webkit-transform: translateX(0);
            transform: translateX(0);
  }
  50% {
    -webkit-transform: translateX(-5px);
            transform: translateX(-5px);
  }
  to {
    -webkit-transform: translateX(0);
            transform: translateX(0);
  }
}

@keyframes toggle {
  from {
    -webkit-transform: translateX(0);
            transform: translateX(0);
  }
  50% {
    -webkit-transform: translateX(-5px);
            transform: translateX(-5px);
  }
  to {
    -webkit-transform: translateX(0);
            transform: translateX(0);
  }
}

.fade-in-down-enter-active, .fade-in-down-leave-active {
  -webkit-transform: translateY(0);
      -ms-transform: translateY(0);
          transform: translateY(0);
  -webkit-transition: all 200ms ease-in-out;
  -o-transition: all 200ms ease-in-out;
  transition: all 200ms ease-in-out;
}

.fade-in-down-enter, .fade-in-down-leave-to {
  opacity: 0;
  -webkit-transform: translateY(10px);
      -ms-transform: translateY(10px);
          transform: translateY(10px);
}

.fade-enter-active, .fade-leave-active {
  opacity: 1;
  -webkit-transition: all 200ms ease-in-out;
  -o-transition: all 200ms ease-in-out;
  transition: all 200ms ease-in-out;
}

.fade-enter, .fade-leave-to {
  opacity: 0;
}

.fade-right-enter-active, .fade-right-leave-to-active {
  -webkit-transform: translateX(0);
      -ms-transform: translateX(0);
          transform: translateX(0);
  -webkit-transition: all 400ms ease-in-out;
  -o-transition: all 400ms ease-in-out;
  transition: all 400ms ease-in-out;
}

.fade-right-enter, .fade-right-leave-to {
  opacity: 0;
  -webkit-transform: translateX(110px);
      -ms-transform: translateX(110px);
          transform: translateX(110px);
  -webkit-transition: all 400ms ease-in-out;
  -o-transition: all 400ms ease-in-out;
  transition: all 400ms ease-in-out;
}

.align-l {
  text-align: left;
}

.align-c {
  text-align: center;
}

.align-r {
  text-align: right;
}

.align-j {
  text-align: justify;
}

.align-m {
  vertical-align: middle;
}

.align-t {
  vertical-align: top;
}

.align-b {
  vertical-align: baseline;
}

.flip-h {
  -webkit-transform: scale(-1, 1);
      -ms-transform: scale(-1, 1);
          transform: scale(-1, 1);
}

.black {
  color: #000000;
}

.white {
  color: #ffffff;
}

.white-svg {
  fill: #ffffff;
}

.yellow {
  color: #fdd007;
}

.red {
  color: red;
}

.yellow-dk {
  color: #FFE48F;
}

/* Background Colors */

.bg-black {
  background-color: #000000;
}

.bg-white {
  background-color: #ffffff;
}

.bg-yellow {
   background-color: #fdd007;
}

.bg-parchment {
  background-color: #fff9e7;
}

.bg-yellow-dk {
  background-color: #FFE48F;
}

.bg-grey5 {
  background-color: #eeefea;
}

/* Background Gradient Colors */

.gd-parchment-top {
  background: -webkit-gradient(linear, left bottom, left top, from(#fff9e7), to(#ffffff));
  background: -o-linear-gradient(bottom, #fff9e7 0%, #ffffff 100%);
  background: linear-gradient(to top, #fff9e7 0%, #ffffff 100%);
}

.gd-parchment-bottom {
  background: -webkit-gradient(linear, left top, left bottom, from(#fff9e7), to(#ffffff));
  background: -o-linear-gradient(top, #fff9e7 0%, #ffffff 100%);
  background: linear-gradient(to bottom, #fff9e7 0%, #ffffff 100%);
}

@font-face {
  font-family: 'gotham-htf-bold';
  src: url("//cdn.shopify.com/s/files/1/2403/8187/files/gotham-htf-bold.woff2?v=6265072679982171356") format('woff2'), url("//cdn.shopify.com/s/files/1/2403/8187/files/gotham-htf-bold.woff?v=5095487823502688638") format('woff'), url("//cdn.shopify.com/s/files/1/2403/8187/files/gotham-htf-bold.ttf?v=315047652011209556") format('truetype');
  font-weight: normal;
  font-style: normal;
}

@font-face {
  font-family: 'Gotham Bold';
  src: url("//cdn.shopify.com/s/files/1/2403/8187/files/GothamBold.woff2?v=9359460107500114053") format('woff2'),
       url("//cdn.shopify.com/s/files/1/2403/8187/files/GothamBold.woff?v=9363268276078449859") format('woff'),
       url("//cdn.shopify.com/s/files/1/2403/8187/files/GothamBold.ttf?v=4080236755602390279") format('truetype');
  font-weight: normal;
  font-style: normal;
}

@font-face {
  font-family: 'Gotham Medium';
  src: url("//cdn.shopify.com/s/files/1/2403/8187/files/GothamMedium.woff2?v=17465759298602699321") format('woff2'),
       url("//cdn.shopify.com/s/files/1/2403/8187/files/GothamMedium.woff?v=15911343527286712650") format('woff'),
       url("//cdn.shopify.com/s/files/1/2403/8187/files/GothamMedium.ttf?v=11777892150238278178") format('truetype');
  font-weight: normal;
  font-style: normal;
}

.container {
  height: 100%;
  margin: 0 auto;
  position: relative;
  width: calc(100% - 40px);
}

@media (min-width: 620px) {

  .container {
    width: calc(100% - 80px);
  }
}

@media (min-width: 1000px) {

  .container {
    width: calc(100% - 120px);
  }
}

@media (min-width: 1200px) {

  .container {
    width: calc(100% - 160px);
  }
}

.container--xxs {
  max-width: 445px
}

.container--xs {
  max-width: 620px
}

.container--s {
  max-width: 768px
}

.container--ms {
  max-width: 840px
}

.container--m {
  max-width: 1000px
}

.container--ml {
  max-width: 1160px
}

.container--l {
  max-width: 1280px
}

.container--xl {
  max-width: 1440px
}

.container--xxl {
  max-width: 1800px
}

html{
  padding-bottom: 0 !important;
}

#main {
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-orient: vertical;
  -webkit-box-direction: normal;
  -webkit-flex-direction: column;
      -ms-flex-direction: column;
          flex-direction: column;
  max-width: 100vw;
  min-height: 100vh;
  overflow-x: hidden;
}

.content {
  -webkit-box-flex: 1;
  -webkit-flex: 1 1 auto;
      -ms-flex: 1 1 auto;
          flex: 1 1 auto;
  min-height: 520px;
  position: relative;
  width: 100%;
}

@media (min-width: 1090px) {

  .content {
    padding-top: 60px;
    margin-top: 0 !important;
  }
}

.is-checkout .content {
    padding-top: 0;
}

.header, .footer {
  -webkit-box-flex: 1;
  -webkit-flex: 1 1 auto;
      -ms-flex: 1 1 auto;
          flex: 1 1 auto;
  width: 100%;
}

.grid {
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  -webkit-flex-wrap: wrap;
      -ms-flex-wrap: wrap;
          flex-wrap: wrap;
  margin: 0 calc(-10px);
}

@media (min-width: 840px) {

  .grid {
    margin: 0 calc(-15px);
  }
}

.grid__item {
  padding: 0 calc(10px);
}

@media (min-width: 840px) {

  .grid__item {
    padding: 0 calc(15px);
  }
}

.page-bottom-spacing{
  padding-bottom: 40px;
}

@media (min-width: 1000px) {

  .page-bottom-spacing {
    padding-bottom: 80px;
  }
}

/* Ratio */

.ratio {
  position: relative
}

.ratio::before {
  content: '';
  display: block;
  width: 100%;
}

/* Icons / Logos */

.icon, .logo {
  position: relative;
}

.icon svg, .logo svg {
    display: block;
    height: 100%;
    width: 100%;
  }

.icon img, .logo img {
    display: block;
    width: 100%;
  }

/* Background Size */

.bg-cover {
  background-size: cover;
  background-position: center;
  background-repeat: no-repeat;
}

.bg-contain {
  background-size: contain;
  background-position: center;
  background-repeat: no-repeat;
}

/* Borders */

.border-bottom {
  border-bottom: 1px solid #d0d0d0;
}

/* Width */

.w100 {
  width: 100%;
}

/* Positioning */

.fill {
  position: absolute;
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;
  margin: auto;
}

.smooth-scroll{
  overflow-y: scroll;
  -webkit-overflow-scrolling: touch;
}

/* Section Spacing */

.section, .donation-payment {
  padding: 40px 0;
}

@media (min-width: 620px) {

  .section, .donation-payment {
    padding: 60px 0;
  }
}

@media (min-width: 1000px) {

  .section, .donation-payment {
    padding: 80px 0;
  }
}

.section + .section, .donation-payment + .section {
  padding-top: 0;
}

@media (min-width: 1440px) {

  .section--lg {
    padding: 120px 0;
  }
}

.section--pad-bottom{
  padding-top: 0;
}

.section--pad-top{
  padding-bottom: 0;
}

.section--with-hr{
  border-bottom: 1px solid #d0d0d0;
  margin-bottom: 40px;
}

@media (min-width: 620px) {

  .section--with-hr {
    margin-bottom: 60px;
  }
}

@media (min-width: 1000px) {

  .section--with-hr {
    margin-bottom: 80px;
  }
}

.section--with-hr-top{
  border-top: 1px solid #d0d0d0;
  margin-top: 40px;
}

@media (min-width: 620px) {

  .section--with-hr-top {
    margin-top: 60px;
  }
}

@media (min-width: 1000px) {

  .section--with-hr-top {
    margin-top: 80px;
  }
}

/* Opacities */

.o1 {
  opacity: 0.1;
}

.o2 {
  opacity: 0.2;
}

.o3 {
  opacity: 0.3;
}

.o4 {
  opacity: 0.4;
}

.o5 {
  opacity: 0.5;
}

.o6 {
  opacity: 0.6;
}

.o7 {
  opacity: 0.7;
}

.o8 {
  opacity: 0.8;
}

.o9 {
  opacity: 0.9;
}

/* Cursor */

.c-pointer {
  cursor: pointer;
}

.strike {
  text-decoration: line-through;
}

/* Vue.js */

[v-cloak] {
  display: none;
}

.hidden{
  visibility: hidden;
}

.sr-only {
  position: absolute;
  width: 1px;
  height: 1px;
  padding: 0;
  margin: -1px;
  overflow: hidden;
  clip: rect(0,0,0,0);
  border: 0;
}

.inline {
  display: inline;
}

.inline-block {
  display: inline-block;
}

.relative {
  position: relative;
}

.absolute {
  position: absolute;
}

.fixed {
  position: fixed;
}

.static {
  position: static;
}

.pointer{
  cursor: pointer;
}

.block {
  display: block;
}

.hide {
  display: none;
}

@media (min-width: 445px) {

  .block--xxs {
    display: block;
  }
}

@media (min-width: 620px) {

  .block--xs {
    display: block;
  }
}

@media (min-width: 768px) {

  .block--s {
    display: block;
  }
}

@media (min-width: 840px) {

  .block--ms {
    display: block;
  }
}

@media (min-width: 1000px) {

  .block--m {
    display: block;
  }
}

@media (min-width: 1160px) {

  .block--ml {
    display: block;
  }
}

@media (min-width: 1200px) {

  .block--l {
    display: block;
  }
}

@media (min-width: 1440px) {

  .block--xl {
    display: block;
  }
}

@media (min-width: 1800px) {

  .block--xxl {
    display: block;
  }
}

@media (min-width: 445px) {

  .hide--xxs {
    display: none;
  }
}

@media (min-width: 620px) {

  .hide--xs {
    display: none;
  }
}

@media (min-width: 768px) {

  .hide--s {
    display: none;
  }
}

@media (min-width: 840px) {

  .hide--ms {
    display: none;
  }
}

@media (min-width: 1000px) {

  .hide--m {
    display: none;
  }
}

@media (min-width: 1160px) {

  .hide--ml {
    display: none;
  }
}

@media (min-width: 1200px) {

  .hide--l {
    display: none;
  }
}

@media (min-width: 1440px) {

  .hide--xl {
    display: none;
  }
}

@media (min-width: 1800px) {

  .hide--xxl {
    display: none;
  }
}

.form {}

/* http://meyerweb.com/eric/tools/css/reset/ */

html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, big, cite, code, del, dfn, em, img, ins, kbd, q, s, samp, small, strike, strong, sub, sup, tt, var, b, u, i, center, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td, article, aside, canvas, details, embed, figure, figcaption, footer, header, hgroup, menu, nav, output, ruby, section, summary, time, mark, audio, video {
  margin: 0;
  padding: 0;
  border: 0;
  font-size: 100%;
  font: inherit;
  vertical-align: baseline;
}

/* HTML5 display-role reset for older browsers */

article, aside, details, figcaption, figure, footer, header, hgroup, menu, nav, section {
  display: block;
}

body {
  cursor: default;
  line-height: 1;
}

ol, ul {
  list-style: none;
}

blockquote, q {
  quotes: none;
}

blockquote::before, blockquote::after, q::before, q::after {
  content: '';
  content: none;
}

table {
  border-collapse: collapse;
  border-spacing: 0;
}

* {
  box-sizing: border-box;
  -webkit-box-sizing: border-box;
  -moz-box-sizing: border-box;
}

input, textarea, button, select, a {
  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
}

*, *:focus, *:active {
  -webkit-box-shadow: none;
          box-shadow: none;
}

a {
  color: inherit;
  text-decoration: none;
}

button[disabled], input[disabled] {
  cursor: default;
}

button {
  cursor: pointer;
}

input, select, button {
  background-color: transparent;
  border: none;
  border-radius: 0;
  -webkit-box-shadow: none;
          box-shadow: none;
  color: inherit;
  font-size: inherit;
  margin: 0;
  padding: 0;
  -moz-appearance: none;
  -webkit-appearance: none;
}

input[type=number]::-webkit-inner-spin-button, input[type=number]::-webkit-outer-spin-button {
  -webkit-appearance: none;
          appearance: none;
}

input[type=number] {
  -moz-appearance: textfield;
}

select::-ms-expand {
  display: none;
}

#preview-bar-iframe {
  display: none !important;
}

.h1, .h2, .h3, .h4, .h4--big, .h5, .account-form__title--accounts, .account-form__title--cart, #product-reviews .y-label.yotpo-header-title, #product-reviews .yotpo-header, #product-reviews .yotpo-header .yotpo-user-name, #product-reviews .yotpo-header .yotpo-user-title, #product-reviews .yotpo-header .yotpo-review-date, #product-reviews .yotpo-main .content-title, #product-reviews .yotpo-footer .footer-actions, #product-reviews .yotpo-helpful .label-helpful, .wysiwyg h1, .wysiwyg h2, .wysiwyg h3, .wysiwyg h4, .wysiwyg h5, .wysiwyg h6 {
  font-family: 'gotham-htf-bold', arial, sans-serif;
  font-weight: normal;
  line-height: 1.2;
  text-transform: uppercase;
}

body, .p1, .p2, .p3, .bq, .a2, .a3, .ul, .ol, .flow-consent-dismiss-btn, .breadcrumbs__item a, .button, .craft-anatomy-card__cta, .header-cart__count, .flow-country-picker-extra-message-container, .newsletter__field, .product-lens-content__frame-only::before, .yotpo-lightbox-product-button, .yotpo-instagram .yotpo-icon-profile label, #product-reviews .yotpo-first-review .write-review-button, #product-reviews .yotpo-submit, #product-reviews .yotpo-icon-button-text, #product-reviews .y-label, #product-reviews .y-input, #product-reviews .yotpo-main .content-review, #product-reviews .yotpo-main .yotpo-read-more, #product-reviews .yotpo-page-element, #product-reviews .yotpo .error-box label, .wysiwyg p, .wysiwyg ul, .wysiwyg ol, .wysiwyg blockquote, .wysiwyg blockquote p, .yotpo .yotpo-bottomline a {
  font-family: 'courier', arial, sans-serif;
  font-weight: normal;
  line-height: 1.2;
}

body{
  font-size: 12px;
}

@media (min-width: 620px) {

  body {
    font-size: 13px;
  }
}

/* Global */

body {
  -moz-osx-font-smoothing: grayscale;
  -webkit-font-smoothing: antialiased;
  font-smoothing: antialiased;
}

select {
  font-family: inherit;
  font-size: inherit;
  font-weight: inherit
}

select:focus {
  outline: -webkit-focus-ring-color auto 5px;
}

sup {
  font-size: 7px;
  vertical-align: super;
}

/* Headings */

.h1, .wysiwyg h1 {
  font-size: 30px;
  letter-spacing: 2px;
}

@media (min-width: 620px) {

  .h1, .wysiwyg h1 {
    font-size: 52px;
    letter-spacing: 3px;
  }
}

.h2, .wysiwyg h2 {
  font-size: 21px;
  letter-spacing: 1px;
  line-height: 1.35;
}

@media (min-width: 620px) {

  .h2, .wysiwyg h2 {
    font-size: 39px;
    letter-spacing: 2px;
  }
}

.h3, .account-form__title--accounts, .wysiwyg h3 {
  font-size: 18px;
  letter-spacing: 1px;
  line-height: 1.2;
}

@media (min-width: 620px) {

  .h3, .account-form__title--accounts, .wysiwyg h3 {
    font-size: 26px;
    letter-spacing: 2px;
  }
}

.h4, .h4--big, .account-form__title--cart, #product-reviews .y-label.yotpo-header-title, .wysiwyg h4, .wysiwyg h5, .wysiwyg h6 {
  font-size: 12px;
  letter-spacing: 2px;
  line-height: 1.8;
}

@media (min-width: 620px) {

  .h4, .h4--big, .account-form__title--cart, #product-reviews .y-label.yotpo-header-title, .wysiwyg h4, .wysiwyg h5, .wysiwyg h6 {
    font-size: 16px;
    line-height: 1.2;
  }
}

@media (min-width: 840px) {

  .h4--big {
    font-size: 26px;
    letter-spacing: 2px;
  }
}

.h5, #product-reviews .yotpo-header, #product-reviews .yotpo-header .yotpo-user-name, #product-reviews .yotpo-header .yotpo-user-title, #product-reviews .yotpo-header .yotpo-review-date, #product-reviews .yotpo-main .content-title, #product-reviews .yotpo-footer .footer-actions, #product-reviews .yotpo-helpful .label-helpful {
  font-size: 10px;
  line-height: 1.4;
  letter-spacing: 2px;
}

@media (min-width: 620px) {

  .h5, #product-reviews .yotpo-header, #product-reviews .yotpo-header .yotpo-user-name, #product-reviews .yotpo-header .yotpo-user-title, #product-reviews .yotpo-header .yotpo-review-date, #product-reviews .yotpo-main .content-title, #product-reviews .yotpo-footer .footer-actions, #product-reviews .yotpo-helpful .label-helpful {
    font-size: 12px;
  }
}

.countdown_interval_basic_cont_description {
 font-size: 10px;
}

@media (min-width: 620px) {

  .countdown_interval_basic_cont_description {
    font-size: 12px;
  }
}

/* Paragraphs */

.p1 {
  font-size: 20px;
}

@media (min-width: 620px) {

  .p1 {
    font-size: 28px;
  }
}

.p2, .a2, .a3, .ul, .ol, .flow-consent-dismiss-btn, .breadcrumbs__item a, .button, .craft-anatomy-card__cta, .newsletter__field, .product-lens-content__frame-only::before, .yotpo-lightbox-product-button, .yotpo-instagram .yotpo-icon-profile label, #product-reviews .yotpo-first-review .write-review-button, #product-reviews .yotpo-submit, #product-reviews .yotpo-icon-button-text, #product-reviews .y-label, #product-reviews .y-input, #product-reviews .yotpo-main .content-review, #product-reviews .yotpo-main .yotpo-read-more, #product-reviews .yotpo-page-element, #product-reviews .yotpo .error-box label, .wysiwyg p, .wysiwyg ul, .wysiwyg ol, .yotpo .yotpo-bottomline a {
  line-height: 1.5;
  letter-spacing: 0;
  font-size: 12px;
}

@media (min-width: 620px) {

  .p2, .a2, .a3, .ul, .ol, .flow-consent-dismiss-btn, .breadcrumbs__item a, .button, .craft-anatomy-card__cta, .newsletter__field, .product-lens-content__frame-only::before, .yotpo-lightbox-product-button, .yotpo-instagram .yotpo-icon-profile label, #product-reviews .yotpo-first-review .write-review-button, #product-reviews .yotpo-submit, #product-reviews .yotpo-icon-button-text, #product-reviews .y-label, #product-reviews .y-input, #product-reviews .yotpo-main .content-review, #product-reviews .yotpo-main .yotpo-read-more, #product-reviews .yotpo-page-element, #product-reviews .yotpo .error-box label, .wysiwyg p, .wysiwyg ul, .wysiwyg ol, .yotpo .yotpo-bottomline a {
    font-size: 13px;
  }
}

.p3 {
  line-height: 1.4;
  letter-spacing: 0;
  font-size: 10px;
}

@media (min-width: 620px) {

  .p3 {
    font-size: 11px;
  }
}

/* Blockquote */

.bq, .wysiwyg blockquote, .wysiwyg blockquote p {
  font-size: 20px;
  line-height: 1.4;
}

@media (min-width: 620px) {

  .bq, .wysiwyg blockquote, .wysiwyg blockquote p {
    font-size: 24px;
  }
}

@media (min-width: 1000px) {

  .bq, .wysiwyg blockquote, .wysiwyg blockquote p {
    font-size: 28px;
  }
}

/* Links */

a:focus {
  outline: -webkit-focus-ring-color auto 5px;
}

.a1, .yotpo .yotpo-bottomline a {
  cursor: pointer;
  opacity: 1;
}

.a2, .flow-consent-dismiss-btn, #product-reviews .yotpo-main .yotpo-read-more {
  cursor: pointer;
  display: inline-block;
  letter-spacing: 1px;
  position: relative;
  text-transform: uppercase
}

.a2::after, .flow-consent-dismiss-btn::after, #product-reviews .yotpo-main .yotpo-read-more::after {
  background-color: currentColor;
  bottom: 1px;
  content: '';
  height: 1px;
  left: 50%;
  position: absolute;
  -webkit-transform: translateX(-50%);
      -ms-transform: translateX(-50%);
          transform: translateX(-50%);
  width: 100%;
}

.a3 {
  cursor: pointer;
  display: inline-block;
  margin-left: -6px;
  padding: 0 6px;
  position: relative;
}

.a3 span {
    position: relative;
    z-index: 1;
  }

.a3::before {
  background-color: #fdd007;
  content: '';
  height: 100%;
  right: 0;
  position: absolute;
  top: 0;
  width: 0;
  z-index: 0;
}

.no-touch .a1 {
    -webkit-transition: opacity 200ms ease-in-out;
    -o-transition: opacity 200ms ease-in-out;
    transition: opacity 200ms ease-in-out
  }

.no-touch .a1:focus {
  outline: -webkit-focus-ring-color auto 5px;
}

.no-touch .a1:hover, .no-touch .a1:focus {
  opacity: 0.6;
}

.no-touch .a2::after {
  -webkit-transition: width 200ms ease-in-out;
  -o-transition: width 200ms ease-in-out;
  transition: width 200ms ease-in-out;
}

.no-touch .a2:hover::after {
  width: calc(100% - 10px);
}

.no-touch .a3::before {
  -webkit-transition: width 200ms ease-in-out;
  -o-transition: width 200ms ease-in-out;
  transition: width 200ms ease-in-out;
}

.no-touch .a3:hover::before {
  left: 0;
  right: auto;
  width: 100%;
}

/* Horizontal Rule */

.hr, .wysiwyg hr {
  background-color: #000000;
  border: none;
  display: block;
  height: 1px;
  opacity: 0.2;
  width: 100%;
}

/* Styles */

.italic, .wysiwyg em {
  font-style: italic;
}

.light {
  font-weight: 100;
}

.medium {
  font-weight: 500;
}

.bold, .wysiwyg b, .wysiwyg strong {
  font-weight: 900;
}

.capitalize {
  text-transform: capitalize;
}

.uppercase {
  text-transform: uppercase;
}

.underline {
  text-decoration: underline;
}

.decoration--none {
  text-decoration: none;
}

.no-wrap{
  white-space: nowrap;
}

.strike{
  text-decoration: line-through;
}

.ul, .ol, .wysiwyg ul, .wysiwyg ol {
  padding-left: 24px;
}

.ul li, .ol li, .wysiwyg ul li, .wysiwyg ol li {
    margin-top: 3px;
    position: relative;
  }

@media (min-width: 620px) {

  .ul li, .ol li, .wysiwyg ul li, .wysiwyg ol li {
    margin-top: 5px;
  }
}

.ul li:first-child, .ol li:first-child, .wysiwyg ul li:first-child, .wysiwyg ol li:first-child {
  margin-top: 0;
}

.ul ul, .ul ol, .ol ul, .ol ol, .wysiwyg ul ul, .wysiwyg ul ol, .wysiwyg ol ul, .wysiwyg ol ol {
    margin-top: 3px;
}

@media (min-width: 620px) {

  .ul ul, .ul ol, .ol ul, .ol ol, .wysiwyg ul ul, .wysiwyg ul ol, .wysiwyg ol ul, .wysiwyg ol ol {
    margin-top: 5px;
  }
}

.ul, .wysiwyg ul {
  list-style: disc;
}

.ol, .wysiwyg ol {
  list-style: decimal;
}

.dropdown {
  display: -webkit-inline-box;
  display: -webkit-inline-flex;
  display: -ms-inline-flexbox;
  display: inline-flex;
  position: relative;
}

.dropdown--single-arrow .dropdown__el {
    cursor: pointer;
    padding-right: 14px;
    position: relative;
    z-index: 1;
  }

.dropdown--single-arrow .dropdown__icon {
    height: 5px;
    position: absolute;
    right: 0;
    top: 5px;
    width: 8px;
    z-index: 0;
  }

.dropdown--regular {
  background-color: #ffffff;
  border: 1px solid #000000;
  display: -webkit-inline-box;
  display: -webkit-inline-flex;
  display: -ms-inline-flexbox;
  display: inline-flex;
  position: relative;
  width: auto;
  overflow: hidden;
  -webkit-box-align: center;
  -webkit-align-items: center;
      -ms-flex-align: center;
          align-items: center;
}

.dropdown--regular .dropdown__el {
    -webkit-box-flex: 0;
    -webkit-flex: 0 0 auto;
        -ms-flex: 0 0 auto;
            flex: 0 0 auto;
    height: 35px;
    left: 0;
    line-height: 35px;
    padding: 0 20px 0 12px;
    position: relative;
    top: 0;
    width: 100%;
    z-index: 1;
  }

.dropdown--regular .dropdown__icon {
    display: block;
    position: absolute;
    right: 10px;
    top: 50%;
    -webkit-transform: translateY(-50%);
        -ms-transform: translateY(-50%);
            transform: translateY(-50%);
    width: 10px;
    z-index: 0;
  }

.dropdown--regular .dropdown__icon > svg {
    display: block;
  }

/*! Flickity v2.2.1
https://flickity.metafizzy.co
---------------------------------------------- */

.flickity-enabled {
  position: relative;
}

.flickity-enabled:focus { outline: none; }

.flickity-viewport {
  overflow: hidden;
  position: relative;
  height: 100%;
}

.flickity-slider {
  position: absolute;
  width: 100%;
  height: 100%;
}

/* draggable */

.flickity-enabled.is-draggable {
  -webkit-tap-highlight-color: transparent;
  -webkit-user-select: none;
     -moz-user-select: none;
      -ms-user-select: none;
          user-select: none;
}

.flickity-enabled.is-draggable .flickity-viewport {
  cursor: move;
  cursor: -webkit-grab;
  cursor: grab;
}

.flickity-enabled.is-draggable .flickity-viewport.is-pointer-down {
  cursor: -webkit-grabbing;
  cursor: grabbing;
}

/* ---- flickity-button ---- */

.flickity-button {
  position: absolute;
  background: rgba(255, 255, 255, 0.75);
  border: none;
  color: #333;
}

.flickity-button:hover {
  background: white;
  cursor: pointer;
}

.flickity-button:focus {
  outline: none;
  -webkit-box-shadow: 0 0 0 5px #19F;
          box-shadow: 0 0 0 5px #19F;
}

.flickity-button:active {
  opacity: 0.6;
}

.flickity-button:disabled {
  opacity: 0.3;
  cursor: auto;
  /* prevent disabled button from capturing pointer up event. #716 */
  pointer-events: none;
}

.flickity-button-icon {
  fill: currentColor;
}

/* ---- previous/next buttons ---- */

.flickity-prev-next-button {
  top: 50%;
  width: 44px;
  height: 44px;
  border-radius: 50%;
  /* vertically center */
  -webkit-transform: translateY(-50%);
      -ms-transform: translateY(-50%);
          transform: translateY(-50%);
}

.flickity-prev-next-button.previous { left: 10px; }

.flickity-prev-next-button.next { right: 10px; }

/* right to left */

.flickity-rtl .flickity-prev-next-button.previous {
  left: auto;
  right: 10px;
}

.flickity-rtl .flickity-prev-next-button.next {
  right: auto;
  left: 10px;
}

.flickity-prev-next-button .flickity-button-icon {
  position: absolute;
  left: 20%;
  top: 20%;
  width: 60%;
  height: 60%;
}

/* ---- page dots ---- */

.flickity-page-dots {
  position: absolute;
  width: 100%;
  bottom: -25px;
  padding: 0;
  margin: 0;
  list-style: none;
  text-align: center;
  line-height: 1;
}

.flickity-rtl .flickity-page-dots { direction: rtl; }

.flickity-page-dots .dot {
  display: inline-block;
  width: 10px;
  height: 10px;
  margin: 0 8px;
  background: #333;
  border-radius: 50%;
  opacity: 0.25;
  cursor: pointer;
}

.flickity-page-dots .dot.is-selected {
  opacity: 1;
}

.is-checkout .zopim {
    display: none !important;
  }

.flow-consent-container{
  text-align: center;
  padding: 10px;
  position: fixed;
  bottom: 0;
  width: 100%;
  z-index: 16000003;
  -webkit-box-shadow: 0px 0px 9px 0px rgba(0,0,0,0.27);
          box-shadow: 0px 0px 9px 0px rgba(0,0,0,0.27);
  background-color: #FFE48F;
}

.flow-consent-container:empty{
  display: none;
}

.flow-consent-message, .flow-consent-message p{
  display: inline;
}

.account-address__title {
  padding-bottom: 20px;
  border-bottom: 1px solid rgba(208, 208, 208, 0.3);
}

@media (min-width: 840px) {

  .account-address__title {
    padding-bottom: 40px;
  }
}

.account-address__migration-alert{
  padding: 20px;
}

.account-address__list {
  position: relative;
}

.account-address__item {
  padding: 20px 0 20px 17px;
  border-bottom: 1px solid rgba(208, 208, 208, 0.3);
}

@media (min-width: 840px) {

  .account-address__item {
    padding: 40px 0 40px 50px;
  }
}

.account-address__default {
  position: absolute;
  top: 20px;
  right: 0;
  padding-right: 15px;
}

@media (min-width: 840px) {

  .account-address__default {
    top: 40px;
    padding-right: 65px;
  }
}

.account-address__default-icon {
  display: block;
  width: 14px;
  height: 14px;
  position: absolute;
  top: -3px;
  right: 0;
  color: #fdd007;
}

@media (min-width: 840px) {

  .account-address__default-icon {
    right: 40px;
    width: 16px;
    height: 16px;
  }
}

.account-address__name {
  position: relative;
  margin-bottom: 5px;
}

.account-address__icon {
  width: 11px;
  height: 11px;
  display: block;
  position: absolute;
  left: -17px;
  top: -1px;
}

@media (min-width: 620px) {

  .account-address__icon {
    width: 12px;
    height: 12px;
    top: 1px;
  }
}

.account-address__footer {
  margin-top: 10px;
}

.account-address__add-address {
  margin-top: 20px;
}

@media (min-width: 840px) {

  .account-address__add-address {
    margin-top: 40px;
  }
}

.account-address__empty-notice {
  margin-top: 20px;
  padding: 3em 0;
}

@media (min-width: 1000px) {

  .account-address__empty-notice {
    padding: 6em 0;
  }
}

.account-form{
  max-width: 350px;
  margin: auto;
}

.account-form--accounts{
  margin: 80px auto;
}

.account-form__header{
  margin: 25px auto 15px;
}

@media (min-width: 1000px) {

  .account-form__header {
    padding: 25px auto;
  }
}

.account-form__title--accounts{
  text-align: center;
  margin-bottom: 20px;
}

.account-form__title + .account-form__byline{
  margin-top: 5px;
}

.account-form__alert{
  padding: 15px;
  margin-bottom: 20px;
}

@media (min-width: 1000px) {

  .account-form__byline--s-only {
    display: none;
  }
}

.account-form__submit{
  width: 100%;
  margin: 25px auto 20px;
}

@media (min-width: 1000px) {

  .account-form__submit {
    margin: 40px auto 20px;
  }
}

.account-form__byline{
  margin-bottom: 20px;
}

.account-form__error-msg{
  margin-top: 7px;
}

.account-form__input + .account-form__input{
  margin-top: 15px;
}

@media (min-width: 1000px) {

  .account-form__input + .account-form__input {
    margin-top: 25px;
  }
}

.account-form__checkbox{
  margin-top: 15px;
}

@media (min-width: 1000px) {

  .account-form__checkbox {
    margin-top: 25px;
  }
}

nav.account__nav {}

li.account__nav__link {}

@media (min-width: 840px) {

  .account-nav {
    margin-top: 80px;
  }
}

.account-nav__title {
  margin-bottom: 20px;
}

@media (min-width: 840px) {

  .account-nav__title {
    margin-bottom: 40px;
  }
}

.account-nav__logout {
  margin-top: 10px;
}

@media (min-width: 840px) {

  .account-nav__logout {
    margin-top: 0;
    position: absolute;
    right: 0;
  }
}

.account-nav__list {
}

.account-nav__desktop {
  display: none;
}

@media (min-width: 840px) {

  .account-nav__desktop {
    display: block;
    text-align: center;
  }
}

.account-nav__mobile {
  position: absolute;
  top: 0;
  background: lightblue;
  opacity: 0;
  width: 100%;
  height: 100%;
  padding: 12px 10px;
}

@media (min-width: 840px) {

  .account-nav__mobile {
    display: none;
  }
}

.account-nav__current {
  position: relative;
  margin-bottom: 40px;
  padding: 10px 30px 10px 10px;
  border: 1px solid #000000;
}

@media (min-width: 840px) {

  .account-nav__current {
    display: none;
  }
}

.account-nav__current span {
    padding-left: 10px;
}

.account-nav__icon {
  height: 5px;
  position: absolute;
  right: 10px;
  width: 8px;
  z-index: 0;
  top: 50%;
  -webkit-transform: translateY(-50%);
      -ms-transform: translateY(-50%);
          transform: translateY(-50%);
}

.account-nav__outer {
  position: relative;
}

@media (min-width: 840px) {

  .account-nav__outer {
    margin-bottom: 80px;
  }
}

.account-nav__link {
  margin-left: 20px;
  margin-right: 20px;
  padding: 0 10px;
}

.account-nav__link--active {
  background: #fdd007;
}

.account-nav__logout {
  margin-bottom: 15px;
}

@media (min-width: 840px) {

  .account-nav__logout-link {
    text-decoration: none;
    background-color: #fdd007;
    color: #000000;
    height: 50px;
    line-height: 50px;
    padding: 0 20px;
    text-transform: uppercase;
  }

  .account-nav__logout-link:after {
    content: none;
  }
}

.address-form__title{
  margin-bottom: 25px;
}

@media (min-width: 768px) {

  .address-form__title {
    margin-bottom: 45px;
  }
}

@media (min-width: 768px) {

  .address-form__group {
    margin-bottom: 20px;
    display: -webkit-box;
    display: -webkit-flex;
    display: -ms-flexbox;
    display: flex;
  }
}

.address-form__input{
  width: 100%;
  margin-bottom: 10px;
}

@media (min-width: 768px) {

  .address-form__input {
    width: 50%;
    margin-bottom: 0;
  }
}

@media (min-width: 768px) {

  .address-form__input:first-child {
    margin-right: 20px;
  }
}

@media (min-width: 768px) {

  .address-form__input + .address-form__input {
    margin-right: 20px;
  }
}

.address-form__footer{
  margin-top: 25px;
  margin-bottom: 40px;
}

@media (min-width: 768px) {

  .address-form__footer {
    margin-top: 45px;
    margin-bottom: 80px;
  }
}

.account-order-details__total {
  padding-top: 20px;
}

.account-order-details__footer {
  margin-top: 40px;
}

@media (min-width: 840px) {

  .account-order-details__footer {
    margin-top: 90px;
    display: -webkit-box;
    display: -webkit-flex;
    display: -ms-flexbox;
    display: flex;
    -webkit-flex-wrap: nowrap;
        -ms-flex-wrap: nowrap;
            flex-wrap: nowrap;
    -webkit-box-pack: justify;
    -webkit-justify-content: space-between;
        -ms-flex-pack: justify;
            justify-content: space-between;
  }
}

.account-order-details__footer .account-address__title, .account-order-details__footer .account-address__footer, .account-order-details__footer .account-address__icon, .account-order-details__footer .account-address__default-icon, .account-order-details__footer .account-address__default, .account-order-details__footer .account-address__item:nth-child(n+2), .account-order-details__footer .account-address__add-address {
    display: none;
}

.account-order-details__footer .account-address__item {
    background: #fff9e7;
    margin: 10px 0 20px;
}

@media (min-width: 840px) {

  .account-order-details__footer .account-address__item {
    margin: 30px 0 20px;
  }
}

.account-order-details__footer .account-address__item {
    border: none;
}

@media (min-width: 840px) {

  .account-order-details__wrapper {
    width: calc(50% - 20px);
  }
}

.order-details__alert {
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-align: center;
  -webkit-align-items: center;
      -ms-flex-align: center;
          align-items: center;
  margin-bottom: 20px;
  color: red;
}

@media (min-width: 840px) {

  .order-details__alert {
    margin-bottom: 40px;
  }
}

.order-details__alert-message {
  -webkit-box-flex: 1;
  -webkit-flex: 1;
      -ms-flex: 1;
          flex: 1;
}

.order-details__alert-icon {
  -webkit-box-flex: 0;
  -webkit-flex: 0 1 auto;
      -ms-flex: 0 1 auto;
          flex: 0 1 auto;
  width: 20px;
  margin-right: 10px;
}

.account-entry-form {
  max-width: 350px;
}

@media (min-width: 840px) {

  .account-order-grid__title {
    text-align: left;
    margin-bottom: 45px;
  }
}

.account-order-grid__title--empty {
  padding-bottom: 20px;
  margin-bottom: 20px;
  border-bottom: 1px solid rgba(208, 208, 208, 0.3);
}

@media (min-width: 840px) {

  .account-order-grid__title--empty {
    border: none;
  }
}

.account-order-grid__title--empty + .orders {
    display: none;
}

@media (min-width: 840px) {

  .account-order-grid__title--empty + .orders {
    display: block;
  }
}

.account-order-grid__container {
  margin-left: auto;
  margin-right: auto;
}

.account-order-grid__wrapper {
  margin-left: auto;
  margin-right: auto;
}

@media (min-width: 840px) {

  .account-order-grid__wrapper {
    width: calc(83.33% - 6.67px);
  }
}

.account-order-grid__icon {
  position: absolute;
  top: 50%;
  left: 0;
  -webkit-transform: translateY(-50%);
      -ms-transform: translateY(-50%);
          transform: translateY(-50%)
}

.account-order-grid__icon:before {}

/* .account-reset-form{
  display: none
} */

.account__container {
  margin-left: auto;
  margin-right: auto;
}

.account__wrapper {
  position: relative;
  margin: 0 auto 40px;
}

@media (min-width: 840px) {

  .account__wrapper {
    width: calc(83.33% - 6.67px);
    margin-bottom: 100px;
  }
}

.account__back {
  position: relative;
  padding-left: 15px;
}

.account__back-icon {
  width: 7px;
  height: 7px;
  display: block;
  -webkit-transform: rotate(90deg) translateX(-50%);
      -ms-transform: rotate(90deg) translateX(-50%);
          transform: rotate(90deg) translateX(-50%);
  position: absolute;
  left: -1px;
  top: 50%;
}

.account-order-grid .pagination {
    display: -webkit-box;
    display: -webkit-flex;
    display: -ms-flexbox;
    display: flex;
    -webkit-box-pack: center;
    -webkit-justify-content: center;
        -ms-flex-pack: center;
            justify-content: center;
    margin-top: 15px;
  }

@media (min-width: 840px) {

  .account-order-grid .pagination {
    margin-top: 80px;
  }
}

.account__header {
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  -webkit-flex-wrap: wrap;
      -ms-flex-wrap: wrap;
          flex-wrap: wrap;
  -webkit-box-pack: justify;
  -webkit-justify-content: space-between;
      -ms-flex-pack: justify;
          justify-content: space-between;
  -webkit-box-align: center;
  -webkit-align-items: center;
      -ms-flex-align: center;
          align-items: center;
  margin: 20px 0;
}

@media (min-width: 840px) {

  .account__header {
    margin: 80px 0;
  }
}

.account__logout-link {
  display: inline-block;
}

.altfit-content__heading {
  padding-bottom: 10px;
}

@media (min-width: 1160px) {

  .altfit-content__heading {
    padding-bottom: 23px;
  }
}

.altfit-nav {
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-pack: justify;
  -webkit-justify-content: space-between;
      -ms-flex-pack: justify;
          justify-content: space-between;
  margin: 38px 0 45px;
}

@media (min-width: 840px) {

  .altfit-nav {
    margin: 64px 0;
    -webkit-box-pack: center;
    -webkit-justify-content: center;
        -ms-flex-pack: center;
            justify-content: center;
  }
}

.altfit-nav__item {
  display: block;
  width: 30%;
  cursor: pointer;
}

@media (min-width: 840px) {

  .altfit-nav__item {
    width: 12%;
    margin-left: 60px;
  }

  .altfit-nav__item:first-child {
    margin-left: 0;
  }
}

.altfit-nav__item img {
    border-radius: 50%;
}

.altfit-nav__item--image {
  position: relative;
  display: block;
  padding-top: 100%;
}

.altfit-nav__item-title {
  padding-top: 30px;
}

.altfit-nav__item--image .altfit-nav__item--image-white {
    opacity: 1;
  }

.altfit-nav__item--active .altfit-nav__item--image .altfit-nav__item--image-white {
      opacity: 0;
    }

.altfit-nav__item--image .altfit-nav__item--image-yellow {
    opacity: 0;
  }

.altfit-nav__item--active .altfit-nav__item--image .altfit-nav__item--image-yellow {
      opacity: 1;
    }

.altfit-content__image-item {
  width: 100%;
}

.altfit-content__image {
  position: relative;
  overflow: hidden
}

.altfit-content__image:before {
  padding-bottom: 110%;
}

@media (min-width: 840px) {

  .altfit-content__image:before {
    padding-bottom:70%;
  }
}

@media (min-width: 840px) {

  .altfit-content__item {
    display: -webkit-box;
    display: -webkit-flex;
    display: -ms-flexbox;
    display: flex;
    -webkit-flex-wrap: wrap;
        -ms-flex-wrap: wrap;
            flex-wrap: wrap;
    -webkit-box-align: start;
    -webkit-align-items: start;
        -ms-flex-align: start;
            align-items: start;
  }
}

@media (min-width: 1160px) {

  .altfit-content__item {
    -webkit-box-align: center;
    -webkit-align-items: center;
        -ms-flex-align: center;
            align-items: center;
  }
}

.altfit-content__item--active {
  display: block;
}

@media (min-width: 840px) {

  .altfit-content__item--active {
    display: -webkit-box;
    display: -webkit-flex;
    display: -ms-flexbox;
    display: flex;
  }
}

.altfit-content__block .wysiwyg {
    padding-bottom: 10px;
  }

@media (min-width: 1160px) {

  .altfit-content__block .wysiwyg {
    padding-bottom: 30px;
  }
}

.altfit-content__block--right {
  width: 100%;
}

@media (min-width: 840px) {

  .altfit-content__block--right {
    width: 50%;
    padding-left: 30px;
  }
}

@media (min-width: 1160px) {

  .altfit-content__block--right {
    width: 37%;
    padding-left: 60px;
  }
}

.altfit-content__block--left {
  margin-bottom: 40px;
}

@media (min-width: 840px) {

  .altfit-content__block--left {
    margin-bottom: 0;
  }
}

@media (min-width: 840px) {

  .altfit-content__block--left .altfit-content__block--left--wrapper {
    margin-bottom: 0;
    width:82%;
    margin: 0 auto;
  }
}

.altfit-content__cta {
  display: block;
}

@media (min-width: 1160px) {

  .altfit-content__cta {
    max-width: 300px;
  }
}

.altfit-content__block--left {
  width: 100%;
  position: relative;
  min-height: 300px;
}

@media (min-width: 840px) {

  .altfit-content__block--left {
    width: 50%;
  }
}

@media (min-width: 1160px) {

  .altfit-content__block--left {
    width: 63%;
  }
}

.altfit-content__block--left .flickity-prev-next-button {
    background-color: transparent;
    height: 25px;
    width: 25px;
}

@media (min-width: 1160px) {

  .altfit-content__block--left .flickity-prev-next-button {
    height: 35px;
    width: 35px;
  }
}

.altfit-content__block--left .flickity-prev-next-button.previous {
    left: -30px;
}

@media (min-width: 1160px) {

  .altfit-content__block--left .flickity-prev-next-button.previous {
    left: -60px;
  }
}

.altfit-content__block--left .flickity-prev-next-button.next {
    right: -30px;
}

@media (min-width: 1160px) {

  .altfit-content__block--left .flickity-prev-next-button.next {
    right: -60px;
  }
}

.article-card {
  width: 100%;
  margin-bottom: 30px;
}

@media (min-width: 620px) {

  .article-card {
    width: 50%;
  }
}

@media (min-width: 840px) {

  .article-card {
    width: 25%;
  }
}

@media (min-width: 1440px) {

  .article-card {
    margin-bottom: 45px;
  }
}

@media (min-width: 840px) {

  .blog-grid__grid--page-1 .article-card:not(.article-card--featured) {
    width: 33.32%;
  }
}

@media (min-width: 840px) {

  .article-card--featured {
    -webkit-box-flex: 1;
    -webkit-flex: 1 1 auto;
        -ms-flex: 1 1 auto;
            flex: 1 1 auto;
    position: relative;
    width: 100%;
    margin-bottom: 80px;
  }
}

@media (min-width: 840px) {

  .article-card--featured .article-card__inner {
    display: -webkit-box;
    display: -webkit-flex;
    display: -ms-flexbox;
    display: flex;
    -webkit-box-align: center;
    -webkit-align-items: center;
        -ms-flex-align: center;
            align-items: center;
  }
}

@media (min-width: 840px) {

  .article-card--featured .article-card__image {
    width: 50%;
    margin-right: 40px;
  }
}

@media (min-width: 1200px) {

  .article-card--featured .article-card__image {
    margin-right: 80px;
  }
}

.article-card--featured .article-card__block {
    padding-right: calc(50% - 440px);
}

@media (min-width: 840px) {

  .article-card--featured .article-card__block {
    width: 50%;
    margin: 0;
  }
}

@media (min-width: 840px) {

  .article-card--featured .article-card__tag {
    margin-bottom: 10px;
    border: 0;
  }
}

@media (min-width: 840px) {

  .article-card--featured .article-card__title, .article-card--featured .article-card__description {
    margin-bottom: 20px;
  }
}

.article-card__image {
  margin-bottom: 15px;
  border: 4px solid #ffffff;
  -webkit-transition: all 200ms ease-in-out;
  -o-transition: all 200ms ease-in-out;
  transition: all 200ms ease-in-out;
}

@media (min-width: 620px) {

  .article-card__image {
    margin-bottom: 11px;
  }
}

@media (min-width: 840px) {

  .article-card__image {
    margin-bottom: 12px;
  }
}

.article-card__image:before {
  padding-bottom: 67.14285714%;
}

.article-card__image:hover {
  border-color: #fdd007;
}

.article-card__tag {
  margin-bottom: 11px;
  padding-bottom: 16px;
  border-bottom: 1px solid #cdcdcd;
}

@media (min-width: 620px) {

  .article-card__tag {
    margin-bottom: 8px;
    padding-bottom: 12px;
  }
}

@media (min-width: 840px) {

  .article-card__tag {
    margin-bottom: 12px;
    padding-bottom: 13px;
  }
}

.article-card__title {
  margin-bottom: 7px;
}

.article-card__cta-link{
  display: none;
}

@media (min-width: 840px) {

  .article-card__cta-link {
    display: inline-block;
  }
}

.article-footer__inner {
  padding: 20px;
  border: 1px solid #cdcdcd;
}

@media (min-width: 1000px) {

  .article-footer__inner {
    padding: 40px;
  }
}

.article__social-inner, .article__social-inner ul {
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  -webkit-flex-wrap: wrap;
      -ms-flex-wrap: wrap;
          flex-wrap: wrap;
  -webkit-box-align: center;
  -webkit-align-items: center;
      -ms-flex-align: center;
          align-items: center;
}

.article__social-title {
  text-transform: none;
}

@media (min-width: 1000px) {

  .article__social-title {
    margin-right: 10px;
  }
}

.article-footer__top {
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-pack: center;
  -webkit-justify-content: center;
      -ms-flex-pack: center;
          justify-content: center;
  -webkit-box-align: center;
  -webkit-align-items: center;
      -ms-flex-align: center;
          align-items: center;
  margin-bottom: 11px;
}

@media (min-width: 1000px) {

  .article-footer__top {
    margin-bottom: 20px;
  }
}

.article-footer__top:only-child {
  margin-bottom: 0;
}

.article__tag-date {
  padding-right: 13px;
  position: relative
}

.article__tag-date:after {
  content: '';
  position: absolute;
  right: 0;
  width: 1px;
  height: 10px;
  background: #000000;
  top: 50%;
  -webkit-transform: translateY(-50%);
      -ms-transform: translateY(-50%);
          transform: translateY(-50%);
}

@media (min-width: 620px) {

  .article__tag-date {
    padding-right: 15px;
  }
}

@media (min-width: 1000px) {

  .article__tag-date {
    padding-right: 33px;
  }

  .article__tag-date:after {
    height: 12px;
  }
}

.article__social {
  padding-left: 13px;
}

@media (min-width: 620px) {

  .article__social {
    padding-left: 15px;
  }
}

@media (min-width: 1000px) {

  .article__social {
    padding-left: 33px;
  }
}

.article-footer__tag-item {
  text-decoration: underline;
}

.article-footer__bottom {
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-align: start;
  -webkit-align-items: flex-start;
      -ms-flex-align: start;
          align-items: flex-start;
  text-align: left;
}

@media (min-width: 620px) {

  .article-footer__bottom {
    -webkit-box-pack: center;
    -webkit-justify-content: center;
        -ms-flex-pack: center;
            justify-content: center;
  }
}

.article-footer__title {
  width: 50px;
  padding-top: 3px;
}

@media (min-width: 620px) {

  .article-footer__title {
    width: 70px;
  }
}

.article-footer__tag-list {
  width: calc(100% - 50px);
}

@media (min-width: 620px) {

  .article-footer__tag-list {
    width: auto;
  }
}

.article-footer__tag-separator {
  margin-right: 8px;
}

.article-shop__container {
  padding-top: 40px;
  border-top: 1px solid rgba(208, 208, 208, 0.3);
}

@media (min-width: 620px) {

  .article-shop__container {
    padding-top: 50px;
  }
}

@media (min-width: 1000px) {

  .article-shop__container {
    padding-top: 60px;
  }
}

@media (min-width: 1200px) {

  .article-shop__container {
    padding-top: 80px;
  }
}

.breadcrumbs {
  padding-top: 20px;
}

.breadcrumbs__item a {
    text-decoration: underline;
  }

.breadcrumbs__item.a1 {
  text-decoration: underline;
}

.button {
  background-color: #fdd007;
  color: #000000;
  cursor: pointer;
  height: 40px;
  line-height: 40px;
  padding: 0 40px;
  position: relative;
  text-transform: uppercase;
  white-space: nowrap;
}

@media (min-width: 620px) {

  .button {
    height: 50px;
    line-height: 50px;
  }
}

.button.button--small {
  height: 36px;
  line-height: 36px;
}

@media (min-width: 620px) {

  .button.button--big {
    height: 60px;
    line-height: 60px;
  }
}

.button[disabled="disabled"] {
  cursor: default;
  opacity: 0.3;
}

.button__el {
  position: relative;
  z-index: 9;
}

.button__icon {
  height: 12px;
  opacity: 0;
  position: absolute;
  right: 5px;
  top: calc(50% - 6px);
  visibility: hidden;
  width: 6px;
}

@media (min-width: 620px) {

  .button__icon {
    height: 14px;
    top: calc(50% - 7px);
    width: 6px;
  }
}

.no-touch .button__icon {
    -webkit-transition-duration: 200ms;
         -o-transition-duration: 200ms;
            transition-duration: 200ms;
    -webkit-transition-property: opacity, right, visibility;
    -o-transition-property: opacity, right, visibility;
    transition-property: opacity, right, visibility;
    -webkit-transition-timing-function: ease-in-out;
         -o-transition-timing-function: ease-in-out;
            transition-timing-function: ease-in-out;
  }

.no-touch .button:focus {
  outline: -webkit-focus-ring-color auto 5px;
}

.no-touch .button:enabled:hover .button__icon, .no-touch .button:enabled:focus .button__icon, .no-touch .button:hover .button__icon {
        -webkit-animation: step 1s infinite;
                animation: step 1s infinite;
        opacity: 1;
        right: 15px;
        visibility: visible;
}

.button{
  font-family:"gotham-htf-bold" !important;
  font-size:16px !important;
  letter-spacing:1.64px !important;
}

@media screen and (max-width:374px) {

  .button {
    font-size:13px !important;
  }
}

.stylefit-content__cta {
  max-width:370px !important;
  padding:0 10px;
}

@media screen and (max-width:750px) {

  .stylefit-content__cta {
    max-width:100% !important;
    font-size:14px !important;
  }
}

@media screen and (max-width:374px) {

  .stylefit-content__cta {
    font-size: 12.5px !important;
  }
}

.newsletter__cta {
  padding:0 30px !important;
}

@media screen and (max-width:750px){
  .newsletter_holder input {
    width:62% !important;
  }
}

@media screen and (max-width:500px){
  .newsletter_holder input {
    width:50% !important;
  }
  .newsletter-submit {
    width:50% !important;
  }
}

.product-main__submit span{
  font-size:16px !important;
  letter-spacing:1.64px !important
}

.product-main__submit span.control {
  font-size:13px !important;
  letter-spacing:0px !important;
}

.product-main__submit span.button_one {
  font-size:16px !important;
  letter-spacing:1.64px !important;
}

.product-main__submit span.button_two {
  font-family:"gotham-htf-bold" !important;
  font-size:16px !important;
  letter-spacing:1.64px !important;
}

.product-main__submit span.button_three {
  font-family: proxima-nova, sans-serif !important;
  font-weight: 700;
  font-size:16px !important;
  letter-spacing:1.64px !important;
}

.product-main__submit span.button_four {
  font-family: nobel, sans-serif !important;
  font-weight: 700;
  font-size:16px !important;
  letter-spacing:1.64px !important;
}

.pdp_control .product-main__submit span {
  font-size:13px !important;
  letter-spacing:0px !important;
}

.pdp_button_one .product-main__submit span {
  font-size:16px !important;
  letter-spacing:1.64px !important;
  top: 1px;
  position: relative;
}

.pdp_button_two .product-main__submit span {
  font-family:"gotham-htf-bold" !important;
  font-size:16px !important;
  letter-spacing:1.64px !important;
}

.pdp_button_three .product-main__submit span {
  font-family: proxima-nova, sans-serif !important;
  font-weight: 700;
  font-size:16px !important;
  letter-spacing:1.64px !important;
}

.pdp_button_four .product-main__submit span {
  font-family: nobel, sans-serif !important;
  font-weight: 700;
  font-size:16px !important;
  letter-spacing:1.64px !important;
}

/* Accessibility - skip to main content */

.skip_link {
  position: absolute;
  top: 0;
  left: 50%;
  z-index: 100;
  opacity: 0;
  -webkit-transform: translate(-50%, -100px);
      -ms-transform: translate(-50%, -100px);
          transform: translate(-50%, -100px);
  text-transform: uppercase;
  padding: 10px 30px;
  color: #000000;
  background-color: #fdd007;
  border: 3px solid #000000;
  z-index: 1000;
}

a.skip_link:active, a.skip_link:focus {
  opacity: 1;
  pointer-events: auto;
  -webkit-transform: translate(-50%, 0);
      -ms-transform: translate(-50%, 0);
          transform: translate(-50%, 0);
  -webkit-transition: all .3s ease;
  -o-transition: all .3s ease;
  transition: all .3s ease;
}

.skip_link--sidebar {
  top: 0;
  left: 0;
  -webkit-transform: translate(-100%, 0);
      -ms-transform: translate(-100%, 0);
          transform: translate(-100%, 0);
}

a.skip_link--sidebar:active, a.skip_link--sidebar:focus {
  -webkit-transform: translate(0%, 0);
      -ms-transform: translate(0%, 0);
          transform: translate(0%, 0);
}

.product-main__submit {
  border: 2px solid black;
  background-color: white;
  color: black;
}

.product-main__submit:hover {
  background-color: #FDD006;
  border: 2px solid #FDD006;
}

.callout-card-2up {
  -webkit-box-align: center;
  -webkit-align-items: center;
      -ms-flex-align: center;
          align-items: center;
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-orient: vertical;
  -webkit-box-direction: normal;
  -webkit-flex-direction: column;
      -ms-flex-direction: column;
          flex-direction: column;
  -webkit-box-pack: center;
  -webkit-justify-content: center;
      -ms-flex-pack: center;
          justify-content: center;
}

@media (min-width: 840px) {

  .callout-card-2up {
    -webkit-box-align: start;
    -webkit-align-items: flex-start;
        -ms-flex-align: start;
            align-items: flex-start;
    -webkit-box-orient: horizontal;
    -webkit-box-direction: normal;
    -webkit-flex-direction: row;
        -ms-flex-direction: row;
            flex-direction: row;
    -webkit-box-pack: start;
    -webkit-justify-content: flex-start;
        -ms-flex-pack: start;
            justify-content: flex-start;
  }
}

.callout-card-2up .callout-card {
    -webkit-box-flex: 0;
    -webkit-flex: 0 0 auto;
        -ms-flex: 0 0 auto;
            flex: 0 0 auto;
    margin-top: 60px;
    max-width: 615px;
    width: 100%;
}

@media (min-width: 840px) {

  .callout-card-2up .callout-card {
    margin-left: 30px;
    margin-top: 0;
    max-width: none;
    width: calc(50% - 15px);
  }
}

.callout-card-2up .callout-card:first-child {
  margin: 0;
}

.callout-card__image {
  margin-bottom: 25px;
}

@media (min-width: 1160px) {

  .callout-card__image {
    margin-bottom: 0;
  }
}

.callout-card__image::before {
  padding-bottom: calc(200/280 * 100%);
}

@media (min-width: 840px) {

  .callout-card__image::before {
    padding-bottom: 100%;
  }
}

.callout-card__logo {
  margin-bottom: 10px
}

.callout-card__logo:before {
  padding-bottom: 10px;
}

@media (min-width: 1160px) {

  .callout-card__logo:before {
    padding-bottom: 14px;
  }
}

.callout-card__title {
  margin-bottom: 10px;
  text-align: center;
}

.callout-card__description {
  margin-bottom: 20px;
  text-align: center;
}

@media (min-width: 1200px) {

  .callout-card__description {
    margin-bottom: 30px;
  }
}

.callout-card__footer {
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-align: center;
  -webkit-align-items: center;
      -ms-flex-align: center;
          align-items: center;
  -webkit-box-pack: justify;
  -webkit-justify-content: space-between;
      -ms-flex-pack: justify;
          justify-content: space-between;
}

.callout-card__button {
  display: block;
  width: calc(50% - 5px);
  padding: 0 10px;
  text-align: center;
}

@media (min-width: 840px) {

  .callout-card__button {
    width: calc(50% - 20px);
  }
}

.callout-card__inner {
  position: relative;
}

@media (min-width: 1160px) {

  .callout-card__inner .callout-card__block {
    position: absolute;
    width: calc(100% - 100px);
    max-width: 475px;
    margin: 0 auto;
    left: 0;
    right: 0;
    top: 50%;
    -webkit-transform: translateY(-50%);
        -ms-transform: translateY(-50%);
            transform: translateY(-50%);
    z-index: 100;
    background: #fff9e7;
    padding: 40px;
  }
}

.carousel-image-text {
  max-width: 947px;
  margin-left: auto;
  margin-right: auto;
}

@media (min-width: 768px) {

  .carousel-image-text {
    padding-left: 20px;
    padding-right: 20px;
  }
}

@media (min-width: 1000px) {

  .carousel-image-text {
    padding-left: 60px;
    padding-right: 60px;
  }
}

@media (min-width: 1200px) {

  .carousel-image-text {
    max-width: 1067px;
    padding-left: 100px;
    padding-right: 100px;
  }
}

@media (min-width: 768px) {

  .carousel-image-text__wrapper {
    display: -webkit-box;
    display: -webkit-flex;
    display: -ms-flexbox;
    display: flex;
  }
}

.carousel-image-text__left {
  margin: 0 auto 60px auto;
  max-width: 467px;
  width: 100%;
}

.carousel-image-text__left .flickity-button {
    display: none;
    width: 30px;
    height: 30px;
    background-color: transparent
  }

.carousel-image-text__left .flickity-button:disabled {
  opacity: 0 !important;
}

@media (min-width: 1000px) {

  .carousel-image-text__left .flickity-button {
    display: block;
  }
}

.carousel-image-text__left .next {
    right: -40px;
}

@media (min-width: 1200px) {

  .carousel-image-text__left .next {
    right: -50px;
  }
}

.carousel-image-text__left .previous {
    left: -40px;
}

@media (min-width: 1200px) {

  .carousel-image-text__left .previous {
    left: -50px;
  }
}

.carousel-image-text__left .flickity-page-dots {
    bottom: -38px;
    left: 0;
    right: 0;
}

.carousel-image-text__left .flickity-page-dots .dot {
      margin: 0 4px;
    }

.carousel-image-text__right {
  margin: 22px auto 0 auto;
  padding: 0 20px;
  max-width: 300px;
  width: 100%;
}

@media (min-width: 768px) {

  .carousel-image-text__right {
    margin: 0 0 0 20px;
    padding: 0;
  }
}

@media (min-width: 1000px) {

  .carousel-image-text__right {
    margin-left: 60px;
  }
}

@media (min-width: 1200px) {

  .carousel-image-text__right {
    margin-left: 100px;
  }
}

.carousel-image-text__right .flickity-viewport {
    cursor: auto !important;
    pointer-events: none;
}

@media (min-width: 768px) {

  .carousel-image-text__right .flickity-viewport {
    height: calc(100% - 60px) !important;
  }
}

.carousel-image-text__right .flickity-slider {
    -webkit-transform: none !important;
        -ms-transform: none !important;
            transform: none !important;
}

.carousel-image-text__featured:before {
  padding-bottom: 59.35483%;
}

.carousel-image-text__caption {
  left: 0 !important;
  opacity: 0;
  -webkit-transition: opacity 0.25s ease-in-out;
  -o-transition: opacity 0.25s ease-in-out;
  transition: opacity 0.25s ease-in-out
}

.carousel-image-text__caption.is-selected {
  opacity: 1;
}

@media (min-width: 768px) {

  .carousel-image-text__caption {
    height: 100%;
    display: -webkit-box;
    display: -webkit-flex;
    display: -ms-flexbox;
    display: flex;
    -webkit-box-align: center;
    -webkit-align-items: center;
        -ms-flex-align: center;
            align-items: center;
  }
}

.carousel-image {
  margin-bottom: 60px;
}

.carousel-image .flickity-page-dots {
    bottom: 0;
    margin-top: 20px;
    position: relative;
  }

@media (min-width: 1000px) {

  .carousel-image .flickity-page-dots {
    display: none;
  }
}

.carousel-image .flickity-page-dots .dot {
      width: 7px;
      height: 7px;
      background: none;
      border: 1px solid #000000;
      opacity: 1;
}

.carousel-image .flickity-page-dots .dot.is-selected {
  background: #000000;
}

.carousel-image .flickity-prev-next-button {
    position: absolute;
    top: 50%;
    -webkit-transform: translateY(-50%);
        -ms-transform: translateY(-50%);
            transform: translateY(-50%);
    background: none;
    display: none;
}

@media (min-width: 1000px) {

  .carousel-image .flickity-prev-next-button {
    display: block;
  }
}

.carousel-image .flickity-prev-next-button.previous {
  left: 35px;
}

@media (min-width: 1200px) {

  .carousel-image .flickity-prev-next-button.previous {
    left: 100px;
  }
}

.carousel-image .flickity-prev-next-button.next {
  right: 35px;
}

@media (min-width: 1200px) {

  .carousel-image .flickity-prev-next-button.next {
    right: 100px;
  }
}

.carousel-image .flickity-prev-next-button .arrow {
      fill: #ffffff;
}

.carousel-image .flickity-prev-next-button svg {
      width: 25px;
      height: 100%;
      top: 0;
      left: 50%;
      -webkit-transform: translateX(-50%);
          -ms-transform: translateX(-50%);
              transform: translateX(-50%);
}

.carousel-image .flickity-prev-next-button path {
      width: 25px;
}

.carousel-image .flickity-slider {
    height: 100%;
}

.carousel-image__wrapper {
  opacity: 0;
  position: absolute;
  visibility: hidden
}

.carousel-image__wrapper::after {
  content: 'flickity';
  display: none;
}

.carousel-image__wrapper.flickity-enabled {
  opacity: 1;
  position: relative;
  visibility: visible;
}

.carousel-image__wrapper.flickity-resized .carousel-image__item {
      display: -webkit-box;
      display: -webkit-flex;
      display: -ms-flexbox;
      display: flex;
      -webkit-box-orient: vertical;
      -webkit-box-direction: normal;
      -webkit-flex-direction: column;
          -ms-flex-direction: column;
              flex-direction: column;
      min-height: 100%;
}

.carousel-image__wrapper.flickity-resized .carousel-image__featured {
      -webkit-box-flex: 0;
      -webkit-flex: 0 0 auto;
          -ms-flex: 0 0 auto;
              flex: 0 0 auto;
      width: auto;
}

.carousel-image__wrapper.flickity-resized .carousel-image__caption {
      -webkit-box-align: center;
      -webkit-align-items: center;
          -ms-flex-align: center;
              align-items: center;
      display: -webkit-box;
      display: -webkit-flex;
      display: -ms-flexbox;
      display: flex;
      -webkit-box-flex: 1;
      -webkit-flex: 1;
          -ms-flex: 1;
              flex: 1;
      -webkit-box-pack: center;
      -webkit-justify-content: center;
          -ms-flex-pack: center;
              justify-content: center;
      width: auto;
}

.carousel-image__container {
  width: 100%;
}

@media (min-width: 1440px) {

  .carousel-image__container {
    width: calc(100% - 160px);
  }
}

.carousel-image__item {
  display: block;
  width: 100%;
  overflow: hidden;
}

@media (min-width: 1000px) {

  .carousel-image__item {
    width: 72%;
    margin: 0 5px;
  }
}

@media (min-width: 1000px) {

  .carousel-image__item:after {
    background-color: #000000;
    content: '';
    display: block;
    height: 100%;
    left: 0;
    opacity: 0.5;
    position: absolute;
    top: 0;
    -webkit-transition-duration: 200ms;
         -o-transition-duration: 200ms;
            transition-duration: 200ms;
    -webkit-transition-property: opacity, visibility;
    -o-transition-property: opacity, visibility;
    transition-property: opacity, visibility;
    -webkit-transition-timing-function: ease-in-out;
         -o-transition-timing-function: ease-in-out;
            transition-timing-function: ease-in-out;
    visibility: visible;
    width: 100%;
    z-index: 2;
  }
}

@media (min-width: 1200px) {

  .carousel-image__item:after {
    opacity: 0.4;
  }
}

.carousel-image__item.is-selected::after {
  opacity: 0;
  visibility: hidden;
}

.carousel-image__featured {
  max-height: 600px;
  width: 100%
}

.carousel-image__featured:before {
  padding-top: 50%;
}

@media (min-width: 1000px) {

  .carousel-image__featured:before {
    padding-top: 62.5%;
  }
}

@media (min-width: 1200px) {

  .carousel-image__featured:before {
    padding-top: 59%;
  }
}

.carousel-image__caption {
  display: block;
  padding: 15px 20px 18px;
  width: 100%;
}

@media (min-width: 620px) {

  .carousel-image__caption {
    padding: 15px 25px 18px;
  }
}

.carousel {
  overflow: hidden;
  position: relative;
  padding: 40px;
}

.carousel .previous, .carousel .next {
    position: absolute;
    top: 50%;
    width: 70px;
    margin-top: -50px;
    color: #000000;
  }

.carousel .previous {
    left: 0px;
    padding-left: 20px;
  }

.carousel .next {
    right: 0px;
    padding-right: 20px;
    -webkit-transform: translateY(-35px);
        -ms-transform: translateY(-35px);
            transform: translateY(-35px);
  }

.carousel .flickity-viewport {
    overflow: hidden;
  }

.carousel__item {
  width: 100%;
  padding-left: 20px;
  padding-right: 20px;
}

@media (min-width: 768px) {

  .carousel__item {
    width: 33.3%;
    padding-left: 0;
    padding-right: 40px;
  }
}

@media (min-width: 1000px) {

  .carousel__item {
    width: 25%;
    padding-right: 40px;
  }
}

/* ---- page dots ---- */

.flickity-page-dots {
  position: absolute;
  width: 100%;
  bottom: -25px;
  padding: 0;
  margin: 0;
  list-style: none;
  text-align: center;
  line-height: 1;
}

.flickity-rtl .flickity-page-dots { direction: rtl; }

.flickity-page-dots .dot {
  display: inline-block;
  width: 8px;
  height: 8px;
  margin: 0 8px;
  background-color: #ffffff;
  border: 1px solid #000000;
  border-radius: 50%;
  cursor: pointer;
}

.flickity-page-dots .dot.is-selected {
  background-color: #000000;
}

.carousel:after {
  content: 'flickity';
  display: none; /* hide :after */
}

.cart-banner-upsell{
  padding: 15px;
  text-align: center;
}

@media (min-width: 840px) {

  .cart-banner-upsell {
    text-align: left;
    padding: 35px 50px;
  }
}

@media (min-width: 840px) {

  .cart-banner-upsell__container {
    display: -webkit-box;
    display: -webkit-flex;
    display: -ms-flexbox;
    display: flex;
    -webkit-box-align: center;
    -webkit-align-items: center;
        -ms-flex-align: center;
            align-items: center;
    -webkit-box-pack: justify;
    -webkit-justify-content: space-between;
        -ms-flex-pack: justify;
            justify-content: space-between;
  }
}

.cart-banner-upsell__left{
  max-width: 500px;
  margin: auto;
}

@media (min-width: 840px) {

  .cart-banner-upsell__left {
    margin: 0;
    width: 40%;
    max-width: 275px;
  }
}

.cart-banner-upsell__upsell-title{
  margin-bottom: 5px;
}

@media (min-width: 840px) {

  .cart-banner-upsell__upsell-title {
    margin-bottom: 10px;
  }
}

.cart-banner-upsell__middle{
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  margin-top: 20px;
}

@media (min-width: 840px) {

  .cart-banner-upsell__middle {
    width: 40%;
    margin-top: 0;
  }
}

.cart-banner-upsell__img-container{
  width: calc(45% - 20px);
  padding-left: 0;
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-orient: vertical;
  -webkit-box-direction: normal;
  -webkit-flex-direction: column;
      -ms-flex-direction: column;
          flex-direction: column;
  margin: auto;
  width: 200px;
}

@media (min-width: 768px) {

  .cart-banner-upsell__img-container {
    -webkit-box-orient: horizontal;
    -webkit-box-direction: normal;
    -webkit-flex-direction: row;
        -ms-flex-direction: row;
            flex-direction: row;
    width: 400px;
  }
}

@media (min-width: 840px) {

  .cart-banner-upsell__img-container {
    width: 100%;
  }
}

.cart-banner-upsell__img{
  position: relative;
  -webkit-box-flex: 1;
  -webkit-flex: 1 0 auto;
      -ms-flex: 1 0 auto;
          flex: 1 0 auto;
  border: solid 3px #ffffff;
  margin-bottom: 10px;
}

@media (min-width: 768px) {

  .cart-banner-upsell__img {
    margin-bottom: 0;
    margin-right: 10px;
  }
}

.cart-banner-upsell__img:before{
  content: '';
  padding-top: 80%;
  display: block;
}

@media (min-width: 620px) {

  .cart-banner-upsell__img:before {
    padding-top: 50%;
  }
}

@media (min-width: 840px) {

  .cart-banner-upsell__img:before {
    padding-top: 65%;
  }
}

.cart-banner-upsell__details{
  width: 55%;
  text-align: left;
}

.cart-banner-upsell__title{
  margin-bottom: 7px;
}

.cart-banner-upsell__dropdown{
  margin-bottom: 5px;
}

.cart-banner-upsell__cta{
  margin-top: 15px;
  position: relative;
  text-align: center;
}

@media (min-width: 840px) {

  .cart-banner-upsell__cta {
    margin: 0;
  }
}

.cart-banner-upsell__out-of-stock {
  margin-top: 5px;
}

.cart-banner-upsell__purchase-controls {
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-orient: vertical;
  -webkit-box-direction: normal;
  -webkit-flex-direction: column;
      -ms-flex-direction: column;
          flex-direction: column;
  width: 180px;
}

.cart-banner-upsell__cta .button {
    width: 100%;
  }

.cart-banner-upsell__option-selector.product-option-selector {
  margin-bottom: 10px;
  max-width: 100%;
  width: 100%;
}

.cart-donation-upsell{
  padding: 15px;
  text-align: center;
}

@media (min-width: 840px) {

  .cart-donation-upsell {
    text-align: left;
    padding: 35px 50px;
  }
}

@media (min-width: 840px) {

  .cart-donation-upsell__container {
    display: -webkit-box;
    display: -webkit-flex;
    display: -ms-flexbox;
    display: flex;
    -webkit-box-align: center;
    -webkit-align-items: center;
        -ms-flex-align: center;
            align-items: center;
    -webkit-box-pack: justify;
    -webkit-justify-content: space-between;
        -ms-flex-pack: justify;
            justify-content: space-between;
  }
}

.cart-donation-upsell__left{
  max-width: 500px;
  margin: auto;
}

@media (min-width: 840px) {

  .cart-donation-upsell__left {
    margin: 0;
    width: 40%;
    max-width: 275px;
  }
}

.cart-donation-upsell__upsell-title{
  margin-bottom: 5px;
}

@media (min-width: 840px) {

  .cart-donation-upsell__upsell-title {
    margin-bottom: 10px;
  }
}

.cart-donation-upsell__middle{
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-align: center;
  -webkit-align-items: center;
      -ms-flex-align: center;
          align-items: center;
  -webkit-box-orient: vertical;
  -webkit-box-direction: normal;
  -webkit-flex-direction: column;
      -ms-flex-direction: column;
          flex-direction: column;
  margin: 20px 0 0;
}

@media (min-width: 768px) {

  .cart-donation-upsell__middle {
    -webkit-box-orient: horizontal;
    -webkit-box-direction: normal;
    -webkit-flex-direction: row;
        -ms-flex-direction: row;
            flex-direction: row;
    margin: 20px auto 20px;
    width: 465px;
  }
}

@media (min-width: 840px) {

  .cart-donation-upsell__middle {
    width: 40%;
    margin: 0;
    -webkit-box-orient: vertical;
    -webkit-box-direction: normal;
    -webkit-flex-direction: column;
        -ms-flex-direction: column;
            flex-direction: column;
  }
}

@media (min-width: 1000px) {

  .cart-donation-upsell__middle {
    -webkit-box-orient: horizontal;
    -webkit-box-direction: normal;
    -webkit-flex-direction: row;
        -ms-flex-direction: row;
            flex-direction: row;
  }
}

.cart-donation-upsell__img-container{
  width: calc(45% - 20px);
  padding-left: 0;
}

@media (min-width: 768px) {

  .cart-donation-upsell__img-container {
    margin-right: 20px;
  }
}

@media (min-width: 840px) {

  .cart-donation-upsell__img-container {
    padding-left: 0;
    margin: 0;
  }
}

@media (min-width: 1000px) {

  .cart-donation-upsell__img-container {
    margin: 0 20px 0 0;
  }
}

.cart-donation-upsell__img{
  position: relative;
  border: solid 3px #ffffff;
}

.cart-donation-upsell__img:before{
  content: '';
  padding-top: 80%;
  display: block;
}

@media (min-width: 620px) {

  .cart-donation-upsell__img:before {
    padding-top: 50%;
  }
}

@media (min-width: 840px) {

  .cart-donation-upsell__img:before {
    padding-top: 65%;
  }
}

.cart-donation-upsell__details{
  margin: 15px 0;
  text-align: center;
  width: 55%;
}

@media (min-width: 768px) {

  .cart-donation-upsell__details {
    margin: 0;
    text-align: left;
  }
}

@media (min-width: 840px) {

  .cart-donation-upsell__details {
    margin-top: 15px;
    text-align: center;
  }
}

@media (min-width: 1000px) {

  .cart-donation-upsell__details {
    margin-top: 0;
    text-align: left;
  }
}

.cart-donation-upsell__title{
  margin-bottom: 7px;
}

.cart-donation-upsell__dropdown{
  margin-bottom: 5px;
}

.cart-donation-upsell__cta{
  position: relative;
  text-align: center;
}

.cart-donation-upsell__cta .button {
    width: 100%;
    padding: 0px;
    font-size: 12px!important;
  }

@media (min-width: 840px) {

  .cart-donation-upsell__cta {
    margin: 0;
  }
}

.cart-donation-upsell__out-of-stock {
  margin-top: 5px;
}

.cart-donation-upsell__purchase-controls {
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-orient: vertical;
  -webkit-box-direction: normal;
  -webkit-flex-direction: column;
      -ms-flex-direction: column;
          flex-direction: column;
  margin: auto;
  width: 180px;
}

@media (min-width: 620px) {

  .cart-donation-upsell__purchase-controls {
    -webkit-box-orient: horizontal;
    -webkit-box-direction: normal;
    -webkit-flex-direction: row;
        -ms-flex-direction: row;
            flex-direction: row;
    width: 465px;
  }
}

@media (min-width: 840px) {

  .cart-donation-upsell__purchase-controls {
    -webkit-box-orient: vertical;
    -webkit-box-direction: normal;
    -webkit-flex-direction: column;
        -ms-flex-direction: column;
            flex-direction: column;
    width: 180px;
    margin: 0;
  }
}

.cart-donation-upsell__option-selector.product-option-selector {
  margin-bottom: 10px;
  max-width: 100%;
  width: 100%;
}

.cart-donation-upsell__option-selector.product-option-selector .product-option-selector__title {
      display: none;
}

@media (min-width: 620px) {

  .cart-donation-upsell__option-selector.product-option-selector {
    margin-bottom: 0;
    margin-right: 10px;
  }

  .cart-donation-upsell__option-selector.product-option-selector .product-option-selector__wrapper {
        -webkit-box-sizing: border-box;
                box-sizing: border-box;
        height: 100%;
  }
}

@media (min-width: 840px) {

  .cart-donation-upsell__option-selector.product-option-selector {
    margin-bottom: 10px;
  }

  .cart-donation-upsell__option-selector.product-option-selector .product-option-selector__wrapper {
        -webkit-box-sizing: initial;
                box-sizing: initial;
        height: initial;
  }
}

@media (min-width: 1000px) {

  .cart-grid {
    min-height: 100vh;
  }
}

.cart-grid.is-mounted {
  min-height: 0;
}

.cart-grid__errors{
  padding: 20px;
}

.cart-grid__sm-header{
  position: relative;
  z-index: 2;
}

@media (min-width: 1090px) {

  .cart-grid__sm-header {
    display: none;
  }
}

.is-flow .cart-grid__sm-header {
    display: none;
}

.cart-grid__sm-header-container{
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-pack: justify;
  -webkit-justify-content: space-between;
      -ms-flex-pack: justify;
          justify-content: space-between;
  -webkit-box-align: center;
  -webkit-align-items: center;
      -ms-flex-align: center;
          align-items: center;
  height: auto;
  padding: 15px 0;
}

.cart-grid__title{
  padding-top: 20px;
  margin: 0 auto 25px;
}

@media (min-width: 768px) {

  .cart-grid__title {
    margin: 0 auto 60px;
    padding-top: 90px;
  }
}

.cart-grid__header{
  display: none;
  border-bottom: 1px solid #d0d0d0;
  margin-bottom: 25px;
}

@media (min-width: 768px) {

  .cart-grid__header {
    display: -webkit-box;
    display: -webkit-flex;
    display: -ms-flexbox;
    display: flex;
  }
}

.cart__body{
  border-top: 1px solid #d0d0d0;
}

@media (min-width: 768px) {

  .cart__body {
    border-top: none;
  }
}

.cart__body-item{
  margin-bottom: 20px;
}

@media (min-width: 1000px) {

  .cart-grid__register-container {
    padding-right: 10%;
    border-right: 1px solid #d0d0d0;
  }
}

@media (min-width: 1000px) {

  .cart-grid__login-container {
    margin-left: 10%;
  }
}

.cart-grid__item--pos-1{
  width: 50%;
}

.cart-grid__item--pos-2{
  width: 20%;
  display: none;
}

@media (min-width: 768px) {

  .cart-grid__item--pos-2 {
    display: block;
  }
}

.cart-grid__item--pos-3{
  width: 20%;
}

.cart-grid__item--pos-4{
  width: 10%;
}

.cart-grid__header-item{
  padding-bottom: 20px;
}

.cart-grid__footer{
  text-align: right;
  margin-top: 20px;
  border-top: 1px solid #d0d0d0;
  padding-top: 35px;
  margin-bottom: 30px;
  max-width: 100%;
  width: 500px;
  float: right;
}

@media (min-width: 768px) {

  .cart-grid__footer {
    border: none;
    padding-top: 0;
    margin-bottom: 80px;
  }
}

.cart-grid__subtotal{
  border-bottom: 1px solid #d0d0d0;
  padding-bottom: 30px;
}

.cart-grid__subtotal-amount{
  display: -webkit-inline-box;
  display: -webkit-inline-flex;
  display: -ms-inline-flexbox;
  display: inline-flex;
  -webkit-box-align: center;
  -webkit-align-items: center;
      -ms-flex-align: center;
          align-items: center;
}

.cart-grid__subtotal-amount > *:first-child{
  margin-right: 10px;
}

.cart-grid__subtotal-byline{
  margin-top: 15px;
}

.cart-grid__ispu {
  padding-top: 30px;
}

.cart-grid__ispu-options {
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-pack: end;
  -webkit-justify-content: flex-end;
      -ms-flex-pack: end;
          justify-content: flex-end;
  margin-top: 15px;
}

.cart-grid__ispu-option {
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex
}

.cart-grid__ispu-option:first-child {
  margin-right: 50px;
}

.cart-grid__ispu-option.disabled {
  cursor: not-allowed;
  opacity: 0.5;
}

.cart-grid__store-selector .select-input__wrap {
    -webkit-box-align: center;
    -webkit-align-items: center;
        -ms-flex-align: center;
            align-items: center;
    display: -webkit-box;
    display: -webkit-flex;
    display: -ms-flexbox;
    display: flex;
    margin-top: 15px;
  }

.cart-grid__store-selector .select-input__wrap > * {
      -webkit-box-flex: 1;
      -webkit-flex: 1;
          -ms-flex: 1;
              flex: 1;
    }

.cart-grid__store-selector .select-input__label {
    padding-right: 15px;
  }

.cart-grid__store-selector .select-input__el {
    height: 36px;
  }

.cart-grid__checkout {
  margin-top: 40px;
}

.cart-grid__continue{
  margin-right: 30px;
}

@media (min-width: 1000px) {

  .cart-grid__checkout-button {
    min-width: 200px;
  }
}

.cart-grid__stage{
  position: relative;
  width: 100%;
}

@media (min-width: 1000px) {

  .cart-grid__stage--2 {
    display: -webkit-box;
    display: -webkit-flex;
    display: -ms-flexbox;
    display: flex;
    margin: 40px auto;
  }
}

@media (min-width: 1000px) {

  .cart-grid__register-container, .cart-grid__login-container {
    width: 50%;
  }
}

@media (min-width: 1000px) {

  .cart-grid__stage--3 {
    display: -webkit-box;
    display: -webkit-flex;
    display: -ms-flexbox;
    display: flex;
  }
}

.cart-item-enter-active, .cart-item-leave-active {
  -webkit-transition: all 1s;
  -o-transition: all 1s;
  transition: all 1s;
}

.cart-item-enter, .cart-item-leave-to{
  opacity: 0;
  -webkit-transform: scale(0.7);
      -ms-transform: scale(0.7);
          transform: scale(0.7);
  -webkit-transform-origin: center;
      -ms-transform-origin: center;
          transform-origin: center;
}

.cart-item-move {
  -webkit-transition: all 1s;
  -o-transition: all 1s;
  transition: all 1s;
}

.cart-item:first-child {
  padding-top: 15px;
}

@media (min-width: 768px) {

  .cart-item:first-child {
    padding-top: 0;
  }
}

.cart-item + .cart-item:not(.cart-item__container--grouped) {
  border-top: 1px solid #d0d0d0;
  padding-top: 20px;
}

.cart-item__container{
  -webkit-box-align: start;
  -webkit-align-items: flex-start;
      -ms-flex-align: start;
          align-items: flex-start;
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  opacity: 1;
  -webkit-transform: translateY(0);
      -ms-transform: translateY(0);
          transform: translateY(0);
}

@media (min-width: 768px) {

  .cart-item__container {
    padding-top: 0;
  }
}

.cart-item__container--grouped + .cart-item:not(.cart-item__container--grouped) {
  border-top: 1px solid #d0d0d0;
  padding-top: 20px;
}

.cart-item__img-container{
  width: 30%;
  min-width: 30%;
  position: relative;
  max-width: 122px;
  height: auto;
}

@media (min-width: 445px) {

  .cart-item__img-container {
    width: 15%;
    min-width: 15%;
  }
}

.cart-item__img-container .img, .cart-item__img-container .img__el {
  height: auto;
}

.cart-item__img-container:before{
  content:'';
  display: block;
  padding-top: 73%;
}

.cart-item__img{
  width: 100%;
}

.cart-item__main-area{
  padding-left: 10px;
  width: 47%;
}

@media (min-width: 768px) {

  .cart-item__main-area {
    display: -webkit-box;
    display: -webkit-flex;
    display: -ms-flexbox;
    display: flex;
    padding-left: 0;
    width: 70%;
  }
}

.cart-item__total{
  width: 23%;
}

@media (min-width: 768px) {

  .cart-item__total {
    width: auto;
  }
}

.cart-item__desc-inner{
  padding-left: 0;
  padding-right: 10px;
}

@media (min-width: 768px) {

  .cart-item__desc-inner {
    width: 43%;
    padding-left: 20px;
  }
}

.cart-item__price{
  display: none;
}

@media (min-width: 768px) {

  .cart-item__price {
    display: block;
    width: 28%;
  }
}

.cart-item__quantity{
  margin-top: 15px;
}

@media (min-width: 768px) {

  .cart-item__quantity {
    margin-top: 0;
  }
}

.cart-item__remove{
  margin-top: 5px;
  opacity: 0.4;
}

.cart-item__details {
  margin-top: 8px;
  padding-left: 13px;
  position: relative
}

.cart-item__details::before {
  content: '+';
  display: block;
  left: 0;
  position: absolute;
}

.cart-item__properties ul {
    margin-top: 8px;
  }

.cart-item__properties li {
    margin-top: 1px;
    padding-left: 13px;
    position: relative;
    text-transform: capitalize
  }

.cart-item__properties li::before {
  content: '+';
  display: block;
  left: 0;
  position: absolute;
}

.cart-p-b{
  /* position: fixed; */
  position: relative;
  width: 100%;
  overflow-x: hidden;
  z-index: 2;
  padding: 9px 0 15px;
}

@media (min-width: 1000px) {

  .cart-p-b {
    padding: 15px 0 20px;
  }
}

.cart-p-b__stage.is-hidden{
  display: none;
}

.cart-p-b__stages{
  position: relative;
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
}

@media (min-width: 768px) {

  .cart-p-b__stages {
    -webkit-box-pack: justify;
    -webkit-justify-content: space-between;
        -ms-flex-pack: justify;
            justify-content: space-between;
  }
}

.cart-p-b__stages:before{
  content: '';
  position: absolute;
  top: 32px;
  left:0;
  right: 0;
  height: 1px;
  background: #ffffff;
}

@media (min-width: 1000px) {

  .cart-p-b__stages:before {
    top: 38px;
  }
}

.cart-p-b__stage{
  -webkit-box-flex: 0;
  -webkit-flex: 0 0 auto;
      -ms-flex: 0 0 auto;
          flex: 0 0 auto;
  position: relative;
  width: 20%;
  height: 40px;
}

@media (min-width: 768px) {

  .cart-p-b__stage {
    width: auto;
  }
}

@media (min-width: 1000px) {

  .cart-p-b__stage {
    height: 50px;
  }
}

.cart-p-b__stage:first-child:before, .cart-p-b__stage:last-child:before{
  content: '';
  position: absolute;
  background: #000000;
  height: 50px;
  width: 400px;
}

.cart-p-b__stage:first-child:before{
  right: 50%;
}

.cart-p-b__stage:last-child:before{
  left: 50%;
}

.cart-p-b__stage-link{
  position: absolute;
  left: 50%;
  margin-left: -200px;
  width: 400px;
  text-align: center;
  white-space: nowrap;
}

@media (min-width: 768px) {

  .cart-p-b__stage-link {
    position: relative;
    left: 0;
    margin-left: 0;
    width: auto;
  }
}

.cart-p-b__stage-link:hover{
  color: #ffffff;
}

.cart-p-b__stage-link-text{
  opacity: 0;
}

@media (min-width: 768px) {

  .cart-p-b__stage-link-text {
    opacity: 1;
  }
}

.is-current .cart-p-b__stage-link-text{
  opacity: 1;
}

.cart-p-b__stage-link:before, .is-active .cart-p-b__stage-link:after{
  content: '';
  display: block;
  width: 12px;
  height: 12px;
  border-radius: 50%;
  position: absolute;
  top: 25px;left: 0;
  right: 0;
  margin: auto;
  border: 2px solid #000000;
}

@media (min-width: 1000px) {

  .cart-p-b__stage-link:before, .is-active .cart-p-b__stage-link:after {
    width: 20px;
    height: 20px;
  }
}

.cart-p-b__stage-link:before{
  background: #ffffff;
}

.is-active .cart-p-b__stage-link:after{
  background: #fdd007;
  -webkit-box-shadow: inset 0px 0px 0px 1px #ffffff;
          box-shadow: inset 0px 0px 0px 1px #ffffff;
}

@media (min-width: 1000px) {

  .is-active .cart-p-b__stage-link:after {
    -webkit-box-shadow: inset 0px 0px 0px 2px #ffffff;
            box-shadow: inset 0px 0px 0px 2px #ffffff;
  }
}

.cart-summ{
  background-color: #fff9e7;
  position: fixed;
  top: 0;
  right: -100vw;
  z-index: 10000;
  width: 100vw;
  height: 100vh;
  padding: 20px;
  -webkit-transform: translateX(0);
      -ms-transform: translateX(0);
          transform: translateX(0);
  -webkit-transition: -webkit-transform 300ms;
  transition: -webkit-transform 300ms;
  -o-transition: transform 300ms;
  transition: transform 300ms;
  transition: transform 300ms, -webkit-transform 300ms;
}

@media (min-width: 1000px) {

  .cart-summ {
    z-index: 1;
    position: relative;
    width: 50%;
    height: auto;
    padding: 80px 0 140px 90px;
    display: block;
    right: auto;
    top: auto;
    -webkit-transform: none;
        -ms-transform: none;
            transform: none;
  }
}

.cart-summ.is-visible{
  -webkit-transform: translateX(-100%);
      -ms-transform: translateX(-100%);
          transform: translateX(-100%);
  overflow-y: auto;
}

.cart-summ:before{
  content: '';
  position: fixed;
  top: 0;
  right: 0;
  background-color: #fff9e7;
  width: 50vw;
  height: 100%;
  z-index: 1;
  display: none;
}

@media (min-width: 1090px) {

  .cart-summ:before {
    display: block;
  }
}

.cart-summ__inner{
  position: relative;
  z-index: 2;
  padding-top: 50px;
}

@media (min-width: 1090px) {

  .cart-summ__inner {
    padding-top: 0;
  }
}

.cart-summ__header-sm{
  position: fixed;
  background: black;
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  height: 50px;
  width: 100%;
  top: 0;
  left: 0;
  color: white;
  -webkit-box-align: center;
  -webkit-align-items: center;
      -ms-flex-align: center;
          align-items: center;
  -webkit-box-pack: end;
  -webkit-justify-content: flex-end;
      -ms-flex-pack: end;
          justify-content: flex-end;
  padding: 0 30px;
}

@media (min-width: 1090px) {

  .cart-summ__header-sm {
    display: none;
  }
}

.cart-summ__item{
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
}

.cart-summ__item + .cart-summ__item{
  margin-top: 20px;
}

.cart-summ__item-img{
  width: 30%;
  position: relative;
}

.cart-summ__item-img img{
  width: 100%;
}

.cart-summ__item-info{
  margin-left: 20px;
  padding-right: 20px;
  width: calc(40% - 20px);
}

.cart-summ__item-price{
  margin-left: 20px;
  width: calc(30% - 20px);
}

.cart-summ__subtotals-wrapper{
  border-top: 1px solid #d0d0d0;
  border-bottom: 1px solid #d0d0d0;
  padding: 20px 0;
  margin: 20px auto;
}

.cart-summ__subtotals-line{
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-pack: justify;
  -webkit-justify-content: space-between;
      -ms-flex-pack: justify;
          justify-content: space-between;
}

.cart-summ__subtotals-line:not(:last-child){
  margin-bottom: 25px;
}

.cart-summ__total-wrapper{
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-pack: justify;
  -webkit-justify-content: space-between;
      -ms-flex-pack: justify;
          justify-content: space-between;
}

.cart-upsell{
  padding: 15px;
  text-align: center;
}

@media (min-width: 840px) {

  .cart-upsell {
    text-align: left;
    padding: 35px 50px;
  }
}

@media (min-width: 840px) {

  .cart-upsell__container {
    display: -webkit-box;
    display: -webkit-flex;
    display: -ms-flexbox;
    display: flex;
    -webkit-box-align: center;
    -webkit-align-items: center;
        -ms-flex-align: center;
            align-items: center;
    -webkit-box-pack: justify;
    -webkit-justify-content: space-between;
        -ms-flex-pack: justify;
            justify-content: space-between;
  }
}

.cart-upsell__left{
  max-width: 500px;
  margin: auto;
}

@media (min-width: 840px) {

  .cart-upsell__left {
    margin: 0;
    width: 40%;
    max-width: 275px;
  }
}

.cart-upsell__upsell-title{
  margin-bottom: 5px;
}

@media (min-width: 840px) {

  .cart-upsell__upsell-title {
    margin-bottom: 10px;
  }
}

.cart-upsell__middle{
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  margin-top: 20px;
}

@media (min-width: 840px) {

  .cart-upsell__middle {
    width: 40%;
    margin-top: 0;
  }
}

.cart-upsell__img-container{
  width: calc(45% - 20px);
  margin-right: 20px;
  padding-left: 0;
}

@media (min-width: 620px) {

  .cart-upsell__img-container {
    padding-left: 15%;
  }
}

@media (min-width: 840px) {

  .cart-upsell__img-container {
    padding-left: 0;
    margin: 0 20px 0 0;
  }
}

.cart-upsell__img{
  position: relative;
  border: solid 3px #ffffff;
}

.cart-upsell__img:before{
  content: '';
  padding-top: 80%;
  display: block;
}

@media (min-width: 620px) {

  .cart-upsell__img:before {
    padding-top: 50%;
  }
}

@media (min-width: 840px) {

  .cart-upsell__img:before {
    padding-top: 65%;
  }
}

.cart-upsell__details{
  width: 55%;
  text-align: left;
}

.cart-upsell__title{
  margin-bottom: 7px;
}

.cart-upsell__dropdown{
  margin-bottom: 5px;
}

.cart-upsell__cta{
  margin-top: 15px;
  position: relative;
  text-align: center;
}

@media (min-width: 840px) {

  .cart-upsell__cta {
    margin: 0;
  }
}

.cart-upsell__out-of-stock {
  margin-top: 5px;
}

.checkbox{
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-align: center;
  -webkit-align-items: center;
      -ms-flex-align: center;
          align-items: center;
}

.checkbox--align-t {
  -webkit-box-align: start;
  -webkit-align-items: flex-start;
      -ms-flex-align: start;
          align-items: flex-start;
}

.checkbox__icon {
  width: 15px;
  height: 15px;
  position: relative;
  border: 1px solid #d0d0d0;
  margin-right: 10px;
}

.is-error.checkbox__icon{
  border: 1px solid red;
}

.checkbox--align-t .checkbox__icon{
  margin-top: 2px;
}

.checkbox__icon-el {
  cursor: pointer;
  display: block;
  -webkit-box-flex: 0;
  -webkit-flex: 0 0 auto;
      -ms-flex: 0 0 auto;
          flex: 0 0 auto;
  height: 15px;
  margin-right: 10px;
  position: relative;
  width: 15px;
  z-index: 1;
}

.checkbox__icon-el:checked + .checkbox__icon-tick {
  opacity: 1;
}

.checkbox__icon-tick{
  width: 10px;
  position: absolute;
  top: 1px;
  right: 0;
  bottom: 0;
  left: 0;
  margin: auto;
  z-index: 0;
  opacity: 0;
  -webkit-transition: opacity 300ms ease-in-out;
  -o-transition: opacity 300ms ease-in-out;
  transition: opacity 300ms ease-in-out;
}

.is-error + .checkbox__label{
  color: red;
}

.color-circle-custom-ab{
  /* background-color: var(--black); */
  background-size: cover;
  /* border-radius: 50%;
  box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.08); */
  cursor: pointer;
  height: 22px;
  min-width: 22px;
  position: relative;
  text-align: center;
  width: 22px
}

.color-circle-custom-ab:focus-within {
  outline: -webkit-focus-ring-color auto 5px;
}

.color-circle-custom-ab.is-active:before{
  content: '';
  position: absolute;
  top: -2px;
  left: -2px;
  width: calc(100% + 4px);
  height: calc(100% + 4px);
  /* border-radius: 50%;
  box-shadow: 0px 0px 0px 1px rgba(0,0,0,1); */
}

.color-circle-custom{
  background-color: #000000;
  background-size: cover;
  border-radius: 50%;
  /* box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.08); */
  cursor: pointer;
  height: 22px;
  min-width: 22px;
  position: relative;
  text-align: center;
  width: 22px
}

.color-circle-custom:focus-within {
  outline: -webkit-focus-ring-color auto 5px;
}

.color-circle-custom.is-active:before{
  content: '';
  position: absolute;
  top: -2px;
  left: -2px;
  width: calc(100% + 4px);
  height: calc(100% + 4px);
  /* border-radius: 50%;
  box-shadow: 0px 0px 0px 1px rgba(0,0,0,1); */
}

.color-circle{
  background-color: #000000;
  background-size: cover;
  border-radius: 50%;
  -webkit-box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.08);
          box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.08);
  cursor: pointer;
  height: 22px;
  min-width: 22px;
  position: relative;
  text-align: center;
  width: 22px
}

.color-circle:focus-within {
  outline: -webkit-focus-ring-color auto 5px;
}

.color-circle.is-active:before{
  content: '';
  position: absolute;
  top: -2px;
  left: -2px;
  width: calc(100% + 4px);
  height: calc(100% + 4px);
  border-radius: 50%;
  -webkit-box-shadow: 0px 0px 0px 1px rgba(0,0,0,1);
          box-shadow: 0px 0px 0px 1px rgba(0,0,0,1);
}

.color-selector{
  max-width: 156px;
  position: relative;
  margin: auto;
  padding: 0 15px;
}

@media (min-width: 1000px) {

  .color-selector {
    padding: 0 25px;
    max-width: 205px;
  }
}

.color-selector--simple{
  padding: 0;
  max-width: none;
}

.color-selector--cart{
  margin-top: 10px;
}

.color-selector__list-wrapper{
  max-height: 28px;
  overflow-y: hidden;
}

.color-selector__list{
  position: relative;
  height: 50px; /* height scroll bar */
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  overflow: hidden;
  overflow-x: auto;
}

.color-selector--simple .color-selector__list {
    -webkit-box-pack: center;
    -webkit-justify-content: center;
        -ms-flex-pack: center;
            justify-content: center;
  }

.color-selector--cart .color-selector__list {
    -webkit-box-pack: start;
    -webkit-justify-content: flex-start;
        -ms-flex-pack: start;
            justify-content: flex-start;
  }

.color-selector__list-item{
  padding: 3px 5px;
  margin-bottom: 3px;
  -webkit-box-flex: 1;
  -webkit-flex: 1 0 22px;
      -ms-flex: 1 0 22px;
          flex: 1 0 22px;
}

.color-selector__list-item .color-circle:focus-within {
    outline: -webkit-focus-ring-color auto 5px;
  }

.color-selector--simple .color-selector__list-item {
    -webkit-box-flex: 0;
    -webkit-flex: none;
        -ms-flex: none;
            flex: none;
  }

.color-selector__arrow{
  width: 8px;
  height: 14px;
  position: absolute;
  top: 0;
  bottom: 0;
  margin: auto;
  z-index: 1;
  cursor: pointer;
}

@media (min-width: 1000px) {

  .color-selector__arrow {
    width: 11px;
    height: 19px;
  }
}

.color-selector__arrow--left{
  left: 0;
}

.color-selector__arrow--right{
  right: 0;
}

.contacts-info--footer {
  max-width: 430px;
  width: 100%;
}

.contacts-info__list {
  -webkit-box-align: start;
  -webkit-align-items: flex-start;
      -ms-flex-align: start;
          align-items: flex-start;
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-pack: justify;
  -webkit-justify-content: space-between;
      -ms-flex-pack: justify;
          justify-content: space-between;
}

.contacts-info__item {
  margin-left: 20px
}

.contacts-info__item:first-child {
  margin-left: 0;
}

.contacts-info__icon {
  display: block;
  height: 20px;
  margin: 0 auto 6px;
  width: 20px
}

.contacts-info__icon.contacts-info__icon--phone {
  height: 40px;
  width: 40px;
}

.contacts-info__icon.contacts-info__icon--email {
  height: 40px;
  width: 30px;
}

.contacts-info__icon.contacts-info__icon--chat {
  height: 40px;
  width: 30px;
}

.customheight {
  height: 56px;
}

.content-header {
  margin: 0 auto 40px;
  max-width: 625px;
  text-align: center;
  width: 100%;
}

@media (min-width: 620px) {

  .content-header {
    margin-bottom: 60px;
  }
}

@media (min-width: 1000px) {

  .content-header {
    margin-bottom: 80px;
  }
}

@media (min-width: 1000px) {

  .content-header--sm {
    margin-bottom: 60px;
  }
}

.content-header__caption{
  margin-top: 10px;
}

.countdown_cont {
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-pack: center;
  -webkit-justify-content: center;
      -ms-flex-pack: center;
          justify-content: center;
  color: #d8d8d8;
}

.countdown_interval_cont {
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  -webkit-justify-content: space-around;
      -ms-flex-pack: distribute;
          justify-content: space-around;
  width: auto;
}

.countdown__interval_basic_cont:not(:last-child) {
  margin-right: 6px;
}

@media (min-width: 620px) {

  .countdown__interval_basic_cont:not(:last-child) {
    margin-right: 12px;
  }
}

.countdown_interval_basic_cont {
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-orient: vertical;
  -webkit-box-direction: normal;
  -webkit-flex-direction: column;
      -ms-flex-direction: column;
          flex-direction: column;
}

.countdown_interval_basic_cont_description {
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-pack: center;
  -webkit-justify-content: center;
      -ms-flex-pack: center;
          justify-content: center;
  margin-bottom: 6px;
  color: #000000;
}

.countdown_digit_cont {
  -webkit-perspective: 3.2em;
          perspective: 3.2em;
  -webkit-box-shadow: 0.1em 0.1em 0.1em rgba(0, 0, 0, 0.2);
          box-shadow: 0.1em 0.1em 0.1em rgba(0, 0, 0, 0.2);
  width: 1em;
  height: 1.6em;
  position: relative;
  line-height: 1.6em;
  //This controlled size of countdown. Not related to typo
  font-size: 24px;
  font-weight: bold;
  border-radius: 6px;
}

@media (min-width: 620px) {

  .countdown_digit_cont {
    font-size: 38px;
  }
}

.countdown_digit_cont:nth-child(n+1):not(:last-child) {
  margin-right: 0.05em;
}

.countdown_digit_last_placeholder, .countdown_digit_new_placeholder {
  position: absolute;
  left: 0;
  width: 100%;
  height: 50%;
  text-align: center;
  overflow: hidden;
}

.countdown_digit_last_placeholder {
  bottom: 0;
  background: #343538;
  border-radius: 0 0 6px 6px;
}

.countdown_digit_last_placeholder_inner {
  width: 100%;
  height: 100%;
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-pack: center;
  -webkit-justify-content: center;
      -ms-flex-pack: center;
          justify-content: center;
  -webkit-box-align: center;
  -webkit-align-items: center;
      -ms-flex-align: center;
          align-items: center;
  bottom: 50%;
  position: absolute;
}

.countdown_digit_new_placeholder {
  top: 0;
  background: #343538;
  border-radius: 6px 6px 0 0;
}

.countdown_digit_last_rotate, .countdown_digit_new_rotate {
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-pack: center;
  -webkit-justify-content: center;
      -ms-flex-pack: center;
          justify-content: center;
  width: 100%;
  height: 50%;
  font-weight: bold;
  position: absolute;
  top: 0;
  overflow: hidden;
  -webkit-animation-duration: 0.4s;
          animation-duration: 0.4s;
  -webkit-animation-timing-function: linear;
          animation-timing-function: linear;
  border-radius: 6px 6px 0 0;
  -webkit-animation-fill-mode: forwards;
          animation-fill-mode: forwards;
  -webkit-transform-origin: 100% 100%;
      -ms-transform-origin: 100% 100%;
          transform-origin: 100% 100%;
}

.countdown_digit_last_rotate:after, .countdown_digit_new_rotate:after {
  content: "";
  position: absolute;
  z-index: -1;
  left: 0;
  bottom: 0;
  width: 100%;
  height: 100%;
  border-bottom: 0.01em solid rgba(0, 0, 0, 0.1);
}

.countdown_digit_last_rotate {
  -webkit-animation-name: countDown_flip_1;
          animation-name: countDown_flip_1;
  background: #343538;
}

.countdown_digit_new_rotate {
  -webkit-animation-name: countDown_flip_2;
          animation-name: countDown_flip_2;
  background: #343538;
}

.countdown_digit_new_rotated {
  -webkit-transform: rotateX(180deg);
          transform: rotateX(180deg);
  width: 100%;
  height: 100%;
}

.countdown_digit_new_rotated_inner {
  width: 100%;
  height: 100%;
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-pack: center;
  -webkit-justify-content: center;
      -ms-flex-pack: center;
          justify-content: center;
  -webkit-box-align: center;
  -webkit-align-items: center;
      -ms-flex-align: center;
          align-items: center;
  bottom: 50%;
  position: absolute;
}

@-webkit-keyframes countDown_flip_1 {
  0% {
    -webkit-transform: rotateX(0deg);
            transform: rotateX(0deg);
    z-index: 1;
  }
  100% {
    -webkit-transform: rotateX(-180deg);
            transform: rotateX(-180deg);
    z-index: 0;
  }
}

@keyframes countDown_flip_1 {
  0% {
    -webkit-transform: rotateX(0deg);
            transform: rotateX(0deg);
    z-index: 1;
  }
  100% {
    -webkit-transform: rotateX(-180deg);
            transform: rotateX(-180deg);
    z-index: 0;
  }
}

@-webkit-keyframes countDown_flip_2 {
  0% {
    -webkit-transform: rotateX(0deg);
            transform: rotateX(0deg);
    z-index: 0;
  }
  100% {
    -webkit-transform: rotateX(-180deg);
            transform: rotateX(-180deg);
    z-index: 1;
  }
}

@keyframes countDown_flip_2 {
  0% {
    -webkit-transform: rotateX(0deg);
            transform: rotateX(0deg);
    z-index: 0;
  }
  100% {
    -webkit-transform: rotateX(-180deg);
            transform: rotateX(-180deg);
    z-index: 1;
  }
}

.craft-anatomy-card {
  width: 100%;
}

@media (min-width: 445px) {

  .craft-anatomy-card {
    width: 50%;
  }
}

@media (min-width: 840px) {

  .craft-anatomy-card {
    cursor: pointer;
    -webkit-box-flex: 1;
    -webkit-flex: 1;
        -ms-flex: 1;
            flex: 1;
    width: auto;
  }
}

.craft-anatomy-card__featured {
  min-height: 500px;
  max-height: 640px;
  z-index: 0
}

.craft-anatomy-card__featured::before {
  padding-bottom: calc(400/320 * 100%);
}

@media (min-width: 445px) {

  .craft-anatomy-card__featured::before {
    padding-bottom: calc(400/300 * 100%);
  }
}

@media (min-width: 840px) {

  .craft-anatomy-card__featured::before {
    padding-bottom: calc(450/200 * 100%);
  }
}

@media (min-width: 1200px) {

  .craft-anatomy-card__featured::before {
    padding-bottom: calc(500/290 * 100%);
  }
}

.craft-anatomy-card__text {
  -webkit-box-align: center;
  -webkit-align-items: center;
      -ms-flex-align: center;
          align-items: center;
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-orient: vertical;
  -webkit-box-direction: normal;
  -webkit-flex-direction: column;
      -ms-flex-direction: column;
          flex-direction: column;
  height: 100%;
  -webkit-box-pack: justify;
  -webkit-justify-content: space-between;
      -ms-flex-pack: justify;
          justify-content: space-between;
  left: 0;
  padding: 30px 0;
  position: absolute;
  top: 0;
  width: 100%;
}

@media (min-width: 840px) {

  .craft-anatomy-card__text {
    display: block;
    opacity: 0;
    -webkit-transform: translateY(10px);
        -ms-transform: translateY(10px);
            transform: translateY(10px);
    visibilty: hidden;
  }
}

.craft-anatomy-card__title {
  margin-bottom: 10px;
}

.craft-anatomy-card__cta {
  background-color: #fdd007;
  color: #000000;
  cursor: pointer;
  display: inline-block;
  height: 40px;
  line-height: 40px;
  padding: 0 40px;
  position: relative;
  text-transform: uppercase;
}

@media (min-width: 620px) {

  .craft-anatomy-card__cta {
    height: 50px;
    line-height: 50px;
  }
}

@media (min-width: 840px) {

  .craft-anatomy-card__cta {
    background-color: transparent;
    display: inline-block;
    height: auto;
    letter-spacing: 1px;
    line-height: 1.5;
    padding: 0;
    position: relative;
    text-transform: uppercase;
  }
}

@media (min-width: 840px) {

  .craft-anatomy-card__cta::after {
    background-color: currentColor;
    bottom: 1px;
    content: '';
    height: 1px;
    left: 50%;
    position: absolute;
    -webkit-transform: translateX(-50%);
        -ms-transform: translateX(-50%);
            transform: translateX(-50%);
    width: 100%;
  }
}

.no-touch .craft-anatomy-card .craft-anatomy-card__text {
      -webkit-transition-duration: 200ms;
           -o-transition-duration: 200ms;
              transition-duration: 200ms;
      -webkit-transition-property: opacity, visibilty, -webkit-transform;
      transition-property: opacity, visibilty, -webkit-transform;
      -o-transition-property: opacity, transform, visibilty;
      transition-property: opacity, transform, visibilty;
      transition-property: opacity, transform, visibilty, -webkit-transform;
      -webkit-transition-timing-function: ease-in-out;
           -o-transition-timing-function: ease-in-out;
              transition-timing-function: ease-in-out;
    }

@media (min-width: 840px) {

  .no-touch .craft-anatomy-card:hover .craft-anatomy-card__text {
    opacity: 1;
    -webkit-transform: translateY(0);
        -ms-transform: translateY(0);
            transform: translateY(0);
    visibilty: visible;
  }
}

@media (min-width: 840px) {

  .no-touch .craft-anatomy-card__cta::after {
    -webkit-transition: width 200ms ease-in-out;
    -o-transition: width 200ms ease-in-out;
    transition: width 200ms ease-in-out;
  }
}

@media (min-width: 840px) {

  .no-touch .craft-anatomy-card__cta:hover::after {
    width: calc(100% - 10px);
  }
}

.craft-anatomy {
  padding-bottom: 80px;
}

@media (min-width: 840px) {

  .craft-anatomy {
    padding-bottom: 0;
  }
}

@media (min-width: 840px) {

  .craft-anatomy__cards {
    display: -webkit-box;
    display: -webkit-flex;
    display: -ms-flexbox;
    display: flex;
  }
}

.craft-anatomy__cards .flickity-page-dots {
    bottom: -30px;
}

.craft-anatomy__modal {
  height: 100vh;
  left: 0;
  overflow: scroll;
  padding: 30px;
  position: fixed;
  top: 0;
  width: 100%;
  z-index: 999;
}

@media (min-width: 620px) {

  .craft-anatomy__modal {
    padding: 40px;
  }
}

@media (min-width: 768px) {

  .craft-anatomy__modal {
    height: 100%;
    min-height: 100%;
    padding: 40px 0;
    position: absolute;
    top: 0;
    width: 100%;
    z-index: 3;
  }
}

@media (min-width: 1000px) {

  .craft-anatomy__modal {
    padding: 50px 0;
  }
}

@media (min-width: 1200px) {

  .craft-anatomy__modal {
    padding: 60px 0;
  }
}

@media (min-width: 1800px) {

  .craft-anatomy__modal {
    padding: 80px 0;
  }
}

.craft-anatomy__modal-close {
  position: absolute;
  right: 0;
  top: -10px;
  width: 12px;
}

@media (min-width: 768px) {

  .craft-anatomy__modal-close {
    right: 40px;
    top: auto;
  }
}

@media (min-width: 1000px) {

  .craft-anatomy__modal-close {
    right: 50px;
    width: 20px;
  }
}

@media (min-width: 1200px) {

  .craft-anatomy__modal-close {
    right: 60px;
  }
}

@media (min-width: 1800px) {

  .craft-anatomy__modal-close {
    right: 80px;
  }
}

.craft-anatomy__modal-header {
  margin-bottom: 0;
}

.craft-anatomy__modal-holder {
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-orient: vertical;
  -webkit-box-direction: normal;
  -webkit-flex-direction: column;
      -ms-flex-direction: column;
          flex-direction: column;
}

@media (min-width: 768px) {

  .craft-anatomy__modal-holder {
    -webkit-box-pack: justify;
    -webkit-justify-content: space-between;
        -ms-flex-pack: justify;
            justify-content: space-between;
  }
}

.craft-anatomy__modal-container {
  -webkit-box-flex: 0;
  -webkit-flex: 0 0 auto;
      -ms-flex: 0 0 auto;
          flex: 0 0 auto;
  height: auto;
}

@media (min-width: 1000px) {

  .craft-anatomy__modal-container {
    -webkit-box-align: center;
    -webkit-align-items: center;
        -ms-flex-align: center;
            align-items: center;
    display: -webkit-box;
    display: -webkit-flex;
    display: -ms-flexbox;
    display: flex;
    -webkit-box-pack: center;
    -webkit-justify-content: center;
        -ms-flex-pack: center;
            justify-content: center;
    margin-top: 30px;
  }
}

.craft-anatomy__modal-featured {
  margin: 30px auto 35px;
}

@media (min-width: 768px) {

  .craft-anatomy__modal-featured {
    margin: 30px auto;
  }
}

@media (min-width: 840px) {

  .craft-anatomy__modal-featured {
    margin: 25px auto;
  }
}

@media (min-width: 1000px) {

  .craft-anatomy__modal-featured {
    margin-bottom: 0;
    width: 40%;
  }
}

@media (min-width: 1160px) {

  .craft-anatomy__modal-featured {
    width: 50%;
  }
}

.craft-anatomy__modal-featured--portrait {
  display: block;
  max-width: 300px;
}

@media (min-width: 768px) {

  .craft-anatomy__modal-featured--portrait {
    display: none;
  }
}

@media (min-width: 1000px) {

  .craft-anatomy__modal-featured--portrait {
    display: block;
  }
}

@media (min-width: 1440px) {

  .craft-anatomy__modal-featured--portrait {
    display: none;
  }
}

.craft-anatomy__modal-featured--portrait::before {
  padding-bottom: calc(210/300 * 100%);
}

.craft-anatomy__modal-featured--landscape {
  display: none;
  max-width: 600px;
}

@media (min-width: 768px) {

  .craft-anatomy__modal-featured--landscape {
    display: block;
  }
}

@media (min-width: 1000px) {

  .craft-anatomy__modal-featured--landscape {
    display: none;
  }
}

@media (min-width: 1440px) {

  .craft-anatomy__modal-featured--landscape {
    display: block;
    max-width: 615px;
  }
}

.craft-anatomy__modal-featured--landscape::before {
  padding-bottom: calc(107/600 * 100%);
}

.craft-anatomy__modal-details {
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  -webkit-flex-wrap: wrap;
      -ms-flex-wrap: wrap;
          flex-wrap: wrap;
  -webkit-box-pack: center;
  -webkit-justify-content: center;
      -ms-flex-pack: center;
          justify-content: center;
  margin: 0 auto;
  width: 100%;
}

@media (min-width: 620px) {

  .craft-anatomy__modal-details {
    -webkit-box-pack: center;
    -webkit-justify-content: center;
        -ms-flex-pack: center;
            justify-content: center;
  }
}

@media (min-width: 768px) {

  .craft-anatomy__modal-details {
    max-width: 640px;
  }
}

@media (min-width: 1000px) {

  .craft-anatomy__modal-details {
    width: 60%;
  }
}

@media (min-width: 1160px) {

  .craft-anatomy__modal-details {
    margin: 0;
    width: 50%;
  }
}

.craft-anatomy__modal-details .flickity-viewport {
    width: 100%;
}

.craft-anatomy__modal-details .flickity-button {
    background-color: transparent;
    height: 30px;
    width: 30px;
}

.craft-anatomy__modal-details .flickity-button:disabled {
  opacity: 0;
}

.craft-anatomy__modal-details .flickity-button.previous {
  left: -30px;
}

.craft-anatomy__modal-details .flickity-button.next {
  right: -30px;
}

.craft-anatomy__modal-detail {
  margin-bottom: 20px;
  position: relative;
  width: 100%;
}

@media (min-width: 620px) {

  .craft-anatomy__modal-detail {
    width: 50%;
  }
}

@media (min-width: 768px) {

  .craft-anatomy__modal-detail {
    width: 33.33%;
  }
}

@media (min-width: 1000px) {

  .craft-anatomy__modal-detail {
    margin-bottom: 30px;
  }
}

@media (min-width: 1440px) {

  .craft-anatomy__modal-detail {
    margin-bottom: 40px;
  }
}

.craft-anatomy__modal-detail:nth-child(n+5) {
  margin-bottom: 0;
}

.craft-anatomy__modal-detail-title {
  margin-bottom: 15px;
}

.craft-anatomy__modal-detail-featured {
  border-radius: 50%;
  margin: auto;
  max-width: 120px;
  overflow: hidden;
  width: 100%;
  -webkit-mask-image: -webkit-radial-gradient(white, black)
}

.craft-anatomy__modal-detail-featured::before {
  padding-bottom: 100%;
}

.craft-callout{
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  -webkit-flex-wrap: wrap-reverse;
      -ms-flex-wrap: wrap-reverse;
          flex-wrap: wrap-reverse;
  border-top: 1px solid #d0d0d0;
}

@media (min-width: 768px) {

  .craft-callout {
    -webkit-box-align: center;
    -webkit-align-items: center;
        -ms-flex-align: center;
            align-items: center;
    -webkit-flex-wrap: nowrap;
        -ms-flex-wrap: nowrap;
            flex-wrap: nowrap;
  }
}

@media (min-width: 840px) {

  .craft-callout {
    border-top: none;
  }
}

.craft-callout__image, .craft-callout__text{
  width: 100%;
}

@media (min-width: 768px) {

  .craft-callout__image, .craft-callout__text {
    width: 50%;
  }
}

@media (min-width: 768px) {

  .craft-callout__image {
    margin-right: 40px;
  }
}

@media (min-width: 1000px) {

  .craft-callout__image {
    margin-right: 80px;
  }
}

.craft-callout__image:before{
  content: "";
  display: block;
  padding-top: 100%;
}

.craft-callout__text{
  margin-bottom: 40px;
  text-align: center;
}

@media (min-width: 768px) {

  .craft-callout__text {
    margin-bottom: 0;
    text-align: left;
  }
}

.craft-callout__title{
  margin-bottom: 20px;
}

@media (min-width: 768px) {

  .craft-callout__title {
    margin-bottom: 40px;
  }
}

.craft-callout__headline{
  margin-bottom: 10px;
}

.craft-callout__desc + .craft-callout__headline{
  margin-top: 30px;
}

.craftmanship-image{
  position: relative;
}

.craftmanship-image:before{
  content: "";
  display: block;
  padding-top: 0;
  height: 250px;
}

@media (min-width: 620px) {

  .craftmanship-image:before {
    height: 0;
    padding-top: 40%;
  }
}

@media (min-width: 1440px) {

  .craftmanship-image:before {
    padding-top: 0;
    height: 500px;
  }
}

.cta-grid {
  padding: 40px 0 60px;
}

@media (min-width: 620px) {

  .cta-grid {
    padding: 50px 0 80px;
  }
}

@media (min-width: 1000px) {

  .cta-grid {
    padding: 60px 0 120px;
  }
}

@media (min-width: 1200px) {

  .cta-grid {
    padding: 80px 0 100px;
  }
}

.cta-grid__tagline {
  margin-bottom: 5px;
}

.cta-grid__featured {
  margin: 30px auto;
  max-width: 240px;
  width: 100%;
}

@media (min-width: 1000px) {

  .cta-grid__featured {
    margin: 40px auto 40px;
    max-width: 300px;
  }
}

@media (min-width: 1200px) {

  .cta-grid__featured {
    margin-bottom: 65px;
    margin-top: 55px;
  }
}

.cta-grid__featured::before {
  padding-bottom: calc(100/300 * 100%);
}

.cta-grid__subtitle {
  margin-bottom: 10px;
}

.cta-grid__wrapper {
  -webkit-box-align: center;
  -webkit-align-items: center;
      -ms-flex-align: center;
          align-items: center;
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-pack: center;
  -webkit-justify-content: center;
      -ms-flex-pack: center;
          justify-content: center;
  -webkit-flex-wrap: wrap;
      -ms-flex-wrap: wrap;
          flex-wrap: wrap;
  margin-top: 20px;
}

.cta-grid__btn {
  -webkit-box-flex: 0;
  -webkit-flex: 0 0 auto;
      -ms-flex: 0 0 auto;
          flex: 0 0 auto;
  margin-top: 15px;
  width: 100%;
}

@media (min-width: 445px) {

  .cta-grid__btn {
    margin: 20px 0 0 24px;
    width: calc(50% - 12px);
  }
}

.cta-grid__btn:first-child {
  margin-top: 10px;
}

@media (min-width: 445px) {

  .cta-grid__btn:first-child {
    margin-top: 20px;
  }
}

.cta-grid__btn:nth-child(2n+1) {
  margin-left: 0;
}

.divider {
  height: 1px;
  background-color: #e3e3e3;
}

@media (min-width: 768px) {

  .donation-free-eye-care {
    padding: 35px 0;
  }
}

@media (min-width: 1000px) {

  .donation-free-eye-care {
    padding: 100px 0;
  }
}

.donation-free-eye-care__container {
  -webkit-box-align: stretch;
  -webkit-align-items: stretch;
      -ms-flex-align: stretch;
          align-items: stretch;
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-orient: vertical;
  -webkit-box-direction: normal;
  -webkit-flex-direction: column;
      -ms-flex-direction: column;
          flex-direction: column;
}

@media (min-width: 1000px) {

  .donation-free-eye-care__container {
    -webkit-box-orient: horizontal;
    -webkit-box-direction: normal;
    -webkit-flex-direction: row;
        -ms-flex-direction: row;
            flex-direction: row;
  }
}

.donation-free-eye-care__block {
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-flex: 0;
  -webkit-flex: 0 0 auto;
      -ms-flex: 0 0 auto;
          flex: 0 0 auto;
  -webkit-box-orient: vertical;
  -webkit-box-direction: normal;
  -webkit-flex-direction: column;
      -ms-flex-direction: column;
          flex-direction: column;
  -webkit-box-pack: center;
  -webkit-justify-content: center;
      -ms-flex-pack: center;
          justify-content: center;
  padding: 40px 30px;
  position: relative;
}

@media (min-width: 620px) {

  .donation-free-eye-care__block {
    padding: 40px;
  }
}

@media (min-width: 1000px) {

  .donation-free-eye-care__block {
    padding: 70px;
  }
}

.donation-free-eye-care__block--content {
  -webkit-box-align: left;
  -webkit-align-items: left;
      -ms-flex-align: left;
          align-items: left;
  -webkit-box-ordinal-group: 3;
  -webkit-order: 2;
      -ms-flex-order: 2;
          order: 2;
}

@media (min-width: 768px) {

  .donation-free-eye-care__block--content {
    margin: auto;
    max-width: 500px;
  }
}

@media (min-width: 1000px) {

  .donation-free-eye-care__block--content {
    -webkit-box-ordinal-group: 2;
    -webkit-order: 1;
        -ms-flex-order: 1;
            order: 1;
    width: 40%;
  }
}

@media (min-width: 1200px) {

  .donation-free-eye-care__block--content {
    max-width: 700px;
  }
}

.donation-free-eye-care__block--image {
  -webkit-box-align: center;
  -webkit-align-items: center;
      -ms-flex-align: center;
          align-items: center;
  -webkit-box-flex: 2;
  -webkit-flex: 2 0 auto;
      -ms-flex: 2 0 auto;
          flex: 2 0 auto;
  -webkit-box-ordinal-group: 2;
  -webkit-order: 1;
      -ms-flex-order: 1;
          order: 1;
  overflow: hidden;
  max-width: auto;
}

@media (min-width: 768px) {

  .donation-free-eye-care__block--image {
    max-height: 480px;
  }
}

@media (min-width: 1000px) {

  .donation-free-eye-care__block--image {
    -webkit-box-ordinal-group: 3;
    -webkit-order: 2;
        -ms-flex-order: 2;
            order: 2;
    width: 60%;
  }
}

@media (min-width: 1200px) {

  .donation-free-eye-care__block--image {
    max-height: auto;
  }
}

.donation-free-eye-care__block--image::before {
  padding-bottom: calc(7/10 * 100%);
}

.donation-free-eye-care__block--image .img__el {
    padding: 20px;
}

@media (min-width: 1000px) {

  .donation-free-eye-care__block--image .img__el {
    padding: 0;
  }
}

.donation-free-eye-care__title {
  margin-bottom: 15px;
}

.donation-free-eye-care__text {
  margin: 20px 0;
  max-width: 490px;
}

.donation-free-eye-care__cta {
  display: block;
  width: 100%;
  text-align: center;
  margin-top: 15px;
}

@media (min-width: 768px) {

  .donation-free-eye-care__cta {
    width: 160px;
    padding: 0px;
  }
}

.no-touch .donation-free-eye-care__block__image {
    -webkit-transition: -webkit-transform 1s cubic-bezier(0.165, 0.84, 0.44, 1);
    transition: -webkit-transform 1s cubic-bezier(0.165, 0.84, 0.44, 1);
    -o-transition: transform 1s cubic-bezier(0.165, 0.84, 0.44, 1);
    transition: transform 1s cubic-bezier(0.165, 0.84, 0.44, 1);
    transition: transform 1s cubic-bezier(0.165, 0.84, 0.44, 1), -webkit-transform 1s cubic-bezier(0.165, 0.84, 0.44, 1);
  }

.no-touch .donation-free-eye-care__block--featured:hover .donation-free-eye-care__block__image {
        -webkit-transform: scale(1.05);
            -ms-transform: scale(1.05);
                transform: scale(1.05);
}

.donation-gallery .carousel-image {
    margin-bottom: 0;
  }

.donation-gallery__headline {
  width: calc(100% - 40px);
}

@media (min-width: 620px) {

  .donation-gallery__headline {
    width: calc(100% - 80px);
  }
}

.donation-gallery__title {
  -webkit-box-align: center;
  -webkit-align-items: center;
      -ms-flex-align: center;
          align-items: center;
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-pack: center;
  -webkit-justify-content: center;
      -ms-flex-pack: center;
          justify-content: center;
  margin-bottom: 10px;
}

@media (min-width: 620px) {

  .donation-gallery__title {
    margin-bottom: 15px;
  }
}

.donation-gallery__title .icon {
    height: 18px;
    width: 40px;
}

@media (min-width: 1000px) {

  .donation-gallery__title .icon {
    height: 30px;
    width: 68px;
  }
}

.donation-gallery__title .icon.icon--pointer-left {
  margin-right: 20px;
}

@media (min-width: 1000px) {

  .donation-gallery__title .icon.icon--pointer-left {
    margin-right: 50px;
  }
}

.donation-gallery__title .icon.icon--pointer-right {
  margin-left: 20px;
}

@media (min-width: 1000px) {

  .donation-gallery__title .icon.icon--pointer-right {
    margin-left: 50px;
  }
}

.text-image-2up__title {
  display: none;
}

.donation-logos {
  margin: auto;
  width: calc(100% - 40px);
}

@media (min-width: 620px) {

  .donation-logos {
    width: calc(100% - 80px);
  }
}

.donation-logos__title {
  -webkit-box-align: center;
  -webkit-align-items: center;
      -ms-flex-align: center;
          align-items: center;
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-pack: center;
  -webkit-justify-content: center;
      -ms-flex-pack: center;
          justify-content: center;
}

.donation-logos__title .icon {
    height: 18px;
    width: 40px;
  }

@media (min-width: 1000px) {

  .donation-logos__title .icon {
    height: 30px;
    width: 68px;
  }
}

.donation-logos__title .icon.icon--pointer-left {
  margin-right: 20px;
}

@media (min-width: 1000px) {

  .donation-logos__title .icon.icon--pointer-left {
    margin-right: 50px;
  }
}

.donation-logos__title .icon.icon--pointer-right {
  margin-left: 20px;
}

@media (min-width: 1000px) {

  .donation-logos__title .icon.icon--pointer-right {
    margin-left: 50px;
  }
}

.donation-logos__images {
  -webkit-box-align: center;
  -webkit-align-items: center;
      -ms-flex-align: center;
          align-items: center;
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  -webkit-justify-content: space-around;
      -ms-flex-pack: distribute;
          justify-content: space-around;
  margin: auto;
  max-width: 750px;
  width: 100%;
}

.donation-logos__images-item {
  width: calc(100% / 5);
}

.donation-logos__images-item img {
    max-width: 125px;
    margin: auto;
  }

.donation-old-glasses__container {
  -webkit-box-align: stretch;
  -webkit-align-items: stretch;
      -ms-flex-align: stretch;
          align-items: stretch;
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-orient: vertical;
  -webkit-box-direction: normal;
  -webkit-flex-direction: column;
      -ms-flex-direction: column;
          flex-direction: column;
}

@media (min-width: 768px) {

  .donation-old-glasses__container {
    -webkit-box-orient: horizontal;
    -webkit-box-direction: normal;
    -webkit-flex-direction: row;
        -ms-flex-direction: row;
            flex-direction: row;
  }
}

.donation-old-glasses__block {
  -webkit-box-align: stretch;
  -webkit-align-items: stretch;
      -ms-flex-align: stretch;
          align-items: stretch;
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-flex: 0;
  -webkit-flex: 0 0 auto;
      -ms-flex: 0 0 auto;
          flex: 0 0 auto;
  -webkit-box-orient: vertical;
  -webkit-box-direction: normal;
  -webkit-flex-direction: column;
      -ms-flex-direction: column;
          flex-direction: column;
  -webkit-box-pack: center;
  -webkit-justify-content: center;
      -ms-flex-pack: center;
          justify-content: center;
  padding: 0 30px 40px 30px;
  position: relative;
  width: 100%;
}

@media (min-width: 620px) {

  .donation-old-glasses__block {
    padding: 0 40px 40px;
  }
}

@media (min-width: 768px) {

  .donation-old-glasses__block {
    padding: 40px;
  }
}

@media (min-width: 1000px) {

  .donation-old-glasses__block {
    padding: 70px;
  }
}

@media (min-width: 768px) {

  .donation-old-glasses__block--content {
    width: 40%;
  }
}

.donation-old-glasses__block--featured {
  overflow: hidden
}

.donation-old-glasses__block--featured::before {
  padding-bottom: calc(400/720 * 100%);
}

.donation-old-glasses__block--featured .img {
    margin: auto;
    width: 70%;
}

@media (min-width: 768px) {

  .donation-old-glasses__block--featured {
    width: 60%;
  }
}

.donation-old-glasses__title {
  margin-bottom: 15px;
}

.donation-old-glasses__text-large {
  margin-bottom: 20px;
}

#shopify-section-donation-payment {
  padding: 0;
}

.donation-payment {
  padding: 50px 0;
}

@media (min-width: 620px) {

  .donation-payment {
    margin: 0;
    padding: 70px 0;
  }
}

.donation-payment__headline {
  margin-bottom: 20px;
}

@media (min-width: 620px) {

  .donation-payment__headline {
    margin-bottom: 70px;
  }
}

.donation-payment__title {
  -webkit-box-align: center;
  -webkit-align-items: center;
      -ms-flex-align: center;
          align-items: center;
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-pack: center;
  -webkit-justify-content: center;
      -ms-flex-pack: center;
          justify-content: center;
  margin-bottom: 15px; 
}

.donation-payment__title .icon {
    height: 18px;
    width: 40px;
  }

@media (min-width: 1000px) {

  .donation-payment__title .icon {
    height: 30px;
    width: 68px;
  }
}

.donation-payment__title .icon.icon--pointer-left {
  margin-right: 20px;
}

@media (min-width: 1000px) {

  .donation-payment__title .icon.icon--pointer-left {
    margin-right: 50px;
  }
}

.donation-payment__title .icon.icon--pointer-right {
  margin-left: 20px;
}

@media (min-width: 1000px) {

  .donation-payment__title .icon.icon--pointer-right {
    margin-left: 50px;
  }
}

.donation-payment__hero {
  -webkit-box-align: stretch;
  -webkit-align-items: stretch;
      -ms-flex-align: stretch;
          align-items: stretch; 
  display: -webkit-box; 
  display: -webkit-flex; 
  display: -ms-flexbox; 
  display: flex;
  -webkit-box-orient: vertical;
  -webkit-box-direction: normal;
  -webkit-flex-direction: column;
      -ms-flex-direction: column;
          flex-direction: column;
  -webkit-box-pack: center;
  -webkit-justify-content: center;
      -ms-flex-pack: center;
          justify-content: center;
  position: relative;
  text-align: center;
}

.donation-payment__hero .product-option-selector {
    margin-bottom: 15px;
    max-width: 100%;
  }

@media (min-width: 620px) {

  .donation-payment__hero .product-option-selector {
    width: 160px;
  }
}

.donation-payment__hero__content {
  -webkit-box-align: center;
  -webkit-align-items: center;
      -ms-flex-align: center;
          align-items: center;
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-orient: vertical;
  -webkit-box-direction: normal;
  -webkit-flex-direction: column;
      -ms-flex-direction: column;
          flex-direction: column;
  margin: 0 auto;
  -webkit-box-ordinal-group: 2;
  -webkit-order: 1;
      -ms-flex-order: 1;
          order: 1;
  padding: 20px 0 0;
}

@media (min-width: 620px) {

  .donation-payment__hero__content {
    height: 350px;
    left: 50%;
    margin-left: calc(-475px / 2);
    margin-top: calc(-350px / 2);
    padding: 50px 57px;
    position: absolute;
    top: 50%;
    width: 475px;
    z-index: 10;
  }
}

.donation-payment__hero-title {
  margin-bottom: 15px;
}

.donation-payment__hero-text {
  margin-bottom: 15px;
  text-align: center;
}

.donation-payment__hero-cta {
  display: block;
  margin: auto;
  text-align: center;
  width: 100%;
}

@media (min-width: 620px) {

  .donation-payment__hero-cta {
    width: 160px;
    padding: 0px;
  }
}

.donation-payment__hero__background {
  max-height: 720px;
  -webkit-box-ordinal-group: 1;
  -webkit-order: 0;
      -ms-flex-order: 0;
          order: 0;
  width: 100%;
}

@media (min-width: 620px) {

  .donation-payment__hero__background {
    -webkit-box-ordinal-group: 2;
    -webkit-order: 1;
        -ms-flex-order: 1;
            order: 1;
  }
}

.donation-payment__hero__background::before {
  padding-bottom: calc(158/235 * 100%);
}

@media (min-width: 620px) {

  .donation-payment__hero__background::before {
    padding-bottom: calc(400/600 * 100%);
  }
}

@media (min-width: 1000px) {

  .donation-payment__hero__background::before {
    padding-bottom: calc(580/1000 * 100%);
  }
}

@media (min-width: 1200px) {

  .donation-payment__hero__background::before {
    padding-bottom: calc(630/1440 * 100%);
  }
}

.donation-payment__hero__background::after {
  background-color: rgba(0, 0, 0, 0.1);
  content: '';
  height: 100%;
  left: 0;
  position: absolute;
  top: 0;
  width: 100%;
  z-index: 9;
}

.donation-quote{}

.empty-view {
  margin: 20px 0 40px;
  padding: 20px 25px;
}

@media (min-width: 840px) {

  .empty-view {
    margin-top: 40px;
    padding: 50px;
  }
}

.empty-view__title{
  margin-bottom: 25px;
}

@media (min-width: 840px) {

  .empty-view__title {
    margin-bottom: 30px;
  }
}

.empty-view__image {
  width: 100%;
  max-width: 135px;
  margin: 0 auto 25px;
}

@media (min-width: 840px) {

  .empty-view__image {
    max-width: 180px;
    margin-bottom: 35px;
  }
}

.empty-view__image:before {
  padding-top: 88.88888889%;
}

@media (min-width: 840px) {

  .empty-view__image:before {
    padding-top: 61.11111111%;
  }
}

.empty-view__button {
  display: inline-block;
}

@media (min-width: 840px) {

  .empty-view__button {
    min-width: 250px;
  }
}

.event-countdown {
  margin-bottom: 40px;
}

.event-countdown__wrapper {
  background: #fff9e7;
}

.event-countdown__inner {
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-orient: vertical;
  -webkit-box-direction: normal;
  -webkit-flex-direction: column;
      -ms-flex-direction: column;
          flex-direction: column;
  padding: 30px 20px;
  text-align: center;
}

@media (min-width: 620px) {

  .event-countdown__inner {
    padding: 40px 30px;
  }
}

@media (min-width: 1000px) {

  .event-countdown__inner {
    padding: 40px;
    -webkit-box-orient: horizontal;
    -webkit-box-direction: normal;
    -webkit-flex-direction: row;
        -ms-flex-direction: row;
            flex-direction: row;
  }
}

@media (min-width: 1440px) {

  .event-countdown__inner {
    width: 83.33333333%;
    margin: 0 auto;
  }
}

.event-countdown__image {
  display: none;
  position: relative;
  width: 100%;
}

@media (min-width: 1440px) {

  .event-countdown__image {
    display: block;
    max-width: 140px;
    margin-right: 50px;
  }
}

.event-countdown__image:before {
  content: '';
  display: block;
  padding-top: 77%;
}

.event-countdown__description {
  margin-top: 10px;
}

@media (min-width: 1000px) {

  .event-countdown__top {
    width: 40%;
  }
}

@media (min-width: 1440px) {

  .event-countdown__top {
    width: 50%;
    display: -webkit-box;
    display: -webkit-flex;
    display: -ms-flexbox;
    display: flex;
    -webkit-box-align: center;
    -webkit-align-items: center;
        -ms-flex-align: center;
            align-items: center;
  }
}

@media (min-width: 1000px) {

  .event-countdown__content {
    text-align: left;
    padding-right: 20px;
  }
}

.event-countdown__bottom {
  margin-top: 20px;
}

@media (min-width: 620px) {

  .event-countdown__bottom {
    display: -webkit-box;
    display: -webkit-flex;
    display: -ms-flexbox;
    display: flex;
    -webkit-box-align: center;
    -webkit-align-items: center;
        -ms-flex-align: center;
            align-items: center;
    -webkit-justify-content: space-around;
        -ms-flex-pack: distribute;
            justify-content: space-around;
  }
}

@media (min-width: 1000px) {

  .event-countdown__bottom {
    width: 60%;
    margin: 0;
  }
}

@media (min-width: 1440px) {

  .event-countdown__bottom {
    width: 50%;
  }
}

@media (min-width: 1000px) {

  .event-countdown__clock {
    padding-right: 20px;
  }
}

.event-countdown__cta {
  display: inline-block;
  max-width: 200px;
  margin: 20px auto 0;
}

@media (min-width: 620px) {

  .event-countdown__cta {
    margin: 18px 0 0;
  }
}

.footer {
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-orient: vertical;
  -webkit-box-direction: normal;
  -webkit-flex-direction: column;
      -ms-flex-direction: column;
          flex-direction: column;
  overflow: hidden;
  width: 100%;
}

.is-checkout .footer {
    display: none;
  }

.footer-main {
  background-color: #fdd007;
  -webkit-box-ordinal-group: 4;
  -webkit-order: 3;
      -ms-flex-order: 3;
          order: 3;
}

@media (min-width: 1000px) {

  .footer-main {
    -webkit-box-ordinal-group: 3;
    -webkit-order: 2;
        -ms-flex-order: 2;
            order: 2;
    padding-top: 60px;
  }
}

.footer-main__holder {
  -webkit-box-align: stretch;
  -webkit-align-items: stretch;
      -ms-flex-align: stretch;
          align-items: stretch;
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-orient: vertical;
  -webkit-box-direction: normal;
  -webkit-flex-direction: column;
      -ms-flex-direction: column;
          flex-direction: column;
}

@media (min-width: 1000px) {

  .footer-main__holder {
    -webkit-box-orient: horizontal;
    -webkit-box-direction: normal;
    -webkit-flex-direction: row;
        -ms-flex-direction: row;
            flex-direction: row;
  }
}

.footer-links {
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-flex: 0;
  -webkit-flex: 0 0 auto;
      -ms-flex: 0 0 auto;
          flex: 0 0 auto;
  -webkit-flex-wrap: wrap;
      -ms-flex-wrap: wrap;
          flex-wrap: wrap;
  -webkit-box-pack: justify;
  -webkit-justify-content: space-between;
      -ms-flex-pack: justify;
          justify-content: space-between;
  -webkit-box-ordinal-group: 3;
  -webkit-order: 2;
      -ms-flex-order: 2;
          order: 2;
}

@media (min-width: 620px) {

  .footer-links {
    -webkit-flex-wrap: nowrap;
        -ms-flex-wrap: nowrap;
            flex-wrap: nowrap;
    -webkit-box-pack: center;
    -webkit-justify-content: center;
        -ms-flex-pack: center;
            justify-content: center;
  }
}

@media (min-width: 1000px) {

  .footer-links {
    -webkit-box-pack: justify;
    -webkit-justify-content: space-between;
        -ms-flex-pack: justify;
            justify-content: space-between;
    -webkit-box-ordinal-group: 2;
    -webkit-order: 1;
        -ms-flex-order: 1;
            order: 1;
    padding: 50px 40px 50px 0;
    width: 50%;
  }
}

@media (min-width: 1200px) {

  .footer-links {
    padding-right: 50px;
  }
}

.footer-links__list {
  margin-left: 40px;
  width: calc(50% - 20px);
}

@media (min-width: 620px) {

  .footer-links__list {
    margin-left: 80px;
    width: auto;
  }
}

@media (min-width: 1000px) {

  .footer-links__list {
    margin-left: 20px;
  }
}

@media (min-width: 1200px) {

  .footer-links__list {
    width: 150px;
  }
}

.footer-links__list:first-child {
  margin-left: 0;
}

.footer-links__list:last-child {
  margin-left: 0;
  margin-top: 15px;
}

@media (min-width: 620px) {

  .footer-links__list:last-child {
    margin-left: 80px;
    margin-top: 0;
  }
}

@media (min-width: 1000px) {

  .footer-links__list:last-child {
    margin-left: 20px;
  }
}

.footer-links__item {
  margin-top: 2px;
}

.footer-links__item--title {
  margin-bottom: 8px;
  margin-top: 0;
}

.footer-contacts {
  -webkit-box-align: center;
  -webkit-align-items: center;
      -ms-flex-align: center;
          align-items: center;
  border-bottom: 1px solid rgba(0, 0, 0, 0.3);
  border-top: 1px solid rgba(0, 0, 0, 0.3);
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-flex: 0;
  -webkit-flex: 0 0 auto;
      -ms-flex: 0 0 auto;
          flex: 0 0 auto;
  -webkit-box-orient: vertical;
  -webkit-box-direction: normal;
  -webkit-flex-direction: column;
      -ms-flex-direction: column;
          flex-direction: column;
  -webkit-box-pack: center;
  -webkit-justify-content: center;
      -ms-flex-pack: center;
          justify-content: center;
  margin-bottom: 30px;
  -webkit-box-ordinal-group: 2;
  -webkit-order: 1;
      -ms-flex-order: 1;
          order: 1;
  padding: 30px 0;
}

@media (min-width: 1000px) {

  .footer-contacts {
    border-bottom: none;
    border-left: 1px solid #000000;
    border-top: none;
    margin: 0;
    -webkit-box-ordinal-group: 3;
    -webkit-order: 2;
        -ms-flex-order: 2;
            order: 2;
    padding: 40px 0 40px 40px;
    width: 50%;
  }
}

@media (min-width: 1200px) {

  .footer-contacts {
    padding-left: 50px;
  }
}

.footer-contacts .contacts-info__list {
    -webkit-box-orient: vertical;
    -webkit-box-direction: normal;
    -webkit-flex-direction: column;
        -ms-flex-direction: column;
            flex-direction: column;
    -webkit-box-align: center;
    -webkit-align-items: center;
        -ms-flex-align: center;
            align-items: center;
}

@media (min-width: 620px) {

  .footer-contacts .contacts-info__list {
    -webkit-box-orient: horizontal;
    -webkit-box-direction: normal;
    -webkit-flex-direction: row;
        -ms-flex-direction: row;
            flex-direction: row;
  }
}

.footer-contacts .contacts-info__item {
    margin-left: 0;
    margin-top: 15px;
}

@media (min-width: 620px) {

  .footer-contacts .contacts-info__item {
    margin-left: 20px;
    margin-top: 0;
  }
}

.footer-contacts .contacts-info__item:first-child {
  margin-left: 0;
  margin-top: 0;
}

.footer-contacts__title {
  margin-bottom: 8px;
}

@media (min-width: 620px) {

  .footer-contacts__title {
    margin-bottom: 15px;
  }
}

.footer-contacts__content {
  margin: 0 auto 30px;
  max-width: 410px;
}

.footer-socials {
  margin: 30px 0;
  -webkit-box-ordinal-group: 3;
  -webkit-order: 2;
      -ms-flex-order: 2;
          order: 2;
}

@media (min-width: 1000px) {

  .footer-socials {
    margin: 40px 0;
    -webkit-box-ordinal-group: 4;
    -webkit-order: 3;
        -ms-flex-order: 3;
            order: 3;
  }
}

.footer-bottom {
  margin: 50px 0 20px;
  -webkit-box-ordinal-group: 5;
  -webkit-order: 4;
      -ms-flex-order: 4;
          order: 4;
}

@media (min-width: 1000px) {

  .footer-bottom {
    margin-top: 0;
  }
}

.footer-bottom__container {
  -webkit-box-align: center;
  -webkit-align-items: center;
      -ms-flex-align: center;
          align-items: center;
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-pack: center;
  -webkit-justify-content: center;
      -ms-flex-pack: center;
          justify-content: center;
}

.footer-bottom__list {
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
}

.footer-bottom__item {
  margin-left: 15px
}

.footer-bottom__item:first-child {
  margin-left: 0;
}

.glass-frames__item {
  margin-top: 40px;
}

@media (min-width: 840px) {

  .glass-frames__item {
    display: -webkit-box;
    display: -webkit-flex;
    display: -ms-flexbox;
    display: flex;
    -webkit-box-align: center;
    -webkit-align-items: center;
        -ms-flex-align: center;
            align-items: center;
  }

  .glass-frames__item:first-child {
    margin-top: 0;
  }
}

@media (min-width: 840px) {

  .glass-frames__left, .glass-frames__right {
    width: 50%;
  }
}

.glass-frames__left .glass-frames__left-wrapper {
  text-align: center;
}

@media (min-width: 840px) {

  .glass-frames__left .glass-frames__left-wrapper {
    width: 80%;
    margin: 0 auto;
  }
}

.glass-frames__title {
  text-align: center;
}

.glass-frames__title--desktop {
  display: none;
}

@media (min-width: 840px) {

  .glass-frames__title--desktop {
    display: block;
    text-align: left;
  }
}

.glass-frames__title--mobile {
  display: block;
}

@media (min-width: 840px) {

  .glass-frames__title--mobile {
    display: none;
  }
}

.glass-frames__image {
  display: inline-block;
  margin-top: 17px;
  max-width: 100%;
}

.glass-frames__image img {
  display: inline-block;
  max-width: 100%;
  margin: 0 auto;
}

.glass-frames__size {
  position: relative;
  text-align: center;
  margin-top: 10px
}

.glass-frames__size:before, .glass-frames__size:after {
  content: '';
  position: absolute;
  z-index: 1;
  top: 50%;
  left: 0;
}

.glass-frames__size:after {
  -webkit-transform: translate3d(0, -50%, 0);
          transform: translate3d(0, -50%, 0);
  height: 6px;
  width: calc(100% - 2px);
  border-left: 1px solid #000000;
  border-right: 1px solid #000000;
}

.glass-frames__size:before {
  -webkit-transform: translate3d(0, -50%, 0);
          transform: translate3d(0, -50%, 0);
  height: 1px;
  width: 100%;
  background: #000000;
}

.glass-frames__size span {
    position: relative;
    z-index: 2;
    display: inline-block;
    padding: 0 5px;
    background: #ffffff;
}

.glass-frames__description, .glass-frames__cta {
  text-align: center;
  margin-top: 15px;
}

@media (min-width: 840px) {

  .glass-frames__description, .glass-frames__cta {
    text-align: left;
  }
}

.glass-frames__cta > a {
  text-transform: uppercase;
  text-decoration: underline
}

.glass-frames__cta > a:first-child {
  margin-right: 20px;
}

.alert {
  background-color: #000000;
  border-radius: 4px;
}

.alert__message {}

.alert__icon {
  font-size: 0;
}

.alert__icon svg {
    height: 1.5rem;
    width: 1.5rem;
    color: $c1;
  }

.header-autocomplete {
  background: #000000;
  border: 1px solid rgba(255, 255, 255, 0.2);
  margin: 0 auto;
  -webkit-box-ordinal-group: 1;
  -webkit-order: 0;
      -ms-flex-order: 0;
          order: 0;
  width: calc(100% - 40px);
}

@media (min-width: 620px) {

  .header-autocomplete {
    width: calc(100% - 80px);
  }
}

@media (min-width: 1090px) {

  .header-autocomplete {
    background: #ffffff;
    border: none;
    -webkit-box-shadow: 0 3px 10px -6px rgba(0, 0, 0, 0.5);
            box-shadow: 0 3px 10px -6px rgba(0, 0, 0, 0.5);
    display: none;
    margin: 0 0 0 auto;
    opacity: 0;
    -webkit-transform: translateY(10px);
        -ms-transform: translateY(10px);
            transform: translateY(10px);
    -webkit-transition: all 200ms ease-in-out;
    -o-transition: all 200ms ease-in-out;
    transition: all 200ms ease-in-out;
    visibility: hidden;
    width: 520px;
  }
}

.header-autocomplete .text-input--default .text-input__input-wrap {
    border: 0;
    padding: 12px 14px;
}

@media (min-width: 1090px) {

  .header-autocomplete .text-input--default .text-input__input-wrap {
    padding: 20px 30px;
  }
}

.header-autocomplete.header-autocomplete--active {
  opacity: 1;
  visibility: visible;
  -webkit-transform: translateY(0);
      -ms-transform: translateY(0);
          transform: translateY(0);
}

@media (min-width: 768px) {

  .header-autocomplete {
    display: block;
  }
}

.header-autocomplete__input {
  padding-top: 0 !important;
  margin-left: 25px;
  color: #ffffff;
}

@media (min-width: 1090px) {

  .header-autocomplete__input {
    color: #000000;
    margin-left: 30px;
  }
}

.header-autocomplete__icon-search {
  display: block;
  position: absolute;
  top: 50%;
  -webkit-transform: translate3d(0, -50%, 0);
          transform: translate3d(0, -50%, 0);
  height: 13px;
  width: 13px;
}

@media (min-width: 1090px) {

  .header-autocomplete__icon-search {
    height: 18px;
    width: 18px;
  }
}

.header-autocomplete__icon-search .icon {
    color: #ffffff;
}

@media (min-width: 1090px) {

  .header-autocomplete__icon-search .icon {
    color: #000000;
  }
}

.header-autocomplete__results-wrap {
  background-color: #ffffff;
  padding: 20px;
  position: absolute;
  width: 100%;
  z-index: 2;
  /* display: none; */
}

@media (min-width: 1090px) {

  .header-autocomplete__results-wrap {
    display: block;
    border-top: 1px solid rgba(0, 0, 0, 0.1);
    padding: 30px 70px;
    position: relative;
  }
}

.header-autocomplete__featured {
  -webkit-box-align: center;
  -webkit-align-items: center;
      -ms-flex-align: center;
          align-items: center;
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  position: relative;
}

.header-autocomplete__image {
  display: block;
  margin-right: 20px;
  width: 95px;
  min-width: 95px;
}

@media (min-width: 1090px) {

  .header-autocomplete__image {
    width: 115px;
    min-width: 115px;
  }
}

.header-autocomplete__image:before {
  padding-top: 85%;
}

.header-autocomplete__title {
  color: #000000;
}

.header-autocomplete__result:not(:last-child) {
  margin-bottom: 15px;
}

.header-autocomplete__footer {
  padding-top: 30px;
  text-transform: uppercase;
  text-align: center;
  color: #000000;
  text-decoration: underline;
}

.header-autocomplete__results-empty {
  color: #000000;
}

.header-autocomplete__result {
  border-bottom:1px solid #e7e7e7;
  padding-bottom:10px;
}

/**
 * Mobile nav wrapper
 */

.nav__mobile {
  opacity: 0;
  overflow: auto;
  -webkit-overflow-scrolling: touch;
  -webkit-transform: translateY(-200%);
      -ms-transform: translateY(-200%);
          transform: translateY(-200%); // push out of the way
  transition: opacity 200ms ease-in-out;
}

@media (min-width: 768px) {

  .nav__mobile {
    display: none;
  }
}

/* *
   * Classes added to body */

.mobile-nav-is-active .nav__mobile {
    -webkit-transform: translateY(0);
        -ms-transform: translateY(0);
            transform: translateY(0);
    opacity: 1;
}

.mobile-nav-is-hiding .nav__mobile {
    opacity: 0;
}

/**
 * <li> menu
 */

.nav__mobile__item {
  border-bottom: 1px solid #000000
}

.nav__mobile__item:last-child {
  border: 0;
}

.nav__mobile__submenu {
  padding-left: 1em;
}

.header {
  position: relative;
  width: 100% !important;
  z-index: 999;
}

.header-main {
  background-color: #000000;
  color: #ffffff;
  width: 100%;
}

@media (min-width: 1090px) {

  .header-main {
    background-color: #fdd007;
    color: #000000;
    position: relative !important;
    top: auto !important;
    left: 0 !important;
  }
}

.header-main__container {
  -webkit-box-align: center;
  -webkit-align-items: center;
      -ms-flex-align: center;
          align-items: center;
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-pack: center;
  -webkit-justify-content: center;
      -ms-flex-pack: center;
          justify-content: center;
  padding: 20px 0;
}

@media (min-width: 1090px) {

  .header-main__container {
    padding: 37px 0;
    width: calc(100% - 80px);
  }
}

@media (min-width: 1200px) {

  .header-main__container {
    padding: 30px 0;
    width: calc(100% - 100px);
  }
}

.header-main__logo {
  -webkit-box-align: center;
  -webkit-align-items: center;
      -ms-flex-align: center;
          align-items: center;
  color: #fdd007;
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-orient: vertical;
  -webkit-box-direction: normal;
  -webkit-flex-direction: column;
      -ms-flex-direction: column;
          flex-direction: column
}

.header-main__logo:focus {
  outline: -webkit-focus-ring-color auto 5px;
}

@media (min-width: 1090px) {

  .header-main__logo {
    color: #000000;
  }
}

.header-main__logo__main {
  height: 25px;
  width: 128px;
}

@media (min-width: 1090px) {

  .header-main__logo__main {
    height: 40px;
    width: 225px;
  }
}

@media (min-width: 1200px) {

  .header-main__logo__main {
    height: 50px;
    width: 280px;
  }
}

.header-main__logo__subtitle {
  display: none;
}

@media (min-width: 1090px) {

  .header-main__logo__subtitle {
    display: block;
    height: 10px;
    margin-top: 10px;
    width: 340px;
  }
}

@media (min-width: 1200px) {

  .header-main__logo__subtitle {
    height: 12px;
    margin-top: 12px;
    width: 425px;
  }
}

.header-main__btn-mobile {
  display: block;
  left: 0;
  position: absolute;
  top: 50%;
  -webkit-transform: translateY(-50%);
      -ms-transform: translateY(-50%);
          transform: translateY(-50%)
}

.header-main__btn-mobile:focus {
  outline: -webkit-focus-ring-color auto 5px;
}

@media (min-width: 1090px) {

  .header-main__btn-mobile {
    display: none;
  }
}

.header-main__btn-mobile.is-active .header-main__icon-search--mobile {
      -webkit-transform: rotate(45deg);
          -ms-transform: rotate(45deg);
              transform: rotate(45deg);
      opacity: 0;
      visibility: hidden;
}

.header-main__btn-mobile.is-active .header-main__hamburger::after {
  -webkit-transform: translateY(-7px) rotate(45deg);
      -ms-transform: translateY(-7px) rotate(45deg);
          transform: translateY(-7px) rotate(45deg);
}

.header-main__btn-mobile.is-active .header-main__hamburger::before {
  -webkit-transform: translateY(7px) rotate(-45deg);
      -ms-transform: translateY(7px) rotate(-45deg);
          transform: translateY(7px) rotate(-45deg);
}

.header-main__btn-mobile.is-active .header-main__hamburger .header-main__hamburger__el {
        opacity: 0;
}

.is-checkout .header-main__btn-mobile {
    display: none;
}

.header-main__hamburger::after, .header-main__hamburger::before, .header-main__hamburger .header-main__hamburger__el {
    background-color: #ffffff;
    display: block;
    height: 2px;
    width: 17px;
  }

.header-main__hamburger::after, .header-main__hamburger::before {
  content: '';
  -webkit-transition: -webkit-transform 200ms ease-in-out;
  transition: -webkit-transform 200ms ease-in-out;
  -o-transition: transform 200ms ease-in-out;
  transition: transform 200ms ease-in-out;
  transition: transform 200ms ease-in-out, -webkit-transform 200ms ease-in-out;
  -webkit-transform-origin: center;
      -ms-transform-origin: center;
          transform-origin: center;
}

.header-main__hamburger .header-main__hamburger__el {
    margin: 5px 0;
    -webkit-transition-duration: 200ms;
         -o-transition-duration: 200ms;
            transition-duration: 200ms;
    -webkit-transition-property: opacity, visibility;
    -o-transition-property: opacity, visibility;
    transition-property: opacity, visibility;
    -webkit-transition-timing-function: ease-in-out;
         -o-transition-timing-function: ease-in-out;
            transition-timing-function: ease-in-out;
}

.header-main__icon-search--mobile {
  pointer-events: none;
  display: block;
  height: 20px;
  left: 8px;
  position: absolute;
  top: -2px;
  -webkit-transition-duration: 200ms;
       -o-transition-duration: 200ms;
          transition-duration: 200ms;
  -webkit-transform-origin: bottom right;
      -ms-transform-origin: bottom right;
          transform-origin: bottom right;
  -webkit-transition-property: opacity, visibility, -webkit-transform;
  transition-property: opacity, visibility, -webkit-transform;
  -o-transition-property: opacity, transform, visibility;
  transition-property: opacity, transform, visibility;
  transition-property: opacity, transform, visibility, -webkit-transform;
  -webkit-transition-timing-function: ease-in-out;
       -o-transition-timing-function: ease-in-out;
          transition-timing-function: ease-in-out;
  width: 20px;
}

.header-menu__list {
  color: #ffffff;
  margin: 30px 20px 0;
  -webkit-box-ordinal-group: 3;
  -webkit-order: 2;
      -ms-flex-order: 2;
          order: 2;
}

@media (min-width: 620px) {

  .header-menu__list {
    margin-left: 40px;
    margin-rights: 40px;
  }
}

@media (min-width: 1000px) {

  .header-menu__list {
    margin-left: 60px;
    margin-rights: 60px;
  }
}

@media (min-width: 1090px) {

  .header-menu__list {
    -webkit-box-align: center;
    -webkit-align-items: center;
        -ms-flex-align: center;
            align-items: center;
    bottom: calc(100% + 85px);
    color: #000000;
    display: -webkit-box;
    display: -webkit-flex;
    display: -ms-flexbox;
    display: flex;
    margin: 0;
    position: absolute;
    right: 90px;
    -webkit-transition: color 200ms ease-in-out;
    -o-transition: color 200ms ease-in-out;
    transition: color 200ms ease-in-out;
  }
}

@media (min-width: 1200px) {

  .header-menu__list {
    right: 95px;
  }
}

.is-checkout .header-menu__list {
    display: none;
}

.header-menu__item {
  margin-bottom: 10px;
}

@media (min-width: 1090px) {

  .header-menu__item {
    display: block;
    margin-bottom: 0;
    margin-left: 14px;
  }
}

@media (min-width: 1090px) {

  .header-menu__item:first-child {
    margin-bottom: 0;
    margin-left: 0;
  }
}

.header-menu__item:last-child {
  margin-bottom: 0;
}

.header-menu__item .dropdown {
    max-width: 100px;
}

@media (min-width: 1090px) {

  .header-menu__item .dropdown {
    direction: rtl;
    max-width: 40px;
  }
}

.header-menu__icon-search, .header-menu__icon-close {
  display: none;
}

@media (min-width: 1090px) {

  .header-menu__icon-search, .header-menu__icon-close {
    display: block;
    height: 15px;
    width: 15px;
  }
}

.header-nav {
  background-color: #000000;
  height: 0;
  overflow-y: scroll;
  position: fixed;
  -webkit-overflow-scrolling: touch;
  width: 100%;
  z-index: 999;
}

@media (min-width: 1090px) {

  .header-nav {
    height: 60px !important;
    overflow-y: visible;
    position: absolute;
    -webkit-transition: height 200ms ease-in-out;
    -o-transition: height 200ms ease-in-out;
    transition: height 200ms ease-in-out;
  }
}

.header-nav.is-animated {
  -webkit-transition: height 200ms ease-in-out;
  -o-transition: height 200ms ease-in-out;
  transition: height 200ms ease-in-out;
}

@media (min-width: 1090px) {

  .header-nav.is-sticky {
    height: 90px !important;
  }
}

@media (min-width: 1000px) {

  .header-nav.is-sticky .header-nav__logo {
    opacity: 1;
    -webkit-transform: translate(0, -50%);
        -ms-transform: translate(0, -50%);
            transform: translate(0, -50%);
    -webkit-transition-delay: 200ms;
         -o-transition-delay: 200ms;
            transition-delay: 200ms;
  }
}

@media (min-width: 1090px) {

  .header-nav.is-sticky .header-menu__list {
    color: #ffffff;
    position: fixed;
    right: 95px;
    top: 45px;
  }
}

@media (min-width: 1090px) {

  .header-nav.is-sticky + .header-cart {
    color: #ffffff;
    position: fixed;
    right: 50px;
    top: 35px;
  }
}

.header-nav.is-sticky + .header-cart .header-cart__count {
        background-color: #fdd007;
}

.is-checkout .header-nav {
    display: none;
}

.header-nav__container {
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-orient: vertical;
  -webkit-box-direction: normal;
  -webkit-flex-direction: column;
      -ms-flex-direction: column;
          flex-direction: column;
  padding-bottom: 30px;
}

@media (min-width: 1090px) {

  .header-nav__container {
    display: block;
    height: 100%;
    padding-bottom: 0;
  }
}

.header-nav__logo {
  display: none;
}

@media (min-width: 1090px) {

  .header-nav__logo {
    display: block;
    height: 21px;
    left: 40px;
    opacity: 0;
    position: absolute;
    top: 50%;
    -webkit-transform: translate(0, calc(-30%));
        -ms-transform: translate(0, calc(-30%));
            transform: translate(0, calc(-30%));
    -webkit-transition-duration: 200ms;
         -o-transition-duration: 200ms;
            transition-duration: 200ms;
    -webkit-transition-property: opacity, -webkit-transform;
    transition-property: opacity, -webkit-transform;
    -o-transition-property: opacity, transform;
    transition-property: opacity, transform;
    transition-property: opacity, transform, -webkit-transform;
    -webkit-transition-timing-function: ease-in-out;
         -o-transition-timing-function: ease-in-out;
            transition-timing-function: ease-in-out;
    width: 113px;
    z-index: 9;
  }
}

@media (min-width: 1200px) {

  .header-nav__logo {
    height: 32px;
    left: 50px;
    width: 172px;
  }
}

.header-nav__search {
  margin: 0 auto;
  width: calc(100% - 40px);
}

@media (min-width: 620px) {

  .header-nav__search {
    width: calc(100% - 80px);
  }
}

@media (min-width: 1090px) {

  .header-nav__search {
    display: none;
  }
}

.header-nav__search__field {
  border: 1px solid rgba(255, 255, 255, 0.3);
  padding: 12px 10px;
  width: 100%;
}

.header-nav__list {
  -webkit-box-ordinal-group: 2;
  -webkit-order: 1;
      -ms-flex-order: 1;
          order: 1;
}

@media (min-width: 1090px) {

  .header-nav__list {
    -webkit-box-align: center;
    -webkit-align-items: center;
        -ms-flex-align: center;
            align-items: center;
    display: -webkit-box;
    display: -webkit-flex;
    display: -ms-flexbox;
    display: flex;
    height: 100%;
    -webkit-box-pack: center;
    -webkit-justify-content: center;
        -ms-flex-pack: center;
            justify-content: center;
    position: relative;
  }
}

@media (min-width: 1090px) {

  .header-nav__item {
    -webkit-box-align: center;
    -webkit-align-items: center;
        -ms-flex-align: center;
            align-items: center;
    display: -webkit-box;
    display: -webkit-flex;
    display: -ms-flexbox;
    display: flex;
    height: 100%;
  }
}

.header-nav__link {
  border-bottom: 1px solid rgba(255, 255, 255, 0.2);
  display: block;
  letter-spacing: 1px;
  margin: 0 20px;
  padding: 15px 0;
  position: relative;
  -webkit-transition: color 200ms ease-in-out;
  -o-transition: color 200ms ease-in-out;
  transition: color 200ms ease-in-out;
}

@media (min-width: 620px) {

  .header-nav__link {
    margin: 0 40px;
  }
}

@media (min-width: 1000px) {

  .header-nav__link {
    margin: 0 60px;
  }
}

@media (min-width: 1090px) {

  .header-nav__link {
    -webkit-box-align: center;
    -webkit-align-items: center;
        -ms-flex-align: center;
            align-items: center;
    border-bottom: none;
    display: -webkit-box;
    display: -webkit-flex;
    display: -ms-flexbox;
    display: flex;
    margin: 0 15px;
    padding: 0;
    -webkit-transition: padding 200ms ease-in-out;
    -o-transition: padding 200ms ease-in-out;
    transition: padding 200ms ease-in-out;
  }
}

@media (min-width: 1090px) {

  .header-nav__link::after {
    background-color: currentColor;
    bottom: -1px;
    content: '';
    height: 1px;
    left: auto;
    right: 0;
    position: absolute;
    -webkit-transition: width 200ms ease-in-out;
    -o-transition: width 200ms ease-in-out;
    transition: width 200ms ease-in-out;
    width: 0;
  }
}

.header-nav__link.is-active {
  color: #fdd007;
}

@media (min-width: 1090px) {

  .header-nav__link.is-active::after {
    left: 0;
    right: auto;
    width: 100%;
  }
}

@media (min-width: 1090px) {

  .header-nav__link.is-active .header-nav__icon--arrow-down {
    -webkit-transform: rotate(180deg);
        -ms-transform: rotate(180deg);
            transform: rotate(180deg);
  }
}

.header-nav__icon--arrow-down {
  display: none;
  pointer-events: none;
}

@media (min-width: 1090px) {

  .header-nav__icon--arrow-down {
    display: inline-block;
    height: 5px;
    margin-left: 8px;
    -webkit-transform-origin: center;
        -ms-transform-origin: center;
            transform-origin: center;
    -webkit-transition: -webkit-transform 200ms ease-in-out;
    transition: -webkit-transform 200ms ease-in-out;
    -o-transition: transform 200ms ease-in-out;
    transition: transform 200ms ease-in-out;
    transition: transform 200ms ease-in-out, -webkit-transform 200ms ease-in-out;
    width: 8px;
  }
}

.header-cart {
  bottom: 20px;
  color: #ffffff;
  position: absolute;
  right: 20px;
}

@media (min-width: 620px) {

  .header-cart {
    right: 40px;
  }
}

@media (min-width: 1000px) {

  .header-cart {
    right: 60px;
  }
}

@media (min-width: 1090px) {

  .header-cart {
    bottom: auto;
    color: #000000;
    position: absolute;
    right: 50px;
    top: 29px;
    -webkit-transform: translateY(0);
        -ms-transform: translateY(0);
            transform: translateY(0);
    -webkit-transition-duration: 200ms;
         -o-transition-duration: 200ms;
            transition-duration: 200ms;
    -webkit-transition-property: color;
    -o-transition-property: color;
    transition-property: color;
    -webkit-transition-timing-function: ease-in-out;
         -o-transition-timing-function: ease-in-out;
            transition-timing-function: ease-in-out;
    z-index: 999;
  }
}

.is-checkout .header-cart {
    display: none;
}

.header-cart.is-jiggling {
  -webkit-animation: wabble 1.5s normal forwards;
          animation: wabble 1.5s normal forwards;
}

.header-cart__count {
  background-color: #fdd007;
  border-radius: 50%;
  color: #000000;
  line-height: 12px;
  text-align: center;
  -webkit-transition: background-color ease-in-out 200ms;
  -o-transition: background-color ease-in-out 200ms;
  transition: background-color ease-in-out 200ms;
  position: absolute;
  right: -4px;
  top: -6px;
  font-size: 9px;
  display: block;
  height: 12px;
  width: 12px;
}

@media (min-width: 1090px) {

  .header-cart__count {
    background-color: #ffffff;
  }
}

.header-cart__icon {
  display: block;
  height: 22px;
  width: 34px;
}

.header-sub {
  background-color: #fff9e7;
  height: 0;
  opacity: 0;
  overflow: hidden;
  -webkit-transition: opacity 0s ease-in-out 0.4s, height 0.4s ease-in-out;
  -o-transition: opacity 0s ease-in-out 0.4s, height 0.4s ease-in-out;
  transition: opacity 0s ease-in-out 0.4s, height 0.4s ease-in-out;
}

@media (min-width: 1090px) {

  .header-sub {
    background-color: #ffffff;
    -webkit-box-shadow: 0 2px 4px rgba(0, 0, 0, 0.12);
            box-shadow: 0 2px 4px rgba(0, 0, 0, 0.12);
    display: block;
    height: auto !important;
    left: 0;
    opacity: 0;
    padding: 35px 0;
    pointer-events: none;
    position: absolute;
    top: 100%;
    -webkit-transition-delay: 0s;
         -o-transition-delay: 0s;
            transition-delay: 0s;
    -webkit-transition-duration: 0.4s;
         -o-transition-duration: 0.4s;
            transition-duration: 0.4s;
    -webkit-transition-property: opacity, visibility, z-index;
    -o-transition-property: opacity, visibility, z-index;
    transition-property: opacity, visibility, z-index;
    -webkit-transition-timing-function: ease-in-out;
         -o-transition-timing-function: ease-in-out;
            transition-timing-function: ease-in-out;
    visibility: hidden;
    width: 100%;
    z-index: 1;
  }
}

.header-sub.is-active {
  opacity: 1;
  -webkit-transition-delay: 0s;
       -o-transition-delay: 0s;
          transition-delay: 0s;
}

@media (min-width: 1090px) {

  .header-sub.is-active {
    pointer-events: auto;
    visibility: visible;
    z-index: 9;
  }
}

.header-sub__container {
  height: auto;
}

@media (min-width: 1090px) {

  .header-sub__list {
    -webkit-box-align: stretch;
    -webkit-align-items: stretch;
        -ms-flex-align: stretch;
            align-items: stretch;
    display: -webkit-box;
    display: -webkit-flex;
    display: -ms-flexbox;
    display: flex;
  }
}

.header-sub__list--multi {
  padding: 20px 0;
}

@media (min-width: 1090px) {

  .header-sub__list--multi {
    padding: 0;
  }
}

.header-sub__list--multi .header-sub__item {
    border-bottom: none;
    margin-bottom: 18px;
    padding-bottom: 0;
    padding-top: 0;
}

@media (min-width: 1090px) {

  .header-sub__list--multi .header-sub__item {
    margin-bottom: 0;
    padding-bottom: 15px;
    padding-top: 15px;
  }
}

.header-sub__list--multi .header-sub__item:last-child {
  margin-bottom: 0;
}

.header-sub__list--multi .header-sub__card__title {
    display: inline-block;
    margin-bottom: 0;
}

@media (min-width: 1090px) {

  .header-sub__list--multi .header-sub__card__title {
    display: block;
    font-family: 'gotham-htf-bold', arial, sans-serif;
    font-size: 12px;
    font-weight: normal;
    letter-spacing: 2px;
    line-height: 1.2;
    margin-bottom: 8px;
    text-transform: uppercase;
  }
}

@media (min-width: 1090px) {

  .header-sub__list--multi .header-sub__card__title:before {
    content: none;
  }
}

.header-sub__list--multi .header-sub__card__cta {
    display: none;
}

@media (min-width: 1090px) {

  .header-sub__list--multi .header-sub__card__cta {
    display: inline-block;
  }
}

.header-sub__item {
  border-bottom: 1px solid rgba(208, 208, 208, 0.3);
  padding: 20px 0;
}

@media (min-width: 1090px) {

  .header-sub__item {
    border-bottom: none;
    display: -webkit-box;
    display: -webkit-flex;
    display: -ms-flexbox;
    display: flex;
    -webkit-box-flex: 0;
    -webkit-flex: 0 0 auto;
        -ms-flex: 0 0 auto;
            flex: 0 0 auto;
    -webkit-box-orient: vertical;
    -webkit-box-direction: normal;
    -webkit-flex-direction: column;
        -ms-flex-direction: column;
            flex-direction: column;
    -webkit-box-pack: center;
    -webkit-justify-content: center;
        -ms-flex-pack: center;
            justify-content: center;
    padding: 15px 30px 15px 0;
    width: 30%;
  }
}

@media (min-width: 1200px) {

  .header-sub__item {
    width: 35%;
  }
}

@media (min-width: 1090px) {

  .header-sub__item--last {
    -webkit-box-align: end;
    -webkit-align-items: flex-end;
        -ms-flex-align: end;
            align-items: flex-end;
    border-left: 1px solid #d0d0d0;
    -webkit-box-flex: 0;
    -webkit-flex: 0 0 auto;
        -ms-flex: 0 0 auto;
            flex: 0 0 auto;
    margin-left: 30px;
    padding-left: 60px;
    padding-right: 0;
    width: calc(40% - 50px);
  }
}

@media (min-width: 1200px) {

  .header-sub__item--last {
    margin-left: 50px;
    padding-left: 80px;
    width: calc(30% - 50px);
  }
}

.header-sub__item--last.is-menu {
  -webkit-box-align: center;
  -webkit-align-items: center;
      -ms-flex-align: center;
          align-items: center;
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
}

@media (min-width: 1090px) {

  .header-sub__card {
    -webkit-box-align: center;
    -webkit-align-items: center;
        -ms-flex-align: center;
            align-items: center;
    display: -webkit-box;
    display: -webkit-flex;
    display: -ms-flexbox;
    display: flex;
    -webkit-box-flex: 0;
    -webkit-flex: 0 0 auto;
        -ms-flex: 0 0 auto;
            flex: 0 0 auto;
  }
}

@media (min-width: 1090px) {

  .header-sub__card--default {
    text-align: left;
    height: 100%;
  }
}

.header-sub__card--default .header-sub__card__image {
    display: none;
}

@media (min-width: 1200px) {

  .header-sub__card--default .header-sub__card__image {
    display: block;
    width: 130px;
  }
}

@media (min-width: 1440px) {

  .header-sub__card--default .header-sub__card__image {
    width: 150px;
  }
}

@media (min-width: 1090px) {

  .header-sub__card--default .header-sub__card__image::before {
    padding-bottom: calc(180/150 * 100%);
  }
}

@media (min-width: 1090px) {

  .header-sub__card--default .header-sub__card__wrapper {
    max-width: 200px;
  }
}

@media (min-width: 1200px) {

  .header-sub__card--default .header-sub__card__wrapper {
    margin-left: 30px;
    max-width: none;
  }
}

.header-sub__card--default .header-sub__card__content {
    margin-bottom: 10px;
}

@media (min-width: 1090px) {

  .header-sub__card--default .header-sub__card__content {
    margin-bottom: 18px;
  }
}

@media (min-width: 1090px) {

  .header-sub__card--small {
    -webkit-box-orient: vertical;
    -webkit-box-direction: normal;
    -webkit-flex-direction: column;
        -ms-flex-direction: column;
            flex-direction: column;
    text-align: center;
  }
}

@media (min-width: 1090px) {

  .header-sub__card--small .header-sub__card__image {
    width: 225px;
  }
}

@media (min-width: 1090px) {

  .header-sub__card--small .header-sub__card__image::before {
    padding-bottom: calc(125/225 * 100%);
  }
}

@media (min-width: 1090px) {

  .header-sub__card--small .header-sub__card__wrapper {
    margin-top: 15px;
  }
}

.header-sub__card--small .header-sub__card__content {
    margin-bottom: 5px;
}

@media (min-width: 1090px) {

  .header-sub__card__image {
    -webkit-box-flex: 0;
    -webkit-flex: 0 0 auto;
        -ms-flex: 0 0 auto;
            flex: 0 0 auto;
  }
}

@media (min-width: 1090px) {

  .header-sub__card__wrapper {
    -webkit-box-flex: 1;
    -webkit-flex: 1 1 auto;
        -ms-flex: 1 1 auto;
            flex: 1 1 auto;
  }
}

.header-sub__card__title {
  margin-bottom: 5px;
}

@media (min-width: 1090px) {

  .header-sub__card__title {
    margin-bottom: 8px;
  }
}

.header-sub__menu__item {
  margin-top: 18px;
}

@media (min-width: 1090px) {

  .header-sub__menu__item {
    margin-top: 15px;
  }
}

.header-sub__menu__item:first-child {
  margin-top: 0;
}

.header-socials {
  display: block;
  margin-top: 30px;
  -webkit-box-ordinal-group: 4;
  -webkit-order: 3;
      -ms-flex-order: 3;
          order: 3;
}

@media (min-width: 1090px) {

  .header-socials {
    display: none;
    margin-top: 0;
  }
}

.header-socials .socials__list {
    -webkit-box-pack: start;
    -webkit-justify-content: flex-start;
        -ms-flex-pack: start;
            justify-content: flex-start;
}

.header-socials .socials__item {
    margin-left: 20px;
}

.header-socials .socials__item:first-child {
  margin-left: 0;
}

.header-socials .socials__icon {
    height: 18px;
    width: 18px;
    fill: inherit;
}

.no-touch .header-cart .header-cart__icon {
      -webkit-transform-origin: center bottom;
          -ms-transform-origin: center bottom;
              transform-origin: center bottom;
    }

.no-touch .header-cart:hover .header-cart__icon, .no-touch .header-cart:focus .header-cart__icon {
        -webkit-animation: swing 5s infinite;
                animation: swing 5s infinite;
}

.no-touch .header-nav__link:hover, .no-touch .header-nav__link:focus {
  color: #fdd007;
}

@media (min-width: 1090px) {

  .no-touch .header-nav__item:hover .header-nav__link::after, .no-touch .header-nav__item:focus .header-nav__link::after {
    left: 0;
    right: auto;
    width: 100%;
  }
}

.top-banner {
  text-align: center; 
  padding: 20px 0px; 
  background: #000; 
  color: #fff;
  position: relative; 
  z-index: 9;
}

.mobile-show {display: none;}

@media screen and (max-width: 600px) {
    .desktop-show {display: none;}
    .mobile-show {display: block;}
  }

/* Country Picker dropdown container (Name depends on element being used as a container) */

.dropdown-container {
  display: inline-block;
  color: white;
  cursor: pointer;
  position: relative;
}

/* Dropdown Trigger */

.flow-country-picker-modal-trigger {
  cursor: pointer;
  display: inline;
  font-size: 14px;
  padding: 6px;
}

.flow-country-picker-dropdown-trigger, .flow-currency-picker-dropdown-trigger {
  border: solid 3px #000;
  cursor: pointer;
  display: inline-block;
  font-size: 14px;
  padding: 10px 16px;
  width: 355px;
  max-width: 100%;
  text-align: left;
  background: -webkit-gradient(linear, left top, right top, color-stop(88%, #fff), color-stop(12%, #000));
  background: -o-linear-gradient(left, #fff 88%, #000 12%);
  background: linear-gradient(90deg, #fff 88%, #000 12%);
}

.flow-country-picker-dropdown-trigger::after, .flow-currency-picker-dropdown-trigger::after {
  content: '';
  border-style: solid;
  border-color: transparent;
  border-top-color: #fff;
  border-width: 10px 8px 0 8px;
  display: inline-block;
  width: 0;
  height: 0;
  margin-top: 3px;
  margin-right: -4px;
  float: right;
}

.flow-advanced-country-picker .flow-country-picker-dropdown-trigger::after, .flow-advanced-country-picker .flow-currency-picker-dropdown-trigger::after {
  margin-left: 25px;
}

.flow-country-picker-modal-trigger > img, .flow-country-picker-dropdown-trigger > img {
  vertical-align: text-bottom;
  margin-right: 6px;
  -webkit-box-shadow: 0 2px 8px 0 rgba(0, 0, 0, .10);
  box-shadow: 0 2px 8px 0 rgba(0, 0, 0, .10);
}

.flow-country-picker-modal-trigger img {
  display: none;
}

.flow-country-picker-modal-trigger-text, .flow-country-picker-dropdown-trigger-text, .flow-currency-picker-dropdown-trigger-text {
  /* bottom: -1px; */
  position: relative;
  /* color: #191919; */
}

.flow-country-picker-modal-body .flow-country-picker-dropdown-trigger-text {
  font-family: gotham-htf-bold!important;
}

/* Backdrop that takes over the screen */

.flow-country-picker-dropdown-backdrop {
  background-color: rgba(0, 0, 0, 0);
  height: 100%;
  position: fixed;
  top: 0;
  width: 100%;
  z-index: 100;
}

.flow-country-picker-instruction-txt {
  color: black;
  display: none;
  padding: 12px 10px;
  line-height: 14px;
  border-bottom: 1px solid #e6e6e6;
  margin-bottom: 3px;
}

/* Dropdown button on hover & focus */

.flow-country-picker-country-logo {
  display: inline-block;
  padding-right: 10px;
}

.flow-country-picker-country-logo > img {
  border-radius: 2px;
  -webkit-box-shadow: 0 2px 8px 0 rgba(0, 0, 0, .10);
          box-shadow: 0 2px 8px 0 rgba(0, 0, 0, .10);
}

.flow-country-picker-advanced .flow-country-picker-dropdown-menu {
  max-height: 188px !important;
}

/* Dropdown Content (Hidden by Default) */

.flow-country-picker-dropdown-menu {
  visibility: hidden;
  opacity: 0;
  -webkit-transition: visiblity 0.10s, opacity 0.10s linear;
  -o-transition: visiblity 0.10s, opacity 0.10s linear;
  transition: visiblity 0.10s, opacity 0.10s linear;
  position: absolute;
  background-color: white;
  min-width: 300px;
  max-height: 400px;
  right: 0px;
  overflow-y: scroll;
  z-index: 1002;
  font-size: 14px;
}

.flow-country-picker-advanced .flow-country-picker-dropdown-menu {
  left: 0;
  width: 88%;
  text-align: left;
  border: 3px solid #000;
  border-top: 0px;
}

.flow-country-picker-advanced .flow-currency-picker-dropdown-trigger + .flow-country-picker-dropdown-menu {
  right: 264px;
}

/* Links inside the dropdown */

.flow-country-picker-dropdown-menu a {
  text-decoration: none;
  padding: 10px 16px;
  line-height: 14px;
  display: -webkit-box;
  display: -ms-flexbox;
  display: -webkit-flex;
  display: flex;
  -ms-flex-line-pack: center;
      -webkit-align-content: center;
          align-content: center;
  -webkit-box-orient: horizontal;
  -webkit-box-direction: normal;
      -ms-flex-direction: row;
          -webkit-flex-direction: row;
          flex-direction: row;
  font-family: gotham-htf-bold!important;
}

.flow-country-picker-dropdown-menu a:hover {
  opacity: 1;
  background-color: #f3f3f3;
}

/* The actual text inside the dropdown option */

.flow-country-picker-dropdown-option-text {
  -ms-flex-item-align: center;
      -webkit-align-self: center;
          align-self: center;
  color: #191919;
  position: relative;
  display: inline-block;
  width: calc(100% - 33px);
  top: -1px;
}

.flow-country-picker-show {
  visibility: visible;
  opacity: 1;
}

.flow-country-picker-open {
  color: #191919;
}

/* Modal Country Picker */

.flow-country-picker-modal {
  background-color: white;
  height: 346px;
  padding: 20px;
  position: fixed;
  width: 616px;
  z-index: 1001;
  top: 50%;
  left: 50%;
  -webkit-transform: translate(-50%, -50%);
      -ms-transform: translate(-50%, -50%);
          transform: translate(-50%, -50%);
  text-align: center;
}

/* An item inside the modal */

.flow-country-picker-modal-item-container {
  cursor: pointer;
  display: inline-block;
  font-size: 12px;
  padding: 7px 5px 7px 0;
  width: 100%;
}

.flow-country-picker-modal-item-container:hover {
    background-color: #e6e6e6;
  }

.flow-country-picker-modal-item {
  display: -webkit-box;
  display: -ms-flexbox;
  display: -webkit-flex;
  display: flex;
  -ms-flex-line-pack: center;
      -webkit-align-content: center;
          align-content: center;
  -webkit-box-orient: horizontal;
  -webkit-box-direction: normal;
      -ms-flex-direction: row;
          -webkit-flex-direction: row;
          flex-direction: row;
}

/* The selected item in the modal */

.flow-country-picker-selected-modal-item {
  background-color: #C0DFFF;
  cursor: auto;
  cursor: initial;
}

/* Backdrop that takes over the screen */

.flow-country-picker-modal-backdrop {
  background-color: rgba(0, 0, 0, .30);
  height: 100%;
  position: fixed;
  top: 0;
  width: 100%;
  z-index: 1000;
}

/* The text within the modal item */

.flow-country-picker-modal-text {
  -ms-flex-item-align: center;
      -webkit-align-self: center;
          align-self: center;
  color: #191919;
  line-height: 15px;
}

/* Modal item logo */

.flow-country-picker-modal-logo {
  -ms-flex-item-align: center;
      -webkit-align-self: center;
          align-self: center;
  -webkit-flex-shrink: 0;
      -ms-flex-negative: 0;
          flex-shrink: 0;
  height: 15px;
  margin-left: 10px;
  margin-right: 8px;
  width: 21px;
}

/* Modal Header */

.flow-country-picker-modal-header {
  padding-left: 5px;
  padding-bottom: 16px;
}

/* .flow-country-picker-modal-header {
  padding-left: 5px;
  padding-bottom: 16px;
  border-bottom: 1px #e6e6e6 solid;
  margin-bottom: 16px;
} */

.flow-country-picker-modal-title {
  color: #191919;
  display: inline-block;
  font-size: 29.36px;
  text-transform: uppercase;
  font-family: gotham-htf-bold!important;
  padding-top: 35px;
}

/* Modal close icon */

.flow-country-picker-modal-close {
  float: right;
  cursor: pointer;
  width: 10px;
  height: 10px;
  margin-top: 3px;
  stroke: #000000;
}

.flow-country-picker-modal-close:hover {
    stroke: #000000;
  }

/* Modal Body */

/* Modal Body Content */

.flow-country-picker-modal-body-content {
  -webkit-column-count: 4;
          column-count: 4;
     -moz-column-count: 4;
}

/* Currently selected experience text */

.flow-country-picker-current-experience-txt {
  display: inline-block;
  padding-left: 7px;
  bottom: 6px;
  position: relative;
  font-family: gotham-htf-bold!important;
}

.flow-country-picker-selected-logo {
  display: inline-block;
}

.flow-country-picker-button-container {
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-orient: horizontal;
  -webkit-box-direction: normal;
  -webkit-flex-direction: row;
      -ms-flex-direction: row;
          flex-direction: row;
  -webkit-box-pack: center;
  -webkit-justify-content: center;
      -ms-flex-pack: center;
          justify-content: center;
}

.flow-country-picker-button {
  font-size: 14px;
  display: inline-block;
  min-width: 356px;
  height: 42px;
  color: #000000;
  border: solid 1px #fdd007;
  background-color: #fdd007;
  cursor: pointer;
  -webkit-flex-basis: 30%;
      -ms-flex-preferred-size: 30%;
          flex-basis: 30%;
  padding: 8px;
  font-family: gotham-htf-bold!important;
}

.flow-country-picker-button.flow-country-picker-button-secondary {
  border: solid 1px #191919;
  color: #191919;
  background-color: #ffffff;
  display: none;
}

.flow-country-picker-advanced .flow-country-picker-modal-body-content {
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  padding-bottom: 15px;
  padding-top: 15px;
  -webkit-box-orient: horizontal;
  -webkit-box-direction: reverse;
  -webkit-flex-direction: row-reverse;
      -ms-flex-direction: row-reverse;
          flex-direction: row-reverse;
  -webkit-box-pack: center;
  -webkit-justify-content: center;
      -ms-flex-pack: center;
          justify-content: center;
}

.flow-country-picker-advanced .flow-country-picker-wrapper, .flow-country-picker-advanced .flow-currency-picker-wrapper {
  padding: 0px;
  position: relative;
}

.flow-country-picker-extra-message-container {
  border-radius: 2px;
  margin: 0px auto 10px;
  padding: 0px 0px 10px 0px;
  font-size: 16px;
  max-width: 325px;
}

.flow-country-picker-delivery-window {
  padding-bottom: 24px;
}

.flow-country-picker-payment-methods > img {
  padding-right: 12px;
  max-width: 120px;
  max-height: 32px;
  padding-bottom: 8px;
}

/* Some example responsive rules */

@media (max-width: 768px) {
  .flow-country-picker-modal-title {
    font-size: 21px;
  }
  .flow-country-picker-extra-message-container {
    font-size: 16px;
  }
  .flow-country-picker-modal-body-content {
    -webkit-column-count: unset;
            column-count: unset;
    -moz-column-count: unset;
  }
  .flow-country-picker-dropdown-menu {
    min-width: 280px;
  }
  .flow-country-picker-advanced .flow-country-picker-dropdown-menu {
    right: unset;
    left: 0px;
  }

  .flow-country-picker-modal {
    top: 50%;
    left: 50%;
    -webkit-transform: translate(-50%, -50%);
        -ms-transform: translate(-50%, -50%);
            transform: translate(-50%, -50%);
    width: 550px;
    max-width: 78%;
    height: 346px;
    margin: 0px auto;
  }
}

@media (max-width: 568px) {
  .flow-country-picker-modal-title {
    font-size: 15px;
  }
  .flow-country-picker-extra-message-container {
    font-size: 14px;
  }
  .flow-country-picker-dropdown-trigger, .flow-currency-picker-dropdown-trigger {
  	width: 245px;
    background: -webkit-gradient(linear, left top, right top, color-stop(82%, #fff), color-stop(18%, #000));
    background: -o-linear-gradient(left, #fff 82%, #000 18%);
    background: linear-gradient(90deg, #fff 82%, #000 18%);
  }
  .flow-country-picker-advanced .flow-country-picker-dropdown-menu {
  	left: 0;
    min-width: 245px;
    width: 245px;
  }
  .flow-country-picker-button {
  	min-width: 80%;
  }
  .flow-country-picker-dropdown-menu a {
    padding: 10px;
  }
  .flow-country-picker-modal-trigger > img, .flow-country-picker-dropdown-trigger > img {
    margin-right: 1px;
    vertical-align: middle;
  }
  .flow-country-picker-dropdown-trigger, .flow-currency-picker-dropdown-trigger {
    padding: 10px 16px 10px 10px;
  }
  .flow-country-picker-dropdown-option-text, .flow-country-picker-modal-trigger-text, .flow-country-picker-dropdown-trigger-text, .flow-currency-picker-dropdown-trigger-text {
    font-size: 12px;
  }
}

@media only screen and (min-width: 1090px) and (max-width: 1600px)  {
  .header-menu__list .header-menu__item span.flow-country-picker-modal-trigger-text {
    display: none;
  }
}

#flow-country-select-mobile {
  bottom: 25px;
  right: 60px;
}

@media (min-width: 620px) {

  #flow-country-select-mobile {
    right: 75px;
  }
}

@media (min-width: 1000px) {

  #flow-country-select-mobile {
    right: 100px;
  }
}

#flow-country-select-mobile span.flow-country-picker-modal-trigger-text {
  display: none;
}

.hero{
  background: teal;
}

.home-2up__container {
  -webkit-box-align: center;
  -webkit-align-items: center;
      -ms-flex-align: center;
          align-items: center;
  border-bottom: 1px solid #cdcdcd;
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-orient: vertical;
  -webkit-box-direction: normal;
  -webkit-flex-direction: column;
      -ms-flex-direction: column;
          flex-direction: column;
  padding-bottom: 40px;
}

@media (min-width: 620px) {

  .home-2up__container {
    padding-bottom: 60px;
  }
}

@media (min-width: 840px) {

  .home-2up__container {
    -webkit-box-align: start;
    -webkit-align-items: flex-start;
        -ms-flex-align: start;
            align-items: flex-start;
    border-bottom: none;
    -webkit-box-orient: horizontal;
    -webkit-box-direction: normal;
    -webkit-flex-direction: row;
        -ms-flex-direction: row;
            flex-direction: row;
    -webkit-box-pack: justify;
    -webkit-justify-content: space-between;
        -ms-flex-pack: justify;
            justify-content: space-between;
    padding-bottom: 0;
  }
}

.home-2up-left {
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-orient: vertical;
  -webkit-box-direction: normal;
  -webkit-flex-direction: column;
      -ms-flex-direction: column;
          flex-direction: column;
  margin-top: 40px;
  max-width: 355px;
  -webkit-box-ordinal-group: 3;
  -webkit-order: 2;
      -ms-flex-order: 2;
          order: 2;
}

@media (min-width: 840px) {

  .home-2up-left {
    -webkit-box-flex: 1;
    -webkit-flex: 1 1 auto;
        -ms-flex: 1 1 auto;
            flex: 1 1 auto;
    margin-top: 50px;
    max-width: 440px;
    -webkit-box-ordinal-group: 2;
    -webkit-order: 1;
        -ms-flex-order: 1;
            order: 1;
    width: 40%;
  }
}

@media (min-width: 1440px) {

  .home-2up-left {
    margin-top: 60px;
  }
}

.home-2up-left__featured {
  -webkit-box-flex: 0;
  -webkit-flex: 0 0 auto;
      -ms-flex: 0 0 auto;
          flex: 0 0 auto;
  -webkit-box-ordinal-group: 2;
  -webkit-order: 1;
      -ms-flex-order: 1;
          order: 1;
  width: 100%;
}

@media (min-width: 840px) {

  .home-2up-left__featured {
    -webkit-box-ordinal-group: 3;
    -webkit-order: 2;
        -ms-flex-order: 2;
            order: 2;
  }
}

.home-2up-left__featured::before {
  padding-bottom: calc(485/440 * 100%);
}

.home-2up-left__content {
  -webkit-box-flex: 0;
  -webkit-flex: 0 0 auto;
      -ms-flex: 0 0 auto;
          flex: 0 0 auto;
  margin-top: 20px;
  -webkit-box-ordinal-group: 3;
  -webkit-order: 2;
      -ms-flex-order: 2;
          order: 2;
  width: 100%;
}

@media (min-width: 840px) {

  .home-2up-left__content {
    margin-bottom: 40px;
    margin-top: 0;
    -webkit-box-ordinal-group: 2;
    -webkit-order: 1;
        -ms-flex-order: 1;
            order: 1;
  }
}

.home-2up-left__content--center {
  text-align: center;
}

.home-2up-left__content--right {
  text-align: right;
}

.home-2up-left__title {
  margin-bottom: 10px;
}

@media (min-width: 620px) {

  .home-2up-left__title {
    margin-bottom: 15px;
  }
}

.home-2up-left__text {
  margin-bottom: 15px;
}

.home-2up-right {
  -webkit-box-ordinal-group: 2;
  -webkit-order: 1;
      -ms-flex-order: 1;
          order: 1;
  max-width: 450px;
  position: relative;
  width: 100%;
}

@media (min-width: 620px) {

  .home-2up-right {
    max-width: none;
  }
}

@media (min-width: 840px) {

  .home-2up-right {
    -webkit-box-flex: 1;
    -webkit-flex: 1 1 auto;
        -ms-flex: 1 1 auto;
            flex: 1 1 auto;
    margin-left: 40px;
    max-width: 765px;
    -webkit-box-ordinal-group: 3;
    -webkit-order: 2;
        -ms-flex-order: 2;
            order: 2;
    width: 60%;
  }
}

@media (min-width: 1440px) {

  .home-2up-right {
    margin-left: 80px;
  }
}

.home-2up-right__featured::before {
  padding-bottom: calc(600/765 * 100%);
}

.home-2up-right__featured::after {
  background-color: rgba(0, 0, 0, 0.1);
  content: '';
  height: 100%;
  left: 0;
  position: absolute;
  top: 0;
  width: 100%;
  z-index: 0;
}

.home-2up-right__featured__image--hover, .home-2up-left__featured__image--hover {
  opacity: 0;
  visibility: hidden;
  z-index: 9;
}

.home-2up-right__content {
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-orient: vertical;
  -webkit-box-direction: normal;
  -webkit-flex-direction: column;
      -ms-flex-direction: column;
          flex-direction: column;
  height: 100%;
  -webkit-box-pack: end;
  -webkit-justify-content: flex-end;
      -ms-flex-pack: end;
          justify-content: flex-end;
  left: 0;
  padding: 30px;
  position: absolute;
  top: 0;
  width: 100%;
  z-index: 9;
}

@media (min-width: 620px) {

  .home-2up-right__content {
    padding: 50px;
  }
}

.home-2up-right__content--left {
  -webkit-box-align: start;
  -webkit-align-items: flex-start;
      -ms-flex-align: start;
          align-items: flex-start;
}

.home-2up-right__content--left .home-2up-right__title {
    text-align: left;
  }

.home-2up-right__content--right {
  -webkit-box-align: end;
  -webkit-align-items: flex-end;
      -ms-flex-align: end;
          align-items: flex-end;
}

.home-2up-right__content--right .home-2up-right__title {
    text-align: right;
  }

.home-2up-right__content--center {
  -webkit-box-align: center;
  -webkit-align-items: center;
      -ms-flex-align: center;
          align-items: center;
}

.home-2up-right__content--center .home-2up-right__title {
    text-align: center;
  }

.home-2up-right__title {
  margin-bottom: 10px;
  max-width: 265px;
}

@media (min-width: 620px) {

  .home-2up-right__title {
    margin-bottom: 20px;
    max-width: 420px;
  }
}

.no-touch .home-2up-right__featured__image--hover {
    -webkit-transition-duration: 200ms;
         -o-transition-duration: 200ms;
            transition-duration: 200ms;
    -webkit-transition-property: opacity, visibility;
    -o-transition-property: opacity, visibility;
    transition-property: opacity, visibility;
    -webkit-transition-timing-function: ease-in-out;
         -o-transition-timing-function: ease-in-out;
            transition-timing-function: ease-in-out;
  }

.no-touch .home-2up-left__featured__image--hover {
    -webkit-transition-duration: 200ms;
         -o-transition-duration: 200ms;
            transition-duration: 200ms;
    -webkit-transition-property: opacity, visibility;
    -o-transition-property: opacity, visibility;
    transition-property: opacity, visibility;
    -webkit-transition-timing-function: ease-in-out;
         -o-transition-timing-function: ease-in-out;
            transition-timing-function: ease-in-out;
  }

.no-touch .home-2up-right:hover .home-2up-right__featured__image--hover {
        opacity: 1;
        visibility: visible;
}

.no-touch .home-2up-left:hover .home-2up-left__featured__image--hover {
        opacity: 1;
        visibility: visible;
}

.home-3up {
}

.home-3up__wrapper.post-card-3up .home-3up__callout {
      margin-top: 70px;
      max-width: 370px;
}

@media (min-width: 620px) {

  .home-3up__wrapper.post-card-3up .home-3up__callout {
    margin-top: 100px;
  }
}

@media (min-width: 1000px) {

  .home-3up__wrapper.post-card-3up .home-3up__callout {
    margin-top: 30px;
  }
}

.home-3up__callout {
  position: relative;
}

.home-3up__callout__background {
  position: relative;
  z-index: 0
}

.home-3up__callout__background::before {
  padding-bottom: calc(1270/772 * 100%);
}

.home-3up__callout__content {
  -webkit-box-align: center;
  -webkit-align-items: center;
      -ms-flex-align: center;
          align-items: center;
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-orient: vertical;
  -webkit-box-direction: normal;
  -webkit-flex-direction: column;
      -ms-flex-direction: column;
          flex-direction: column;
  height: 100%;
  -webkit-box-pack: center;
  -webkit-justify-content: center;
      -ms-flex-pack: center;
          justify-content: center;
  left: 0;
  padding: 0 45px;
  position: absolute;
  top: 0;
  width: 100%;
  z-index: 2;
}

@media (min-width: 1000px) {

  .home-3up__callout__content {
    padding: 0 32px;
  }
}

@media (min-width: 1200px) {

  .home-3up__callout__content {
    padding: 0 45px;
  }
}

.home-3up__callout__title {
  margin-bottom: 35px;
}

@media (min-width: 1000px) {

  .home-3up__callout__title {
    margin-bottom: 20px;
  }
}

@media (min-width: 1200px) {

  .home-3up__callout__title {
    margin-bottom: 35px;
  }
}

.home-3up__callout__featured {
  margin-bottom: 40px;
  max-width: 230px;
  width: 80%;
}

@media (min-width: 1000px) {

  .home-3up__callout__featured {
    margin-bottom: 20px;
    width: 60%;
  }
}

@media (min-width: 1200px) {

  .home-3up__callout__featured {
    margin-bottom: 40px;
    width: 80%;
  }
}

.home-3up__callout__featured::before {
  padding-bottom: calc(200/230 * 100%);
}

.home-3up__callout__subtitle {
  margin-bottom: 15px;
}

@media (min-width: 1000px) {

  .home-3up__callout__subtitle {
    mediaargin-bottom: 5px;
  }
}

@media (min-width: 1200px) {

  .home-3up__callout__subtitle {
    margin-bottom: 15px;
  }
}

.home-3up__callout__text {
  margin-bottom: 20px;
  width: 100%;
}

@media (min-width: 1000px) {

  .home-3up__callout__text {
    margin-bottom: 10px;
  }
}

@media (min-width: 1200px) {

  .home-3up__callout__text {
    margin-bottom: 20px;
  }
}

.home-hero {
  border-bottom: 5px solid #fdd007;
}

@media (min-width: 1000px) {

  .home-hero {
    border-bottom: none;
    position: relative;
  }
}

.home-hero__wrapper {
  position: relative;
}

.home-hero__background {
  max-height: 670px;
  min-height: 350px;
  width: 100%;
  z-index: 0;
}

@media (min-width: 620px) {

  .home-hero__background {
    min-height: 585px;
  }
}

.home-hero__background::before {
  padding-bottom: calc(400/600 * 100%);
}

@media (min-width: 1000px) {

  .home-hero__background::before {
    padding-bottom: calc(670/1440 * 100%);
  }
}

.home-hero__background--overlay::after {
  background: -webkit-gradient(linear, left bottom, left top, from(rgba(0, 0, 0, 0.8)), color-stop(60%, rgba(0, 0, 0, 0)));
  background: -o-linear-gradient(bottom, rgba(0, 0, 0, 0.8) 0%, rgba(0, 0, 0, 0) 60%);
  background: linear-gradient(to top, rgba(0, 0, 0, 0.8) 0%, rgba(0, 0, 0, 0) 60%);
  content: '';
  display: block;
  height: 100%;
  left: 0;
  position: absolute;
  top: 0;
  width: 100%;
  z-index: 9;
}

.home-hero__container {
  -webkit-box-align: end;
  -webkit-align-items: flex-end;
      -ms-flex-align: end;
          align-items: flex-end;
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  height: 100%;
  left: 0;
  margin: 0 auto;
  padding: 20px 0;
  position: absolute;
  right: 0;
  top: 0;
  z-index: 9;
}

@media (min-width: 620px) {

  .home-hero__container {
    padding: 40px 0;
  }
}

@media (min-width: 1000px) {

  .home-hero__container {
    padding: 220px 0;
  }
}

@media screen and (min-width:1000px) {

  .home-hero__container {
    padding: 110px 0;
  }
}

@media (min-width: 1200px) {

  .home-hero__container {
    padding: 150px 0;
  }
}

@media screen and (min-width:1600px) {

  .home-hero__container {
    padding: 110px 0;
  }
}

.home-hero__container--center{
  text-align: center;
  -webkit-box-pack: center;
  -webkit-justify-content: center;
      -ms-flex-pack: center;
          justify-content: center;
}

.home-hero__container--right{
  text-align: right;
  -webkit-box-pack: end;
  -webkit-justify-content: flex-end;
      -ms-flex-pack: end;
          justify-content: flex-end;
}

.home-hero__content {
  max-width: 340px;
  width: 100%;
}

@media (min-width: 620px) {

  .home-hero__content {
    max-width: 765px;
    width: 100%;
  }
}

@media (min-width: 768px) {

  .home-hero__content {
    width: 60%;
  }
}

.home-hero__cta {
  margin-top: 15px;
}

@media (min-width: 1000px) {

  .home-hero__cta {
    margin-top: 30px;
  }
}

.home-hero__products {
  background-color: #fff9e7;
  padding: 15px 0 20px;
  width: 100%;
}

@media (min-width: 620px) {

  .home-hero__products {
    padding: 20px 40px 30px;
  }
}

@media (min-width: 1000px) {

  .home-hero__products {
    padding: 0;
    position: absolute;
    right: 80px;
    top: 50%;
    -webkit-transform: translateY(-50%);
        -ms-transform: translateY(-50%);
            transform: translateY(-50%);
    width: 160px;
    z-index: 9;
  }
}

@media (min-width: 1440px) {

  .home-hero__products {
    right: calc(50% - 1280px / 2);
  }
}

.home-hero__products__title {
  margin-bottom: 15px;
}

@media (min-width: 1000px) {

  .home-hero__products__title {
    background-color: #fdd007;
    margin-bottom: 0;
    padding: 20px;
  }
}

@media (min-width: 620px) {

  .home-hero__products__group {
    -webkit-box-align: stretch;
    -webkit-align-items: stretch;
        -ms-flex-align: stretch;
            align-items: stretch;
    display: -webkit-box;
    display: -webkit-flex;
    display: -ms-flexbox;
    display: flex;
  }
}

@media (min-width: 1000px) {

  .home-hero__products__group {
    -webkit-box-orient: vertical;
    -webkit-box-direction: normal;
    -webkit-flex-direction: column;
        -ms-flex-direction: column;
            flex-direction: column;
  }
}

.home-hero__products__item {
  overflow: hidden;
  padding: 0 15px;
  position: relative;
  width: 240px;
}

@media (min-width: 620px) {

  .home-hero__products__item {
    -webkit-box-flex: 1;
    -webkit-flex: 1;
        -ms-flex: 1;
            flex: 1;
    margin-left: 30px;
    padding: 0;
    width: auto;
  }
}

@media (min-width: 768px) {

  .home-hero__products__item {
    margin-left: 60px;
  }
}

@media (min-width: 1000px) {

  .home-hero__products__item {
    -webkit-box-flex: 0;
    -webkit-flex: 0 0 auto;
        -ms-flex: 0 0 auto;
            flex: 0 0 auto;
    margin-left: 0;
    margin-top: -1px;
    max-width: none;
    width: 100%;
  }
}

.home-hero__products__item:first-child {
  margin-left: 0;
  padding-left: 20px;
}

.home-hero__products__item:last-child {
  padding-right: 20px;
}

.home-hero__products__item:first-child, .home-hero__products__item:last-child {
  width: 245px;
}

@media (min-width: 620px) {

  .home-hero__products__item:first-child, .home-hero__products__item:last-child {
    padding: 0;
    width: auto;
  }
}

@media (min-width: 1000px) {

  .home-hero__products__item:first-child, .home-hero__products__item:last-child {
    width: 100%;
  }
}

.home-hero__products__featured {
  background-color: #fff9e7;
  margin-bottom: 5px;
  overflow: hidden;
}

@media (min-width: 620px) {

  .home-hero__products__featured {
    margin-bottom: 10px;
  }
}

@media (min-width: 1000px) {

  .home-hero__products__featured {
    margin-bottom: 0;
  }
}

.home-hero__products__featured::before {
  padding-bottom: calc(120/160 * 100%);
}

.home-hero__products__featured::after {
  -webkit-box-shadow: inset 0 0 0 4.5px #ffffff;
          box-shadow: inset 0 0 0 4.5px #ffffff;
  content: '';
  height: 100%;
  left: 0;
  position: absolute;
  top: 0;
  width: 100%;
  z-index: 9;
}

@media (min-width: 1000px) {

  .home-hero__products__featured::after {
    content: none;
  }
}

.home-hero__products__image::before {
  -webkit-box-shadow: inset 0 0 0 4px #fdd007;
          box-shadow: inset 0 0 0 4px #fdd007;
  content: '';
  height: 100%;
  left: 0;
  position: absolute;
  top: 0;
  width: 100%;
  z-index: 9;
}

@media (min-width: 1000px) {

  .home-hero__products__image::before {
    content: none;
  }
}

@media (min-width: 1000px) {

  .home-hero__products__content {
    background-color: rgba(255, 251, 243, 0.8);
    height: 100%;
    left: 0;
    opacity: 0;
    position: absolute;
    top: 0;
    visibility: hidden;
    width: 100%;
    z-index: 9;
  }
}

@media (min-width: 1000px) {

  .home-hero__products__frame {
    -webkit-box-align: center;
    -webkit-align-items: center;
        -ms-flex-align: center;
            align-items: center;
    display: -webkit-box;
    display: -webkit-flex;
    display: -ms-flexbox;
    display: flex;
    height: 30%;
    -webkit-box-pack: center;
    -webkit-justify-content: center;
        -ms-flex-pack: center;
            justify-content: center;
    left: 0;
    opacity: 0;
    position: absolute;
    top: 0;
    width: 100%;
  }
}

.no-touch .home-hero__products__item {
    -webkit-transition: opacity 200ms ease-in-out;
    -o-transition: opacity 200ms ease-in-out;
    transition: opacity 200ms ease-in-out;
  }

@media (min-width: 1000px) {

  .no-touch .home-hero__products__item {
    -webkit-transition: none;
    -o-transition: none;
    transition: none;
  }
}

.no-touch .home-hero__products__item .home-hero__products__featured::after {
  -webkit-transition: -webkit-box-shadow 200ms ease-in-out;
  transition: -webkit-box-shadow 200ms ease-in-out;
  -o-transition: box-shadow 200ms ease-in-out;
  transition: box-shadow 200ms ease-in-out;
  transition: box-shadow 200ms ease-in-out, -webkit-box-shadow 200ms ease-in-out;
}

@media (min-width: 1000px) {

  .no-touch .home-hero__products__item .home-hero__products__content {
    -webkit-transition-duration: 0.3s;
         -o-transition-duration: 0.3s;
            transition-duration: 0.3s;
    -webkit-transition-property: opacity, visibility;
    -o-transition-property: opacity, visibility;
    transition-property: opacity, visibility;
    -webkit-transition-timing-function: ease-in-out;
         -o-transition-timing-function: ease-in-out;
            transition-timing-function: ease-in-out;
  }
}

.no-touch .home-hero__products__item .home-hero__products__frame {
      -webkit-transition: opacity 200ms ease-in-out;
      -o-transition: opacity 200ms ease-in-out;
      transition: opacity 200ms ease-in-out;
}

@media (min-width: 1000px) {

  .no-touch .home-hero__products__item .home-hero__products__frame {
    -webkit-transition: opacity 200ms ease-in-out, height 0.3s ease-in-out;
    -o-transition: opacity 200ms ease-in-out, height 0.3s ease-in-out;
    transition: opacity 200ms ease-in-out, height 0.3s ease-in-out;
  }
}

.no-touch .home-hero__products__item:hover .home-hero__products__featured::after {
  -webkit-box-shadow: inset 0 0 0 0 #ffffff;
          box-shadow: inset 0 0 0 0 #ffffff;
}

@media (min-width: 1000px) {

  .no-touch .home-hero__products__item:hover .home-hero__products__featured::after {
    -webkit-box-shadow: none;
            box-shadow: none;
  }
}

.no-touch .home-hero__products__item:hover .home-hero__products__content {
        opacity: 1;
        visibility: visible;
}

.no-touch .home-hero__products__item:hover .home-hero__products__frame {
        opacity: 0.6;
}

@media (min-width: 1000px) {

  .no-touch .home-hero__products__item:hover .home-hero__products__frame {
    bottom: 0;
    height: 100%;
    opacity: 1;
    top: auto;
  }
}

/* example img holder */

.img-holder {
  position: relative;
  width: 600px
}

.img-holder::before {
  content: '';
  display: block;
  padding-bottom: calc(287/510 * 100%);
  width: 100%;
}

/* remove example */

.img, .img__el {
  bottom: 0;
  height: 100%;
  left: 0;
  position: absolute;
  right: 0;
  top: 0;
  width: 100%
}

.img.product-grid__image, .img__el.product-grid__image {
  z-index: 0;
}

.no-transition .img, .no-transition .img__el {
    -webkit-transition: none !important;
    -o-transition: none !important;
    transition: none !important;
}

.img {
  overflow: hidden
}

.img.fit-cover .img__el {
      -o-object-fit: cover;
         object-fit: cover;
}

.img.fit-cover .img__el--ie {
      background-size: cover;
}

.img.fit-contain .img__el {
      -o-object-fit: contain;
         object-fit: contain;
}

.img.fit-contain .img__el--ie {
      background-size: contain;
}

.img.fit-width .img__el {
      bottom: auto;
      height: auto;
}

.img.pos-center .img__el {
      -o-object-position: center;
         object-position: center;
}

.img.pos-center .img__el--ie {
      background-position: center center;
}

.img.pos-top .img__el {
      -o-object-position: top;
         object-position: top;
}

.img.pos-top .img__el--ie {
      background-position: center top;
}

.img.pos-bottom .img__el {
      -o-object-position: bottom;
         object-position: bottom;
}

.img.pos-bottom .img__el--ie {
      background-position: center bottom;
}

.img.is-loaded .img__el {
      opacity: 1;
      visibility: visible;
}

.img.is-loaded .img__loader {
      opacity: 0;
      visibility: hidden;
}

.img.is-updating {
  display: none;
}

.img .img__el.is-fallback {
  opacity: 1;
  visibility: visible;
}

.img__el {
  opacity: 0;
  -webkit-transition: opacity 0.25s ease-in-out, opacity 0.25s ease-in-out;
  -o-transition: opacity 0.25s ease-in-out, opacity 0.25s ease-in-out;
  transition: opacity 0.25s ease-in-out, opacity 0.25s ease-in-out;
  visibility: hidden;
  z-index: 2
}

.img__el.img__el--ie {
  background-position: center;
  background-repeat: no-repeat;
  /* For Vue transitions */
}

.img__el.img__el--ie[data-fit="cover"] {
  background-size: cover !important;
}

.img__el.img__el--ie[data-fit="contain"] {
  background-size: contain !important;
}

.img__el {
  /* For Vue transitions */
}

.img__el.fade-enter, .img__el.fade-leave-to {
  opacity: 0 !important;
}

.img__el.fade-enter {
  z-index: 1;
}

.img__el[data-fit="cover"] {
  -o-object-fit: cover !important;
     object-fit: cover !important;
}

.img__el[data-fit="contain"] {
  -o-object-fit: contain !important;
     object-fit: contain !important;
}

.img__loader {
  position: absolute;
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;
  margin: auto;
}

.img__el--motion {
  z-index: 3;
}

.loader{
  background: #fdd007;
  width: 100px;
  height: 100px;
  border-radius: 50%;
}

.loader__icon{
  width: calc(100% / 2);
  height: calc(69% / 2);
  position: absolute;
  top: 0;
  right: 9%;
  bottom: 0;
  left: 0;
  margin: auto;
  -webkit-animation: riding-on-gravel 1.5s linear 0s normal infinite;
          animation: riding-on-gravel 1.5s linear 0s normal infinite;
  -webkit-transform-origin: bottom right;
      -ms-transform-origin: bottom right;
          transform-origin: bottom right;
}

.loader__cart{
  position: absolute;
  width: 100%;
  height: 100%;
}

.loader__wheel{
  position: absolute;
  width: 40%;
  height: 58%;
  bottom: 0;
  right: 13%;
  animation: moving-wheel 1.5s linear 0s reverse infinite;
  -webkit-transform-origin: center;
      -ms-transform-origin: center;
          transform-origin: center;
}

.loader-overlay{
  position: fixed;
  top: 0;
  left: 0;
  width: 100vw;
  height: 100vh;
  z-index: 1000;
}

.loader-circle{
  position: absolute;
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;
  margin: auto;
  border-radius: 50%;
  background-color: #fdd007;
  -webkit-box-shadow: 0px 0px 40px 0px rgba(0,0,0,0.2);
          box-shadow: 0px 0px 40px 0px rgba(0,0,0,0.2);
  opacity: 1;
}

@media (min-width: 840px) {

  .loader-circle {
    width: 150px;
    height: 150px;
  }
}

@-webkit-keyframes moving-wheel {
  from {-webkit-transform: rotate(0deg);transform: rotate(0deg)}
  to {-webkit-transform: rotate(360deg);transform: rotate(360deg)}
}

@keyframes moving-wheel {
  from {-webkit-transform: rotate(0deg);transform: rotate(0deg)}
  to {-webkit-transform: rotate(360deg);transform: rotate(360deg)}
}

@-webkit-keyframes riding-on-gravel {
  0% {-webkit-transform: rotate(0deg);transform: rotate(0deg)}
  10% {-webkit-transform: rotate(2deg);transform: rotate(2deg)}
  20% {-webkit-transform: rotate(-3deg);transform: rotate(-3deg)}
  30% {-webkit-transform: rotate(2deg);transform: rotate(2deg)}
  40% {-webkit-transform: rotate(-4deg);transform: rotate(-4deg)}
  50% {-webkit-transform: rotate(2deg);transform: rotate(2deg)}
  60% {-webkit-transform: rotate(-3deg);transform: rotate(-3deg)}
  70% {-webkit-transform: rotate(2deg);transform: rotate(2deg)}
  80% {-webkit-transform: rotate(-2deg);transform: rotate(-2deg)}
  90% {-webkit-transform: rotate(-4deg);transform: rotate(-4deg)}
  100%{-webkit-transform: rotate(0deg);transform: rotate(0deg)}
}

@keyframes riding-on-gravel {
  0% {-webkit-transform: rotate(0deg);transform: rotate(0deg)}
  10% {-webkit-transform: rotate(2deg);transform: rotate(2deg)}
  20% {-webkit-transform: rotate(-3deg);transform: rotate(-3deg)}
  30% {-webkit-transform: rotate(2deg);transform: rotate(2deg)}
  40% {-webkit-transform: rotate(-4deg);transform: rotate(-4deg)}
  50% {-webkit-transform: rotate(2deg);transform: rotate(2deg)}
  60% {-webkit-transform: rotate(-3deg);transform: rotate(-3deg)}
  70% {-webkit-transform: rotate(2deg);transform: rotate(2deg)}
  80% {-webkit-transform: rotate(-2deg);transform: rotate(-2deg)}
  90% {-webkit-transform: rotate(-4deg);transform: rotate(-4deg)}
  100%{-webkit-transform: rotate(0deg);transform: rotate(0deg)}
}

.location-card {
  width: 100%;
  margin-bottom: 30px;
}

@media (min-width: 445px) {

  .location-card {
    width: 50%;
  }
}

@media (min-width: 840px) {

  .location-card {
    width: 25%;
  }
}

@media (min-width: 1440px) {

  .location-card {
    margin-bottom: 45px;
  }
}

.location-card__image {
  border: 4px solid #ffffff;
  margin-bottom: 15px;
  -webkit-transition: all 200ms ease-in-out;
  -o-transition: all 200ms ease-in-out;
  transition: all 200ms ease-in-out
}

.location-card__image:hover {
  border-color: #fdd007;
}

.location-card__image:focus-within {
  outline: -webkit-focus-ring-color auto 5px;
}

@media (min-width: 620px) {

  .location-card__image {
    margin-bottom: 11px;
  }
}

@media (min-width: 840px) {

  .location-card__image {
    margin-bottom: 12px;
  }
}

.location-card__image:before {
  padding-bottom: 67.14285714%;
}

.location-card__tag {
  border-bottom: 1px solid #cdcdcd;
  padding-bottom: 16px;
  margin-bottom: 11px;
}

@media (min-width: 620px) {

  .location-card__tag {
    padding-bottom: 12px;
    margin-bottom: 8px;
  }
}

@media (min-width: 840px) {

  .location-card__tag {
    padding-bottom: 13px;
    margin-bottom: 12px;
  }
}

.location-card__title {
  margin-bottom: 7px;
}

.location-card__address {
  margin-bottom: 20px;
}

@media (min-width: 620px) {

  .location-card__address {
    margin-bottom: 15px;
  }
}

@media (min-width: 1440px) {

  .location-card__address {
    margin-bottom: 25px;
  }
}

.location-card__secondary-link{
  margin-top: 5px;
}

.location-carousel {
  margin-bottom: 60px;
}

.location-grid {
  background: -webkit-gradient(linear, left top, left bottom, from(#ffffff), to(#fff9e7));
  background: -o-linear-gradient(top, #ffffff 0%, #fff9e7 100%);
  background: linear-gradient(180deg, #ffffff 0%, #fff9e7 100%);
}

.location-grid__wrapper {
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  -webkit-flex-wrap: wrap;
      -ms-flex-wrap: wrap;
          flex-wrap: wrap;
  -webkit-box-pack: center;
  -webkit-justify-content: center;
      -ms-flex-pack: center;
          justify-content: center;
}

@media (min-width: 445px) {

  .location-info__wrapper {
    display: -webkit-box;
    display: -webkit-flex;
    display: -ms-flexbox;
    display: flex;
    -webkit-flex-wrap: nowrap;
        -ms-flex-wrap: nowrap;
            flex-wrap: nowrap;
  }
}

@media (min-width: 445px) {

  .location-info__block {
    width: 50%;
  }
}

.location-info__block--left {
  padding: 30px 0;
}

@media (min-width: 445px) {

  .location-info__block--left {
    padding: 40px 0;
    min-height: 335px;
    display: -webkit-box;
    display: -webkit-flex;
    display: -ms-flexbox;
    display: flex;
    -webkit-box-orient: vertical;
    -webkit-box-direction: normal;
    -webkit-flex-direction: column;
        -ms-flex-direction: column;
            flex-direction: column;
    -webkit-box-align: center;
    -webkit-align-items: center;
        -ms-flex-align: center;
            align-items: center;
    -webkit-box-pack: center;
    -webkit-justify-content: center;
        -ms-flex-pack: center;
            justify-content: center;
    -webkit-flex-wrap: wrap;
        -ms-flex-wrap: wrap;
            flex-wrap: wrap;
  }
}

@media (min-width: 1000px) {

  .location-info__block--left {
    padding: 75px 0;
    min-height: 465px;
    width: calc(37.5% - 12.86px);
  }
}

@media (min-width: 1200px) {

  .location-info__block--left {
    width: calc(33.33% - 19.4px);
  }
}

.location-info__title {
  margin-bottom: 10px;
}

.location-info__block--right {
  height: 335px;
}

@media (min-width: 445px) {

  .location-info__block--right {
    height: auto;
  }
}

@media (min-width: 1000px) {

  .location-info__block--right {
    width: calc(62.5% + 12.86px);
  }
}

@media (min-width: 1200px) {

  .location-info__block--right {
    width: calc(66.67% + 19.4px);
  }
}

.location-info__block--right iframe {
    height: 100%;
}

.location-info__inner {
  max-width: 270px;
  margin: 0 auto;
}

.location-info__row {
  margin-bottom: 30px
}

.location-info__row:last-of-type {
  margin-bottom: 0;
}

@media (min-width: 1200px) {

  .location-info__row {
    margin-bottom: 40px;
  }
}

.location-info__link {
  margin-top: 10px;
}

@media (min-width: 1000px) {

  .location-info__link {
    margin-top: 20px;
  }
}

.location-info__phone-number {
  display: block;
  margin-top: 5px;
  text-decoration: underline;
}

@media (min-width: 1000px) {

  .location-info__phone-number {
    margin-top: 10px;
  }
}

.location-info__map {
  height: 100%;
}

.modal {
  -webkit-box-align: center;
  -webkit-align-items: center;
      -ms-flex-align: center;
          align-items: center;
  display: -webkit-box !important;
  display: -webkit-flex !important;
  display: -ms-flexbox !important;
  display: flex !important;
  height: 100vh;
  -webkit-box-pack: center;
  -webkit-justify-content: center;
      -ms-flex-pack: center;
          justify-content: center;
  left: 0;
  opacity: 0;
  overflow-y: scroll;
  padding: 20px 0 40px;
  pointer-events: none;
  position: fixed;
  top: 0;
  -webkit-transition-duration: 200ms;
       -o-transition-duration: 200ms;
          transition-duration: 200ms;
  -webkit-transition-property: opacity, visibility, z-index;
  -o-transition-property: opacity, visibility, z-index;
  transition-property: opacity, visibility, z-index;
  -webkit-transition-timing-function: ease-in-out;
       -o-transition-timing-function: ease-in-out;
          transition-timing-function: ease-in-out;
  visibility: hidden;
  width: 100%;
  z-index: -99;
  -webkit-overflow-scrolling: touch;
}

@media (min-width: 620px) {

  .modal {
    padding: 30px 0;
  }
}

@media (min-width: 1000px) {

  .modal {
    padding: 40px 0;
  }
}

.modal.is-active {
  opacity: 1;
  pointer-events: auto;
  visibility: visible;
  z-index: 9999;
}

.modal.is-scrollable {
  -webkit-box-align: start;
  -webkit-align-items: flex-start;
      -ms-flex-align: start;
          align-items: flex-start;
  overflow-y: scroll;
  -webkit-overflow-scrolling: touch;
}

.modal.modal--what-size {
  padding: 0;
}

@media (min-width: 445px) {

  .modal.modal--what-size {
    padding: 20px 0 40px;
  }
}

@media (min-width: 620px) {

  .modal.modal--what-size {
    padding: 30px 0;
  }
}

@media (min-width: 1000px) {

  .modal.modal--what-size {
    padding: 40px 0;
  }
}

.modal.modal--what-size .modal__container {
      width: 100%;
}

@media (min-width: 445px) {

  .modal.modal--what-size .modal__container {
    width: calc(100% - 40px);
  }
}

@media (min-width: 620px) {

  .modal.modal--what-size .modal__container {
    width: calc(100% - 80px);
  }
}

@media (min-width: 1000px) {

  .modal.modal--what-size .modal__container {
    width: calc(100% - 120px);
  }
}

@media (min-width: 1200px) {

  .modal.modal--what-size .modal__container {
    width: calc(100% - 160px);
  }
}

.modal.modal--what-size .modal__content {
      background-color: transparent;
      margin: 0 auto;
      position: relative;
}

@media (min-width: 445px) {

  .modal.modal--what-size .modal__content {
    max-width: 320px;
  }
}

@media (min-width: 620px) {

  .modal.modal--what-size .modal__content {
    max-width: 520px;
  }
}

@media (min-width: 1000px) {

  .modal.modal--what-size .modal__content {
    max-width: 880px;
  }
}

@media (min-width: 1200px) {

  .modal.modal--what-size .modal__content {
    max-width: 1280px;
  }
}

.modal__container {
  -webkit-box-flex: 0;
  -webkit-flex: 0 0 auto;
      -ms-flex: 0 0 auto;
          flex: 0 0 auto;
  height: auto;
  margin: 0;
  z-index: 1;
}

.modal__content {
  background-color: #ffffff;
}

.modal__close {
  cursor: pointer;
  display: block;
  height: 15px;
  position: absolute;
  right: 25px;
  top: 25px;
  width: 15px;
  z-index: 9
}

.modal__close::before, .modal__close::after {
  background-color: #000000;
  content: '';
  height: 1px;
  left: 50%;
  position: absolute;
  top: 50%;
  -webkit-transform-origin: center;
      -ms-transform-origin: center;
          transform-origin: center;
  width: 20px;
}

.modal__close::before {
  -webkit-transform: translate(-50%, -50%) rotate(45deg);
      -ms-transform: translate(-50%, -50%) rotate(45deg);
          transform: translate(-50%, -50%) rotate(45deg);
}

.modal__close::after {
  -webkit-transform: translate(-50%, -50%) rotate(-45deg);
      -ms-transform: translate(-50%, -50%) rotate(-45deg);
          transform: translate(-50%, -50%) rotate(-45deg);
}

.modal__overlay {
  background-color: #000000;
  display: block;
  height: 100vh;
  left: 0;
  opacity: 0.7;
  position: fixed;
  top: 0;
  width: 100%;
  z-index: 0;
}

.modal__player::before {
  content: '';
  display: block;
  padding-bottom: calc(450/800 * 100%);
}

.modal__video {
  height: 100%;
  left: 0;
  position: absolute;
  top: 0;
  width: 100%;
}

.modal__video--mobile {
  display: none;
}

.modal.is-video-player .modal__content {
    background-color: transparent;
  }

.modal.is-video-player .modal__container {
    max-width: 1000px;
  }

.modal.is-video-player .modal__close {
    right: 0;
    top: -25px
  }

.modal.is-video-player .modal__close::before, .modal.is-video-player .modal__close::after {
  background-color: #ffffff;
}

/* No Touch */

.no-touch .modal__close {
    -webkit-transition: opacity 200ms ease-in-out;
    -o-transition: opacity 200ms ease-in-out;
    transition: opacity 200ms ease-in-out
  }

.no-touch .modal__close:hover {
  opacity: 0.5;
}

.newsletter {
  -webkit-box-ordinal-group: 2;
  -webkit-order: 1;
      -ms-flex-order: 1;
          order: 1;
  text-align: center;
}

@media (min-width: 840px) {

  .newsletter {
    text-align: left;
  }
}

.newsletter__container {
  -webkit-box-align: center;
  -webkit-align-items: center;
      -ms-flex-align: center;
          align-items: center;
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-orient: vertical;
  -webkit-box-direction: normal;
  -webkit-flex-direction: column;
      -ms-flex-direction: column;
          flex-direction: column;
  -webkit-box-pack: center;
  -webkit-justify-content: center;
      -ms-flex-pack: center;
          justify-content: center;
  padding: 30px 0;
}

@media (min-width: 620px) {

  .newsletter__container {
    padding: 35px 0;
  }
}

@media (min-width: 840px) {

  .newsletter__container {
    -webkit-box-orient: horizontal;
    -webkit-box-direction: normal;
    -webkit-flex-direction: row;
        -ms-flex-direction: row;
            flex-direction: row;
  }
}

.newsletter__title .h3 {width:100%;}

.newsletter__title + .newsletter__content {
  margin-top: 10px;
}

@media (min-width: 840px) {

  .newsletter__title + .newsletter__content {
    margin-left: 30px;
    margin-top: 0;
  }
}

.newsletter__title + .newsletter__form {
  margin-top: 15px;
}

@media (min-width: 840px) {

  .newsletter__title + .newsletter__form {
    margin-left: 50px;
    margin-top: 0;
  }
}

@media (min-width: 840px) {

  .newsletter__content {
    max-width: 350px;
  }
}

.newsletter__content + .newsletter__form {
  margin-top: 15px;
}

@media (min-width: 840px) {

  .newsletter__content + .newsletter__form {
    margin-left: 50px;
    margin-top: 0;
  }
}

.newsletter__form {
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-orient: vertical;
  -webkit-box-direction: normal;
  -webkit-flex-direction: column;
      -ms-flex-direction: column;
          flex-direction: column;
  max-width: 285px;
  width: 100%;
}

@media (min-width: 445px) {

  .newsletter__form {
    -webkit-box-align: stretch;
    -webkit-align-items: stretch;
        -ms-flex-align: stretch;
            align-items: stretch;
    -webkit-box-orient: horizontal;
    -webkit-box-direction: normal;
    -webkit-flex-direction: row;
        -ms-flex-direction: row;
            flex-direction: row;
    max-width: none;
    width: auto;
  }
}

@media (min-width: 840px) {

  .newsletter__form {
    -webkit-box-flex: 0;
    -webkit-flex: 0 1 465px;
        -ms-flex: 0 1 465px;
            flex: 0 1 465px;
  }
}

.newsletter__field {
  border: 1px solid #fdd007;
  height: 40px;
  padding: 0 15px;
  height:55px !important;
}

@media (min-width: 445px) {

  .newsletter__field {
    height: auto;
    width: 250px;
  }
}

@media (min-width: 840px) {

  .newsletter__field {
    -webkit-box-flex: 1;
    -webkit-flex: 1 1 auto;
        -ms-flex: 1 1 auto;
            flex: 1 1 auto;
    width: auto;
  }
}

.newsletter__cta {
  margin-top: 10px;
  height:55px !important;
}

@media (min-width: 445px) {

  .newsletter__cta {
    margin-top: 0;
  }
}

@media (min-width: 840px) {

  .newsletter__cta {
    -webkit-box-flex: 0;
    -webkit-flex: 0 0 auto;
        -ms-flex: 0 0 auto;
            flex: 0 0 auto;
  }
}

.newsletter__response{
  position: absolute;
  top: 100%;
  margin-top: 5px;
  padding: 20px;
  max-width: 100%;
  z-index: 1;
  -webkit-box-shadow: 0px 0px 2px 0px rgba(0,0,0,0.2);
          box-shadow: 0px 0px 2px 0px rgba(0,0,0,0.2);
  border-radius: 2px;
}

@media screen and (max-width:800px){
  .newsletter_holder {
    margin-top:20px;
  }
  .newsletter-text {width:70% !important;}
  .newsletter-submit {width:50% !important; -webkit-box-pack:center; -webkit-justify-content:center; -ms-flex-pack:center; justify-content:center; padding:24px 25px 25px 25px; margin-top:0;}
}

@media (min-width: 840px) {

  .order-details__time {
    margin-top: 5px;
  }
}

.order-details__status {
  background: #fff9e7;
  padding: 20px;
  margin-top: 10px;
  margin-bottom: 20px;
}

@media (min-width: 840px) {

  .order-details__status {
    margin-top: 25px;
    margin-bottom: 85px;
    display: -webkit-box;
    display: -webkit-flex;
    display: -ms-flexbox;
    display: flex;
    -webkit-flex-wrap: nowrap;
        -ms-flex-wrap: nowrap;
            flex-wrap: nowrap;
    -webkit-box-align: center;
    -webkit-align-items: center;
        -ms-flex-align: center;
            align-items: center;
    -webkit-justify-content: space-around;
        -ms-flex-pack: distribute;
            justify-content: space-around;
    padding: 15px;
  }
}

@media (min-width: 840px) {

  .order-details__items {
    margin: 40px 0;
  }
}

.order-details__items .orders__order {
    position: relative;
    border-width: 2px;
}

@media (min-width: 840px) {

  .order-details__items .orders__order {
    -webkit-box-pack: start;
    -webkit-justify-content: flex-start;
        -ms-flex-pack: start;
            justify-content: flex-start;
  }
}

.order-details__items .orders__order--header h5:nth-child(1), .order-details__items .orders__order--header h5:nth-child(4) {
  display: inline-block;
  width: 50%;
}

@media (min-width: 840px) {

  .order-details__items .orders__order--header h5:nth-child(1) {
    width: 51.41509434%;
  }

  .order-details__items .orders__order--header h5:nth-child(2) {
    width: 16.03773585%;
  }

  .order-details__items .orders__order--header h5:nth-child(3) {
    width: 23.58490566%;
  }

  .order-details__items .orders__order--header h5:nth-child(4) {
    width: auto;
  }
}

.order-details__items .orders__meta.orders__meta--product {
    width: 100%;
    display: -webkit-box;
    display: -webkit-flex;
    display: -ms-flexbox;
    display: flex;
    -webkit-flex-wrap: nowrap;
        -ms-flex-wrap: nowrap;
            flex-wrap: nowrap;
}

@media (min-width: 840px) {

  .order-details__items .orders__meta.orders__meta--product {
    width: 51.41509434%;
  }
}

.order-details__items .orders__meta-image {
    display: block;
    width: 23.21428571%;
}

@media (min-width: 840px) {

  .order-details__items .orders__meta-image {
    width: 34.86238532%;
  }
}

.order-details__items .orders__meta-image img {
      display: block;
      width: 100%;
}

.order-details__items .orders__meta--quantity {
    width: 23.58490566%;
}

.order-details__items .orders__meta--total {
    width: auto;
}

.order-details__items .orders__meta-info {
    padding-left: 13px;
}

.order-details__items .orders__meta--price {
    position: absolute;
    top: 12px;
    right: 0;
    display: block;
}

@media (min-width: 840px) {

  .order-details__items .orders__meta--price {
    position: relative;
    top: 0;
    width: 16.03773585%;
  }
}

.orders--total .orders__order {
    border: none;
    padding-bottom: 0;
  }

.orders--total .orders__order {
    padding-top: 20px;
  }

@media (min-width: 840px) {

  .orders--total .orders__order {
    padding-top: 20px;
  }
}

@media (min-width: 840px) {

  .orders--total .orders__order:first-child {
    padding-top: 0;
  }
}

.orders--total .orders__order:last-child {
    padding-top: 20px;
}

@media (min-width: 840px) {

  .orders--total .orders__order:last-child {
    padding-top: 40px;
  }
}

.orders__order {
  padding: 20px 0;
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  -webkit-flex-wrap: wrap;
      -ms-flex-wrap: wrap;
          flex-wrap: wrap;
  -webkit-box-pack: justify;
  -webkit-justify-content: space-between;
      -ms-flex-pack: justify;
          justify-content: space-between;
  border-bottom: 1px solid rgba(208, 208, 208, 0.3);
}

@media (min-width: 840px) {

  .orders__order {
    -webkit-flex-wrap: nowrap;
        -ms-flex-wrap: nowrap;
            flex-wrap: nowrap;
  }
}

.orders__order--header {
  padding-top: 20px;
}

@media (min-width: 840px) {

  .orders__order--header {
    padding-top: 0;
  }
}

.orders__order--header > *:nth-child(2), .orders__order--header > *:nth-child(3), .orders__order--header > *:nth-child(4) {
  display: none;
}

@media (min-width: 840px) {

  .orders__order--header > *:nth-child(2), .orders__order--header > *:nth-child(3), .orders__order--header > *:nth-child(4) {
    display: block;
  }
}

@media (min-width: 840px) {

  .orders__order--header > *:nth-child(1) {
    width: 27.35849057%;
  }

  .orders__order--header > *:nth-child(2) {
    width: 22.64150943%;
  }

  .orders__order--header > *:nth-child(3) {
    width: 20.75471698%;
  }

  .orders__order--header > *:nth-child(4) {
    width: 16.98113208%;
  }

  .orders__order--header > *:nth-child(5) {
    width: auto;
  }
}

.orders__order--header span {
    display: none;
}

@media (min-width: 840px) {

  .orders__order--header span {
    display: inline-block;
  }
}

.orders__meta {
  display: none;
}

@media (min-width: 840px) {

  .orders__meta {
    display: block;
    text-align: left;
  }
}

.orders__meta:nth-child(1), .orders__meta:nth-child(2), .orders__meta:nth-child(5) {
  display: block;
}

.orders__meta--number {
  width: 27.35849057%;
  text-decoration: underline;
}

.orders__meta--date {
  -webkit-box-ordinal-group: 2;
  -webkit-order: 1;
      -ms-flex-order: 1;
          order: 1;
  width: 100%;
}

@media (min-width: 840px) {

  .orders__meta--date {
    -webkit-box-ordinal-group: 1;
    -webkit-order: 0;
        -ms-flex-order: 0;
            order: 0;
    width: 22.64150943%;
  }
}

.orders__meta--financial {
  width: 20.75471698%;

}

.orders__meta--fulfillment {
  width: 16.98113208%;
}

.orders__meta--total {
  width: auto;
}

@media (min-width: 840px) {

  .orders__meta--total {}
}

.page-hero {
  padding: 40px 0;
}

@media (min-width: 620px) {

  .page-hero {
    padding: 50px 0 40px;
  }
}

@media (min-width: 1000px) {

  .page-hero {
    padding: 60px 0 40px;
  }
}

@media (min-width: 1200px) {

  .page-hero {
    padding: 80px 0 40px;
  }
}

.page-hero--blog-stories {
  padding-bottom: 20px;
}

@media (min-width: 620px) {

  .page-hero--blog-stories {
    padding: 50px 0;
  }
}

@media (min-width: 1000px) {

  .page-hero--blog-stories {
    padding: 60px 0;
  }
}

@media (min-width: 1200px) {

  .page-hero--blog-stories {
    padding: 80px 0;
  }
}

.page-hero--article {
  padding-top: 15px;
  margin-left: auto;
  margin-right: auto;
}

@media (min-width: 620px) {

  .page-hero--article {
    padding-top: 25px;
  }
}

@media (min-width: 1000px) {

  .page-hero--article {
    padding-top: 30px;
  }
}

@media (min-width: 1200px) {

  .page-hero--article {
    padding-top: 40px;
  }
}

.page-hero__title {
  margin-bottom: 10px
}

.page-hero__title:only-child {
  margin-bottom: 0;
}

@media (min-width: 620px) {

  .page-hero__title {
    margin-bottom: 20px;
  }
}

@media (min-width: 1000px) {

  .page-hero__title {
    margin-bottom: 15px;
  }
}

.page-hero__description {
  margin-top: 10px;
}

@media (min-width: 620px) {

  .page-hero__description {
    margin-top: 20px;
  }
}

@media (min-width: 1000px) {

  .page-hero__description {
    margin-top: 15px;
  }
}

.page-hero__nav {
  margin-top: 20px;
}

@media (min-width: 620px) {

  .page-hero__nav {
    margin-top: 30px;
  }
}

@media (min-width: 1000px) {

  .page-hero__nav {
    margin-top: 45px;
  }
}

@media (min-width: 1440px) {

  .page-hero__nav {
    margin-top: 30px;
  }
}

.page-hero__nav .subnav__wrap {
    position: relative;
    padding: 0;
    border-top: 0;
}

@media (min-width: 620px) {

  .page-hero__nav .subnav__wrap {
    padding: 30px 0;
    border-top: 1px solid #cdcdcd;
    border-bottom: 1px solid #cdcdcd;
  }
}

#page {
  min-height: 100vh;
}

.outer {
  padding-left: 1rem;
  padding-right: 1rem;
}

@media (min-width: 768px) {

  .outer {
    padding-left: 2rem;
    padding-right: 2rem;
  }
}

.pagination {
  -webkit-box-flex: 1;
  -webkit-flex: 1 1 auto;
      -ms-flex: 1 1 auto;
          flex: 1 1 auto;
  position: relative;
  width: 100%;
  margin: 10px 0 40px;
}

@media (min-width: 620px) {

  .pagination {
    margin: 20px 0 50px;
  }
}

@media (min-width: 1440px) {

  .pagination {
    margin: 35px 0 80px;
  }
}

.pagination__inner {
  text-align: center;
}

.pagination__page a, .pagination__page span {
    width: 2em;
    height: 2em;
    border-radius: 100%;
    line-height: 2em;
    color: #000000;
    text-decoration: none;
  }

.pagination__page span {
    color: #000000;
  }

.pagination__page.is-active a, .pagination__page.is-active span {
      background: #fdd007;
      color: #000000;
}

.pagination__arrow {
  color: #000000;
  text-decoration: none;
}

.pagination__arrow svg {
    width: 9px;
    height: 9px;
    fill: #000000;
  }

.plp-active-filter{
  text-transform: capitalize;
  margin-right: 25px;
  display: none;
  -webkit-box-align: center;
  -webkit-align-items: center;
      -ms-flex-align: center;
          align-items: center;
}

@media (min-width: 1000px) {

  .plp-active-filter {
    display: -webkit-box;
    display: -webkit-flex;
    display: -ms-flexbox;
    display: flex;
  }
}

.plp-active-filter__icon{
  width: 14px;
  height: 14px;
  background-color: #000000;
  display: inline-block;
  margin-right: 7px;
  border-radius: 50%;
  position: relative;
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-align: center;
  -webkit-align-items: center;
      -ms-flex-align: center;
          align-items: center;
  -webkit-box-pack: center;
  -webkit-justify-content: center;
      -ms-flex-pack: center;
          justify-content: center;
}

.plp-active-filter__icon svg{
  width: 8px;
  fill: #fff9e7;
}

.plp-grid-cta {
  padding: 0 30px;
}

@media (min-width: 1440px) {

  .plp-grid-cta {
    padding: 0 50px;
  }
}

.plp-grid-cta__image {
  position: relative;
  padding-top: 100%;
  border-radius: 50%;
  overflow: hidden;
}

.plp-grid-cta__image.has-video {
  border-radius: 0;
}

.plp-grid-cta__title {
  margin: 20px auto 5px;
}

.no-touch .plp-grid-cta:hover {}

.plp-hero--search{
  padding-top: 40px;
}

@media (min-width: 1000px) {

  .plp-hero--search {
    padding-top: 80px;
  }
}

.plp-hero .read-more__cta {
    margin-left: auto;
    margin-right: auto;
  }

@media (min-width: 1200px) {

  .plp-hero {
    height: 60vh;
  }
}

.plp-hero__wrap{
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  -webkit-flex-wrap: wrap-reverse;
      -ms-flex-wrap: wrap-reverse;
          flex-wrap: wrap-reverse;
}

@media (min-width: 1000px) {

  .plp-hero__wrap {
    -webkit-flex-wrap: nowrap;
        -ms-flex-wrap: nowrap;
            flex-wrap: nowrap;
    height: inherit;
  }
}

.plp-hero__copy{
  text-align: center;
  padding: 30px 20px;
  width: 100%;
}

@media (min-width: 1000px) {

  .plp-hero__copy {
    width: auto;
    display: -webkit-box;
    display: -webkit-flex;
    display: -ms-flexbox;
    display: flex;
    -webkit-flex-flow: wrap;
        -ms-flex-flow: wrap;
            flex-flow: wrap;
    -webkit-box-align: center;
    -webkit-align-items: center;
        -ms-flex-align: center;
            align-items: center;
    padding: 90px;
    max-width: 700px;
    min-width: 520px;
    min-height: 450px;
  }
}

.plp-hero__title{
  margin-bottom: 10px;
}

.plp-hero__title-image{
  width: 220px;
  margin: auto;
}

@media (min-width: 1000px) {

  .plp-hero__title-image {
    width: 250px;
  }
}

.plp-hero__title-image img{
  -o-object-position: bottom;
     object-position: bottom;
}

.plp-hero__title-image:before{
  content: '';
  display: block;
  padding-top: 20%;
}

.plp-hero__image{
  width: 100%;
  position: relative;
  padding-top: 50%;
}

@media (min-width: 1000px) {

  .plp-hero__image {
    padding-top: 0;
  }
}

.plp-hero__image--smallscreen {
  display: block;
}

.plp-hero__image--widescreen {
  display: none;
}

@media (min-width: 1440px) {
.plp-hero__image--widescreen {
    display: block;
}
.plp-hero__image--smallscreen {
  display: none;
}
}

.plp-hero { height: 100% !important; }

@media screen and (min-width: 1440px) {
  .plp-hero__wrap { height: 850px; }
}

.plp-hero__wrap { height: 400px; }

.plp-hero__copy { min-height: auto !important; }

@media screen and (max-width: 1000px) {

.plp-hero__image {

   padding-top: 40%;

}
.plp-hero__wrap { height: 100%; }


}

.plp-select {
    border: 1px solid #000000;
    display: -webkit-inline-box;
    display: -webkit-inline-flex;
    display: -ms-inline-flexbox;
    display: inline-flex;
    position: relative;
    min-width: 180px;
    width: auto;
    overflow: hidden;
    -webkit-box-align: center;
    -webkit-align-items: center;
        -ms-flex-align: center;
            align-items: center;
}

@media (min-width: 1000px) {

  .plp-select {
    min-width: 280px;
  }
}

.plp-select__pre {
  white-space: nowrap;
  padding-left: 10px;
  line-height: 40px;
  display: none;
}

@media (min-width: 1000px) {

  .plp-select__pre {
    display: block;
  }
}

.plp-select__pre + .plp-select__el {
  padding-left: 5px;
}

.plp-select__el {
  -webkit-box-flex: 0;
  -webkit-flex: 0 0 auto;
      -ms-flex: 0 0 auto;
          flex: 0 0 auto;
  height: 40px;
  left: 0;
  line-height: 40px;
  position: relative;
  top: 0;
  width: 100%;
  z-index: 1;
  margin-left: 5px;
}

@media (min-width: 1000px) {

  .plp-select__el {
    margin-left: 0;
  }
}

.plp-select__icon {
  display: block;
  position: absolute;
  right: 12px;
  top: 50%;
  -webkit-transform: translateY(-50%);
      -ms-transform: translateY(-50%);
          transform: translateY(-50%);
  width: 16px;
  z-index: 0;
}

.plp-select__icon > svg{
  display: block;
}

.plp-sidebar-link{
  padding: 0 4px;
  text-transform: capitalize;
  position: relative;
  overflow: hidden;
  display: inline-block;
  line-height: 1.4;
}

.plp-sidebar-link:before{
  content: '';
  background: #fdd007;
  width: 100%;
  height: 100%;
  position: absolute;
  top: 0;
  left: 0;
  -webkit-transform: translateX(-101%);
      -ms-transform: translateX(-101%);
          transform: translateX(-101%);
  -webkit-transition: -webkit-transform 400ms cubic-bezier(0.42, 0, 0.58, 1);
  transition: -webkit-transform 400ms cubic-bezier(0.42, 0, 0.58, 1);
  -o-transition: transform 400ms cubic-bezier(0.42, 0, 0.58, 1);
  transition: transform 400ms cubic-bezier(0.42, 0, 0.58, 1);
  transition: transform 400ms cubic-bezier(0.42, 0, 0.58, 1), -webkit-transform 400ms cubic-bezier(0.42, 0, 0.58, 1);
}

.plp-sidebar-link.is-active:before{
  -webkit-transform: translateX(0);
      -ms-transform: translateX(0);
          transform: translateX(0);
}

.plp-sidebar-link span{
  position: relative;
}

.plp-sidebar{
  width: 100%;
}

@media (min-width: 1000px) {

  .plp-sidebar {
    padding: 40px 30px;
    width: 300px;
  }
}

@media (min-width: 1200px) {

  .plp-sidebar {
    display: block;
    width: 400px;
    padding: 80px;
  }
}

.plp-sidebar__list--collections{
  overflow: hidden;
  max-height: 0;
  -webkit-transition: max-height 600ms ease-in-out;
  -o-transition: max-height 600ms ease-in-out;
  transition: max-height 600ms ease-in-out;
  margin-bottom: 20px;
  border-bottom: 1px solid #d0d0d0;
}

@media (min-width: 1000px) {

  .plp-sidebar__list--collections {
    margin-bottom: 0;
    max-height: none;
    border-bottom: none;
  }
}

.is-collection-list-active .plp-sidebar__list--collections{
    max-height: 1000px;
  }

@media (min-width: 1000px) {

  .is-collection-list-active .plp-sidebar__list--collections {
    max-height: none;
  }
}

.is-collection-list-active .plp-sidebar__show-collections .icon {
      -webkit-transform: rotate(180deg);
          -ms-transform: rotate(180deg);
              transform: rotate(180deg);
    }

.plp-sidebar__show-collections{
  cursor: pointer;
  padding: 20px 0;
  position: relative;
}

@media (min-width: 1000px) {

  .plp-sidebar__show-collections {
    display: none;
  }
}

.plp-sidebar__show-collections .icon {
    height: 8px;
    pointer-events: none;
    position: absolute;
    right: 0;
    top: calc(50% - 4px);
    -webkit-transform: rotate(0deg);
        -ms-transform: rotate(0deg);
            transform: rotate(0deg);
    -webkit-transition: -webkit-transform 200ms ease-in-out;
    transition: -webkit-transform 200ms ease-in-out;
    -o-transition: transform 200ms ease-in-out;
    transition: transform 200ms ease-in-out;
    transition: transform 200ms ease-in-out, -webkit-transform 200ms ease-in-out;
    width: 10px;
}

@media (min-width: 620px) {

  .plp-sidebar__show-collections .icon {
    top: 4px;
  }
}

.is-search .plp-sidebar__show-collections{
  display: none;
}

.plp-sidebar__list--filters{
  width: 100vw;
  max-width: 240px;
  height: 100vh;
  overflow-y: scroll;
  -webkit-overflow-scrolling: touch;
  position: fixed;
  top: 0;
  right:0;
  background: #ffffff;
  z-index: 999;
  padding: 20px;
  -webkit-box-shadow: -3px 0px 5px 0px rgba(0, 0, 0, 0.14);
          box-shadow: -3px 0px 5px 0px rgba(0, 0, 0, 0.14);
  -webkit-transform: translateX(250px);
      -ms-transform: translateX(250px);
          transform: translateX(250px);
  -webkit-transition: -webkit-transform 300ms ease-in-out;
  transition: -webkit-transform 300ms ease-in-out;
  -o-transition: transform 300ms ease-in-out;
  transition: transform 300ms ease-in-out;
  transition: transform 300ms ease-in-out, -webkit-transform 300ms ease-in-out;
}

@media (min-width: 1000px) {

  .plp-sidebar__list--filters {
    width: auto;
    max-width: none;
    height: auto;
    position: relative;
    background: transparent;
    z-index: 1;
    padding: 0;
    -webkit-box-shadow: none;
            box-shadow: none;
    -webkit-transition: none;
    -o-transition: none;
    transition: none;
    -webkit-transform: none;
        -ms-transform: none;
            transform: none;
    overflow-y: inherit;
    padding-top: 30px;
    border-top: 1px solid #d0d0d0;
  }
}

@media (min-width: 1000px) {

  .plp--search .plp-sidebar__list--filters {
    padding-top: 0;
    border-top: 0;
  }
}

@media (min-width: 1000px) {

  .is-search .plp-sidebar__list--filters {
    border-top: none;
    padding-top: 0;
  }
}

.plp-sidebar__list--filters.is-active{
  -webkit-transform: translateX(0);
      -ms-transform: translateX(0);
          transform: translateX(0);
}

.plp-sidebar__list-group{
  margin-bottom: 30px;
}

.plp-sidebar__list-group-inner--color{
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  -webkit-flex-wrap: wrap;
      -ms-flex-wrap: wrap;
          flex-wrap: wrap;
}

.plp-sidebar__color-circle{
  margin: 3px 5px
}

.plp-sidebar__color-circle:focus-within {
  outline: -webkit-focus-ring-color auto 5px;
}

.plp-sidebar__list-group > ul{
  padding: 10px 0 0 15px;
}

.plp-sidebar__list-group li.is-active{
  background: #fdd007;
  padding: 2px 5px;
}

.plp-sidebar__list-group-item{
  text-transform: capitalize;
  cursor: pointer;
}

.plp-sidebar__list-group-item + .plp-sidebar__list-group-item{
  margin: 3px 0 0;
}

.plp-sidebar__list-group-item--filter{
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-align: center;
  -webkit-align-items: center;
      -ms-flex-align: center;
          align-items: center
}

.plp-sidebar__list-group-item--filter:focus-within {
  outline: -webkit-focus-ring-color auto 5px;
}

.plp-sidebar__list-group-item--filter + .plp-sidebar__list-group-item--filter{
  margin: 7px 0 0;
}

.plp-sidebar__apply-filter{
  padding-bottom: 20px;
  border-bottom: 1px solid #d0d0d0;
  margin-bottom: 20px;
}

@media (min-width: 1000px) {

  .plp-sidebar__apply-filter {
    display: none;
  }
}

@media (min-width: 1000px) {

  .plp-sidebar__reset-filter {
    display: none;
  }
}

.plp-sidebar__list-overlay {
  position: fixed;
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;
  z-index: 998;
  background: rgba(255, 255, 255, .8);
}

.plp__wrap{
  position: relative;
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  -webkit-flex-flow: wrap;
      -ms-flex-flow: wrap;
          flex-flow: wrap;
  padding: 10px 20px 60px 20px;
}

@media (min-width: 1000px) {

  .plp__wrap {
    -webkit-flex-flow: nowrap;
        -ms-flex-flow: nowrap;
            flex-flow: nowrap;
    padding-top: 30px;
  }
}

.plp__sort-bar{
  padding-bottom: 20px;
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
}

@media (min-width: 1000px) {

  .plp__sort-bar {
    margin: 0 10px 40px;
    border-bottom: 1px solid #d0d0d0;
  }
}

@media (min-width: 1000px) {

  .is-search .plp__sort-bar.is-empty {
    padding-bottom: 0;
  }
}

.plp__sort-bar__left{
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  width: 50%;
  -webkit-box-align: center;
  -webkit-align-items: center;
      -ms-flex-align: center;
          align-items: center;
}

@media (min-width: 1000px) {

  .plp__sort-bar__left {
    width: calc(100% - 240px);
    -webkit-box-align: end;
    -webkit-align-items: flex-end;
        -ms-flex-align: end;
            align-items: flex-end;
  }
}

.plp__sort-bar__right{
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-pack: end;
  -webkit-justify-content: flex-end;
      -ms-flex-pack: end;
          justify-content: flex-end;
  width: 50%;
}

@media (min-width: 1000px) {

  .plp__sort-bar-filter-trigger {
    display: none;
  }
}

.plp__grid-wrap{
  width: 100%;
}

@media (min-width: 1000px) {

  .plp__grid-wrap {
    margin: 40px 40px 0 0;
  }
}

@media (min-width: 1200px) {

  .plp__grid-wrap {
    margin: 40px 80px 0 0;
  }
}

.plp__grid-wrap.is-empty {
  visibility: hidden;
}

.plp__grid{
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  -webkit-flex-wrap: wrap;
      -ms-flex-wrap: wrap;
          flex-wrap: wrap;
  width: 100%;
}

@media (min-width: 445px) {

  .plp__grid {
    width: calc(100% + 20px);
    margin-left: -10px;
  }
}

@media (min-width: 1000px) {

  .plp__grid {
    width: 100%;
    margin-left: 0;
  }
}

.plp__grid-first-row{
  width: 100%;
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  -webkit-flex-wrap: wrap;
      -ms-flex-wrap: wrap;
          flex-wrap: wrap;
}

@media (min-width: 1000px) {

  .plp__grid-first-row {
    -webkit-flex-wrap: nowrap;
        -ms-flex-wrap: nowrap;
            flex-wrap: nowrap;
  }
}

.plp__grid-item{
  padding-bottom: 30px;
}

@media (min-width: 445px) {

  .plp__grid-item {
    padding-bottom: 50px;
    margin: 0 10px;
  }
}

.plp__grid-item-group{
  position: relative;
  width: 100%;
  -webkit-align-content: space-between;
      -ms-flex-line-pack: justify;
          align-content: space-between;
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  -webkit-flex-wrap: wrap;
      -ms-flex-wrap: wrap;
          flex-wrap: wrap;
}

@media (min-width: 1000px) {

  .plp__grid-item-group {
    width: calc(33.32% - 20px);
    margin: 0 10px;
  }
}

.plp__grid-item--normal{
  width: 100%;
}

@media (min-width: 445px) {

  .plp__grid-item--normal {
    width: calc(50% - 20px);
  }
}

@media (min-width: 1200px) {

  .plp__grid-item--normal {
    width: calc(33.32% - 20px);
  }
}

.plp__grid-item--featured{
  width: 100%;
}

@media (min-width: 1000px) {

  .plp__grid-item--featured {
    width: calc(66.65% - 20px);
  }
}

.plp__grid-item--first-row-sm{
  width: 100%;
}

@media (min-width: 445px) {

  .plp__grid-item--first-row-sm {
    width: calc(50% - 20px);
  }
}

@media (min-width: 1000px) {

  .plp__grid-item--first-row-sm {
    width: 100%;
    margin: 0;
  }
}

.plp__compact-view-btn{
  margin: auto;
}

.seo_description {
  margin-top: 50px;
  font-size: 14px;
  text-align: left;
}

@media (min-width: 1000px) {

  .seo_description {
    margin-top: 30px;
  }
}

.post-card__featured {
  margin-bottom: 20px;
}

@media (min-width: 620px) {

  .post-card__featured {
    margin-bottom: 30px;
  }
}

.post-card__featured::before {
  padding-bottom: calc(310/280 * 100%);
}

@media (min-width: 620px) {

  .post-card__featured::before {
    padding-bottom: calc(300/420 * 100%);
  }
}

@media (min-width: 1000px) {

  .post-card__featured::before {
    padding-bottom: calc(440/400 * 100%);
  }
}

.post-card__image--hover {
  opacity: 0;
  visibility: hidden;
  z-index: 9;
}

.post-card__title, .post-card__tag {
  margin-bottom: 10px;
}

@media (min-width: 620px) {

  .post-card__title, .post-card__tag {
    margin-bottom: 15px;
  }
}

.post-card__text {
  margin-bottom: 15px;
}

@media (min-width: 620px) {

  .post-card__text {
    margin-bottom: 20px;
  }
}

.post-card-3up {
  -webkit-box-align: center;
  -webkit-align-items: center;
      -ms-flex-align: center;
          align-items: center;
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-orient: vertical;
  -webkit-box-direction: normal;
  -webkit-flex-direction: column;
      -ms-flex-direction: column;
          flex-direction: column;
  -webkit-box-pack: center;
  -webkit-justify-content: center;
      -ms-flex-pack: center;
          justify-content: center;
}

@media (min-width: 1000px) {

  .post-card-3up {
    -webkit-box-align: start;
    -webkit-align-items: flex-start;
        -ms-flex-align: start;
            align-items: flex-start;
    -webkit-box-orient: horizontal;
    -webkit-box-direction: normal;
    -webkit-flex-direction: row;
        -ms-flex-direction: row;
            flex-direction: row;
    -webkit-box-pack: start;
    -webkit-justify-content: flex-start;
        -ms-flex-pack: start;
            justify-content: flex-start;
  }
}

.post-card-3up .post-card {
    -webkit-box-flex: 0;
    -webkit-flex: 0 0 auto;
        -ms-flex: 0 0 auto;
            flex: 0 0 auto;
    margin-top: 30px;
    max-width: 615px;
    width: 100%;
}

@media (min-width: 1000px) {

  .post-card-3up .post-card {
    margin-top: 0;
    margin-left: 30px;
    width: calc(33.33% - 20px);
  }
}

.post-card-3up .post-card:first-child {
  margin: 0;
}

.no-touch .post-card__image--hover {
    -webkit-transition-duration: 200ms;
         -o-transition-duration: 200ms;
            transition-duration: 200ms;
    -webkit-transition-property: opacity, visibility;
    -o-transition-property: opacity, visibility;
    transition-property: opacity, visibility;
    -webkit-transition-timing-function: ease-in-out;
         -o-transition-timing-function: ease-in-out;
            transition-timing-function: ease-in-out;
  }

.no-touch .post-card:hover .post-card__image--hover {
        opacity: 1;
        visibility: visible;
}

.rx-call-form{
  z-index: 1;
}

.rx-call-form__row{
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  -webkit-flex-wrap: wrap;
      -ms-flex-wrap: wrap;
          flex-wrap: wrap;
  margin-top: 10px;
}

@media (min-width: 1000px) {

  .rx-call-form__row {
    margin-top: 20px;
  }
}

.rx-call-form__input--state{
  width: 40%;
}

.rx-call-form__dob-title{
  margin-bottom: 7px;
}

.rx-call-form__input--dobMonth{
  width: 100%;
  margin-bottom: 10px;
}

@media (min-width: 1000px) {

  .rx-call-form__input--dobMonth {
    width: 40%;
    margin-bottom: 0;
  }
}

.rx-call-form__input--number{
  width: calc(60% - 10px);
  margin-left: 10px;
}

@media (min-width: 1000px) {

  .rx-call-form__input--number {
    width: calc(60% - 20px);
    margin-left: 20px;
  }
}

.rx-call-form__input--dobDay{
  width: calc(50% - 5px);
}

@media (min-width: 1000px) {

  .rx-call-form__input--dobDay {
    width: calc(30% - 20px);
    margin-left: 20px;
  }
}

.rx-call-form__input--dobYear{
  width: calc(50% - 5px);
  margin-left: 10px;
}

@media (min-width: 1000px) {

  .rx-call-form__input--dobYear {
    width: calc(30% - 20px);
  }
}

.rx-call-form__dob-title{
  width: 100%;
}

.rx-existing-form{
  z-index: 1;
}

.rx-grid{
  min-height: 500px;
}

.rx-grid__signout-modal{
  padding: 40px;
}

.rx-grid__signout-modal-text{
  margin-bottom: 25px;
}

.rx-grid__new-rx{
  margin-bottom: 40px;
}

@media (min-width: 1000px) {

  .rx-grid__new-rx {
    margin-bottom: 80px;
  }
}

.rx-grid__new-rx-footer{
  margin-top: 25px;
}

@media (min-width: 1000px) {

  .rx-grid__new-rx-footer {
    margin-top: 40px;
  }
}

.rx-grid__title{
  padding-bottom: 25px;
}

@media (min-width: 1000px) {

  .rx-grid__title {
    padding-bottom: 40px;
  }
}

.rx-grid__container{
  border-top: 1px solid rgba(208, 208, 208, 0.3);
  padding-top: 25px;
}

@media (min-width: 1000px) {

  .rx-grid__container {
    padding-top: 45px;
  }
}

.rx-grid__container--empty{
  padding-top: 0;
}

.rx-grid__empty-notice{
  padding: 3em 0;
}

@media (min-width: 1000px) {

  .rx-grid__empty-notice {
    padding: 6em 0;
  }
}

.rx-grid__item{
  border-bottom: 1px solid rgba(208, 208, 208, 0.3);
  padding-bottom: 20px;
  margin-bottom: 25px;
}

@media (min-width: 1000px) {

  .rx-grid__item {
    margin-bottom: 40px;
    padding-bottom: 40px;
  }
}

.rx-grid__edit-icon{
  width: 12px;
  height: 12px;
  display: inline-block;
  vertical-align: middle;
  position: relative;
  top: -1px;
}

@media (min-width: 1000px) {

  .rx-grid__item-body {
    display: -webkit-box;
    display: -webkit-flex;
    display: -ms-flexbox;
    display: flex;
  }
}

.rx-grid__item-title{
  margin-bottom: 15px;
}

@media (min-width: 1000px) {

  .rx-grid__item-title {
    margin-bottom: 25px;
  }
}

.rx-grid__item-orders{
  margin: -10px 0 20px;
}

.rx-grid__item-orders a:not(:last-child) {
    margin-right: 5px;
  }

@media (min-width: 1000px) {

  .rx-grid__item-orders {
    margin: 0;
    position: absolute;
    top: 0;
    right: 0;
  }
}

.rx-grid__alert{
  padding: 20px;
  margin-bottom: 20px;
  display: inline-block;
  border-radius: 3px;
}

.rx-grid__item-col{
  margin-bottom: 15px;
}

@media (min-width: 1000px) {

  .rx-grid__item-col {
    margin-bottom: 0;
  }
}

.rx-grid__item-col:last-child{
  margin-bottom: 0;
}

@media (min-width: 1000px) {

  .rx-grid__item-col--1, .rx-grid__item-col--2 {
    min-width: 165px;
  }
}

.rx-grid__item-footer{
  margin-top: 10px;
}

.rx-grid__item-footer > a{
    margin-right: 7px;
  }

.rx-grid__footer{
  margin-top: 45px;
}

.rx-manual-form{
  z-index: 1;
}

.rx-manual-form__input--14{
  width: 25%;
}

.rx-manual-form__upsell, .rx-manual-form__alert{
  padding: 20px 25px;
}

.rx-options{
  padding-top: 20px;
}

@media (min-width: 1000px) {

  .rx-options {
    width: 50%;
    padding-top: 80px;
    padding-right: 90px;
  }
}

.rx-options__header{
  margin-bottom: 25px;
}

.rx-options__option + .rx-options__option{
  padding-top: 30px;
}

.rx-options__option{
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
}

.rx-options__footer{
  margin-top: 30px;
  margin-bottom: 40px;
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-pack: justify;
  -webkit-justify-content: space-between;
      -ms-flex-pack: justify;
          justify-content: space-between;
  -webkit-box-align: center;
  -webkit-align-items: center;
      -ms-flex-align: center;
          align-items: center;
}

@media (min-width: 1000px) {

  .rx-options__footer {
    margin-top: 80px;
    border-top: 1px solid #d0d0d0;
    padding-top: 40px;
  }
}

.rx-options__byline{
  margin-top: 5px;
}

.rx-options__option-wrap{
  width: 100%;
}

.rx-options__option-wrap.is-inactive{
  opacity: 0.5;
}

.rx-options__form-row{
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  -webkit-flex-wrap: wrap;
      -ms-flex-wrap: wrap;
          flex-wrap: wrap;
  margin-top: 20px;
}

.rx-options__form-input--14{
  width: calc(50% - 5px);
}

@media (min-width: 1160px) {

  .rx-options__form-input--14 {
    width: calc(25% - 15px);
  }
}

.rx-options__form-input--14:nth-child(odd){
  margin-left: 10px;
}

@media (min-width: 1160px) {

  .rx-options__form-input--14:nth-child(odd) {
    margin-left: auto;
  }
}

@media (min-width: 1160px) {

  .rx-options__form-input--14:nth-child(n+3) {
    margin-left: 20px;
  }
}

.rx-options__form-input--14{
  margin-bottom: 10px;
}

.rx-options__form-input--w1{
  width: 100%;
}

.rx-options__form-group-title{
  width: 100%;
  margin-bottom: 7px;
}

.product-3up__container {
  width: 100%;
}

@media (min-width: 1000px) {

  .product-3up__container {
    width: calc(100% - 120px);
  }
}

@media (min-width: 1200px) {

  .product-3up__container {
    max-width: 1280px;
    width: calc(100% - 160px);
  }
}

.product-3up__container .flickity-slider {
    padding: 0 40px;
}

.product-3up__container.product-3up--hr-top::before {
  content: '';
  display: block;
  border-top: 1px solid #d0d0d0;
  padding-bottom: 40px;
  margin: auto 20px;
}

@media (min-width: 620px) {

  .product-3up__container.product-3up--hr-top::before {
    padding-bottom: 60px;
  }
}

@media (min-width: 1000px) {

  .product-3up__container.product-3up--hr-top::before {
    padding-bottom: 80px;
  }
}

.product-3up__container.product-3up--is-4up {
  max-width: 1440px;
}

.product-3up__title {
  -webkit-box-align: center;
  -webkit-align-items: center;
      -ms-flex-align: center;
          align-items: center;
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-pack: center;
  -webkit-justify-content: center;
      -ms-flex-pack: center;
          justify-content: center;
  margin-bottom: 23px;
  padding: 0 20px;
}

@media (min-width: 1000px) {

  .product-3up__title {
    margin-bottom: 40px;
  }
}

.product-3up__title > * {
  -webkit-box-flex: 0;
  -webkit-flex: 0 0 auto;
      -ms-flex: 0 0 auto;
          flex: 0 0 auto;
}

.product-3up__title .icon {
    height: 18px;
    width: 40px;
}

@media (min-width: 1000px) {

  .product-3up__title .icon {
    height: 30px;
    width: 68px;
  }
}

.product-3up__title .icon.icon--pointer-left {
  margin-right: 20px;
}

@media (min-width: 1000px) {

  .product-3up__title .icon.icon--pointer-left {
    margin-right: 50px;
  }
}

.product-3up__title .icon.icon--pointer-right {
  margin-left: 20px;
}

@media (min-width: 1000px) {

  .product-3up__title .icon.icon--pointer-right {
    margin-left: 50px;
  }
}

.product-3up__title__text {
  -webkit-box-flex: 1;
  -webkit-flex: 1 1 auto;
      -ms-flex: 1 1 auto;
          flex: 1 1 auto;
}

@media (min-width: 445px) {

  .product-3up__title__text {
    -webkit-box-flex: 0;
    -webkit-flex: 0 0 auto;
        -ms-flex: 0 0 auto;
            flex: 0 0 auto;
  }
}

@media (min-width: 1000px) {

  .product-3up__items {
    display: -webkit-box;
    display: -webkit-flex;
    display: -ms-flexbox;
    display: flex;
    -webkit-box-pack: center;
    -webkit-justify-content: center;
        -ms-flex-pack: center;
            justify-content: center;
  }
}

.product-3up__item {
  margin-left: 30px;
  width: 210px;
}

@media (min-width: 620px) {

  .product-3up__item {
    width: 410px;
  }
}

@media (min-width: 1000px) {

  .product-3up__item {
    width: calc(33.33% - 20px);
  }
}

@media (min-width: 1000px) {

  .product-3up--is-4up .product-3up__item {
    width: calc(25% - 20px);
  }
}

@media (min-width: 445px) {

  .product-3up__item:first-child {
    margin-left: 0;
  }
}

.product-breadcrumbs .breadcrumbs {
    margin-top: 15px;
  }

@media (min-width: 620px) {

  .product-breadcrumbs .breadcrumbs {
    margin-top: 30px;
  }
}

.product-breakdown__wrapper {
  width: 100%
}

.product-breakdown__wrapper::before {
  padding-bottom: calc(320/280 * 100%);
}

@media (min-width: 620px) {

  .product-breakdown__wrapper::before {
    padding-bottom: calc(410/520 * 100%);
  }
}

@media (min-width: 1000px) {

  .product-breakdown__wrapper::before {
    padding-bottom: calc(655/1280 * 100%);
  }
}

.quick-view__wrapper {
  position: fixed;
  top: 100px;
  right: 55px;
  z-index: 1000;
  -webkit-box-shadow: 0 0 5px #ccc;
          box-shadow: 0 0 5px #ccc;
}

@media (min-width: 1200px) {

  .quick-view__wrapper {
    top: 90px;
    right: 45px;
  }
}

.quick-view__wrapper-inner {
  background-color: #ffffff;
  text-transform: uppercase;
  padding: 20px 20px 0;
}

.quick-view__wrapper-header {
  border-bottom: 2px solid #e3e3e3;
  padding-bottom: 20px;
}

.quick-view__wrapper-body {
  background-color: #ffffff;
  padding: 26px 0;
}

.quick-view__wrapper-footer {
  background-color: #fff9e7;
  padding: 20px;
}

.quick-view__image {
  width: 72px;
  height: 51px;
  position: relative;
  display: inline-block;
}

.product-details {
  display: inline-block;
  vertical-align: top;
  padding-left: 5px;
}

.product-details p {
    padding-top: 8px;
    text-transform: capitalize;
  }

.product-card__quick-view {
  position: absolute;
  top: -20px;
  left: -20px;
  width: calc(100% + 40px);
  padding: 20px;
  -webkit-box-shadow: 0 0 5px #ccc;
          box-shadow: 0 0 5px #ccc;
  z-index: 11;
}

.product-card__quick-view .flickity-prev-next-button {
    background: none;
    width: 26px;
    height: 26px;
  }

@media (min-width: 1440px) {

  .product-card__quick-view .flickity-prev-next-button {
    width: 30px;
    height: 30px;
  }
}

.product-card__quick-view__carousel .flickity-enabled {
    z-index: 2;
    position: relative;
    cursor: pointer;
  }

.product-card__quick-view__disclaimer {
  padding-top: 10px;
}

.product-card {
  position: relative;
}

.product-card__featured {
  display: block;
  padding-top: 70%;
  position: relative
}

.product-card__featured::before {
  -webkit-box-shadow: inset 0px 0px 0px 4.5px #ffffff;
          box-shadow: inset 0px 0px 0px 4.5px #ffffff;
  content: '';
  height: 100%;
  left: 0;
  position: absolute;
  top: 0;
  width: 100%;
  z-index: 10;
}

@media (min-width: 445px) {

  .product-card--large .product-card__featured {
    padding-top:40%;
  }
}

@media (min-width: 1000px) {

  .product-card--large .product-card__featured {
    padding-top: calc(69% + 140px);
  }
}

.product-card__image::before {
  -webkit-box-shadow: inset 0 0 0 4px #fdd007;
          box-shadow: inset 0 0 0 4px #fdd007;
  content: '';
  height: 100%;
  left: 0;
  position: absolute;
  top: 0;
  width: 100%;
  z-index: 9;
}

.product-card__image.quickviewActive:before {
  z-index: 0;
}

.product-card__details {
  display: block;
  text-align: center;
  margin: 15px 0;
}

.no-touch .product-card .product-card__featured::before {
  -webkit-transition: -webkit-box-shadow 200ms ease-in-out;
  transition: -webkit-box-shadow 200ms ease-in-out;
  -o-transition: box-shadow 200ms ease-in-out;
  transition: box-shadow 200ms ease-in-out;
  transition: box-shadow 200ms ease-in-out, -webkit-box-shadow 200ms ease-in-out;
}

.no-touch .product-card:hover .product-card__featured::before {
  -webkit-box-shadow: inset 0 0 0 0 #ffffff;
          box-shadow: inset 0 0 0 0 #ffffff;
}

.product-color-swatch__title {
  margin-bottom: 10px;
}

.product-color-swatch__list {
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  -webkit-flex-wrap: wrap;
      -ms-flex-wrap: wrap;
          flex-wrap: wrap;
  margin: -5px;
  max-width: 256px;
}

@media (min-width: 1000px) {

  .product-color-swatch__list {
    max-width: 192px;
  }
}

@media (min-width: 1200px) {

  .product-color-swatch__list {
    max-width: 256px;
  }
}

.product-color-swatch__item {
  margin: 5px;
  -webkit-transition: opacity 200ms ease-in-out;
  -o-transition: opacity 200ms ease-in-out;
  transition: opacity 200ms ease-in-out
}

.product-color-swatch__item:disabled {
  opacity: 0.4;
  position: relative;
}

.product-color-swatch__item:disabled::before {
  background-color: #ffffff;
  content: '';
  height: 100%;
  left: 50%;
  position: absolute;
  top: 0;
  -webkit-transform: translateX(-50%) rotate(45deg);
      -ms-transform: translateX(-50%) rotate(45deg);
          transform: translateX(-50%) rotate(45deg);
  width: 1px;
  z-index: 9;
}

.product-color-swatch__item:disabled .color-circle {
      cursor: default;
}

.product-description__item {
  border-bottom: 1px solid #d0d0d0
}

.product-description__item.is-active .product-description__title::before {
  -webkit-transform: translateY(-50%) rotate(0);
      -ms-transform: translateY(-50%) rotate(0);
          transform: translateY(-50%) rotate(0);
}

.product-description__item.is-active .product-description__content {
      -webkit-transition-delay: 0;
           -o-transition-delay: 0;
              transition-delay: 0;
}

.product-description__item.is-active .product-description__content__container {
      opacity: 1;
      pointer-events: auto;
      visibility: visible;
}

.product-description__item.is-active .h4 {
  text-decoration: underline;
}

.product-description__title {
  cursor: pointer;
  padding: 15px 0;
  position: relative
}

.product-description__title::after, .product-description__title::before {
  background-color: #000000;
  content: '';
  display: block;
  height: 2px;
  position: absolute;
  right: 3px;
  top: 50%;
  -webkit-transform: translateY(-50%);
      -ms-transform: translateY(-50%);
          transform: translateY(-50%);
  -webkit-transform-origin: center;
      -ms-transform-origin: center;
          transform-origin: center;
  -webkit-transition: -webkit-transform 200ms ease-in-out;
  transition: -webkit-transform 200ms ease-in-out;
  -o-transition: transform 200ms ease-in-out;
  transition: transform 200ms ease-in-out;
  transition: transform 200ms ease-in-out, -webkit-transform 200ms ease-in-out;
  width: 6px;
}

.product-description__title::before {
  -webkit-transform: translateY(-50%) rotate(90deg);
      -ms-transform: translateY(-50%) rotate(90deg);
          transform: translateY(-50%) rotate(90deg);
}

.product-description__content {
  height: 0;
  overflow: hidden;
  -webkit-transition: height 200ms ease-in-out;
  -o-transition: height 200ms ease-in-out;
  transition: height 200ms ease-in-out
}

.product-description__content.wysiwyg {
  padding: 0;
}

.product-description__content__container {
  opacity: 0;
  padding-bottom: 15px;
  pointer-events: none;
  -webkit-transition-duration: 200ms;
       -o-transition-duration: 200ms;
          transition-duration: 200ms;
  -webkit-transition-property: opacity, visibility;
  -o-transition-property: opacity, visibility;
  transition-property: opacity, visibility;
  -webkit-transition-timing-function: ease-in-out;
       -o-transition-timing-function: ease-in-out;
          transition-timing-function: ease-in-out;
  visibility: hidden;
}

.product-gallery {
  -webkit-box-flex: 0;
  -webkit-flex: 0 0 auto;
      -ms-flex: 0 0 auto;
          flex: 0 0 auto;
  overflow: hidden;
  margin: 0 -20px;
  width: calc(100% + 40px);
}

@media (min-width: 1000px) {

  .product-gallery {
    -webkit-box-flex: 1;
    -webkit-flex: 1 1 620px;
        -ms-flex: 1 1 620px;
            flex: 1 1 620px;
    margin: 0;
    max-width: 620px;
    width: 100%;
  }
}

@media (min-width: 1200px) {

  .product-gallery {
    -webkit-box-flex: 1;
    -webkit-flex: 1 1 765px;
        -ms-flex: 1 1 765px;
            flex: 1 1 765px;
    max-width: 765px;
  }
}

.product-gallery .flickity-page-dots {
    bottom: 30px;
}

.product-gallery .dot {
    background-color: transparent;
    border: 1px solid #000000;
    height: 7px;
    margin: 0 4px;
    opacity: 0.5;
    -webkit-transition: background-color 200ms ease-in-out;
    -o-transition: background-color 200ms ease-in-out;
    transition: background-color 200ms ease-in-out;
    width: 7px;
}

.product-gallery .dot.is-selected {
  background-color: #000000;
  opacity: 0.5;
}

.product-gallery .flickity-slider {
    display: -webkit-box;
    display: -webkit-flex;
    display: -ms-flexbox;
    display: flex;
}

.product-gallery__container {
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
}

@media (min-width: 1000px) {

  .product-gallery__container {
    display: block;
  }
}

.product-gallery-featured {
  display: none;
  overflow: hidden;
}

@media (min-width: 620px) {

  .product-gallery-featured {
    display: block;
    -webkit-box-flex: 1;
    -webkit-flex: 1 1 auto;
        -ms-flex: 1 1 auto;
            flex: 1 1 auto;
    margin-bottom: 18px;
    width: 100%;
  }
}

.product-gallery-featured::before {
  padding-bottom: calc(575/765 * 100%);
}

.product-gallery-featured .zoomImg {
    pointer-events: none;
    -webkit-transition: opacity 200ms ease-in-out;
    -o-transition: opacity 200ms ease-in-out;
    transition: opacity 200ms ease-in-out;
    z-index: 9;
}

.product-gallery-featured--gift-card {
  display: block;
  -webkit-box-flex: 1;
  -webkit-flex: 1 1 auto;
      -ms-flex: 1 1 auto;
          flex: 1 1 auto;
  width: 100%;
}

.product-gallery-list {
  max-height: 430px;
  overflow: hidden;
  width: 100%;
  -webkit-overflow-scrolling: touch;


}

@media (min-width: 620px) {

  .product-gallery-list {
    display: -webkit-box;
    display: -webkit-flex;
    display: -ms-flexbox;
    display: flex;
    -webkit-box-flex: 0;
    -webkit-flex: 0 0 auto;
        -ms-flex: 0 0 auto;
            flex: 0 0 auto;
    -webkit-box-orient: vertical;
    -webkit-box-direction: normal;
    -webkit-flex-direction: column;
        -ms-flex-direction: column;
            flex-direction: column;
    margin-left: 20px;
    overflow: visible;
    width: auto;
  }
}

@media (min-width: 1000px) {

  .product-gallery-list {
    -webkit-box-orient: horizontal;
    -webkit-box-direction: normal;
    -webkit-flex-direction: row;
        -ms-flex-direction: row;
            flex-direction: row;
    -webkit-flex-wrap: wrap;
        -ms-flex-wrap: wrap;
            flex-wrap: wrap;
    margin: 0 -7px;
  }
}

.product-gallery-list__item {
  cursor: pointer;
  position: relative;
  width: 100%
}

.product-gallery-list__item:focus {
  outline: -webkit-focus-ring-color auto 5px;
}

@media (min-width: 620px) {

  .product-gallery-list__item {
    -webkit-box-flex: 0;
    -webkit-flex: 0 0 auto;
        -ms-flex: 0 0 auto;
            flex: 0 0 auto;
    margin-top: 15px;
    width: 95px;
  }
}

@media (min-width: 1000px) {

  .product-gallery-list__item {
    margin: 0 7px 14px;
    width: 100px;
  }
}

@media (min-width: 620px) {

  .product-gallery-list__item:first-child {
    margin-top: 0;
  }
}

@media (min-width: 620px) {

  .product-gallery-list__item::before {
    -webkit-box-shadow: inset 0 0 0 0 #fdd007;
            box-shadow: inset 0 0 0 0 #fdd007;
    content: '';
    height: 100%;
    left: 0;
    position: absolute;
    top: 0;
    -webkit-transition: -webkit-box-shadow 200ms ease-in-out;
    transition: -webkit-box-shadow 200ms ease-in-out;
    -o-transition: box-shadow 200ms ease-in-out;
    transition: box-shadow 200ms ease-in-out;
    transition: box-shadow 200ms ease-in-out, -webkit-box-shadow 200ms ease-in-out;
    width: 100%;
    z-index: 9;
  }
}

@media (min-width: 620px) {

  .product-gallery-list__item.is-active::before {
    -webkit-box-shadow: inset 0 0 0 3px #fdd007;
            box-shadow: inset 0 0 0 3px #fdd007;
  }
}

.product-gallery-list__item .zoomImg {
    opacity: 1 !important;
    pointer-events: none;
    -webkit-transition: opacity 200ms ease-in-out;
    -o-transition: opacity 200ms ease-in-out;
    transition: opacity 200ms ease-in-out;
    visibility: visible;
    z-index: 9;
}

.product-gallery-list__thumbnail {
  width: 100%
}

.product-gallery-list__thumbnail::before {
  padding-bottom: calc(450/600 * 100%);
}

@media (min-width: 620px) {

  .product-gallery-list__thumbnail::before {
    padding-bottom: calc(75/100 * 100%);
  }
}

@media (min-width: 1000px) {

  .no-touch .product-gallery-list__item:hover::before {
    -webkit-box-shadow: inset 0 0 0 3px #fdd007;
            box-shadow: inset 0 0 0 3px #fdd007;
  }
}

#mobile-alttext {
  text-align: center;
  display: inline-block;
  margin: 20px auto 0px;
  font-size: 10px;
}

@media (min-width: 620px) {

  #mobile-alttext {
    display: none;
  }
}

.product-hero {
  padding-top: 8px;
}

@media (min-width: 620px) {

  .product-hero {
    padding: 16px 0px 55px; 
  }
}

@media (min-width: 1000px) {

  .product-hero {
    padding-bottom: 75px;
  }
}

.product-hero__container {
  -webkit-box-align: start;
  -webkit-align-items: flex-start;
      -ms-flex-align: start;
          align-items: flex-start;
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-orient: vertical;
  -webkit-box-direction: normal;
  -webkit-flex-direction: column;
      -ms-flex-direction: column;
          flex-direction: column;
}

@media (min-width: 1000px) {

  .product-hero__container {
    -webkit-box-orient: horizontal;
    -webkit-box-direction: normal;
    -webkit-flex-direction: row;
        -ms-flex-direction: row;
            flex-direction: row;
    -webkit-box-pack: end;
    -webkit-justify-content: flex-end;
        -ms-flex-pack: end;
            justify-content: flex-end;
  }
}

.product-hero__offer {
  display: block;
  margin-bottom: 10px;
}

@media (min-width: 620px) {

  .product-hero__offer {
    display: none;
  }
}

.product-hero__title {
  font-size: 20px;   
  line-height: 27px;
  letter-spacing: 0.07em;

  margin-bottom: 2px;
}

.product-hero__affirm-msg{
  margin-top: 10px;
  text-align: center;
}

@media (min-width: 768px) {

  .product-hero__affirm-msg {
    margin-top: 15px;
  }
}

.product-hero__affirm-msg > a {
  text-decoration: underline;
}

.product-hero__affirm-msg--main{
  margin-top: 20px;
}

.product-hero__meta, .product-main__meta {
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-orient: vertical;
  -webkit-box-direction: normal;
  -webkit-flex-direction: column;
      -ms-flex-direction: column;
          flex-direction: column;
}

@media (min-width: 1000px) {

  .product-hero__meta, .product-main__meta {
    padding-top: 0;
    -webkit-box-orient: horizontal;
    -webkit-box-direction: normal;
    -webkit-flex-direction: row;
        -ms-flex-direction: row;
            flex-direction: row;
    -webkit-box-align: center;
    -webkit-align-items: center;
        -ms-flex-align: center;
            align-items: center;
  }
}

.product-hero__meta .yotpo, .product-main__meta .yotpo {
    padding-top: 2px;
}

@media (min-width: 620px) {

  .product-hero__meta .yotpo, .product-main__meta .yotpo {
    padding-top: 5px;
  }
}

@media (min-width: 1000px) {

  .product-hero__meta .yotpo, .product-main__meta .yotpo {
    margin-left: 25px;
  }
}

.product-lens-flow {
  height: 100vh;
  opacity: 0;
  overflow: hidden;
  pointer-events: none;
  position: fixed;
  right: 0;
  top: 0;
  -webkit-transition-duration: 0.4s;
       -o-transition-duration: 0.4s;
          transition-duration: 0.4s;
  -webkit-transition-property: opacity, visibility, z-index;
  -o-transition-property: opacity, visibility, z-index;
  transition-property: opacity, visibility, z-index;
  -webkit-transition-timing-function: ease-in-out;
       -o-transition-timing-function: ease-in-out;
          transition-timing-function: ease-in-out;
  visibility: hidden;
  width: 100%;
  z-index: -99
}

.product-lens-flow.is-active {
  opacity: 1;
  pointer-events: auto;
  visibility: visible;
  z-index: 99999999;
}

.product-lens-flow__container {
  height: 100%;
  left: 0;
  position: absolute;
  top: 0;
  width: 100%;
}

.product-lens-flow__container .small-card {
    margin-top: 40px;
  }

.product-lens-flow__overlay {
  background-color: rgba(255, 255, 255, 0.6);
  content: '';
  display: block;
  position: absolute;
  height: 100%;
  width: 100%;
  z-index: 0;
}

.product-lens-flow__wrapper {
  background-color: #ffffff;
  -webkit-box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.2);
          box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.2);
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-orient: vertical;
  -webkit-box-direction: normal;
  -webkit-flex-direction: column;
      -ms-flex-direction: column;
          flex-direction: column;
  height: 100%;
  min-height: 0;
  position: absolute;
  right: 0;
  width: 100%;
  z-index: 9;
}

@media (min-width: 768px) {

  .product-lens-flow__wrapper {
    width: 530px;
  }
}

.product-lens-main, .product-lens-continue {
  width: 100%;
}

.product-lens-main {
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-flex: 1;
  -webkit-flex: 1 1 auto;
      -ms-flex: 1 1 auto;
          flex: 1 1 auto;
  -webkit-box-orient: vertical;
  -webkit-box-direction: normal;
  -webkit-flex-direction: column;
      -ms-flex-direction: column;
          flex-direction: column;
  min-height: 0;
  padding-top: 30px;
  position: relative;
}

@media (min-width: 445px) {

  .product-lens-main {
    padding-top: 35px;
  }
}

.product-lens-main::after {
  background: -webkit-gradient(linear, left top, left bottom, from(rgba(0, 0, 0, 0)), to(rgba(0, 0, 0, 0.08)));
  background: -o-linear-gradient(top, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 0.08) 100%);
  background: linear-gradient(to bottom, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 0.08) 100%);
  bottom: 0;
  content: '';
  height: 5px;
  left: 0;
  position: absolute;
  width: 100%;
}

.product-lens-headline {
  border-bottom: 1px solid #d0d0d0;
  -webkit-box-flex: 0;
  -webkit-flex: 0 0 auto;
      -ms-flex: 0 0 auto;
          flex: 0 0 auto;
  margin: 0 20px;
  padding-bottom: 25px;
  position: relative;
  width: calc(100% - 40px);
}

@media (min-width: 445px) {

  .product-lens-headline {
    padding-bottom: 30px;
    margin: 0 40px;
    width: calc(100% - 80px);
  }
}

@media (min-width: 620px) {

  .product-lens-headline {
    margin: 0 45px;
    width: calc(100% - 90px);
  }
}

.product-lens-headline__previous, .product-lens-headline__close {
  display: block;
  position: absolute;
  top: 0
}

.product-lens-headline__previous:focus, .product-lens-headline__close:focus {
  outline: auto 5px -webkit-focus-ring-color;
}

.product-lens-headline__previous {
  left: 0;
}

.product-lens-headline__previous .icon {
    height: 16px;
    width: 10px;
  }

.product-lens-headline__close {
  right: 0;
}

.product-lens-headline__close .icon {
    height: 14px;
    width: 14px;
  }

.product-lens-content {
  -webkit-box-flex: 1;
  -webkit-flex: 1;
      -ms-flex: 1;
          flex: 1;
  overflow-y: auto;
  padding: 25px 20px;
  position: relative;
  width: 100%;
  -webkit-overflow-scrolling: touch;
}

@media (min-width: 445px) {

  .product-lens-content {
    padding: 40px;
  }
}

@media (min-width: 620px) {

  .product-lens-content {
    padding: 40px 45px;
  }
}

.product-lens-content__item {
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  margin-top: 20px
}

.product-lens-content__item:first-child {
  margin-top: 0;
}

.product-lens-content__item__label {
  cursor: pointer;
}

.product-lens-content__item__upgrade {
  margin-top: 5px;
}

.product-lens-content__frame-only {
  border-top: 1px solid #d0d0d0;
  margin-top: 40px;
  padding-top: 40px;
  position: relative;
}

.product-lens-content__frame-only::before {
  background-color: #ffffff;
  color: #d0d0d0;
  content: 'or';
  padding: 0 3px;
  position: absolute;
  top: -11px;
  left: 50%;
  text-transform: uppercase;
  -webkit-transform: translateX(-50%);
      -ms-transform: translateX(-50%);
          transform: translateX(-50%);
}

.product-lens-content__frame-only.italy::before {
  content: 'o';
}

.product-lens-content__frame-only.japan::before {
  content: '\307E\305F\306F';
}

.product-lens-continue {
  border-top: 1px solid #d0d0d0;
  -webkit-box-flex: 1;
  -webkit-flex: 1;
      -ms-flex: 1;
          flex: 1;
  padding: 20px 20px 30px;
  position: relative;
  margin-bottom: 40px
}

.product-lens-continue.is-international {
  padding-bottom: 70px;
}

@media (min-width: 620px) {

  .product-lens-continue {
    padding: 30px 45px;
  }

  .product-lens-continue.is-international {
    padding: 30px 45px;
  }
}

@media (min-width: 768px) {

  .product-lens-continue__holder {
    -webkit-box-align: start;
    -webkit-align-items: flex-start;
        -ms-flex-align: start;
            align-items: flex-start;
    display: -webkit-box;
    display: -webkit-flex;
    display: -ms-flexbox;
    display: flex;
  }
}

.product-lens-continue__card {
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  margin-bottom: 10px;
}

@media (min-width: 445px) {

  .product-lens-continue__card {
    margin-bottom: 30px;
  }
}

@media (min-width: 768px) {

  .product-lens-continue__card {
    -webkit-box-flex: 1;
    -webkit-flex: 1;
        -ms-flex: 1;
            flex: 1;
  }
}

.product-lens-continue__card.no-display {
  display: none;
}

@media (min-width: 768px) {

  .product-lens-continue__card.no-display {
    display: -webkit-box;
    display: -webkit-flex;
    display: -ms-flexbox;
    display: flex;
  }
}

.product-lens-continue__card__featured{
  margin-right: 25px;
  width: 125px;
}

@media (min-width: 768px) {

  .product-lens-continue__card__featured {
    -webkit-box-flex: 0;
    -webkit-flex: 0 0 auto;
        -ms-flex: 0 0 auto;
            flex: 0 0 auto;
  }
}

.product-lens-continue__card__featured::before {
  padding-bottom: calc(90/125 * 100%);
}

.product-lens-continue__card__title {
  margin-bottom: 10px;
}

.product-lens-continue__price {
  -webkit-box-align: center;
  -webkit-align-items: center;
      -ms-flex-align: center;
          align-items: center;
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-pack: justify;
  -webkit-justify-content: space-between;
      -ms-flex-pack: justify;
          justify-content: space-between;
  margin: 0 -20px;
  padding: 0 20px 12px;
}

@media (min-width: 445px) {

  .product-lens-continue__price:not(.no-product-preview) {
    border-top: 1px solid #d0d0d0;
    padding: 22px 45px;
  }

  .product-lens-continue__price {
    padding: 0px 45px 22px;
    margin: 0 -45px;
  }
}

@media (min-width: 768px) {

  .product-lens-continue__price {
    border-top: none;
    display: block;
    -webkit-box-flex: 0;
    -webkit-flex: 0 0 auto;
        -ms-flex: 0 0 auto;
            flex: 0 0 auto;
    margin: 0 0 0 20px;
    padding: 0;
  }
}

.product-lens-continue__error {
  bottom: 20px;
  color: red;
  position: absolute;
}

/* Animations */

.lens-flow-enter-active, .lens-flow-leave-active {
  -webkit-transition: opacity 0.4s ease-in-out;
  -o-transition: opacity 0.4s ease-in-out;
  transition: opacity 0.4s ease-in-out;
}

.lens-flow-enter, .lens-flow-leave-to {
  opacity: 0;
}

.lens-flow-enter-active .product-lens-flow__wrapper, .lens-flow-leave-active .product-lens-flow__wrapper {
  -webkit-transition: -webkit-transform 0.4s ease-in-out;
  transition: -webkit-transform 0.4s ease-in-out;
  -o-transition: transform 0.4s ease-in-out;
  transition: transform 0.4s ease-in-out;
  transition: transform 0.4s ease-in-out, -webkit-transform 0.4s ease-in-out;
}

.lens-flow-enter .product-lens-flow__wrapper, .lens-flow-leave-to .product-lens-flow__wrapper {
  -webkit-transform: translateX(40px);
      -ms-transform: translateX(40px);
          transform: translateX(40px);
}

.flow-step-enter-active, .flow-step-leave-active {
  -webkit-transition: opacity 0.4s ease-in-out, -webkit-transform 0.4s ease-in-out;
  transition: opacity 0.4s ease-in-out, -webkit-transform 0.4s ease-in-out;
  -o-transition: opacity 0.4s ease-in-out, transform 0.4s ease-in-out;
  transition: opacity 0.4s ease-in-out, transform 0.4s ease-in-out;
  transition: opacity 0.4s ease-in-out, transform 0.4s ease-in-out, -webkit-transform 0.4s ease-in-out;
}

.flow-step-enter, .flow-step-leave-to {
  opacity: 0;
}

.product-lens-content__step--1.flow-step-enter, .product-lens-content__step--1.flow-step-leave-to {
  -webkit-transform: translateX(-20px);
      -ms-transform: translateX(-20px);
          transform: translateX(-20px);
}

.product-lens-content__step--2.flow-step-enter, .product-lens-content__step--2.flow-step-leave-to {
  -webkit-transform: translateX(20px);
      -ms-transform: translateX(20px);
          transform: translateX(20px);
}

.product-toggle {
  width: 50px;
  height: 25px;
  background-color: #ffffff;
  border-top-left-radius: 50px;
  border-top-right-radius: 50px;
  border: 1px solid #d0d0d0;
  border-bottom-color: transparent;
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-align: center;
  -webkit-align-items: center;
      -ms-flex-align: center;
          align-items: center;
  -webkit-box-pack: center;
  -webkit-justify-content: center;
      -ms-flex-pack: center;
          justify-content: center;
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  margin: auto;
  -webkit-transform: translateY(-60%);
      -ms-transform: translateY(-60%);
          transform: translateY(-60%)
}

.product-toggle:after {
  content: "";
  display: block;
  width: 104%;
  height: 40%;
  position: absolute;
  bottom: 0;
  left: -2%;
  background-color: #ffffff;
  z-index: 1;
}

@media (min-width: 768px) {

  .product-toggle {
    display: none;
  }
}

.product-toggle__icon {
  width: 10px;
  display: block;
  z-index: 2;
  position: relative;
  -webkit-transform: rotate(180deg);
      -ms-transform: rotate(180deg);
          transform: rotate(180deg);
}

.product-toggle.showing .product-toggle__icon {
    -webkit-transform: rotate(0deg);
        -ms-transform: rotate(0deg);
            transform: rotate(0deg);
  }

.product-lens-continue__card__content .p2 {width:220%;}

.lfbc-on .lf-breadcrumbs-titles {
  display:-webkit-box;
  display:-webkit-flex;
  display:-ms-flexbox;
  display:flex;
  -webkit-box-pack:justify;
  -webkit-justify-content:space-between;
      -ms-flex-pack:justify;
          justify-content:space-between;
  margin:10px auto 0 auto;
}

@media screen and (max-width:650px) {

  .lfbc-on .lf-breadcrumbs-titles {
    width:430px;
  }
}

@media screen and (max-width:500px) {

  .lfbc-on .lf-breadcrumbs-titles {
    width:auto;
  }
}

.lfbc-on .lf-breadcrumbs-titles .step-one, .lfbc-on .lf-breadcrumbs-titles .step-two, .lfbc-on .lf-breadcrumbs-titles .step-three {width:102px;
}

.lfbc-on .lf-breadcrumbs-titles p {
    font-family:'courier', arial, sans-serif;
    font-size:13px;
    color:#ccc;
    width:90px;
    text-transform:uppercase;
    text-align:center;
    width:100%;
    -webkit-transition:0.3s all ease-in-out;
    -o-transition:0.3s all ease-in-out;
    transition:0.3s all ease-in-out;
}

@media screen and (max-width:750px) {

  .lfbc-on .lf-breadcrumbs-titles p {
    font-size:10px;
  }
}

@media screen and (max-width:750px) {
      .lfbc-on .lf-breadcrumbs-titles .step-one p {text-align:left;}
      .lfbc-on .lf-breadcrumbs-titles .step-three p {text-align:right;}
}

.lfbc-on .lf-breadcrumbs-titles .step-two {cursor:pointer;
}

.lfbc-on .lf-breadcrumbs-titles .active p {
      color:black;
    }

.lfbc-on .lf-breadcrumbs {
  display:-webkit-box;
  display:-webkit-flex;
  display:-ms-flexbox;
  display:flex;
  -webkit-box-pack:justify;
  -webkit-justify-content:space-between;
      -ms-flex-pack:justify;
          justify-content:space-between;
  width:360px;
  margin:10px auto -10px auto;
}

@media screen and (max-width:450px) {

  .lfbc-on .lf-breadcrumbs {
    width:auto;
  }
}

.lfbc-on .lf-breadcrumbs .step-one, .lfbc-on .lf-breadcrumbs .step-two, .lfbc-on .lf-breadcrumbs .step-three {
    display: -webkit-box;
    display: -webkit-flex;
    display: -ms-flexbox;
    display: flex;
    -webkit-flex-wrap: wrap;
        -ms-flex-wrap: wrap;
            flex-wrap: wrap;
    -webkit-box-pack: center;
    -webkit-justify-content: center;
        -ms-flex-pack: center;
            justify-content: center;
}

.lfbc-on .lf-breadcrumbs .step-two {cursor:pointer;
}

.lfbc-on .lf-breadcrumbs .orb {
    width:20px;
    height:20px;
    background:#ccc;
    border-radius:20px;
    -webkit-transition:0.3s all ease-in-out;
    -o-transition:0.3s all ease-in-out;
    transition:0.3s all ease-in-out;
}

@media screen and (max-width:750px) {

  .lfbc-on .lf-breadcrumbs .orb {
    width:14px;
    height:14px;
  }
}

.lfbc-on .lf-breadcrumbs .step-line {
    width:100%;
    height:1px;
    background:black;
    margin:9px 4px 0 4px;
}

@media screen and (max-width:750px) {

  .lfbc-on .lf-breadcrumbs .step-line {
    margin:6px 4px 0 4px;
  }
}

.lfbc-on .lf-breadcrumbs .active .orb {
      background:#F7D148;
    }

.loop-onstore { padding: 0.25rem 2rem !important; }

.loop-onstore__back { font-family: 'gotham-htf-bold' !important; padding: 0.75rem 1.25rem !important; }

#launcher {
  bottom: 55px !important;
}

.product-lifestyle__container {
  position: relative;
  width: 100%;
}

.product-lifestyle__container .flickity-button {
    width: 30px;
    height: 30px;
    background-color: #fdd007;
  }

@media (max-width: 999px) {

  .product-lifestyle__container .flickity-button {
    display: none;
  }
}

.product-lifestyle__item {
  position: relative;
  width: 875px;
}

@media (min-width: 620px) {

  .product-lifestyle__item {
    width: 990px;
  }
}

@media (min-width: 1000px) {

  .product-lifestyle__item {
    max-width: 1440px;
    width: 100%;
  }
}

.product-lifestyle__item.is-selected .product-lifestyle__caption {
      opacity: 1;
      visibility: visible;
}

.product-lifestyle__featured::before {
  padding-bottom: calc(615/1440 * 100%);
}

@media (max-width: 999px) {

  .product-lifestyle__captions {
    margin-bottom: 20px;
  }
}

.product-lifestyle__captions .flickity-slider {
    -webkit-transform: none !important;
        -ms-transform: none !important;
            transform: none !important;
}

.product-lifestyle__captions .flickity-page-dots {
    bottom: -32px;
    left: 0;
    right: 0;
}

@media (min-width: 1000px) {

  .product-lifestyle__captions .flickity-page-dots {
    display: none;
  }
}

.product-lifestyle__captions .flickity-page-dots .dot {
      margin: 0 4px;
}

.product-lifestyle__captions__item {
  left: 0 !important;
  opacity: 0;
  pointer-events: none;
  -webkit-transition-duration: 200ms;
       -o-transition-duration: 200ms;
          transition-duration: 200ms;
  -webkit-transition-property: opacity, visibility;
  -o-transition-property: opacity, visibility;
  transition-property: opacity, visibility;
  -webkit-transition-timing-function: ease-in-out;
       -o-transition-timing-function: ease-in-out;
          transition-timing-function: ease-in-out;
  visibility: hidden;
  width: 100%
}

.product-lifestyle__captions__item.is-selected {
  opacity: 1;
  pointer-events: auto;
  visibility: visible;
}

.product-lifestyle__captions__text {
  margin-left: auto;
  margin-right: auto;
  margin-top: 20px;
  max-width: 320px;
}

@media (min-width: 445px) {

  .product-lifestyle__captions__text {
    max-width: 445px;
  }
}

@media (min-width: 620px) {

  .product-lifestyle__captions__text {
    max-width: 620px;
  }
}

@media (min-width: 768px) {

  .product-lifestyle__captions__text {
    max-width: 768px;
  }
}

@media (min-width: 840px) {

  .product-lifestyle__captions__text {
    max-width: 100%;
  }
}

@media (min-width: 1000px) {

  .product-main {
    -webkit-box-flex: 0;
    -webkit-flex: 0 0 380px;
        -ms-flex: 0 0 380px;
            flex: 0 0 380px;
    margin-left: 60px;
  }
}

@media (min-width: 1200px) {

  .product-main {
    -webkit-box-flex: 0;
    -webkit-flex: 0 0 435px;
        -ms-flex: 0 0 435px;
            flex: 0 0 435px;
    margin-left: 80px;
  }
}

.product-main .small-card {
    margin-top: 50px;
}

@media (min-width: 445px) {

  .product-main .small-card {
    margin-top: 30px;
  }
}

.product-main__container {
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-orient: vertical;
  -webkit-box-direction: normal;
  -webkit-flex-direction: column;
      -ms-flex-direction: column;
          flex-direction: column;
}

@media (min-width: 768px) {

  .product-main__container {
    -webkit-box-orient: horizontal;
    -webkit-box-direction: normal;
    -webkit-flex-direction: row;
        -ms-flex-direction: row;
            flex-direction: row;
  }
}

@media (min-width: 1000px) {

  .product-main__container {
    -webkit-box-orient: vertical;
    -webkit-box-direction: normal;
    -webkit-flex-direction: column;
        -ms-flex-direction: column;
            flex-direction: column;
  }
}

.product-main__block {
  -webkit-box-flex: 0;
  -webkit-flex: 0 0 auto;
      -ms-flex: 0 0 auto;
          flex: 0 0 auto;
  width: 100%;
}

@media (min-width: 768px) {

  .product-main__block {
    width: calc(50% - 20px);
  }
}

@media (min-width: 1000px) {

  .product-main__block {
    width: 100%;
  }
}

.product-main__block:last-child {
  margin-top: 30px;
}

@media (min-width: 768px) {

  .product-main__block:last-child {
    margin-left: 40px;
    margin-top: 0;
  }
}

@media (min-width: 1000px) {

  .product-main__block:last-child {
    margin-left: 0;
    margin-top: 30px;
  }
}

.product-main__title {
  display: none;
}

@media (min-width: 620px) {

  .product-main__title {
    display: block;
    font-size: 27px;
    line-height: 35px;
    letter-spacing: 0.05em;
  }
}

.product-main__offer {
  display: none;
  margin-bottom: 20px;
}

@media (min-width: 620px) {

  .product-main__offer {
    display: block;
  }
}

.product-main__variants {
  -webkit-box-align: start;
  -webkit-align-items: flex-start;
      -ms-flex-align: start;
          align-items: flex-start;
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-orient: vertical;
  -webkit-box-direction: normal;
  -webkit-flex-direction: column;
      -ms-flex-direction: column;
          flex-direction: column;
  margin-bottom: 20px;
  margin-top: 10px;
}

@media (min-width: 620px) {

  .product-main__variants {
    -webkit-box-orient: horizontal;
    -webkit-box-direction: normal;
    -webkit-flex-direction: row;
        -ms-flex-direction: row;
            flex-direction: row;
    margin-bottom: 30px;
    margin-top: 0;
  }
}

@media (min-width: 768px) {

  .product-main__variants {
    -webkit-box-orient: vertical;
    -webkit-box-direction: normal;
    -webkit-flex-direction: column;
        -ms-flex-direction: column;
            flex-direction: column;
  }
}

@media (min-width: 1000px) {

  .product-main__variants {
    -webkit-box-orient: horizontal;
    -webkit-box-direction: normal;
    -webkit-flex-direction: row;
        -ms-flex-direction: row;
            flex-direction: row;
  }
}

.product-main__variants__item--color {
  -webkit-box-flex: 0;
  -webkit-flex: 0 0 auto;
      -ms-flex: 0 0 auto;
          flex: 0 0 auto;
}

.product-main__variants__item--size {
  -webkit-box-align: end;
  -webkit-align-items: flex-end;
      -ms-flex-align: end;
          align-items: flex-end;
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-flex: 1;
  -webkit-flex: 1 1 auto;
      -ms-flex: 1 1 auto;
          flex: 1 1 auto;
  -webkit-box-orient: horizontal;
  -webkit-box-direction: normal;
  -webkit-flex-direction: row;
      -ms-flex-direction: row;
          flex-direction: row;
  width: 100%;
  margin-left: 0;
  margin-top: 20px;
}

@media (min-width: 620px) {

  .product-main__variants__item--size {
    margin-left: 30px;
    margin-top: 0;
  }
}

@media (min-width: 768px) {

  .product-main__variants__item--size {
    margin-left: 0;
    margin-top: 20px;
  }
}

@media (min-width: 1000px) {

  .product-main__variants__item--size {
    -webkit-box-align: start;
    -webkit-align-items: flex-start;
        -ms-flex-align: start;
            align-items: flex-start;
    -webkit-box-orient: vertical;
    -webkit-box-direction: normal;
    -webkit-flex-direction: column;
        -ms-flex-direction: column;
            flex-direction: column;
    margin-left: 40px;
    margin-top: 0;
  }
}

.product-main__variants__modal {
  margin-bottom: 10px;
  margin-left: 20px;
}

@media (min-width: 1000px) {

  .product-main__variants__modal {
    margin-left: 0;
    margin-top: 10px;
  }
}

.product-main__sold-out {
  display: none
}

.product-main__sold-out.block {
  display: block;
}

.product-main__error {
  display: none;
  margin-top: 8px
}

.product-main__error.is-active {
  display: block;
}

.bis-reset {
  display: none !important;
}

.warranty-shipping {
  width:380px;
  height:80px;
  display:none;
}

.warranty-shipping.one {
  display:block;
  background:url('https://cdn.shopify.com/s/files/1/2403/8187/t/381/assets/Warranty_Shipping_1.svg');
  background-size:122%;
  background-repeat: no-repeat;
  background-position: center;
  margin-bottom:-20px;
}

.warranty-shipping.two {
  display:block;
  background:url('https://cdn.shopify.com/s/files/1/2403/8187/t/381/assets/Warranty_Shipping_2.svg');
  background-size:122%;
  background-repeat: no-repeat;
  background-position: center;
  margin-bottom:-20px;
}

.warranty-shipping.three {
  display:block;
  background:url('https://cdn.shopify.com/s/files/1/2403/8187/t/381/assets/Warranty_Shipping_3.svg');
  background-size:122%;
  background-repeat: no-repeat;
  background-position: center;
  margin-bottom:-20px;
}

/* VARIANT 1 */

.product-main.product-variant-1 .product-main__variants {
  display: inline-block;
  margin-bottom: 10px;
  width: 100%;
}

.product-main.product-variant-1 .product-color-swatch__title, .product-main.product-variant-1 .product-size-selector__title {
  border-bottom: 1px solid #D9D8D8;
  margin-bottom: 15px;
  padding-bottom: 10px;
}

.product-main.product-variant-1 .product-color-swatch__list, .product-main.product-variant-1 .product-size-selector {
  max-width: 100%;
}

.product-main.product-variant-1 .product-main__variants__item--color {
  margin-top: 10px;
}

.product-main.product-variant-1 .product-main__variants__item--size {
  margin: 30px 0px 0px;
  position: relative;
}

.product-main.product-variant-1 .product-main__variants__item--size button.product-main__variants__modal {
    position: absolute;
    top: -15px;
    right: 0;
    background: #FEF9E9;
    padding: 5px 10px;
    font-size: 11px;
}

.product-main.product-variant-1 .variant-1 {
  display: none
}

.product-main.product-variant-1 .variant-2 strong{
  font-weight: 600;
}

.product-main.product-variant-1 .product-size-selector .variant-2 li, .product-main.product-variant-1 .product-size-selector .variant-2 option {
    background: #FFFFFD;
    border: 1px solid #000000;
    font-family: Courier;
    font-style: normal;
    font-weight: normal;
    font-size: 12px;
    text-align: center;
    letter-spacing: 0.01em;
    text-align: center;
    width: 31%;
    line-height: 36px;
    vertical-align: middle;
    display: inline-block;
    margin: 0px 10px 15px 0px;
    text-transform: capitalize;
    cursor: pointer;
    list-style: none;
}

.product-main.product-variant-1 .product-size-selector .variant-2 li:nth(3n), .product-main.product-variant-1 .product-size-selector .variant-2 option:nth(3n) {
  margin-right: 0px;
}

.variant-2, .product-main.product-variant-1 .variant-1, .product-main.product-variant-1 .product-size-selector .variant-2.mobile-version{ display: none; }

.product-main.product-variant-1 .product-size-selector .variant-2.desktop-version{ display: block; }

.product-main.product-variant-1 .variant-2 { display: block; }

.product-main.product-variant-1 .product-size-selector .variant-2 li:hover, .product-main.product-variant-1 .product-size-selector .variant-2 li[selected], .product-main.product-variant-1 .product-size-selector .variant-2 option:hover, .product-main.product-variant-1 .product-size-selector .variant-2 option[selected] {
    background: #FEF9E9;
    border: 1px solid #F7D048;
}

.product-main.product-variant-1 .product-size-selector .variant-2 li[disabled], .product-main.product-variant-1 .product-size-selector .variant-2 option[disabled] {
    display: none;
}

.product-main.product-variant-1 .color-circle.is-active:before {
  -webkit-box-shadow: 0 0 0 1px #F7D048;
  box-shadow: 0 0 0 1px #F7D048;
}

.color-circle-custom {
  background-color: transparent;
  height: 40px;
  width: 95px;
  min-width: 95px;
  background-repeat: no-repeat;
  margin: 0 auto;
  text-align: center;
  background-size: cover;
  background-position: -10px -18px;
  -webkit-box-shadow: none;
          box-shadow: none;
}

.color-circle-custom-ab {
  background-color: transparent;
  height: 40px;
  width: 95px;
  min-width: 95px;
  background-repeat: no-repeat;
  margin: 0 auto;
  text-align: center;
  background-size: contain;
  background-position: -1px 0px;
  -webkit-box-shadow: none;
          box-shadow: none;
}

.product-main.product-variant-1.variant-glass .color-circle-custom.is-active:before, .product-main.product-variant-1.variant-glass-sun .color-circle-custom-ab.is-active:before {
  border-radius: 0px;
  -webkit-box-shadow: none;
          box-shadow: none;
}

.product-main.product-variant-1.variant-glass .color-variant-1, .product-main.product-variant-1.variant-glass-sun .color-variant-1, .color-variant-2, .color-variant-3, .main-carousel.color-variant-mobile {
  display: none;
}

.product-main.product-variant-1.variant-glass .color-variant-2 {
  display: inline-block;
}

.product-main.product-variant-1.variant-glass-sun .color-variant-3 {
  display: inline-block;
  width: 100%;
}

.product-main.product-variant-1.variant-glass .product-color-swatch__item, .product-main.product-variant-1.variant-glass-sun .product-color-swatch__item {
  margin: 5px auto;
  width: 20%;
  text-align: center;
  font-size: 9px;
  text-transform: capitalize;
  font-family: Courier;
  text-align: center;
  -webkit-box-shadow: none;
          box-shadow: none;
  padding: 0px 5px;
}

.product-main.product-variant-1.variant-glass button.product-color-swatch__item .custom-color-wrapper, .product-main.product-variant-1.variant-glass-sun button.product-color-swatch__item .custom-color-wrapper {
  border-bottom: 2px solid #ffffff;
  font-weight: normal;
  -webkit-box-shadow: none;
          box-shadow: none;
}

.product-main.product-variant-1.variant-glass .product-color-swatch__item .custom-color-wrapper:hover, .product-main.product-variant-1.variant-glass .product-color-swatch__item .custom-color-wrapper.is-active, .product-main.product-variant-1.variant-glass-sun .product-color-swatch__item .custom-color-wrapper:hover, .product-main.product-variant-1.variant-glass-sun .product-color-swatch__item .custom-color-wrapper.is-active {
  border-bottom: 2px solid #F7D048;
  font-weight: 700;
}

span.variant-color-title {
  padding: 5px 0px;
  display: block;
  vertical-align: top;
}

/* cell inherit height from carousel */

.product-main.product-variant-1 .flickity-viewport {
  height: 80px!important;
  width: 100%;
  margin-left: 15px;
}

.carousel-cell {
  height: 100%;
  width: 100%;
}

.product-main.product-variant-1 .main-carousel .carousel-cell.product-color-swatch__item {
  width: 31%;
  margin: 0px auto;
  text-align: center;
}

.product-main.product-variant-1 .main-carousel .color-circle-custom {
  background-position: center center;
  height: 50px;
  width: 100px;
  min-width: 100px;
}

.product-main.product-variant-1 .main-carousel span.variant-color-title {
  height: 27px;
}

.product-main.product-variant-1 .flickity-prev-next-button.previous {
  width: 20px;
  background: transparent;
  left: 0px;
}

.product-main.product-variant-1 .flickity-prev-next-button.next {
  width: 20px;
  background: transparent;
  right: 0px;
}

@media only screen and (max-width: 1024px) {
.product-main.product-variant-1 .product-size-selector .variant-2.desktop-version{ display: none; }
.product-main.product-variant-1 .product-size-selector .variant-2.mobile-version{ display: block; }
}

@media only screen and (max-width: 600px) {
  .product-main.product-variant-1 .product-size-selector .variant-2 li, .product-main.product-variant-1 .product-size-selector .variant-2 option {
    width: 30%;
    font-size: 10px;
  }
  .product-main.product-variant-1 .product-main__variants__item--size button.product-main__variants__modal {
    top: -5px;
  }
}

#product-moments .yotpo-pictures-gallery {
    position: absolute;
    visbility: hidden;
    z-index: -1;
  }

#product-moments .yotpo-single-image-container {
    -webkit-animation-duration: 0.001s;
            animation-duration: 0.001s;
    -webkit-animation-name: nodeInserted;
            animation-name: nodeInserted;
    margin: 0;
  }

.yotpo .yotpo-modal {
    pointer-events: none;
    -webkit-transition-duration: 0.4s;
         -o-transition-duration: 0.4s;
            transition-duration: 0.4s;
    -webkit-transition-property: opacity, visibility;
    -o-transition-property: opacity, visibility;
    transition-property: opacity, visibility;
    -webkit-transition-timing-function: ease-in-out;
         -o-transition-timing-function: ease-in-out;
            transition-timing-function: ease-in-out
  }

.yotpo .yotpo-modal.yotpo-modal-active {
  opacity: 1;
  pointer-events: auto;
  visibility: visible;
}

.yotpo .yotpo-lightbox-image {
    border-radius: 0 !important;
    height: 100%;
  }

.yotpo-lightbox-product-button {
  background-color: #fdd007!important;
  color: #000000!important;
  font-weight: normal!important;
  border-radius: 0!important;
  text-transform: uppercase;
}

.yotpo-instagram .yotpo-header {
    padding-bottom: 24px!important;
  }

.yotpo-instagram .yotpo-icon-profile {
    background-color: #fdd007!important;
  }

.yotpo-instagram .yotpo-icon-profile label {
      top: 8px!important;
      color: #000000!important;
    }

.yotpo-header label.yotpo-user-name.pull-left.yotpo-instagram-username {
  color: #000000!important;
}

.product-moments__container {
  width: 100%;
}

@media (min-width: 840px) {

  .product-moments__container {
    width: calc(100% - 80px);
  }
}

@media (min-width: 1000px) {

  .product-moments__container {
    width: calc(100% - 120px);
  }
}

@media (min-width: 1200px) {

  .product-moments__container {
    width: calc(100% - 160px);
  }
}

.product-moments__headline {
  margin: 0 auto 30px;
  width: calc(100% - 40px);
}

.product-moments__title {
  margin-bottom: 5px;
}

@media (min-width: 840px) {

  .product-moments__title {
    margin-bottom: 10px;
  }
}

.product-moments__wrapper .flickity-button {
    background-color: transparent;
    background-position: center;
    background-size: contain;
    border-radius: 0;
    height: 22px;
    opacity: 1;
    width: 13px
  }

.product-moments__wrapper .flickity-button::before, .product-moments__wrapper .flickity-button::after {
  content: '';
  display: block;
  height: 100%;
  left: 0;
  position: absolute;
  top: 0;
  -webkit-transition: opacity 200ms ease-in-out;
  -o-transition: opacity 200ms ease-in-out;
  transition: opacity 200ms ease-in-out;
  width: 100%;
}

.product-moments__wrapper .flickity-button::before {
  opacity: 1;
}

@media (min-width: 1000px) {

  .product-moments__wrapper .flickity-button::before {
    opacity: 0;
  }
}

.product-moments__wrapper .flickity-button::after {
  opacity: 0;
}

@media (min-width: 1000px) {

  .product-moments__wrapper .flickity-button::after {
    opacity: 1;
  }
}

.product-moments__wrapper .flickity-button:disabled::before {
  opacity: 0;
}

.product-moments__wrapper .flickity-button:disabled::after {
  opacity: 1;
}

@media (min-width: 1000px) {

  .product-moments__wrapper .flickity-button:disabled::after {
    opacity: 0.4;
  }
}

.product-moments__wrapper .flickity-button svg {
      display: none;
}

.product-moments__wrapper .flickity-button.previous {
  left: calc(50% - 150px);
}

@media (min-width: 620px) {

  .product-moments__wrapper .flickity-button.previous {
    left: calc(50% - 180px);
  }
}

@media (min-width: 840px) {

  .product-moments__wrapper .flickity-button.previous {
    left: 20px;
  }
}

@media (min-width: 1000px) {

  .product-moments__wrapper .flickity-button.previous {
    left: -40px;
  }
}

.product-moments__wrapper .flickity-button.next {
  right: calc(50% - 150px);
}

@media (min-width: 620px) {

  .product-moments__wrapper .flickity-button.next {
    right: calc(50% - 180px);
  }
}

@media (min-width: 840px) {

  .product-moments__wrapper .flickity-button.next {
    right: 20px;
  }
}

@media (min-width: 1000px) {

  .product-moments__wrapper .flickity-button.next {
    right: -40px;
  }
}

.product-moments__wrapper .flickity-button.next::before, .product-moments__wrapper .flickity-button.next::after {
  -webkit-transform-origin: center;
      -ms-transform-origin: center;
          transform-origin: center;
  -webkit-transform: rotate(-180deg);
      -ms-transform: rotate(-180deg);
          transform: rotate(-180deg);
}

.product-moments__item {
  display: block;
  margin-right: 10px;
  position: relative;
  width: 210px;
}

@media (min-width: 620px) {

  .product-moments__item {
    margin-right: 20px;
    width: 240px;
  }
}

@media (min-width: 840px) {

  .product-moments__item {
    margin-right: 20px;
    width: calc(25% - 15px);
  }
}

@media (min-width: 1200px) {

  .product-moments__item {
    margin-right: 30px;
    width: calc(25% - 22.5px);
  }
}

.product-moments__featured {
  overflow: hidden;
  position: relative
}

.product-moments__featured::before {
  padding-bottom: 100%;
}

.product-moments__featured .yotpo-image {
    left: 0;
    position: absolute;
    top: 0;
    width: 100%;
}

.no-touch .flickity-button {
    -webkit-transition: opacity 200ms ease-in-out;
    -o-transition: opacity 200ms ease-in-out;
    transition: opacity 200ms ease-in-out
  }

.no-touch .flickity-button:enabled:hover {
  opacity: 0.6;
}

.product-option-selector {
  max-width: 140px;
  width: 100%;
}

@media (min-width: 620px) {

  .product-option-selector {
    max-width: 120px;
  }
}

@media (min-width: 768px) {

  .product-option-selector {
    max-width: 150px;
  }
}

@media (min-width: 840px) {

  .product-option-selector {
    max-width: 230px;
  }
}

@media (min-width: 1200px) {

  .product-option-selector {
    max-width: 150px;
  }
}

.product-option-selector__title {
  margin-bottom: 10px;
}

.product-option-selector__wrapper {
  width: 100%;
}

.product-recommend__title {
  margin-bottom: 40px;
 }

@media (min-width: 620px) {

  .product-recommend__title {
    margin-bottom: 60px;
  }
}

@media (min-width: 1000px) {

  .product-recommend__title {
    margin-bottom: 80px;
  }
}

@media (min-width: 1000px) {

  .product-recommend__wrapper {
    -webkit-box-align: stretch;
    -webkit-align-items: stretch;
        -ms-flex-align: stretch;
            align-items: stretch;
    display: -webkit-box;
    display: -webkit-flex;
    display: -ms-flexbox;
    display: flex;
  }
}

.product-recommend__item {
  width: 70%;
}

@media (min-width: 1000px) {

  .product-recommend__item {
    -webkit-box-flex: 0;
    -webkit-flex: 0 0 auto;
        -ms-flex: 0 0 auto;
            flex: 0 0 auto;
    margin-left: 30px;
    width: calc(33.33% - 20px);
  }
}

@media (min-width: 1000px) {

  .product-recommend__item:first-child {
    margin-left: 0;
  }
}

.product-reviews__headline {
  margin-bottom: -10px;
}

@media (min-width: 768px) {

  .product-reviews__headline {
    margin-bottom: 15px;
  }
}

@media (min-width: 1200px) {

  .product-reviews__headline {
    margin-bottom: 30px;
  }
}

#product-reviews {
  color: #000000;
}

#product-reviews .yotpo-label, #product-reviews .yotpo-bottomline-box-1, #product-reviews .yotpo-preloader-wrapper, #product-reviews .write-question-wrapper, #product-reviews .write-question-button, #product-reviews .yotpo-searchable-widget, #product-reviews .yotpo-nav, #product-reviews .yotpo-lightbox, #product-reviews .yotpo-questions, #product-reviews .yotpo-template, #product-reviews .yotpo-hidden, #product-reviews .yotpo-user-letter, #product-reviews .promoted-products-box, #product-reviews .yotpo-first-review-stars {
    display: none !important;
  }

#product-reviews .yotpo-regular-box {
    padding: 0;
    margin: 0;
    border: none;
  }

#product-reviews .yotpo-no-reviews .yotpo-regular-box {
    height: 0;
  }

#product-reviews .yotpo-no-reviews .yotpo-reviews {
    padding-bottom: 20px;
  }

#product-reviews .yotpo-first-review {
    margin-top: 30px;
  }

@media screen and (max-width:750px) {

  #product-reviews .yotpo-first-review .write-review-button {
    max-width: 200px !important;
  }
}

#product-reviews .yotpo-first-review .write-review-button {
  color: #000000;
}

@media (min-width: 620px) {

  #product-reviews .yotpo-first-review .write-review-button {
    max-width: 100%;
  }
}

/* Don't show right-side review button if no reviews */

#product-reviews .yotpo-no-reviews div.write-button {
    display: none;
}

#product-reviews .write-review-button, #product-reviews .yotpo-submit {
    background-color: #fdd007;
    padding: 0 40px;
    height: 40px;
    line-height: 40px;
}

#product-reviews .write-review-button {
    top: -20px;
}

@media (min-width: 620px) {

  #product-reviews .write-review-button {
    top: -30px;
    height: 50px;
    line-height: 50px;
  }
}

@media (min-width: 768px) {

  #product-reviews .write-review-button {
    top: -55px;
  }
}

@media (min-width: 1200px) {

  #product-reviews .write-review-button {
    top: -70px;
  }
}

#product-reviews .write-review-button .yotpo-icon {
      display: none;
}

#product-reviews .yotpo-small .write-review-button {
    display: inline;
    left: 0;
    top: 30px;
}

#product-reviews .yotpo-small .write-review-button .yotpo-icon-button-text {
      display: inline;
    }

#product-reviews .yotpo-submit {
    margin: 0;
    cursor: pointer;
}

@media (min-width: 1200px) {

  #product-reviews .yotpo-submit {
    margin-bottom: 15px;
  }
}

#product-reviews .yotpo-submit:hover {
  background-color: #fdd007 !important;
  color: #000000 !important;
}

#product-reviews .yotpo-submit, #product-reviews .yotpo-icon-button-text {
    color: #000000;
}

#product-reviews .yotpo .error {
    border-color: red;
}

#product-reviews .yotpo-messages {
    padding-top: 0;
}

@media screen and (min-width: 548px) {

  #product-reviews .yotpo-messages {
    padding-top: 30px;
  }
}

#product-reviews .yotpo-thank-you {
    padding: 20px;
    margin-bottom: 10px;
    background: transparent;
}

@media (min-width: 1200px) {

  #product-reviews .yotpo-thank-you {
    margin-bottom: 20px;
  }
}

#product-reviews .yotpo-thank-you .yotpo-icon-btn .yotpo-icon-cross {
    color: #000000!important;
}

#product-reviews .yotpo-thank-you .yotpo-thankyou-content, #product-reviews .yotpo-thank-you .yotpo-thankyou-header .yotpo-icon-heart {
    display: none;
}

#product-reviews .yotpo-thankyou-header span {
    color: #000000;
    font-size: 14px;
}

@media (min-width: 620px) {

  #product-reviews .yotpo-thankyou-header span {
    font-size: 18px;
  }
}

#product-reviews .y-label, #product-reviews .y-input {
    color: #000000;
}

#product-reviews .y-input {
    border-color: #000000;
    padding: 20px 10px;
}

#product-reviews .y-input.yotpo-text-box {
  padding: 10px 10px;
}

#product-reviews .yotpo-icon {
    color: #fdd007 !important;
    margin-left: 5px!important;
    width: 24px!important;
}

#product-reviews .yotpo-icon:first-child {
  margin-left: 0 !important;
}

#product-reviews .yotpo-icon.review-star {
  cursor: pointer;
}

#product-reviews .yotpo-reviews {
    display: -webkit-box;
    display: -webkit-flex;
    display: -ms-flexbox;
    display: flex;
    -webkit-flex-wrap: wrap;
        -ms-flex-wrap: wrap;
            flex-wrap: wrap;
    -webkit-box-pack: center;
    -webkit-justify-content: center;
        -ms-flex-pack: center;
            justify-content: center;
    padding-bottom: 60px;
    position: relative;
}

@media (min-width: 768px) {

  #product-reviews .yotpo-reviews {
    margin: 0 -15px;
  }
}

@media (min-width: 1200px) {

  #product-reviews .yotpo-reviews {
    -webkit-flex-wrap: nowrap;
        -ms-flex-wrap: nowrap;
            flex-wrap: nowrap;
  }
}

#product-reviews .yotpo-review {
    border: 1px solid #d0d0d0;
    display: -webkit-box;
    display: -webkit-flex;
    display: -ms-flexbox;
    display: flex;
    -webkit-box-flex: 0;
    -webkit-flex: 0 0 auto;
        -ms-flex: 0 0 auto;
            flex: 0 0 auto;
    -webkit-box-orient: vertical;
    -webkit-box-direction: normal;
    -webkit-flex-direction: column;
        -ms-flex-direction: column;
            flex-direction: column;
    margin-top: 30px;
    padding: 25px 20px 35px;
    position: relative;
    width: 100%;
}

@media (min-width: 768px) {

  #product-reviews .yotpo-review {
    margin: 15px;
    width: calc(50% - 30px);
  }
}

@media (min-width: 1200px) {

  #product-reviews .yotpo-review {
    -webkit-box-flex: 1;
    -webkit-flex: 1;
        -ms-flex: 1;
            flex: 1;
    margin: 0 15px;
    max-width: calc(25% - 30px);
    width: auto;
  }
}

#product-reviews .yotpo-review-stars {
    display: -webkit-box;
    display: -webkit-flex;
    display: -ms-flexbox;
    display: flex;
    left: 0;
    position: absolute;
    top: 0;
}

#product-reviews .yotpo-review-stars .rating-star {
      font-size: 26px;
    }

#product-reviews .yotpo-header {
    -webkit-box-flex: 0;
    -webkit-flex: 0 0 auto;
        -ms-flex: 0 0 auto;
            flex: 0 0 auto;
    padding-top: 35px;
    width: 100%;
}

@media (min-width: 768px) {

  #product-reviews .yotpo-header {
    padding-top: 50px;
  }
}

#product-reviews .yotpo-header .yotpo-header-element {
      display: -webkit-box;
      display: -webkit-flex;
      display: -ms-flexbox;
      display: flex;
      font-size: 10px;
      right: 0;
      top: 2px;
}

#product-reviews .yotpo-header .yotpo-header-element.yotpo-icon-profile {
  display: none;
}

#product-reviews .yotpo-header .yotpo-user-name, #product-reviews .yotpo-header .yotpo-user-title, #product-reviews .yotpo-header .yotpo-review-date {
      color: #000000;
      opacity: 1;
}

#product-reviews .yotpo-header .yotpo-review-date {
      font-size: 10px;
      opacity: 0.3;
}

#product-reviews .yotpo-user-name {
    color: #000000;
}

#product-reviews .yotpo-header-actions {
    font-size: 9px;
    position: absolute;
    right: 20px;
    top: 25px;
}

#product-reviews .yotpo-main {
    -webkit-box-flex: 1;
    -webkit-flex: 1 1 auto;
        -ms-flex: 1 1 auto;
            flex: 1 1 auto;
    margin-left: 0;
    width: 100%;
}

#product-reviews .yotpo-main .content-title {
      color: #000000;
      margin: 15px 0;
    }

@media (min-width: 768px) {

  #product-reviews .yotpo-main .content-title {
    margin: 15px 0 25px;
  }
}

#product-reviews .yotpo-main .content-review {
      margin-left: 0;
}

#product-reviews .yotpo-main .rest-content-collapsed, #product-reviews .yotpo-main .yotpo-read-more {
      font: inherit;
      color: inherit;
}

#product-reviews .yotpo-footer {
    display: none;
    -webkit-box-flex: 0;
    -webkit-flex: 0 0 auto;
        -ms-flex: 0 0 auto;
            flex: 0 0 auto;
    margin-top: 50px;
    width: 100%;
}

#product-reviews .yotpo-footer .connect-wrapper {
      padding-left: 0;
    }

#product-reviews .yotpo-footer .connect-wrapper .form-element {
      padding-right: 0;
      width: 100%;
    }

@media (min-width: 620px) {

  #product-reviews .yotpo-footer .connect-wrapper .form-element {
    width: 50%;
  }

  #product-reviews .yotpo-footer .connect-wrapper .form-element:first-child {
    padding-right: 15px;
  }
}

#product-reviews .yotpo-footer .footer-actions {
      font-size: 9px;
      position: relative;
}

#product-reviews .yotpo-footer .yotpo-action {
      display: -webkit-box;
      display: -webkit-flex;
      display: -ms-flexbox;
      display: flex;
}

#product-reviews .yotpo-footer .yotpo-action .y-label {
        cursor: pointer;
      }

#product-reviews .yotpo-footer .yotpo-icon-share {
      background-position: center;
      background-repeat: no-repeat;
      background-size: contain;
      cursor: pointer;
      display: inline-block;
      height: 10px;
      margin-right: 5px;
      opacity: 0.3;
      width: 10px;
}

#product-reviews .yotpo-footer .yotpo-icon-seperator {
      display: none;
}

#product-reviews .yotpo-footer .share-options-wrapper {
      position: absolute;
      left: 0;
      bottom: calc(100% + 5px);
}

#product-reviews .yotpo-footer .share-options-wrapper .yotpo-icon {
        display: none;
      }

#product-reviews .yotpo-footer .share-options-wrapper [data-social] {
        display: inline-block;
        margin-right: 10px;
      }

#product-reviews .yotpo-footer .share-options-wrapper [data-social="facebook"] {
        margin-right: 6px;
      }

#product-reviews .yotpo-footer .share-options-wrapper .social-link i {
        background-position: center;
        background-repeat: no-repeat;
        background-size: contain;
        display: block;
        height: 14px;
        overflow: hidden;
        text-indent: -999px;
        width: 14px
      }

#product-reviews .yotpo-footer .share-options-wrapper .social-link i.LinkedIn {
  height: 12px;
  width: 12px;
}

#product-reviews .yotpo-footer .share-options-wrapper .social-link i.google {
  height: 16px;
  width: 16px;
}

#product-reviews .yotpo-helpful {
    -webkit-box-align: center;
    -webkit-align-items: center;
        -ms-flex-align: center;
            align-items: center;
    color: #000000;
    display: -webkit-box;
    display: -webkit-flex;
    display: -ms-flexbox;
    display: flex;
    -webkit-flex-wrap: wrap;
        -ms-flex-wrap: wrap;
            flex-wrap: wrap;
    margin-top: 2px;
}

#product-reviews .yotpo-helpful .label-helpful {
      color: #000000;
      -webkit-box-flex: 0;
      -webkit-flex: 0 0 auto;
          -ms-flex: 0 0 auto;
              flex: 0 0 auto;
      font-size: 9px;
      letter-spacing: 0 !important;
      line-height: 1 !important;
    }

#product-reviews .yotpo-helpful .yotpo-icon {
      background-position: center;
      background-repeat: no-repeat;
      background-size: contain;
      cursor: pointer;
      display: inline-block;
      height: 10px;
      margin: 0 4px;
      opacity: 0.3;
      width: 10px;
    }

#product-reviews .yotpo-sum {
    font-size: 12px;
    opacity: 0.3;
}

#product-reviews .share-options {
    display: none;
}

#product-reviews .footer-additional-actions {
    display: none;
}

#product-reviews .yotpo-pager {
    -webkit-box-align: center;
    -webkit-align-items: center;
        -ms-flex-align: center;
            align-items: center;
    bottom: 0;
    display: -webkit-box;
    display: -webkit-flex;
    display: -ms-flexbox;
    display: flex;
    -webkit-box-pack: center;
    -webkit-justify-content: center;
        -ms-flex-pack: center;
            justify-content: center;
    margin: 50px 0 20px;
    position: absolute;
    width: 100%;
}

#product-reviews .yotpo-page-element {
    color: #000000;
    cursor: pointer;
    margin: 0 5px;
}

#product-reviews .yotpo-page-element.goTo {
  -webkit-box-align: center;
  -webkit-align-items: center;
      -ms-flex-align: center;
          align-items: center;
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  height: 26px;
  -webkit-box-pack: center;
  -webkit-justify-content: center;
      -ms-flex-pack: center;
          justify-content: center;
  line-height: 26px;
  width: 26px;
}

#product-reviews .yotpo-page-element.goTo.yotpo-active {
  background-color: #fdd007;
  border-radius: 50%;
}

#product-reviews .yotpo-page-element.yotpo-icon {
  background-position: center !important;
  background-repeat: no-repeat !important;
  background-size: contain !important;
  cursor: pointer !important;
  display: inline-block;
  height: 12px;
  margin: 0 4px;
  -webkit-transform-origin: center;
      -ms-transform-origin: center;
          transform-origin: center;
  width: 6px !important;
}

#product-reviews .yotpo-page-element.yotpo-icon::before {
  content: none !important;
}

#product-reviews .yotpo-page-element.yotpo-icon.yotpo-icon-right-arrow {
  -webkit-transform: rotate(180deg);
      -ms-transform: rotate(180deg);
          transform: rotate(180deg);
}

#product-reviews .product-link-wrapper {
    display: none;
}

#product-reviews .label-with-tooltip {
    position: relative;
}

#product-reviews .yotpo-user-title {
    display: none;
    font-size: 9px;
    margin-left: 6px;
    opacity: 0.3;
}

#product-reviews .yotpo-tool-tip {
    display: block !important;
    opacity: 0;
    position: absolute;
    visibility: hidden;
}

#product-reviews .socialize-wrapper {
    display: none !important;
    width: 0;
}

#product-reviews .yotpo .error-box {
    background-color: transparent;
}

#product-reviews .yotpo .error-box .yotpo-icon-btn-small {
      display: none;
    }

#product-reviews .yotpo .error-box label {
      color: red;
    }

#product-reviews .yotpo-footer {
    margin-top: 0;
}

#product-reviews .yotpo-footer .yotpo-or {
      width: 100px;
      margin-top: 66px;
      }

.product-size-buttons {
  padding-top: 20px;
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-pack: space-evenly;
  -webkit-justify-content: space-evenly;
      -ms-flex-pack: space-evenly;
          justify-content: space-evenly;
  width: 100%;
  -webkit-flex-wrap: wrap;
      -ms-flex-wrap: wrap;
          flex-wrap: wrap;
}

.product-size-buttons__option {
  border: 1px solid #000000;
  -webkit-flex-basis: 48%;
      -ms-flex-preferred-size: 48%;
          flex-basis: 48%;
  padding: 15px 0;
  text-align: center;
  margin-bottom: 10px;
  cursor: pointer;
}

.plp__grid-item--featured .product-size-buttons__option {
    -webkit-flex-basis: 24%;
        -ms-flex-preferred-size: 24%;
            flex-basis: 24%;
  }

.product-size-buttons__option:hover {
  background-color: #fdd007;
  -webkit-transition: background-color 0.5s ease;
  -o-transition: background-color 0.5s ease;
  transition: background-color 0.5s ease;
}

.product-size-selector {
  max-width: 140px;
  width: 100%;
}

@media (min-width: 620px) {

  .product-size-selector {
    max-width: 120px;
  }
}

@media (min-width: 768px) {

  .product-size-selector {
    max-width: 150px;
  }
}

@media (min-width: 840px) {

  .product-size-selector {
    max-width: 230px;
  }
}

@media (min-width: 1200px) {

  .product-size-selector {
    max-width: 150px;
  }
}

.product-size-selector__title {
  margin-bottom: 10px;
}

.product-size-selector__wrapper {
  width: 100%;
}

.product-story-modal .modal__content {
    background: -webkit-gradient(linear, left bottom, left top, from(#fff9e7), to(#ffffff));
    background: -o-linear-gradient(bottom, #fff9e7 0%, #ffffff 100%);
    background: linear-gradient(to top, #fff9e7 0%, #ffffff 100%);
  }

.product-story-modal .story-gallery__headline {
    margin-bottom: 30px;
  }

.product-story-modal .section {
    padding: 30px 0;
  }

@media (min-width: 768px) {

  .product-story-modal .section {
    padding: 60px 0;
  }
}

@media (min-width: 768px) {

  .product-story-modal .section[id*="story-gallery"] {
    padding-bottom: 40px;
  }
}

.product-story-modal .section[id*="story-cta"] {
  padding-top: 0;
}

.product-story-modal__title {
  padding-top: 30px;
}

@media (min-width: 768px) {

  .product-story-modal__title {
    padding-top: 60px;
  }
}

@media (min-width: 1000px) {

  .product-testimonial__container {
    -webkit-box-align: stretch;
    -webkit-align-items: stretch;
        -ms-flex-align: stretch;
            align-items: stretch;
    display: -webkit-box;
    display: -webkit-flex;
    display: -ms-flexbox;
    display: flex;
    max-width: none;
    width: 100%;
  }
}

.product-testimonial__block {
  -webkit-box-align: center;
  -webkit-align-items: center;
      -ms-flex-align: center;
          align-items: center;
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-flex: 0;
  -webkit-flex: 0 0 auto;
      -ms-flex: 0 0 auto;
          flex: 0 0 auto;
  -webkit-box-orient: vertical;
  -webkit-box-direction: normal;
  -webkit-flex-direction: column;
      -ms-flex-direction: column;
          flex-direction: column;
  -webkit-box-pack: center;
  -webkit-justify-content: center;
      -ms-flex-pack: center;
          justify-content: center;
  min-height: 300px;
  padding: 40px 30px;
  position: relative;
  text-align: center;
  width: 100%;
}

@media (min-width: 620px) {

  .product-testimonial__block {
    min-height: 300px;
    padding: 40px;
  }
}

@media (min-width: 1000px) {

  .product-testimonial__block {
    min-height: 500px;
    padding: 70px;
    width: 50%;
  }
}

.product-testimonial__block--featured {
  height: 300px;
}

@media (min-width: 1000px) {

  .product-testimonial__block--featured {
    height: auto;
    max-height: 620px;
  }
}

.product-testimonial__block--featured::before {
  content: '';
  padding-bottom: calc(300/280 * 100%);
}

@media (min-width: 620px) {

  .product-testimonial__block--featured::before {
    padding-bottom: calc(145/400 * 100%);
  }
}

@media (min-width: 1000px) {

  .product-testimonial__block--featured::before {
    padding-bottom: calc(500/720 * 100%);
  }
}

@media (min-width: 1000px) {

  .product-testimonial__text {
    max-width: 490px;
  }
}

.product-testimonial__logo {
  display: block;
  -webkit-box-flex: 0;
  -webkit-flex: 0 0 auto;
      -ms-flex: 0 0 auto;
          flex: 0 0 auto;
  margin-top: 10px;
  width: 120px;
}

@media (min-width: 620px) {

  .product-testimonial__logo {
    margin-top: 20px;
    width: 140px;
  }
}

.product-testimonial__logo::before {
  content: '';
  padding-bottom: calc(45/140 * 100%);
}

.product-testimonial__video--fallback {
  display: block;
}

@media (min-width: 620px) {

  .product-testimonial__video--fallback {
    display: none;
  }
}

.product-what-size__featured::before {
  padding-bottom: calc(2162/640 * 100%);
}

@media (min-width: 620px) {

  .product-what-size__featured::before {
    padding-bottom: calc(2086/1040 * 100%);
  }
}

@media (min-width: 1000px) {

  .product-what-size__featured::before {
    padding-bottom: calc(1744/1760 * 100%);
  }
}

@media (min-width: 1200px) {

  .product-what-size__featured::before {
    padding-bottom: calc(1484/2560 * 100%);
  }
}

.product-what-size__image__mobile {
  display: block;
}

@media (min-width: 620px) {

  .product-what-size__image__mobile {
    display: none;
  }
}

.product-what-size__image__tablet {
  display: none;
}

@media (min-width: 620px) {

  .product-what-size__image__tablet {
    display: block;
  }
}

@media (min-width: 1000px) {

  .product-what-size__image__tablet {
    display: none;
  }
}

.product-what-size__image__desktop-small {
  display: none;
}

@media (min-width: 1000px) {

  .product-what-size__image__desktop-small {
    display: block;
  }
}

@media (min-width: 1200px) {

  .product-what-size__image__desktop-small {
    display: none;
  }
}

.product-what-size__image__desktop-large {
  display: none;
}

@media (min-width: 1200px) {

  .product-what-size__image__desktop-large {
    display: block;
  }
}

.promo-bar {
  background-color: #fdd007;
  color: #000000;
  padding: 5px 0;
  text-align: center;
  width: 100%;
  z-index: 2;
}

@media (min-width: 620px) {

  .promo-bar {
    padding: 8px 0;
  }
}

@media (min-width: 1090px) {

  .promo-bar {
    background-color: transparent;
    left: 0;
    padding: 0;
    position: absolute;
    text-align: left;
    top: 30px;
    width: calc(50% - 280px);
  }
}

.is-checkout .promo-bar {
    display: none;
}

@media (min-width: 1090px) {

  .promo-bar__container {
    left: 40px;
    width: 100%;
  }
}

@media (min-width: 620px) {

  .promo-bar__container {
    width: 100%;
  }
}

@media (min-width: 1200px) {

  .promo-bar__container {
    left: 50px;
  }
}

@media screen and (max-width: 325px) {
  .promo-bar__container {
    width: 100% !important;
  }
}

.promo-bar__content {
  letter-spacing: 1px;
}

p.promo-bar__content.plane {
   background: url("https://cdn.shopify.com/s/files/1/2403/8187/files/PLANE.svg?v=1602619275") scroll no-repeat center left transparent;
   padding-left: 42px;
   line-height: 26px;
   font-size: 17px;
}

.quantity-selector {
  -webkit-box-align: center;
  -webkit-align-items: center;
      -ms-flex-align: center;
          align-items: center;
  display: -webkit-inline-box;
  display: -webkit-inline-flex;
  display: -ms-inline-flexbox;
  display: inline-flex;
  position: relative;
  -webkit-transition: opacity 0.25s ease-in-out;
  -o-transition: opacity 0.25s ease-in-out;
  transition: opacity 0.25s ease-in-out;
  border: 1px solid #000000;
}

.quantity-selector:disabled {
  opacity: 0.4;
}

.quantity-selector__action {
  width: 25px;
  height: 25px;
  color: #000000;
  cursor: pointer;
  display: block;
  opacity: 1;
  padding: 0;
  text-align: center;
  -webkit-transition: opacity 0.25s ease-in-out;
  -o-transition: opacity 0.25s ease-in-out;
  transition: opacity 0.25s ease-in-out;
  -webkit-user-select: none;
     -moz-user-select: none;
      -ms-user-select: none;
          user-select: none;
}

@media (min-width: 620px) {

  .quantity-selector__action {
    width: 35px;
    height: 35px;
  }
}

.quantity-selector__action:disabled {
  cursor: default;
  opacity: 0.4;
}

.quantity-selector__field {
  width: 25px;
  height: 25px;
  line-height: 25px;
  text-align: center;
  color: inherit;
  -moz-apperance: none;
  -webkit-appearance: none;
  font-size: 14px;
}

@media (min-width: 620px) {

  .quantity-selector__field {
    width: 35px;
    height: 35px;
    line-height: 35px;
  }
}

.quantity-selector__field::-webkit-inner-spin-button, .quantity-selector__field::-webkit-outer-spin-button {
  -webkit-appearance: none;
          appearance: none;
}

.quote-over {
  position: relative;
}

/*.quote-over .flickity-slider {
    -webkit-transform: none !important;
        -ms-transform: none !important;
            transform: none !important;
  }*/

.quote-over .flickity-slider .js-item {
      pointer-events: none;
      left: 0 !important;
      opacity: 0;
      -webkit-transition-duration: 0.4s;
           -o-transition-duration: 0.4s;
              transition-duration: 0.4s;
      -webkit-transition-property: opacity, visibility;
      -o-transition-property: opacity, visibility;
      transition-property: opacity, visibility;
      -webkit-transition-timing-function: ease-in-out;
           -o-transition-timing-function: ease-in-out;
              transition-timing-function: ease-in-out;
      visibility: hidden
    }

.quote-over .flickity-slider .js-item.is-selected {
  opacity: 1;
  pointer-events: auto;
  -webkit-transition-delay: 0.3s;
       -o-transition-delay: 0.3s;
          transition-delay: 0.3s;
  visibility: visible;
}

.quote-over__container {
  left: 0;
  margin: 0 auto;
  position: absolute;
  right: 0;
  top: 0;
  z-index: 10;
}

.quote-over__wrapper {
  height: 100%;
}

.quote-over__wrapper .flickity-viewport {
    height: 100% !important;
  }

.quote-over__item {
  -webkit-box-align: center;
  -webkit-align-items: center;
      -ms-flex-align: center;
          align-items: center;
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  height: 100%;
  -webkit-box-pack: center;
  -webkit-justify-content: center;
      -ms-flex-pack: center;
          justify-content: center;
  width: 100%;
}

.quote-over__content {
  max-width: 625px;
}

.quote-over__item__logo {
  height: 30px;
  margin: 20px auto 0;
  width: 80px;
}

@media (min-width: 620px) {

  .quote-over__item__logo {
    height: 32px;
    width: 100px;
  }
}

.quote-over__item__source {
  margin-top: 25px;
  text-align: center;
}

.quote-over__background {
  max-height: 720px;
  width: 100%
}

.quote-over__background::before {
  padding-bottom: calc(400/320 * 100%);
}

@media (min-width: 620px) {

  .quote-over__background::before {
    padding-bottom: calc(400/600 * 100%);
  }
}

@media (min-width: 1000px) {

  .quote-over__background::before {
    padding-bottom: calc(580/1000 * 100%);
  }
}

@media (min-width: 1200px) {

  .quote-over__background::before {
    padding-bottom: calc(630/1440 * 100%);
  }
}

.quote-over__background::after {
  background-color: rgba(0, 0, 0, 0.1);
  content: '';
  height: 100%;
  left: 0;
  position: absolute;
  top: 0;
  width: 100%;
  z-index: 9;
}

.radio-button {
  -webkit-box-align: start;
  -webkit-align-items: flex-start;
      -ms-flex-align: start;
          align-items: flex-start;
  display: -webkit-inline-box;
  display: -webkit-inline-flex;
  display: -ms-inline-flexbox;
  display: inline-flex;
  -webkit-box-pack: start;
  -webkit-justify-content: flex-start;
      -ms-flex-pack: start;
          justify-content: flex-start;
  position: relative;
}

.radio-button__holder {
  border: 1px solid #d0d0d0;
  border-radius: 50%;
  display: block;
  -webkit-box-flex: 0;
  -webkit-flex: 0 0 auto;
      -ms-flex: 0 0 auto;
          flex: 0 0 auto;
  width: 15px;
  height: 15px;
  margin-right: 10px;
  position: relative;
}

.radio-button__el, .radio-button__checked {
  width: 100%;
  height: 100%;
  position: absolute;
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;
  margin: auto;
}

.radio-button__el {
  cursor: pointer;
  margin: 0;
  z-index: 1
}

.radio-button__el:focus {
  outline: -webkit-focus-ring-color auto 5px;
}

.radio-button__checked {
  background-color: #000000;
  opacity: 0;
  -webkit-transition: opacity 0.25s ease-in-out;
  -o-transition: opacity 0.25s ease-in-out;
  transition: opacity 0.25s ease-in-out;
  z-index: 0;
  border-radius: 50%;
  width: 7px;
  height: 7px;
}

.radio-button__el:checked + .radio-button__checked {
  opacity: 1;
}

.radio-button__label {
  -webkit-box-flex: 1;
  -webkit-flex: 1 1 auto;
      -ms-flex: 1 1 auto;
          flex: 1 1 auto;
  width: auto;
}

.read-more.is-dynamic {
  display: none;
}

.read-more.is-dynamic.is-active {
  display: block;
}

.read-more__cta {
  -webkit-box-align: center;
  -webkit-align-items: center;
      -ms-flex-align: center;
          align-items: center;
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  margin-top: 10px
}

.read-more__cta.is-active .read-more__cta__close {
      display: block;
}

.read-more__cta.is-active .icon {
      -webkit-transform: rotate(180deg);
          -ms-transform: rotate(180deg);
              transform: rotate(180deg);
}

.read-more__cta .icon {
    -webkit-box-flex: 0;
    -webkit-flex: 0 0 auto;
        -ms-flex: 0 0 auto;
            flex: 0 0 auto;
    height: 5px;
    margin-left: 6px;
    margin-top: 2px;
    -webkit-transition: -webkit-transform 200ms ease-in-out;
    transition: -webkit-transform 200ms ease-in-out;
    -o-transition: transform 200ms ease-in-out;
    transition: transform 200ms ease-in-out;
    transition: transform 200ms ease-in-out, -webkit-transform 200ms ease-in-out;
    width: 8px;
}

.read-more__cta__open {
  display: block;
}

.read-more__cta__close {
  display: none;
}

.read-more__wrapper {
  height: 0;
  overflow: hidden;
  -webkit-transition: height 0.4s ease-in-out;
  -o-transition: height 0.4s ease-in-out;
  transition: height 0.4s ease-in-out
}

.read-more__wrapper.is-active {
  -webkit-transition-delay: 0;
       -o-transition-delay: 0;
          transition-delay: 0;
}

.read-more__wrapper.is-active .read-more__content {
      opacity: 1;
      -webkit-transform: translateY(0);
          -ms-transform: translateY(0);
              transform: translateY(0);
      -webkit-transition-delay: 200ms;
           -o-transition-delay: 200ms;
              transition-delay: 200ms;
      visibility: visible;
}

.read-more__content {
  opacity: 0;
  -webkit-transform: translateY(10px);
      -ms-transform: translateY(10px);
          transform: translateY(10px);
  -webkit-transition-duration: 0.4s;
       -o-transition-duration: 0.4s;
          transition-duration: 0.4s;
  -webkit-transition-property: opacity, visibility, -webkit-transform;
  transition-property: opacity, visibility, -webkit-transform;
  -o-transition-property: opacity, transform, visibility;
  transition-property: opacity, transform, visibility;
  transition-property: opacity, transform, visibility, -webkit-transform;
  -webkit-transition-timing-function: ease-in-out;
       -o-transition-timing-function: ease-in-out;
          transition-timing-function: ease-in-out;
  visibility: hidden;
}

.recently-viewed .product-3up__container:before {
    content: '';
    display: block;
    border-top: 1px solid #d0d0d0;
    padding-top: 25px;
    margin: 0 20px;
  }

@media (min-width: 1000px) {

  .recently-viewed .product-3up__container:before {
    padding-top: 40px;
    margin: 0;
  }
}

.recommendation-box {
  position: relative;
}

@media (min-width: 840px) {

  .recommendation-box {
    padding: 30px;
    background: #fff9e7;
  }
}

@media (min-width: 1160px) {

  .recommendation-box {
    padding: 60px;
  }
}

.recommendation-box__image {
  position: absolute;
  right: 15px;
  -webkit-transform: translateY(-50%);
      -ms-transform: translateY(-50%);
          transform: translateY(-50%);
  width: 65px;
  max-width: 100px;
  border-radius: 50%;
  overflow: hidden;
}

@media (min-width: 840px) {

  .recommendation-box__image {
    position: relative;
    right: 0;
    -webkit-transform: none;
        -ms-transform: none;
            transform: none;
    width: 100%;
    max-width: 190px;
    margin: 0 auto;
  }
}

.recommendation-box__image:before {
  padding-bottom: 100%;
}

.recommendation-box__content {
  padding: 20px;
  background: #fff9e7;
}

@media (min-width: 840px) {

  .recommendation-box__content {
    padding: 0;
    margin-top: 30px;
    text-align: center;
  }
}

.recommendation-box__title {
  margin-bottom: 5px;
  max-width: 75%;
}

@media (min-width: 840px) {

  .recommendation-box__title {
    max-width: 100%;
    margin-bottom: 10px;
  }
}

.related-products {
  margin-bottom: 6em;
}

.related-products__header {
  margin-bottom: 4em;
}

.related-products__items {
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  -webkit-flex-wrap: wrap;
      -ms-flex-wrap: wrap;
          flex-wrap: wrap;
}

.related-products--three-up .related-products__item {
  width: 33.32%
}

.related-products--four-up .related-products__item {
  width: 25%;
}

.search-grid {
  padding: 40px 0;
  min-height: 100vh;
  position: relative;
  background-color: #fff9e7
}

.search-grid:before {
  position: absolute;
  top: 100px;
  left: 50%;
  -webkit-transform: translate(-50%, -50%);
      -ms-transform: translate(-50%, -50%);
          transform: translate(-50%, -50%);
}

@media (min-width: 1000px) {

  .search-grid {
    padding: 80px 0;
  }
}

.search-grid.is-loaded {
  min-height: 0;
}

.search-grid__hero {
  text-align: center;
  padding-bottom: 40px;
}

@media (min-width: 1000px) {

  .search-grid__hero {
    padding-bottom: 80px;
  }
}

.search-grid__product-grid {
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  -webkit-flex-wrap: wrap;
      -ms-flex-wrap: wrap;
          flex-wrap: wrap;
  width: 100%;
  margin-bottom: -30px;
}

@media (min-width: 445px) {

  .search-grid__product-grid {
    width: calc(100% + 20px);
    margin-left: -10px;
    margin-bottom: -50px;
  }
}

@media (min-width: 1000px) {

  .search-grid__product-grid {
    width: 100%;
    margin-left: 0;
  }
}

.search-grid__product-grid-item {
  padding-bottom: 30px;
  width: 100%;
}

@media (min-width: 445px) {

  .search-grid__product-grid-item {
    padding-bottom: 50px;
    margin: 0 10px;
    width: calc(50% - 20px);
  }
}

@media (min-width: 1200px) {

  .search-grid__product-grid-item {
    width: calc(25% - 20px);
  }
}

.search-grid__load-more {
  text-align: center;
  padding-top: 40px;
}

@media (min-width: 1000px) {

  .search-grid__load-more {
    padding-top: 80px;
  }
}

@media (min-width: 768px) {

  .search-grid__editorials {
    margin-top: 40px;
    padding-top: 40px;
    border-top: 1px solid #cdcdcd;
  }
}

@media (min-width: 1000px) {

  .search-grid__editorials {
    margin-top: 80px;
    padding-top: 80px;
  }
}

.search-grid__editorial + .search-grid__editorial {
    margin-top: 40px;
  }

.search-grid__editorial-grid {
  -webkit-box-align: center;
  -webkit-align-items: center;
      -ms-flex-align: center;
          align-items: center;
}

@media (min-width: 768px) {

  .search-grid__editorial-content  {
    width: 75%;
  }
}

.search-grid__editorial-image  {
  width: 25%;
  display: none;
}

@media (min-width: 768px) {

  .search-grid__editorial-image  {
    display: block;
  }
}

.search-grid__editorial-image-link {
  display: block;
  padding-top: 70%;
  position: relative
}

.search-grid__editorial-image-link::before {
  -webkit-box-shadow: inset 0px 0px 0px 4.5px #ffffff;
          box-shadow: inset 0px 0px 0px 4.5px #ffffff;
  content: '';
  height:  100%;
  left: 0;
  position: absolute;
  top: 0;
  width: 100%;
  z-index: 10;
}

.search-grid__editorial-margin {
  margin-bottom: 10px;
  max-width: 690px;
}

.search-grid__tab-navigation {
  border-top: 1px solid #cdcdcd;
  border-bottom: 1px solid #cdcdcd;
  padding: 15px 0;
  margin-bottom: 40px;
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
}

.search-grid__tab-navigation-label {
  -webkit-box-flex: 1;
  -webkit-flex: 1;
      -ms-flex: 1;
          flex: 1;
}

.search-grid__tab-navigation-items {
  -webkit-box-flex: 0;
  -webkit-flex: 0 1 auto;
      -ms-flex: 0 1 auto;
          flex: 0 1 auto;
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
}

.search-grid__tab-navigation-text {
  padding: 0 4px;
  text-transform: uppercase;
  position: relative;
  overflow: hidden;
  display: inline-block;
  line-height: 1.4;
}

.search-grid__tab-navigation-button {
  font: inherit;
}

.search-grid__tab-navigation-button + .search-grid__tab-navigation-button {
    margin-left: 5px;
  }

.search-grid__tab-navigation-button:before {
  content: '';
  background: #fdd007;
  width: 100%;
  height: 100%;
  position: absolute;
  top: 0;
  left: 0;
  -webkit-transform: translateX(-101%);
      -ms-transform: translateX(-101%);
          transform: translateX(-101%);
  -webkit-transition: -webkit-transform 400ms cubic-bezier(0.42, 0, 0.58, 1);
  transition: -webkit-transform 400ms cubic-bezier(0.42, 0, 0.58, 1);
  -o-transition: transform 400ms cubic-bezier(0.42, 0, 0.58, 1);
  transition: transform 400ms cubic-bezier(0.42, 0, 0.58, 1);
  transition: transform 400ms cubic-bezier(0.42, 0, 0.58, 1), -webkit-transform 400ms cubic-bezier(0.42, 0, 0.58, 1);
}

.search-grid__tab-navigation-button.is-active:before {
  -webkit-transform: translateX(0);
      -ms-transform: translateX(0);
          transform: translateX(0);
}

.search-grid__tab-navigation-button span {
    position: relative;
}

/**
   * Shopify generated class from 'highlight' filter
   */

.search__result .highlight {
    background: #000000;
  }

/**
 * For product listings
 */

.search__result--product {}

/**
 * Result title, caption
 */

@media (min-width: 768px) {

  .search__result__info {
    width: 75%;
    padding-right: 2em;
  }
}

/**
 * Result image container
 */

.search__result__image {
  -webkit-box-ordinal-group: 0;
  -webkit-order: -1;
      -ms-flex-order: -1;
          order: -1;
  overflow: hidden;
  padding-top: 60%;
  margin-bottom: 1.5em;
}

@media (min-width: 768px) {

  .search__result__image {
    width: 25%;
    -webkit-box-ordinal-group: 3;
    -webkit-order: 2;
        -ms-flex-order: 2;
            order: 2;
    padding-top: 15%;
    margin-bottom: 0;
  }
}

.section__anchor {
  display: block;
  -webkit-transform: translateY(-65px);
      -ms-transform: translateY(-65px);
          transform: translateY(-65px);
}

@media (min-width: 1000px) {

  .section__anchor {
    -webkit-transform: translateY(-90px);
        -ms-transform: translateY(-90px);
            transform: translateY(-90px);
  }
}

.section-header {
  text-align: center;
  margin-bottom: 25px;
}

@media (min-width: 840px) {

  .section-header {
    margin-bottom: 70px;
  }
}

.section-header__title {
  margin-bottom: 10px;
}

@media (min-width: 840px) {

  .section-header__title {
    margin-bottom: 15px;
  }

  .section-header__title:last-child {
    margin-bottom: 0;
  }
}

.section-header__description {
  max-width: 625px;
  margin: 0 auto;
}

.section-header__description p + p {
    margin-top: 20px;
  }

.section-header__description a {
    position: relative
  }

.section-header__description a:after {
  content: '';
  position: absolute;
  bottom: -2px;
  left: 0;
  width: 100%;
  height: 1px;
  background-color: #000000;
}

.select-input{
  position: relative;
  -webkit-box-align: center;
  -webkit-align-items: center;
      -ms-flex-align: center;
          align-items: center;
  padding-right: 1px /* Disappearing border-right issue */
}

.select-input.select-input--small {
  display: inline-block;
}

.select-input__el-wrap{
  position: relative;
  border: 1px solid #000000;
}

.select-input--small .select-input__el-wrap {
    border: none;
    display: inline-block;
  }

label + .select-input__el-wrap{
  margin-top: 7px;
}

.select-input--small label + .select-input__el-wrap {
    margin-top: 2px;
  }

.select-input__el{
  display: block;
  width: 100%;
  height: 48px;
  z-index: 1;
  padding-left: 15px;
  padding-right: 25px;
}

.select-input--small .select-input__el {
    height: 20px;
    padding-left: 1px;
    padding-right: 23px;
  }

.select-input__icon {
  display: block;
  position: absolute;
  right: 10px;
  top: 20px;
  width: 7px;
  height: 7px;
  -webkit-transform: rotate(-45deg) translateY(-50%);
      -ms-transform: rotate(-45deg) translateY(-50%);
          transform: rotate(-45deg) translateY(-50%);
  z-index: 0;
  border: solid #343538;
  border-width: 0 0 1px 1px;
}

.select-input--small .select-input__icon {
    width: 6px;
    height: 6px;
    top: 8px;
    right: 4px;
  }

.select {
}

.select__el {
}

.select__label {
}

.small-card {
  -webkit-box-align: center;
  -webkit-align-items: center;
      -ms-flex-align: center;
          align-items: center;
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-pack: center;
  -webkit-justify-content: center;
      -ms-flex-pack: center;
          justify-content: center;
  padding: 25px;
  position: relative
}

.small-card.small-card--expand {
  -webkit-box-align: start;
  -webkit-align-items: flex-start;
      -ms-flex-align: start;
          align-items: flex-start;
}

.small-card .read-more__content {
    padding-top: 20px;
}

.small-card .read-more__content::before {
  content: '';
  display: block;
  height: 1px;
  background-color: #d0d0d0;
  margin-bottom: 20px;
  width: 100%;
}

.small-card__image {
  border-radius: 50%;
  -webkit-box-flex: 0;
  -webkit-flex: 0 0 auto;
      -ms-flex: 0 0 auto;
          flex: 0 0 auto;
  height: 65px;
  overflow: hidden;
  position: absolute;
  right: 30px;
  top: -32px;
  width: 65px;
  -webkit-mask-image: -webkit-radial-gradient(white, black);
}

@media (min-width: 445px) {

  .small-card__image {
    height: 92px;
    margin-right: 25px;
    position: relative;
    right: auto;
    top: auto;
    width: 92px;
  }
}

.small-card__content {
  -webkit-box-flex: 1;
  -webkit-flex: 1 1 auto;
      -ms-flex: 1 1 auto;
          flex: 1 1 auto;
}

.small-card__title {
  margin-bottom: 5px;
}

@media (min-width: 1000px) {

  .small-card__title {
    margin-bottom: 10px;
  }
}

.small-card__cta {
  margin-top: 10px;
}

.social-button__icon {
  width: 13px;
  height: 13px;
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  position: relative;
  margin: 0 2px;
  -webkit-transition: all 200ms ease-in-out;
  -o-transition: all 200ms ease-in-out;
  transition: all 200ms ease-in-out;
}

@media (min-width: 620px) {

  .social-button__icon {
    margin: 0 5px;
  }
}

@media (min-width: 1000px) {

  .social-button__icon {
    width: 15px;
    height: 15px;
    margin: 0 15px;
  }
}

.social-button__icon:hover {
  -webkit-transform: scale(1.1) rotate(5deg);
      -ms-transform: scale(1.1) rotate(5deg);
          transform: scale(1.1) rotate(5deg);
}

.social-button__icon svg {
  position: absolute;
  width: 100%;
  height: 100%;
  top: 0;
}

.socials__list {
  -webkit-box-align: center;
  -webkit-align-items: center;
      -ms-flex-align: center;
          align-items: center;
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-pack: center;
  -webkit-justify-content: center;
      -ms-flex-pack: center;
          justify-content: center;
}

.socials__item {
  margin-left: 40px
}

.socials__item:first-child {
  margin-left: 0;
}

.socials__icon {
  display: block;
  height: 22px;
  width: 22px;
}

.locator__form{
  text-align: center;
  padding: 40px 0 20px;
}

@media (min-width: 1000px) {

  .locator__form {
    padding: 80px 0 40px;
  }
}

.locator__form-inputs{
  max-width: 1000px;
  margin: 40px auto 0;
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  -webkit-flex-wrap: wrap;
      -ms-flex-wrap: wrap;
          flex-wrap: wrap;
}

@media (min-width: 1000px) {

  .locator__form-inputs {
    display: -webkit-box;
    display: -webkit-flex;
    display: -ms-flexbox;
    display: flex;
    -webkit-flex-wrap: nowrap;
        -ms-flex-wrap: nowrap;
            flex-wrap: nowrap;
    margin-top: 60px;
    -webkit-box-align: center;
    -webkit-align-items: center;
        -ms-flex-align: center;
            align-items: center;
    -webkit-box-pack: justify;
    -webkit-justify-content: space-between;
        -ms-flex-pack: justify;
            justify-content: space-between;
  }
}

.locator__input-wrapper{
  -webkit-box-align: center;
  -webkit-align-items: center;
      -ms-flex-align: center;
          align-items: center;
  margin: 0 0 20px 0;
}

@media (min-width: 1000px) {

  .locator__input-wrapper {
    margin: 0 40px 0 0;
    display: -webkit-box;
    display: -webkit-flex;
    display: -ms-flexbox;
    display: flex;
  }
}

.locator__input-wrapper.locator__input-wrapper--location {
  width: 100%;
}

@media (min-width: 1000px) {

  .locator__input-wrapper.locator__input-wrapper--location {
    width: auto;
  }
}

.locator__input-wrapper.locator__input-wrapper--country {
  width: 50%;
  padding-right: 20px;
}

@media (min-width: 1000px) {

  .locator__input-wrapper.locator__input-wrapper--country {
    width: auto;
    padding-right: 0;
  }
}

.locator__input-wrapper.locator__input-wrapper--distance {
  width: 50%;
}

@media (min-width: 1000px) {

  .locator__input-wrapper.locator__input-wrapper--distance {
    width: auto;
  }
}

.locator__input-wrapper.locator__input-wrapper--submit {
  width: 100%;
}

@media (min-width: 1000px) {

  .locator__input-wrapper.locator__input-wrapper--submit {
    width: auto;
  }
}

.locator__input-wrapper:last-child{
  margin-right: 0;
}

.locator__input-label{
  margin: 0 0 7px 0;
  text-align: left;
}

@media (min-width: 1000px) {

  .locator__input-label {
    margin: 0 7px 0 0;
    text-align: right;
  }
}

@media (min-width: 1000px) {

  .locator__input-wrapper--country .locator__input-el {
    width: 160px;
  }
}

@media (min-width: 1000px) {

  .locator__input-wrapper--distance .locator__input-el {
    width: 90px;
  }
}

.locator__submit-button{
  display: block;
  width: 100%;
  min-width: 130px;
}

@media (min-width: 1000px) {

  .locator__submit-button {
    width: auto;
  }
}

.locator__bottom{
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  -webkit-flex-wrap: wrap-reverse;
      -ms-flex-wrap: wrap-reverse;
          flex-wrap: wrap-reverse;
}

@media (min-width: 1000px) {

  .locator__bottom {
    height: 600px;
    -webkit-flex-wrap: wrap;
        -ms-flex-wrap: wrap;
            flex-wrap: wrap;
  }
}

.locator__geo-title{
  margin-bottom: 10px;
}

@media (min-width: 1000px) {

  .locator__geo-title {
    margin: 80px 0 10px;
  }
}

.locator__geo-wrapper{
  margin-top: 20px;
}

.locator__geo-feedback{
  display: none
}

.locator__geo-feedback.is-visible {
  display: block;
}

.locator__sidebar{
  width: 100%;
  padding: 40px 20px;
  position: relative;
  height: 100%;
}

@media (min-width: 1000px) {

  .locator__sidebar {
    padding: 0 25px 0 40px;
    width: 30%;
  }
}

.locator__sidebar-list{
  overflow: hidden;
  overflow-y: scroll;
  -webkit-overflow-scrolling: touch;
  height: 100%;
}

.locator__sidebar-row{
  padding: 30px 0 30px 40px;
  border-bottom: 1px solid #d0d0d0;
  position: relative;
}

.locator__sidebar-icon{
  width: 21px;
  height: 21px;
  display: block;
  position: absolute;
  left: 0;
  background-size: contain;
  background-repeat: no-repeat;
}

.locator__pagination{
  display:none;
}

.locator__map{
  width: 100%;
  min-height: 80vw;
  background: #eee;
  position: relative;
}

@media (min-width: 1000px) {

  .locator__map {
    width: 70%;
    min-height: 0;
  }
}

.locator__redo{
  display: none;
  position: absolute;
  right: 5px;
  top: 5px;
  z-index: 1;
  padding: 0 20px;
}

@media (min-width: 1000px) {

  .locator__redo {
    right: 20px;
    top: 20px;
    padding: 0 40px;
  }
}

.locator__redo__long-form{
  display: none;
}

@media (min-width: 1000px) {

  .locator__redo__long-form {
    display: inline;
  }
}

.locator__redo.is-visible{
  display:inline-block;
}

.locator__map > div{
  width: 100%;
  height: 100%;
}

.story-charity{}

.story-gallery .carousel-image {
    margin-bottom: 0;
  }

.story-gallery__headline {
  width: calc(100% - 40px);
}

@media (min-width: 620px) {

  .story-gallery__headline {
    width: calc(100% - 80px);
  }
}

.story-gallery__title {
  margin-bottom: 10px;
}

@media (min-width: 620px) {

  .story-gallery__title {
    margin-bottom: 15px;
  }
}

.story-timeline {
  padding-bottom: 140px;
  overflow: hidden;
}

.story-timeline .flickity-viewport {
    overflow: visible;
  }

@media (min-width: 445px) {

  .story-timeline {
    padding-bottom: 190px;
  }
}

.story-timeline__container {
  max-width: none;
  width: 100%;
}

@media (min-width: 1440px) {

  .story-timeline__container {
    max-width: 1280px;
    width: calc(100% - 160px);
  }
}

.story-timeline__headline {
  margin-bottom: 50px;
}

.story-timeline__title {
  margin-bottom: 10px;
}

.story-timeline__wrapper {
  position: relative;
}

.story-timeline__line {
  background-color: #000000;
  bottom: 0;
  display: block;
  height: 1px;
  left: 0;
  position: absolute;
  width: 100%;
}

@media (min-width: 1440px) {

  .story-timeline__list {
    -webkit-box-align: stretch;
    -webkit-align-items: stretch;
        -ms-flex-align: stretch;
            align-items: stretch;
    display: -webkit-box;
    display: -webkit-flex;
    display: -ms-flexbox;
    display: flex;
  }
}

.story-timeline__list .flickity-prev-next-button {
    background-color: transparent;
    height: 30px;
    width: 30px;
}

@media (min-width: 1440px) {

  .story-timeline__list .flickity-prev-next-button {
    display: none;
  }
}

.story-timeline__list .flickity-prev-next-button:disabled {
  opacity: 0;
}

.story-timeline__list .flickity-prev-next-button.previous {
  left: 20px;
}

.story-timeline__list .flickity-prev-next-button.next {
  right: 20px;
}

.story-timeline__item {
  cursor: pointer;
  opacity: 1;
  pointer-events: none;
  position: relative;
  visibility: hidden;
  width: 100%;
  z-index: 9;
}

@media (min-width: 620px) {

  .story-timeline__item {
    width: 50%;
  }
}

@media (min-width: 768px) {

  .story-timeline__item {
    width: 33.33%;
  }
}

@media (min-width: 840px) {

  .story-timeline__item {
    width: 25%;
  }
}

@media (min-width: 1160px) {

  .story-timeline__item {
    width: 20%;
  }
}

@media (min-width: 1440px) {

  .story-timeline__item {
    -webkit-box-flex: 1;
    -webkit-flex: 1 1 0;
        -ms-flex: 1 1 0px;
            flex: 1 1 0;
    width: auto;
  }
}

.story-timeline__item.is-visible {
  pointer-events: auto;
  visibility: visible;
}

.story-timeline__item.is-visible .story-timeline__item__tagline, .story-timeline__item.is-visible .story-timeline__item__title {
      opacity: 1;
      -webkit-transform: translateY(0);
          -ms-transform: translateY(0);
              transform: translateY(0);
}

.story-timeline__item.is-visible:not(.no-animation) .story-timeline__item__featured {
        -webkit-animation: wabbleZoom 0.6s ease;
                animation: wabbleZoom 0.6s ease;
        -webkit-animation-fill-mode: forwards;
                animation-fill-mode: forwards;
}

.story-timeline__item.is-visible.no-animation .story-timeline__item__featured {
        -webkit-transform: scale(1);
            -ms-transform: scale(1);
                transform: scale(1);
}

.story-timeline__item.is-visible .story-timeline__item__position {
      opacity: 1;
      -webkit-transform: translateY(0);
          -ms-transform: translateY(0);
              transform: translateY(0);
}

.story-timeline__item.is-visible .story-timeline__item__date {
      opacity: 1;
      -webkit-transform: translateY(0);
          -ms-transform: translateY(0);
              transform: translateY(0);
}

.story-timeline__item.is-visible .story-timeline__item__marker {
      -webkit-transform: translateX(-50%) scale(1);
          -ms-transform: translateX(-50%) scale(1);
              transform: translateX(-50%) scale(1);
}

.story-timeline__item.is-active {
  cursor: default;
}

.story-timeline__item.is-active .story-timeline__item__marker {
      color: #fdd007;
}

.story-timeline__item.is-active .story-timeline__item__caption {
      opacity: 1;
      -webkit-transform: translate(-50%, 0);
          -ms-transform: translate(-50%, 0);
              transform: translate(-50%, 0);
      visibility: visible;
}

.story-timeline__item__tagline, .story-timeline__item__title, .story-timeline__item__featured {
  -webkit-transition: all 0.4s ease-in-out;
  -o-transition: all 0.4s ease-in-out;
  transition: all 0.4s ease-in-out;
  -webkit-transition-delay: 200ms;
       -o-transition-delay: 200ms;
          transition-delay: 200ms;
}

.story-timeline__item__caption {
  -webkit-transition-duration: 0.4s;
       -o-transition-duration: 0.4s;
          transition-duration: 0.4s;
  -webkit-transition-property: opacity, visibility, -webkit-transform;
  transition-property: opacity, visibility, -webkit-transform;
  -o-transition-property: opacity, transform, visibility;
  transition-property: opacity, transform, visibility;
  transition-property: opacity, transform, visibility, -webkit-transform;
  -webkit-transition-timing-function: ease-in-out;
       -o-transition-timing-function: ease-in-out;
          transition-timing-function: ease-in-out;
}

.story-timeline__item__tagline, .story-timeline__item__title {
  opacity: 0;
  -webkit-transform: translateY(10px);
      -ms-transform: translateY(10px);
          transform: translateY(10px);
}

.story-timeline__item__tagline {
  margin-bottom: 5px;
}

.story-timeline__item__title {
  margin-bottom: 15px;
}

.story-timeline__item__featured {
  margin: 0 auto 65px;
  max-width: 125px;
  -webkit-transform: scale(0);
      -ms-transform: scale(0);
          transform: scale(0);
  width: 100%;
}

@media (min-width: 1440px) {

  .story-timeline__item__featured {
    max-width: 115px;
  }
}

.story-timeline__item__featured::before {
  padding-bottom: calc(130/125 * 100%);
}

.story-timeline__item__image--hover {
  display: none;
}

.story-timeline__item__position {
  font-size: 12px;
  left: 0;
  right: 0;
  margin-left: auto;
  margin-right: auto;
  max-width: 200px;
  opacity: 0;
  position: absolute;
  top: 195px;
  -webkit-transform: translateY(10px);
      -ms-transform: translateY(10px);
          transform: translateY(10px);
  -webkit-transition-delay: 0.4s;
       -o-transition-delay: 0.4s;
          transition-delay: 0.4s;
  -webkit-transition-duration: 200ms;
       -o-transition-duration: 200ms;
          transition-duration: 200ms;
  -webkit-transition-property: opacity, -webkit-transform;
  transition-property: opacity, -webkit-transform;
  -o-transition-property: opacity, transform;
  transition-property: opacity, transform;
  transition-property: opacity, transform, -webkit-transform;
  -webkit-transition-timing-function: ease-in-out;
       -o-transition-timing-function: ease-in-out;
          transition-timing-function: ease-in-out;
  width: 100%
}

.story-timeline__item__position::before, .story-timeline__item__position::after {
  color: #fdd007;
  content: '*';
  display: inline-block;
}

.story-timeline__item__position::before {
  margin-right: 5px;
}

.story-timeline__item__position::after {
  margin-left: 5px;
}

.story-timeline__item__date {
  margin-bottom: 20px;
  opacity: 0;
  -webkit-transition: opacity 200ms ease-in-out, -webkit-transform 200ms ease-in-out;
  transition: opacity 200ms ease-in-out, -webkit-transform 200ms ease-in-out;
  -o-transition: opacity 200ms ease-in-out, transform 200ms ease-in-out;
  transition: opacity 200ms ease-in-out, transform 200ms ease-in-out;
  transition: opacity 200ms ease-in-out, transform 200ms ease-in-out, -webkit-transform 200ms ease-in-out;
  -webkit-transform: translateY(10px);
      -ms-transform: translateY(10px);
          transform: translateY(10px);
}

.story-timeline__item__marker {
  background-color: #ffffff;
  border-radius: 50%;
  bottom: -16px;
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  height: 32px;
  left: 50%;
  position: absolute;
  -webkit-transition: color 200ms ease-in-out, -webkit-transform 200ms ease-in-out;
  transition: color 200ms ease-in-out, -webkit-transform 200ms ease-in-out;
  -o-transition: color 200ms ease-in-out, transform 200ms ease-in-out;
  transition: color 200ms ease-in-out, transform 200ms ease-in-out;
  transition: color 200ms ease-in-out, transform 200ms ease-in-out, -webkit-transform 200ms ease-in-out;
  -webkit-transform: translateX(-50%) scale(0);
      -ms-transform: translateX(-50%) scale(0);
          transform: translateX(-50%) scale(0);
  width: 32px;
  z-index: 9;
}

.story-timeline__item__icon {
  display: block;
  height: 15px;
  left: 8.5px;
  top: 8.5px;
  width: 15px;
}

.story-timeline__item__caption {
  left: 50%;
  opacity: 0;
  padding: 15px 10px;
  position: absolute;
  top: calc(100% + 25px);
  -webkit-transform: translate(-50%, 10px);
      -ms-transform: translate(-50%, 10px);
          transform: translate(-50%, 10px);
  visibility: hidden;
  width: calc(100% - 40px);
}

@media (min-width: 445px) {

  .story-timeline__item__caption {
    width: 220px;
  }
}

.story-timeline__item__caption::before {
  border-bottom: 5px solid #fdd007;
  border-left: 8px solid transparent;
  border-right: 8px solid transparent;
  content: '';
  display: block;
  height: 0;
  left: 50%;
  position: absolute;
  top: -5px;
  -webkit-transform: translateX(-50%);
      -ms-transform: translateX(-50%);
          transform: translateX(-50%);
  width: 0;
}

.story-timeline__loader {
  top: 50%;
}

.no-touch .story-timeline__item:not(.is-active):not(.no-animation):hover .story-timeline__item__image {
        -webkit-animation: wabble 0.6s ease;
                animation: wabble 0.6s ease;
}

.no-touch .story-timeline__item:not(.is-active):not(.no-animation):hover .story-timeline__item__marker {
        color: #fdd007;
}

.no-touch .story-timeline__item.has-hover-image .story-timeline__item__featured:hover .story-timeline__item__image {
          display: none;
        }

.no-touch .story-timeline__item.has-hover-image .story-timeline__item__featured:hover .story-timeline__item__image--hover {
          display: block;
        }

.story-video {
  cursor: pointer;
  position: relative;
}

.story-video__container {
  color: #000000;
}

@media (min-width: 620px) {

  .story-video__container {
    -webkit-box-align: center;
    -webkit-align-items: center;
        -ms-flex-align: center;
            align-items: center;
    color: #ffffff;
    display: -webkit-box;
    display: -webkit-flex;
    display: -ms-flexbox;
    display: flex;
    -webkit-box-orient: vertical;
    -webkit-box-direction: normal;
    -webkit-flex-direction: column;
        -ms-flex-direction: column;
            flex-direction: column;
    height: 100%;
    -webkit-box-pack: center;
    -webkit-justify-content: center;
        -ms-flex-pack: center;
            justify-content: center;
    left: 0;
    margin: 0 auto;
    position: absolute;
    right: 0;
    top: 0;
    z-index: 99;
  }
}

.story-video__title {
  margin-bottom: 40px;
}

@media (min-width: 620px) {

  .story-video__title {
    display: block;
    -webkit-box-flex: 0;
    -webkit-flex: 0 0 auto;
        -ms-flex: 0 0 auto;
            flex: 0 0 auto;
    margin-bottom: 20px;
    max-width: 625px;
    width: 100%;
  }
}

.story-video__featured {
  max-height: 630px;
  overflow: hidden
}

.story-video__featured::before {
  padding-bottom: calc(300/320 * 100%);
}

@media (min-width: 620px) {

  .story-video__featured::before {
    padding-bottom: calc(630/1440 * 100%);
  }
}

.story-video__featured::after {
  background-color: rgba(0, 0, 0, 0.2);
  content: '';
  height: 100%;
  left: 0;
  position: absolute;
  top: 0;
  width: 100%;
  z-index: 9;
}

.story-video__btn {
  bottom: 0;
  height: 50px;
  left: 0;
  margin: auto;
  position: absolute;
  right: 0;
  top: 0;
  width: 50px;
  z-index: 99;
}

@media (min-width: 620px) {

  .story-video__btn {
    bottom: auto;
    left: auto;
    margin: 0;
    position: relative;
    right: auto;
    top: auto;
  }
}

.story-video__btn::after {
  border-radius: 50%;
  border: 1.5px solid #fdd007;
  content: '';
  display: block;
  height: calc(100% - 3px);
  width: calc(100% - 3px);
}

.story-video__icon {
  height: 19px;
  left: calc(50% + 2px);
  position: absolute;
  top: 50%;
  -webkit-transform: translate(-50%, -50%);
      -ms-transform: translate(-50%, -50%);
          transform: translate(-50%, -50%);
  width: 19px;
}

.no-touch .story-video__btn::after {
  -webkit-transition: -webkit-transform 200ms ease-in-out;
  transition: -webkit-transform 200ms ease-in-out;
  -o-transition: transform 200ms ease-in-out;
  transition: transform 200ms ease-in-out;
  transition: transform 200ms ease-in-out, -webkit-transform 200ms ease-in-out;
}

.no-touch .story-video__featured::after {
  -webkit-transition: background-color 0.4s ease-in-out;
  -o-transition: background-color 0.4s ease-in-out;
  transition: background-color 0.4s ease-in-out;
}

.no-touch .story-video:hover .story-video__btn::after {
  -webkit-transform: scale(1.15);
      -ms-transform: scale(1.15);
          transform: scale(1.15);
}

.no-touch .story-video:hover .story-video__featured::after {
  background-color: rgba(0, 0, 0, 0.3);
}

.section-header + .stylefit-how__what-size {
  margin-top: -5px;
}

@media (min-width: 445px) {

  .section-header + .stylefit-how__what-size {
    margin-bottom: 10px;
  }
}

@media (min-width: 768px) {

  .section-header + .stylefit-how__what-size {
    margin-bottom: 60px;
  }
}

@media (min-width: 840px) {

  .section-header + .stylefit-how__what-size {
    margin: -50px 0 80px;
  }
}

.stylefit-how__content {
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  -webkit-flex-wrap: wrap;
      -ms-flex-wrap: wrap;
          flex-wrap: wrap;
  margin-bottom: 40px;
}

@media (min-width: 840px) {

  .stylefit-how__content {
    -webkit-box-orient: horizontal;
    -webkit-box-direction: reverse;
    -webkit-flex-direction: row-reverse;
        -ms-flex-direction: row-reverse;
            flex-direction: row-reverse;
    -webkit-box-align: center;
    -webkit-align-items: center;
        -ms-flex-align: center;
            align-items: center;
  }
}

.stylefit-how__block--right {
  width: 100%;
}

@media (min-width: 840px) {

  .stylefit-how__block--right {
    width: 40%;
  }
}

@media (min-width: 1160px) {

  .stylefit-how__block--right {
    width: 33.3333%;
  }
}

.stylefit-how__block--left {
  width: 100%;
  margin-bottom: 80px;
}

@media (min-width: 840px) {

  .stylefit-how__block--left {
    width: 60%;
    margin-bottom: 0;
  }
}

@media (min-width: 1160px) {

  .stylefit-how__block--left {
    width: 66.6666%;
  }
}

.stylefit-how__contact .contacts-info {
    text-align: center;
  }

@media (min-width: 840px) {

  .stylefit-how__contact .contacts-info {
    margin-top: 84px;
  }
}

.stylefit-how__contact .contacts-info__list {
    margin-top: 20px;
    -webkit-flex-wrap: wrap;
        -ms-flex-wrap: wrap;
            flex-wrap: wrap;
}

@media (min-width: 840px) {

  .stylefit-how__contact .contacts-info__list {
    -webkit-box-pack: center;
    -webkit-justify-content: center;
        -ms-flex-pack: center;
            justify-content: center;
  }
}

.stylefit-how__contact .contacts-info__item {
    width: 100%;
    margin: 15px 0 0;
}

@media (min-width: 840px) {

  .stylefit-how__contact .contacts-info__item {
    width: 33.3333%;
    max-width: 180px;
    margin: 0;
    padding: 0 10px;
  }
}

.stylefit-how__contact .contacts-info__item:first-child {
  margin: 0;
}

.stylefit__header, .stylefit-nav {
  text-align: center;
}

.stylefit__header {
  margin-bottom: 20px;
}

@media (min-width: 840px) {

  .stylefit__header {
    margin-bottom: 40px;
  }
}

.stylefit__header .section-header__title {
  margin-bottom: 10px;
}

@media (min-width: 840px) {

  .stylefit__header .section-header__title {
    margin-bottom: 15px;
  }
}

.stylefit-nav {
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  -webkit-flex-wrap: wrap;
      -ms-flex-wrap: wrap;
          flex-wrap: wrap;
  -webkit-box-align: end;
  -webkit-align-items: flex-end;
      -ms-flex-align: end;
          align-items: flex-end;
  -webkit-box-pack: center;
  -webkit-justify-content: center;
      -ms-flex-pack: center;
          justify-content: center;
}

@media (min-width: 840px) {

  .stylefit-nav {
    margin-bottom: 80px;
  }
}

.stylefit-nav__item {
  padding: 0 8px;
  width: 25%;
  text-align: center;
  max-width: 200px;
  cursor: pointer;
}

.stylefit-nav__item--active .stylefit-nav__item-icon path {
      fill: #fdd007;
    }

/*
Placeholder for icon. Delete this when real icon is applied
*/

.stylefit-nav__item-icon {
  width: 100%;
  height: 100%;
  height: 55px;
  max-width: 55px;
  display: block;
  margin: 0 auto 15px;
  -webkit-box-sizing: border-box;
          box-sizing: border-box;
}

@media (min-width: 840px) {

  .stylefit-nav__item-icon {
    height: 110px;
    max-width: 110px;
  }
}

@media (min-width: 840px) {

  .stylefit-nav__item-icon.icon-heart {
    max-width: 115px;
  }
}

.stylefit-nav__item-icon path {
    fill: #fff;
}

.stylefit-content__image-item {
  width: 100%;
  position: absolute;
  top: 0;
}

@media (min-width: 840px) {

  .stylefit-content__image-item {
    width: 50%;
    position: relative;
  }
}

.stylefit-content__image-item:first-child{
  z-index: 2;
}

.stylefit-content__image-item + .stylefit-content__image-item{
  z-index: 1;
}

.stylefit-content__image {
  position: relative;
  overflow: hidden
}

.stylefit-content__image:before {
  padding-bottom: 110%;
}

.stylefit-nav {
  margin-bottom: 40px;
}

.stylefit-content__block--left {
  margin-bottom: 40px;
}

@media (min-width: 840px) {

  .stylefit-content__block--left {
    margin-bottom: 0;
  }
}

.stylefit-content__cta {
  display: block;
}

@media (min-width: 1160px) {

  .stylefit-content__cta {
    max-width: 300px;
  }
}

.stylefit-content__block--left {
  width: 100%;
  position: relative;
  min-height: 300px;
}

@media (min-width: 840px) {

  .stylefit-content__block--left {
    width: 50%;
    display: -webkit-box;
    display: -webkit-flex;
    display: -ms-flexbox;
    display: flex;
    -webkit-flex-wrap: wrap;
        -ms-flex-wrap: wrap;
            flex-wrap: wrap;
    -webkit-box-align: center;
    -webkit-align-items: center;
        -ms-flex-align: center;
            align-items: center;
  }
}

@media (min-width: 1160px) {

  .stylefit-content__block--left {
    width: 63%;
  }
}

@media (min-width: 840px) {

  .stylefit-content__item {
    display: -webkit-box;
    display: -webkit-flex;
    display: -ms-flexbox;
    display: flex;
    -webkit-flex-wrap: wrap;
        -ms-flex-wrap: wrap;
            flex-wrap: wrap;
    -webkit-box-align: center;
    -webkit-align-items: center;
        -ms-flex-align: center;
            align-items: center;
  }
}

.stylefit-content__item--active {
  display: block;
}

@media (min-width: 840px) {

  .stylefit-content__item--active {
    display: -webkit-box;
    display: -webkit-flex;
    display: -ms-flexbox;
    display: flex;
  }
}

@media (min-width: 840px) {

  .stylefit-content__block .wysiwyg {
    padding-bottom: 40px;
  }
}

.stylefit-content__block--right {
  width: 100%;
}

@media (min-width: 840px) {

  .stylefit-content__block--right {
    width: 50%;
    padding-left: 30px;
  }
}

@media (min-width: 1160px) {

  .stylefit-content__block--right {
    width: 37%;
    padding-left: 60px;
  }
}

/*
Fallback when having only 1 or no image
 */

.stylefit-content__image-item:only-child {
  width: 100%;
}

.stylefit-content__block:only-child {
  width: 100%;
}

.stylefit-icon {
  display: block;
  margin: 0 auto 25px;
  width: 12px;
  height: 12px;
}

@media (min-width: 1160px) {

  .stylefit-icon {
    width: 20px;
    height: 20px;
  }
}

.stylefit-shopping__header {
  margin-bottom: 40px;
}

.submit-button{
  position: relative;
  -webkit-transition: background-color 200ms;
  -o-transition: background-color 200ms;
  transition: background-color 200ms;
}

.submit-button:disabled{
  background-color: #d0d0d0;
}

.is-loading.submit-button{
  background-color: #fdd0078a;
}

.submit-button__loader{
  position: absolute;
  width: 30px;
  height: 30px;
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;
  margin: auto;
}

.subnav {
  -webkit-box-shadow: none;
          box-shadow: none;
  -webkit-transition: -webkit-transform 0.4s ease-in-out;
  transition: -webkit-transform 0.4s ease-in-out;
  -o-transition: transform 0.4s ease-in-out;
  transition: transform 0.4s ease-in-out;
  transition: transform 0.4s ease-in-out, -webkit-transform 0.4s ease-in-out;
  z-index: 99
}

.subnav.is-sticky {
  -webkit-box-shadow: 0 0 2px 2px rgba(0, 0, 0, 0.2);
          box-shadow: 0 0 2px 2px rgba(0, 0, 0, 0.2);
  -webkit-transform: translateY(90px) !important;
      -ms-transform: translateY(90px) !important;
          transform: translateY(90px) !important;
  width: 100% !important;
}

@media (min-width: 620px) {

  .subnav.is-sticky {
    -webkit-transform: translateY(100px) !important;
        -ms-transform: translateY(100px) !important;
            transform: translateY(100px) !important;
  }
}

@media (min-width: 1000px) {

  .subnav.is-sticky {
    -webkit-transform: translateY(90px) !important;
        -ms-transform: translateY(90px) !important;
            transform: translateY(90px) !important;
  }
}

@media (min-width: 768px) {

  .subnav.is-sticky .subnav__container {
    max-width: 100%;
    width: 100%;
  }
}

.subnav.is-sticky .subnav__wrap {
      border-bottom: 0 solid transparent;
      border-top: 0 solid transparent;
      padding: 15px 0;
}

@media (min-width: 768px) {

  .subnav.is-sticky .subnav__wrap {
    padding: 20px 0;
  }
}

.subnav__wrap {
  background-color: #ffffff;
  border-top: 1px solid #cdcdcd;
  padding: 40px 0;
}

@media (min-width: 768px) {

  .subnav__wrap {
    border-bottom: 1px solid #cdcdcd;
    padding: 30px 0;
  }
}

.subnav__mobile {
  display: block;
}

@media (min-width: 768px) {

  .subnav__mobile {
    display: none;
  }
}

.subnav__desktop {
  display: none;
}

@media (min-width: 768px) {

  .subnav__desktop {
    display: block;
  }
}

.subnav__select {
  border: 1px solid #000000;
  padding: 10px;
  padding-left: 90px;
}

.subnav__current {
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  -webkit-flex-wrap: wrap;
      -ms-flex-wrap: wrap;
          flex-wrap: wrap;
  -webkit-box-align: center;
  -webkit-align-items: center;
      -ms-flex-align: center;
          align-items: center;
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  width: 100%;
  padding: 5px 8px 5px 12px;
  pointer-events: none;
  text-align: left;
}

@media (min-width: 768px) {

  .subnav__current {
    display: none;
  }
}

.subnav__selection {
  overflow: hidden;
  color: #000000;
  width: 100%;
  pointer-events: none;
  font-size: 11px;
  letter-spacing: 1px;
}

.subnav__select-content {
  width: 100%;
  height: 100%;
  cursor: pointer;
}

.subnav__select {
  position: relative
}

.subnav__select:after {
  content: '';
  width: 6px;
  height: 6px;
  border-right: 1px solid #000000;
  border-bottom: 1px solid #000000;
  -webkit-transform: translateY(-50%) rotate(45deg);
      -ms-transform: translateY(-50%) rotate(45deg);
          transform: translateY(-50%) rotate(45deg);
  position: absolute;
  top: 50%;
  right: 10px;
}

.subnav__list {
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  -webkit-flex-wrap: wrap;
      -ms-flex-wrap: wrap;
          flex-wrap: wrap;
  -webkit-box-pack: center;
  -webkit-justify-content: center;
      -ms-flex-pack: center;
          justify-content: center;
}

.subnav__link {
  padding: 2px 20px;
  text-transform: uppercase;
}

.subnav__link--active {
  background: #fdd007;
}

.text-image-2up__container {
  -webkit-box-align: stretch;
  -webkit-align-items: stretch;
      -ms-flex-align: stretch;
          align-items: stretch;
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-orient: vertical;
  -webkit-box-direction: normal;
  -webkit-flex-direction: column;
      -ms-flex-direction: column;
          flex-direction: column;
}

@media (min-width: 768px) {

  .text-image-2up__container {
    -webkit-box-orient: horizontal;
    -webkit-box-direction: normal;
    -webkit-flex-direction: row;
        -ms-flex-direction: row;
            flex-direction: row;
  }
}

.text-image-2up__block {
  -webkit-box-align: center;
  -webkit-align-items: center;
      -ms-flex-align: center;
          align-items: center;
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-flex: 0;
  -webkit-flex: 0 0 auto;
      -ms-flex: 0 0 auto;
          flex: 0 0 auto;
  -webkit-box-orient: vertical;
  -webkit-box-direction: normal;
  -webkit-flex-direction: column;
      -ms-flex-direction: column;
          flex-direction: column;
  -webkit-box-pack: center;
  -webkit-justify-content: center;
      -ms-flex-pack: center;
          justify-content: center;
  padding: 40px 30px;
  position: relative;
  width: 100%;
}

@media (min-width: 620px) {

  .text-image-2up__block {
    padding: 40px;
  }
}

@media (min-width: 768px) {

  .text-image-2up__block {
    width: 50%;
  }
}

@media (min-width: 1000px) {

  .text-image-2up__block {
    padding: 70px;
  }
}

.text-image-2up__block--content {
  -webkit-box-ordinal-group: 3;
  -webkit-order: 2;
      -ms-flex-order: 2;
          order: 2;
}

@media (min-width: 768px) {

  .text-image-2up__block--content {
    -webkit-box-ordinal-group: 2;
    -webkit-order: 1;
        -ms-flex-order: 1;
            order: 1;
  }
}

.text-image-2up__block--featured {
  -webkit-box-ordinal-group: 2;
  -webkit-order: 1;
      -ms-flex-order: 1;
          order: 1;
  overflow: hidden;
}

@media (min-width: 768px) {

  .text-image-2up__block--featured {
    max-height: 480px;
    -webkit-box-ordinal-group: 3;
    -webkit-order: 2;
        -ms-flex-order: 2;
            order: 2;
  }
}

.text-image-2up__block--featured::before {
  padding-bottom: calc(400/720 * 100%);
}

.text-image-2up__title {
  margin-bottom: 15px;
}

.text-image-2up__content-image {
  height: 85px;
  width: 235px;
}

.text-image-2up__text {
  margin: 20px 0;
  max-width: 490px;
  width: 100%;
}

@media (min-width: 768px) {

  .text-image-2up__text {
    max-width: 490px;
  }
}

.no-touch .text-image-2up__block__image {
    -webkit-transition: -webkit-transform 1s cubic-bezier(0.165, 0.84, 0.44, 1);
    transition: -webkit-transform 1s cubic-bezier(0.165, 0.84, 0.44, 1);
    -o-transition: transform 1s cubic-bezier(0.165, 0.84, 0.44, 1);
    transition: transform 1s cubic-bezier(0.165, 0.84, 0.44, 1);
    transition: transform 1s cubic-bezier(0.165, 0.84, 0.44, 1), -webkit-transform 1s cubic-bezier(0.165, 0.84, 0.44, 1);
  }

.no-touch .text-image-2up__block--featured:hover .text-image-2up__block__image {
        -webkit-transform: scale(1.05);
            -ms-transform: scale(1.05);
                transform: scale(1.05);
}

.text-input{
  position: relative;
}

.text-input__input-wrap{
  position: relative;
}

.text-input--default .text-input__input-wrap{
  border: 1px solid #000000;
  padding: 10px 15px;
}

.text-input--newsletter .text-input__input-wrap{
  height: 100%;
}

.text-input--default .text-input__label, .text-input--newsletter .text-input__label{
  position: absolute;
  top: 0;
  bottom: 0;
  margin: auto;
  height: 1.5em;
  -webkit-transform: translateY(0);
      -ms-transform: translateY(0);
          transform: translateY(0);
  -webkit-transition: all 200ms;
  -o-transition: all 200ms;
  transition: all 200ms;
  z-index: 1;
}

.text-input--default .text-input__label.is-active, .text-input--newsletter .text-input__label.is-active{
  -webkit-transform: translateY(-130%);
      -ms-transform: translateY(-130%);
          transform: translateY(-130%);
  font-size: 12px;
  padding: 0 4px;
}

.text-input--default .text-input__label.is-active{
  background: #ffffff;
}

.text-input--newsletter .text-input__label.is-active{
  background: #000000;
}

.text-input__el{
  position: relative;
  width: 100%;
  height: 100%
}

.text-input__el:focus {
  outline: -webkit-focus-ring-color auto 5px;
}

.text-input--default .text-input__el, .text-input--newsletter .text-input__el{
  z-index: 2;
  padding-top: 8px;
}

.text-input--label .text-input__el{
  display: block;
  border: 1px solid #000000;
  width: 100%;
  min-height: 50px;
  margin-top: 7px;
  padding: 10px 15px;
}

.text-input__error{
  -webkit-transition: opacity 300ms;
  -o-transition: opacity 300ms;
  transition: opacity 300ms;
}

.text-input--floating-errors .text-input__error {
    width: 100%;
    background: #ffffff;
    position: absolute;
    left: 0;
    right: 0;
    border-radius: 2px;
    padding: 4px;
    text-align: center;
    -webkit-box-shadow: 0px 0px 2px 0px rgba(0,0,0,0.2);
            box-shadow: 0px 0px 2px 0px rgba(0,0,0,0.2);
  }

.text-input--label .text-input__error, .text-input--default .text-input__error {
    margin-top: 7px;
  }

.text-input--newsletter .text-input__error {
    margin-bottom: 15px;
    bottom: 100%;
  }

.text-input--frontend-password {
  margin-top: 1em;
  margin-bottom: 1em;
  padding: 15px 30px;
  border: 1px solid #000000;
}

.textarea-input{

}

.tooltip{
  width: 12px;
  height: 12px;
  display: inline-block;
  position: relative;
  vertical-align: middle;
  top: -1px;
  cursor: pointer;
}

.tooltip__icon{
  background-color: #d0d0d0;
  display: inline-block;
  border-radius: 50%;
}

.tooltip__icon, .tooltip__icon svg{
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
}

.tooltip__content{
  width: 150px;
  position: absolute;
  bottom: 30px;
  left: 50%;
  z-index: 10;
  text-transform: none;
  background: #ffffff;
  padding: 10px;
  margin-left: -75px;
  -webkit-box-shadow: 0px 0px 9px 0px rgba(0,0,0,0.27);
          box-shadow: 0px 0px 9px 0px rgba(0,0,0,0.27)
}

.tooltip__content.offset--to-right {
  margin-left: -45px;
}

.tooltip__content.offset--to-right:after {
  margin-left: -40px;
}

.tooltip__content:before{
  content: '';
  position: absolute;
  background: #ffffff;
  width: 100%;
  height: 100%;
  top: 0;
  left: 0;
  z-index: 2;
}

.tooltip__content:after{
  content: '';
  width: 20px;
  height: 20px;
  background: #ffffff;
  position: absolute;
  bottom: -4px;
  left: 50%;
  margin-left: -10px;
  -webkit-transform-origin: center;
      -ms-transform-origin: center;
          transform-origin: center;
  -webkit-transform: rotate(45deg);
      -ms-transform: rotate(45deg);
          transform: rotate(45deg);
  -webkit-box-shadow: 0px 0px 9px 0px rgba(0,0,0,0.27);
          box-shadow: 0px 0px 9px 0px rgba(0,0,0,0.27);
  z-index: 1;
}

.tooltip__content-inner{
  position: relative;
  z-index: 3;
  display: block;
}

.tooltip__content-inner:before{
  content: '';
  position: absolute;
  width: calc(100% + 20px);
  height: 30px;
  left: -10px;
  bottom: calc(-10px + -30px);
}

.transition{
  opacity: 0;
}

@media (min-width: 840px) {

  .two-up__wrapper {
    display: -webkit-box;
    display: -webkit-flex;
    display: -ms-flexbox;
    display: flex;
    -webkit-box-align: center;
    -webkit-align-items: center;
        -ms-flex-align: center;
            align-items: center;
  }
}

.two-up__block {
  width: 100%;
  position: relative;
}

@media (min-width: 840px) {

  .two-up__block {
    width: 50%;
  }
}

.two-up__block--left{
  margin-bottom: 40px;
}

@media (min-width: 840px) {

  .two-up__block--left {
    margin-bottom: 0;
    margin-right: 80px;
  }
}

.two-up--location-eye-exam .two-up__block--left:before {
  content: '';
  display: block;
  padding-top: 25%;
}

.two-up--stylefit-welcome .two-up__block--left:before {
  content: '';
  display: block;
  padding-top: 70%;
}

@media (min-width: 840px) {

  .two-up__block--right {
    padding-right: 120px;
  }
}

.two-up--location-eye-exam .two-up__block--right {
    text-align: center;
}

@media (min-width: 840px) {

  .two-up--location-eye-exam .two-up__block--right {
    text-align: left;
  }
}

.two-up__block-inner{
  height: 100%;
}

.two-up__title {
  margin-top: 20px;
}

@media (min-width: 840px) {

  .two-up__title {
    margin-top: 0;
  }
}

.two-up__description {
  margin: 15px 0;
}

@media (min-width: 840px) {

  .two-up__description {
    margin: 40px 0;
  }
}

.two-up__description p + p {
    margin-bottom: 20px;
}

.two-up__description p:last-child {
    margin-bottom: 0;
}

.two-up__phone {
  margin-bottom: 10px;
}

.ugc .yotpo{
    height: 0;
    margin: 0;
    opacity: 0;
    overflow: hidden;
    padding: 0;
    width: 0;
  }

.ugc .yotpo-single-image-container {
    -webkit-animation-duration: 0.001s;
            animation-duration: 0.001s;
    -webkit-animation-name: nodeInserted;
            animation-name: nodeInserted;
    position: relative;
    width: 100%
  }

.ugc .yotpo-single-image-container::before {
  content: '';
  display: block;
  padding-bottom: 100%;
  width: 100%;
}

.ugc .yotpo-image{
    height: 100%;
    left: 0;
    -o-object-fit: cover;
       object-fit: cover;
    -o-object-position: top;
       object-position: top;
    position: absolute;
    top: 0;
    width: 100%;
  }

.ugc__wrapper{
  position: relative;
  -webkit-transition: opacity 200ms ease-in-out;
  -o-transition: opacity 200ms ease-in-out;
  transition: opacity 200ms ease-in-out;
  height: 0;
  overflow: hidden;
  padding-bottom: 150%
}

.ugc__wrapper:not(.is-active) {
  opacity: 0;
}

@media (min-width: 620px) {

  .ugc__wrapper {
    padding-bottom: 50%;
  }
}

@media (min-width: 1160px) {

  .ugc__wrapper {
    padding-bottom: 33.35%;
  }
}

.ugc__inner{
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-orient: vertical;
  -webkit-box-direction: reverse;
  -webkit-flex-direction: column-reverse;
      -ms-flex-direction: column-reverse;
          flex-direction: column-reverse;
  -webkit-flex-wrap: wrap;
      -ms-flex-wrap: wrap;
          flex-wrap: wrap;
}

@media (min-width: 620px) {

  .ugc__inner {
    -webkit-box-orient: horizontal;
    -webkit-box-direction: normal;
    -webkit-flex-direction: row;
        -ms-flex-direction: row;
            flex-direction: row;
  }
}

.ugc__layout{
  position: relative;
}

.ugc__layout--1 {
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  -webkit-flex-wrap: wrap;
      -ms-flex-wrap: wrap;
          flex-wrap: wrap;
  width: 100%;
}

@media (min-width: 620px) {

  .ugc__layout--1 {
    display: block;
    width: 25%;
  }
}

@media (min-width: 1160px) {

  .ugc__layout--1 {
    display: block;
    width: 16.665%;
  }
}

.ugc__layout--1 .yotpo-single-image-container {
    width: 50%;
}

@media (min-width: 620px) {

  .ugc__layout--1 .yotpo-single-image-container {
    width: 100%;
  }
}

.ugc__layout--2 {
  display: none;
}

@media (min-width: 1160px) {

  .ugc__layout--2 {
    display: -webkit-box;
    display: -webkit-flex;
    display: -ms-flexbox;
    display: flex;
    -webkit-flex-wrap: wrap;
        -ms-flex-wrap: wrap;
            flex-wrap: wrap;
    width: 33.335%;
  }
}

.ugc__layout--2 .yotpo-single-image-container {
    width: 50%;
}

@media (min-width: 620px) {

  .ugc__layout--2 .yotpo-single-image-container {
    width: 50%;
  }
}

.ugc__layout--3 {
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  -webkit-flex-wrap: wrap;
      -ms-flex-wrap: wrap;
          flex-wrap: wrap;
  width: 100%;
}

@media (min-width: 620px) {

  .ugc__layout--3 {
    width: 50%;
  }
}

@media (min-width: 1160px) {

  .ugc__layout--3 {
    width: 33.335%;
  }
}

.ugc__layout--3 .yotpo-single-image-container {
    width: 50%;
}

.ugc__layout--4 {
  display: none;
}

@media (min-width: 620px) {

  .ugc__layout--4 {
    display: block;
    width: 25%;
  }
}

@media (min-width: 1160px) {

  .ugc__layout--4 {
    width: 16.665%;
  }
}

.ugc__hashtag {
  background: #000000;
  position: relative;
  width: 100%
}

.ugc__hashtag::before {
  content: '';
  display: block;
  padding-bottom: 50%;
  width: 100%;
}

.ugc__hashtag-inner {
  -webkit-box-align: center;
  -webkit-align-items: center;
      -ms-flex-align: center;
          align-items: center;
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  -webkit-flex-wrap: wrap;
      -ms-flex-wrap: wrap;
          flex-wrap: wrap;
  height: 100%;
  -webkit-box-pack: center;
  -webkit-justify-content: center;
      -ms-flex-pack: center;
          justify-content: center;
  left: 0;
  position: absolute;
  top: 0;
  width: 100%;
}

.ugc__title--desktop {
  display: block;
}

@media (min-width: 620px) {

  .ugc__title--desktop {
    display: none;
  }
}

@media (min-width: 1000px) {

  .ugc__title--desktop {
    display: block;
  }
}

.ugc__title--mobile {
  display: none;
}

@media (min-width: 620px) {

  .ugc__title--mobile {
    display: block;
  }
}

@media (min-width: 1000px) {

  .ugc__title--mobile {
    display: none;
  }
}

.yotpo-lightbox-container .yotpo-label {
    display: none !important;
  }

.video {
  height: 100%;
  left: 0;
  overflow: hidden;
  position: absolute;
  top: 0;
  -webkit-transition: background-color 200ms ease-in-out;
  -o-transition: background-color 200ms ease-in-out;
  transition: background-color 200ms ease-in-out;
  width: 100%;
  z-index: 0
}

.video.no-fallback .video__el {
      display: block;
}

.video.is-loaded .video__el {
      opacity: 1;
      -webkit-transition-delay: 0.3s;
           -o-transition-delay: 0.3s;
              transition-delay: 0.3s;
      visibility: visible;
}

.video.is-loaded .video__loader {
      opacity: 0;
      visibility: hidden;
}

.video.pos-center .video__el {
      top: 50%;
      -webkit-transform: translate(-50%, -50%);
          -ms-transform: translate(-50%, -50%);
              transform: translate(-50%, -50%);
}

.video.pos-top .video__el {
      top: 0;
      -webkit-transform: translate(-50%, 0);
          -ms-transform: translate(-50%, 0);
              transform: translate(-50%, 0);
}

.video.pos-bottom .video__el {
      bottom: 0;
      top: auto;
      -webkit-transform: translate(-50%, 0);
          -ms-transform: translate(-50%, 0);
              transform: translate(-50%, 0);
}

.video__el {
  display: none;
}

@media (min-width: 620px) {

  .video__el {
    display: block;
    height: auto;
    left: 50%;
    opacity: 0;
    position: absolute;
    top: 50%;
    -webkit-transform: translate(-50%, -50%);
        -ms-transform: translate(-50%, -50%);
            transform: translate(-50%, -50%);
    -webkit-transition-duration: 0.4s;
         -o-transition-duration: 0.4s;
            transition-duration: 0.4s;
    -webkit-transition-property: opacity, visibility;
    -o-transition-property: opacity, visibility;
    transition-property: opacity, visibility;
    -webkit-transition-timing-function: ease-in-out;
         -o-transition-timing-function: ease-in-out;
            transition-timing-function: ease-in-out;
    visibility: hidden;
    width: 100%;
  }
}

.video__fallback {
  display: block;
}

@media (min-width: 620px) {

  .video__fallback {
    display: none;
  }
}

.video__loader {
  position: absolute;
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;
  margin: auto;
}

.wysiwyg {
  padding-bottom: 40px;
}

@media (min-width: 1000px) {

  .wysiwyg {
    padding-bottom: 80px;
  }
}

/* Headings */

.wysiwyg h1 + ul, .wysiwyg h1 + p, .wysiwyg h2 + ul, .wysiwyg h2 + p, .wysiwyg h3 + ul, .wysiwyg h3 + p {
  margin-top: 15px;
}

@media (min-width: 1000px) {

  .wysiwyg h1 + ul, .wysiwyg h1 + p, .wysiwyg h2 + ul, .wysiwyg h2 + p, .wysiwyg h3 + ul, .wysiwyg h3 + p {
    margin-top: 20px;
  }
}

.wysiwyg h4 + ul, .wysiwyg h4 + p, .wysiwyg h5 + ul, .wysiwyg h5 + p, .wysiwyg h6 + ul, .wysiwyg h6 + p {
  margin-top: 7px;
}

@media (min-width: 1000px) {

  .wysiwyg h4 + ul, .wysiwyg h4 + p, .wysiwyg h5 + ul, .wysiwyg h5 + p, .wysiwyg h6 + ul, .wysiwyg h6 + p {
    margin-top: 20px;
  }
}

/* Paragraphs & Lists */

.wysiwyg p, .wysiwyg ul, .wysiwyg ol {
    font-size: 13px;
}

@media (min-width: 620px) {

  .wysiwyg p, .wysiwyg ul, .wysiwyg ol {
    font-size: 14px;
  }
}

.wysiwyg p + *, .wysiwyg ul + *, .wysiwyg ol + * {
  margin-top: 15px;
}

@media (min-width: 1000px) {

  .wysiwyg p + *, .wysiwyg ul + *, .wysiwyg ol + * {
    margin-top: 20px;
  }
}

/* Blockquote */

/* Random */

.wysiwyg blockquote, .wysiwyg hr, .wysiwyg img {
    margin: 25px 0;
    width: 100%;
}

@media (min-width: 620px) {

  .wysiwyg blockquote, .wysiwyg hr, .wysiwyg img {
    margin: 50px 0;
  }
}

@media (min-width: 1000px) {

  .wysiwyg blockquote, .wysiwyg hr, .wysiwyg img {
    margin: 40px 0 40px -100px;
    width: calc(100% + 200px);
  }
}

.wysiwyg blockquote + hr, .wysiwyg blockquote + img, .wysiwyg blockquote + blockquote, .wysiwyg hr + hr, .wysiwyg hr + img, .wysiwyg hr + blockquote, .wysiwyg img + hr, .wysiwyg img + img, .wysiwyg img + blockquote {
  margin-top: 0;
}

.wysiwyg > *:first-child {
  margin-top: 0;
}

.wysiwyg > *:first-child > *:first-child {
  margin-top: 0;
}

.wysiwyg a {
    font-family: inherit;
    font-size: inherit;
    text-decoration: underline;
}

.wysiwyg iframe {
    max-width: 100%;
}

.wysiwyg ul {
  margin-bottom: 20px;
  margin-left: -8px;
}

.yotpo.bottomLine {
  display: none;
}

.has-star-rating .yotpo.bottomLine {
      display: block;
}

.yotpo .yotpo-bottomline a {
      text-decoration: underline !important;
      color: #000000 !important;
      margin-left: 1em
    }

.yotpo .yotpo-bottomline a:hover {
  color: #000000 !important;
  text-decoration: underline !important;
}
/* WEBPACK VAR INJECTION */(function(module) {var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;

var _typeof2 = 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; };

(function webpackUniversalModuleDefinition(root, factory) {
  if (( false ? undefined : _typeof2(exports)) === 'object' && ( false ? undefined : _typeof2(module)) === 'object') module.exports = factory();else if (true) !(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),
				__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?
				(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),
				__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));else {}
})(undefined, function () {
  return (/******/function (modules) {
      // webpackBootstrap
      /******/ // The module cache
      /******/var installedModules = {};
      /******/
      /******/ // The require function
      /******/function __webpack_require__(moduleId) {
        /******/
        /******/ // Check if module is in cache
        /******/if (installedModules[moduleId]) {
          /******/return installedModules[moduleId].exports;
          /******/
        }
        /******/ // Create a new module (and put it into the cache)
        /******/var module = installedModules[moduleId] = {
          /******/i: moduleId,
          /******/l: false,
          /******/exports: {}
          /******/ };
        /******/
        /******/ // Execute the module function
        /******/modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
        /******/
        /******/ // Flag the module as loaded
        /******/module.l = true;
        /******/
        /******/ // Return the exports of the module
        /******/return module.exports;
        /******/
      }
      /******/
      /******/
      /******/ // expose the modules object (__webpack_modules__)
      /******/__webpack_require__.m = modules;
      /******/
      /******/ // expose the module cache
      /******/__webpack_require__.c = installedModules;
      /******/
      /******/ // identity function for calling harmony imports with the correct context
      /******/__webpack_require__.i = function (value) {
        return value;
      };
      /******/
      /******/ // define getter function for harmony exports
      /******/__webpack_require__.d = function (exports, name, getter) {
        /******/if (!__webpack_require__.o(exports, name)) {
          /******/Object.defineProperty(exports, name, {
            /******/configurable: false,
            /******/enumerable: true,
            /******/get: getter
            /******/ });
          /******/
        }
        /******/
      };
      /******/
      /******/ // getDefaultExport function for compatibility with non-harmony modules
      /******/__webpack_require__.n = function (module) {
        /******/var getter = module && module.__esModule ?
        /******/function getDefault() {
          return module['default'];
        } :
        /******/function getModuleExports() {
          return module;
        };
        /******/__webpack_require__.d(getter, 'a', getter);
        /******/return getter;
        /******/
      };
      /******/
      /******/ // Object.prototype.hasOwnProperty.call
      /******/__webpack_require__.o = function (object, property) {
        return Object.prototype.hasOwnProperty.call(object, property);
      };
      /******/
      /******/ // __webpack_public_path__
      /******/__webpack_require__.p = "./build";
      /******/
      /******/ // Load entry module and return exports
      /******/return __webpack_require__(__webpack_require__.s = 304);
      /******/
    }(
    /************************************************************************/
    /******/[
    /* 0 */
    /***/function (module, exports, __webpack_require__) {

      var global = __webpack_require__(2),
          core = __webpack_require__(24),
          hide = __webpack_require__(12),
          redefine = __webpack_require__(13),
          ctx = __webpack_require__(25),
          PROTOTYPE = 'prototype';

      var $export = function $export(type, name, source) {
        var IS_FORCED = type & $export.F,
            IS_GLOBAL = type & $export.G,
            IS_STATIC = type & $export.S,
            IS_PROTO = type & $export.P,
            IS_BIND = type & $export.B,
            target = IS_GLOBAL ? global : IS_STATIC ? global[name] || (global[name] = {}) : (global[name] || {})[PROTOTYPE],
            exports = IS_GLOBAL ? core : core[name] || (core[name] = {}),
            expProto = exports[PROTOTYPE] || (exports[PROTOTYPE] = {}),
            key,
            own,
            out,
            exp;
        if (IS_GLOBAL) source = name;
        for (key in source) {
          // contains in native
          own = !IS_FORCED && target && target[key] !== undefined;
          // export native or passed
          out = (own ? target : source)[key];
          // bind timers to global for call from export context
          exp = IS_BIND && own ? ctx(out, global) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out;
          // extend global
          if (target) redefine(target, key, out, type & $export.U);
          // export
          if (exports[key] != out) hide(exports, key, exp);
          if (IS_PROTO && expProto[key] != out) expProto[key] = out;
        }
      };
      global.core = core;
      // type bitmap
      $export.F = 1; // forced
      $export.G = 2; // global
      $export.S = 4; // static
      $export.P = 8; // proto
      $export.B = 16; // bind
      $export.W = 32; // wrap
      $export.U = 64; // safe
      $export.R = 128; // real proto method for `library` 
      module.exports = $export;

      /***/
    },
    /* 1 */
    /***/function (module, exports, __webpack_require__) {

      var isObject = __webpack_require__(4);
      module.exports = function (it) {
        if (!isObject(it)) throw TypeError(it + ' is not an object!');
        return it;
      };

      /***/
    },
    /* 2 */
    /***/function (module, exports) {

      // https://github.com/zloirock/core-js/issues/86#issuecomment-115759028
      var global = module.exports = typeof window != 'undefined' && window.Math == Math ? window : typeof self != 'undefined' && self.Math == Math ? self : Function('return this')();
      if (typeof __g == 'number') __g = global; // eslint-disable-line no-undef

      /***/
    },
    /* 3 */
    /***/function (module, exports) {

      module.exports = function (exec) {
        try {
          return !!exec();
        } catch (e) {
          return true;
        }
      };

      /***/
    },
    /* 4 */
    /***/function (module, exports) {

      module.exports = function (it) {
        return (typeof it === 'undefined' ? 'undefined' : _typeof2(it)) === 'object' ? it !== null : typeof it === 'function';
      };

      /***/
    },
    /* 5 */
    /***/function (module, exports, __webpack_require__) {

      var store = __webpack_require__(57)('wks'),
          uid = __webpack_require__(39),
          _Symbol = __webpack_require__(2).Symbol,
          USE_SYMBOL = typeof _Symbol == 'function';

      var $exports = module.exports = function (name) {
        return store[name] || (store[name] = USE_SYMBOL && _Symbol[name] || (USE_SYMBOL ? _Symbol : uid)('Symbol.' + name));
      };

      $exports.store = store;

      /***/
    },
    /* 6 */
    /***/function (module, exports, __webpack_require__) {

      // Thank's IE8 for his funny defineProperty
      module.exports = !__webpack_require__(3)(function () {
        return Object.defineProperty({}, 'a', { get: function get() {
            return 7;
          } }).a != 7;
      });

      /***/
    },
    /* 7 */
    /***/function (module, exports, __webpack_require__) {

      var anObject = __webpack_require__(1),
          IE8_DOM_DEFINE = __webpack_require__(94),
          toPrimitive = __webpack_require__(23),
          dP = Object.defineProperty;

      exports.f = __webpack_require__(6) ? Object.defineProperty : function defineProperty(O, P, Attributes) {
        anObject(O);
        P = toPrimitive(P, true);
        anObject(Attributes);
        if (IE8_DOM_DEFINE) try {
          return dP(O, P, Attributes);
        } catch (e) {/* empty */}
        if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported!');
        if ('value' in Attributes) O[P] = Attributes.value;
        return O;
      };

      /***/
    },
    /* 8 */
    /***/function (module, exports, __webpack_require__) {

      // 7.1.15 ToLength
      var toInteger = __webpack_require__(30),
          min = Math.min;
      module.exports = function (it) {
        return it > 0 ? min(toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991
      };

      /***/
    },
    /* 9 */
    /***/function (module, exports, __webpack_require__) {

      // 7.1.13 ToObject(argument)
      var defined = __webpack_require__(19);
      module.exports = function (it) {
        return Object(defined(it));
      };

      /***/
    },
    /* 10 */
    /***/function (module, exports) {

      var hasOwnProperty = {}.hasOwnProperty;
      module.exports = function (it, key) {
        return hasOwnProperty.call(it, key);
      };

      /***/
    },
    /* 11 */
    /***/function (module, exports) {

      module.exports = function (it) {
        if (typeof it != 'function') throw TypeError(it + ' is not a function!');
        return it;
      };

      /***/
    },
    /* 12 */
    /***/function (module, exports, __webpack_require__) {

      var dP = __webpack_require__(7),
          createDesc = __webpack_require__(29);
      module.exports = __webpack_require__(6) ? function (object, key, value) {
        return dP.f(object, key, createDesc(1, value));
      } : function (object, key, value) {
        object[key] = value;
        return object;
      };

      /***/
    },
    /* 13 */
    /***/function (module, exports, __webpack_require__) {

      var global = __webpack_require__(2),
          hide = __webpack_require__(12),
          has = __webpack_require__(10),
          SRC = __webpack_require__(39)('src'),
          TO_STRING = 'toString',
          $toString = Function[TO_STRING],
          TPL = ('' + $toString).split(TO_STRING);

      __webpack_require__(24).inspectSource = function (it) {
        return $toString.call(it);
      };

      (module.exports = function (O, key, val, safe) {
        var isFunction = typeof val == 'function';
        if (isFunction) has(val, 'name') || hide(val, 'name', key);
        if (O[key] === val) return;
        if (isFunction) has(val, SRC) || hide(val, SRC, O[key] ? '' + O[key] : TPL.join(String(key)));
        if (O === global) {
          O[key] = val;
        } else {
          if (!safe) {
            delete O[key];
            hide(O, key, val);
          } else {
            if (O[key]) O[key] = val;else hide(O, key, val);
          }
        }
        // add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative
      })(Function.prototype, TO_STRING, function toString() {
        return typeof this == 'function' && this[SRC] || $toString.call(this);
      });

      /***/
    },
    /* 14 */
    /***/function (module, exports, __webpack_require__) {

      var $export = __webpack_require__(0),
          fails = __webpack_require__(3),
          defined = __webpack_require__(19),
          quot = /"/g;
      // B.2.3.2.1 CreateHTML(string, tag, attribute, value)
      var createHTML = function createHTML(string, tag, attribute, value) {
        var S = String(defined(string)),
            p1 = '<' + tag;
        if (attribute !== '') p1 += ' ' + attribute + '="' + String(value).replace(quot, '&quot;') + '"';
        return p1 + '>' + S + '</' + tag + '>';
      };
      module.exports = function (NAME, exec) {
        var O = {};
        O[NAME] = exec(createHTML);
        $export($export.P + $export.F * fails(function () {
          var test = ''[NAME]('"');
          return test !== test.toLowerCase() || test.split('"').length > 3;
        }), 'String', O);
      };

      /***/
    },
    /* 15 */
    /***/function (module, exports, __webpack_require__) {

      // to indexed object, toObject with fallback for non-array-like ES3 strings
      var IObject = __webpack_require__(46),
          defined = __webpack_require__(19);
      module.exports = function (it) {
        return IObject(defined(it));
      };

      /***/
    },
    /* 16 */
    /***/function (module, exports, __webpack_require__) {

      var pIE = __webpack_require__(47),
          createDesc = __webpack_require__(29),
          toIObject = __webpack_require__(15),
          toPrimitive = __webpack_require__(23),
          has = __webpack_require__(10),
          IE8_DOM_DEFINE = __webpack_require__(94),
          gOPD = Object.getOwnPropertyDescriptor;

      exports.f = __webpack_require__(6) ? gOPD : function getOwnPropertyDescriptor(O, P) {
        O = toIObject(O);
        P = toPrimitive(P, true);
        if (IE8_DOM_DEFINE) try {
          return gOPD(O, P);
        } catch (e) {/* empty */}
        if (has(O, P)) return createDesc(!pIE.f.call(O, P), O[P]);
      };

      /***/
    },
    /* 17 */
    /***/function (module, exports, __webpack_require__) {

      // 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O)
      var has = __webpack_require__(10),
          toObject = __webpack_require__(9),
          IE_PROTO = __webpack_require__(74)('IE_PROTO'),
          ObjectProto = Object.prototype;

      module.exports = Object.getPrototypeOf || function (O) {
        O = toObject(O);
        if (has(O, IE_PROTO)) return O[IE_PROTO];
        if (typeof O.constructor == 'function' && O instanceof O.constructor) {
          return O.constructor.prototype;
        }return O instanceof Object ? ObjectProto : null;
      };

      /***/
    },
    /* 18 */
    /***/function (module, exports) {

      var toString = {}.toString;

      module.exports = function (it) {
        return toString.call(it).slice(8, -1);
      };

      /***/
    },
    /* 19 */
    /***/function (module, exports) {

      // 7.2.1 RequireObjectCoercible(argument)
      module.exports = function (it) {
        if (it == undefined) throw TypeError("Can't call method on  " + it);
        return it;
      };

      /***/
    },
    /* 20 */
    /***/function (module, exports, __webpack_require__) {

      var fails = __webpack_require__(3);

      module.exports = function (method, arg) {
        return !!method && fails(function () {
          arg ? method.call(null, function () {}, 1) : method.call(null);
        });
      };

      /***/
    },
    /* 21 */
    /***/function (module, exports, __webpack_require__) {

      // 0 -> Array#forEach
      // 1 -> Array#map
      // 2 -> Array#filter
      // 3 -> Array#some
      // 4 -> Array#every
      // 5 -> Array#find
      // 6 -> Array#findIndex
      var ctx = __webpack_require__(25),
          IObject = __webpack_require__(46),
          toObject = __webpack_require__(9),
          toLength = __webpack_require__(8),
          asc = __webpack_require__(121);
      module.exports = function (TYPE, $create) {
        var IS_MAP = TYPE == 1,
            IS_FILTER = TYPE == 2,
            IS_SOME = TYPE == 3,
            IS_EVERY = TYPE == 4,
            IS_FIND_INDEX = TYPE == 6,
            NO_HOLES = TYPE == 5 || IS_FIND_INDEX,
            create = $create || asc;
        return function ($this, callbackfn, that) {
          var O = toObject($this),
              self = IObject(O),
              f = ctx(callbackfn, that, 3),
              length = toLength(self.length),
              index = 0,
              result = IS_MAP ? create($this, length) : IS_FILTER ? create($this, 0) : undefined,
              val,
              res;
          for (; length > index; index++) {
            if (NO_HOLES || index in self) {
              val = self[index];
              res = f(val, index, O);
              if (TYPE) {
                if (IS_MAP) result[index] = res; // map
                else if (res) switch (TYPE) {
                    case 3:
                      return true; // some
                    case 5:
                      return val; // find
                    case 6:
                      return index; // findIndex
                    case 2:
                      result.push(val); // filter
                  } else if (IS_EVERY) return false; // every
              }
            }
          }return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : result;
        };
      };

      /***/
    },
    /* 22 */
    /***/function (module, exports, __webpack_require__) {

      // most Object methods by ES6 should accept primitives
      var $export = __webpack_require__(0),
          core = __webpack_require__(24),
          fails = __webpack_require__(3);
      module.exports = function (KEY, exec) {
        var fn = (core.Object || {})[KEY] || Object[KEY],
            exp = {};
        exp[KEY] = exec(fn);
        $export($export.S + $export.F * fails(function () {
          fn(1);
        }), 'Object', exp);
      };

      /***/
    },
    /* 23 */
    /***/function (module, exports, __webpack_require__) {

      // 7.1.1 ToPrimitive(input [, PreferredType])
      var isObject = __webpack_require__(4);
      // instead of the ES6 spec version, we didn't implement @@toPrimitive case
      // and the second argument - flag - preferred type is a string
      module.exports = function (it, S) {
        if (!isObject(it)) return it;
        var fn, val;
        if (S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;
        if (typeof (fn = it.valueOf) == 'function' && !isObject(val = fn.call(it))) return val;
        if (!S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;
        throw TypeError("Can't convert object to primitive value");
      };

      /***/
    },
    /* 24 */
    /***/function (module, exports) {

      var core = module.exports = { version: '2.4.0' };
      if (typeof __e == 'number') __e = core; // eslint-disable-line no-undef

      /***/
    },
    /* 25 */
    /***/function (module, exports, __webpack_require__) {

      // optional / simple context binding
      var aFunction = __webpack_require__(11);
      module.exports = function (fn, that, length) {
        aFunction(fn);
        if (that === undefined) return fn;
        switch (length) {
          case 1:
            return function (a) {
              return fn.call(that, a);
            };
          case 2:
            return function (a, b) {
              return fn.call(that, a, b);
            };
          case 3:
            return function (a, b, c) {
              return fn.call(that, a, b, c);
            };
        }
        return function () /* ...args */{
          return fn.apply(that, arguments);
        };
      };

      /***/
    },
    /* 26 */
    /***/function (module, exports, __webpack_require__) {

      var Map = __webpack_require__(110),
          $export = __webpack_require__(0),
          shared = __webpack_require__(57)('metadata'),
          store = shared.store || (shared.store = new (__webpack_require__(113))());

      var getOrCreateMetadataMap = function getOrCreateMetadataMap(target, targetKey, create) {
        var targetMetadata = store.get(target);
        if (!targetMetadata) {
          if (!create) return undefined;
          store.set(target, targetMetadata = new Map());
        }
        var keyMetadata = targetMetadata.get(targetKey);
        if (!keyMetadata) {
          if (!create) return undefined;
          targetMetadata.set(targetKey, keyMetadata = new Map());
        }return keyMetadata;
      };
      var ordinaryHasOwnMetadata = function ordinaryHasOwnMetadata(MetadataKey, O, P) {
        var metadataMap = getOrCreateMetadataMap(O, P, false);
        return metadataMap === undefined ? false : metadataMap.has(MetadataKey);
      };
      var ordinaryGetOwnMetadata = function ordinaryGetOwnMetadata(MetadataKey, O, P) {
        var metadataMap = getOrCreateMetadataMap(O, P, false);
        return metadataMap === undefined ? undefined : metadataMap.get(MetadataKey);
      };
      var ordinaryDefineOwnMetadata = function ordinaryDefineOwnMetadata(MetadataKey, MetadataValue, O, P) {
        getOrCreateMetadataMap(O, P, true).set(MetadataKey, MetadataValue);
      };
      var ordinaryOwnMetadataKeys = function ordinaryOwnMetadataKeys(target, targetKey) {
        var metadataMap = getOrCreateMetadataMap(target, targetKey, false),
            keys = [];
        if (metadataMap) metadataMap.forEach(function (_, key) {
          keys.push(key);
        });
        return keys;
      };
      var toMetaKey = function toMetaKey(it) {
        return it === undefined || (typeof it === 'undefined' ? 'undefined' : _typeof2(it)) == 'symbol' ? it : String(it);
      };
      var exp = function exp(O) {
        $export($export.S, 'Reflect', O);
      };

      module.exports = {
        store: store,
        map: getOrCreateMetadataMap,
        has: ordinaryHasOwnMetadata,
        get: ordinaryGetOwnMetadata,
        set: ordinaryDefineOwnMetadata,
        keys: ordinaryOwnMetadataKeys,
        key: toMetaKey,
        exp: exp
      };

      /***/
    },
    /* 27 */
    /***/function (module, exports, __webpack_require__) {

      "use strict";

      if (__webpack_require__(6)) {
        var LIBRARY = __webpack_require__(32),
            global = __webpack_require__(2),
            fails = __webpack_require__(3),
            $export = __webpack_require__(0),
            $typed = __webpack_require__(58),
            $buffer = __webpack_require__(81),
            ctx = __webpack_require__(25),
            anInstance = __webpack_require__(31),
            propertyDesc = __webpack_require__(29),
            hide = __webpack_require__(12),
            redefineAll = __webpack_require__(36),
            toInteger = __webpack_require__(30),
            toLength = __webpack_require__(8),
            toIndex = __webpack_require__(38),
            toPrimitive = __webpack_require__(23),
            has = __webpack_require__(10),
            same = __webpack_require__(107),
            classof = __webpack_require__(45),
            isObject = __webpack_require__(4),
            toObject = __webpack_require__(9),
            isArrayIter = __webpack_require__(66),
            create = __webpack_require__(33),
            getPrototypeOf = __webpack_require__(17),
            gOPN = __webpack_require__(34).f,
            getIterFn = __webpack_require__(83),
            uid = __webpack_require__(39),
            wks = __webpack_require__(5),
            createArrayMethod = __webpack_require__(21),
            createArrayIncludes = __webpack_require__(48),
            speciesConstructor = __webpack_require__(75),
            ArrayIterators = __webpack_require__(84),
            Iterators = __webpack_require__(42),
            $iterDetect = __webpack_require__(54),
            setSpecies = __webpack_require__(37),
            arrayFill = __webpack_require__(59),
            arrayCopyWithin = __webpack_require__(87),
            $DP = __webpack_require__(7),
            $GOPD = __webpack_require__(16),
            dP = $DP.f,
            gOPD = $GOPD.f,
            RangeError = global.RangeError,
            TypeError = global.TypeError,
            Uint8Array = global.Uint8Array,
            ARRAY_BUFFER = 'ArrayBuffer',
            SHARED_BUFFER = 'Shared' + ARRAY_BUFFER,
            BYTES_PER_ELEMENT = 'BYTES_PER_ELEMENT',
            PROTOTYPE = 'prototype',
            ArrayProto = Array[PROTOTYPE],
            $ArrayBuffer = $buffer.ArrayBuffer,
            $DataView = $buffer.DataView,
            arrayForEach = createArrayMethod(0),
            arrayFilter = createArrayMethod(2),
            arraySome = createArrayMethod(3),
            arrayEvery = createArrayMethod(4),
            arrayFind = createArrayMethod(5),
            arrayFindIndex = createArrayMethod(6),
            arrayIncludes = createArrayIncludes(true),
            arrayIndexOf = createArrayIncludes(false),
            arrayValues = ArrayIterators.values,
            arrayKeys = ArrayIterators.keys,
            arrayEntries = ArrayIterators.entries,
            arrayLastIndexOf = ArrayProto.lastIndexOf,
            arrayReduce = ArrayProto.reduce,
            arrayReduceRight = ArrayProto.reduceRight,
            arrayJoin = ArrayProto.join,
            arraySort = ArrayProto.sort,
            arraySlice = ArrayProto.slice,
            arrayToString = ArrayProto.toString,
            arrayToLocaleString = ArrayProto.toLocaleString,
            ITERATOR = wks('iterator'),
            TAG = wks('toStringTag'),
            TYPED_CONSTRUCTOR = uid('typed_constructor'),
            DEF_CONSTRUCTOR = uid('def_constructor'),
            ALL_CONSTRUCTORS = $typed.CONSTR,
            TYPED_ARRAY = $typed.TYPED,
            VIEW = $typed.VIEW,
            WRONG_LENGTH = 'Wrong length!';

        var $map = createArrayMethod(1, function (O, length) {
          return allocate(speciesConstructor(O, O[DEF_CONSTRUCTOR]), length);
        });

        var LITTLE_ENDIAN = fails(function () {
          return new Uint8Array(new Uint16Array([1]).buffer)[0] === 1;
        });

        var FORCED_SET = !!Uint8Array && !!Uint8Array[PROTOTYPE].set && fails(function () {
          new Uint8Array(1).set({});
        });

        var strictToLength = function strictToLength(it, SAME) {
          if (it === undefined) throw TypeError(WRONG_LENGTH);
          var number = +it,
              length = toLength(it);
          if (SAME && !same(number, length)) throw RangeError(WRONG_LENGTH);
          return length;
        };

        var toOffset = function toOffset(it, BYTES) {
          var offset = toInteger(it);
          if (offset < 0 || offset % BYTES) throw RangeError('Wrong offset!');
          return offset;
        };

        var validate = function validate(it) {
          if (isObject(it) && TYPED_ARRAY in it) return it;
          throw TypeError(it + ' is not a typed array!');
        };

        var allocate = function allocate(C, length) {
          if (!(isObject(C) && TYPED_CONSTRUCTOR in C)) {
            throw TypeError('It is not a typed array constructor!');
          }return new C(length);
        };

        var speciesFromList = function speciesFromList(O, list) {
          return fromList(speciesConstructor(O, O[DEF_CONSTRUCTOR]), list);
        };

        var fromList = function fromList(C, list) {
          var index = 0,
              length = list.length,
              result = allocate(C, length);
          while (length > index) {
            result[index] = list[index++];
          }return result;
        };

        var addGetter = function addGetter(it, key, internal) {
          dP(it, key, { get: function get() {
              return this._d[internal];
            } });
        };

        var $from = function from(source /*, mapfn, thisArg */) {
          var O = toObject(source),
              aLen = arguments.length,
              mapfn = aLen > 1 ? arguments[1] : undefined,
              mapping = mapfn !== undefined,
              iterFn = getIterFn(O),
              i,
              length,
              values,
              result,
              step,
              iterator;
          if (iterFn != undefined && !isArrayIter(iterFn)) {
            for (iterator = iterFn.call(O), values = [], i = 0; !(step = iterator.next()).done; i++) {
              values.push(step.value);
            }O = values;
          }
          if (mapping && aLen > 2) mapfn = ctx(mapfn, arguments[2], 2);
          for (i = 0, length = toLength(O.length), result = allocate(this, length); length > i; i++) {
            result[i] = mapping ? mapfn(O[i], i) : O[i];
          }
          return result;
        };

        var $of = function of() /*...items*/{
          var index = 0,
              length = arguments.length,
              result = allocate(this, length);
          while (length > index) {
            result[index] = arguments[index++];
          }return result;
        };

        // iOS Safari 6.x fails here
        var TO_LOCALE_BUG = !!Uint8Array && fails(function () {
          arrayToLocaleString.call(new Uint8Array(1));
        });

        var $toLocaleString = function toLocaleString() {
          return arrayToLocaleString.apply(TO_LOCALE_BUG ? arraySlice.call(validate(this)) : validate(this), arguments);
        };

        var proto = {
          copyWithin: function copyWithin(target, start /*, end */) {
            return arrayCopyWithin.call(validate(this), target, start, arguments.length > 2 ? arguments[2] : undefined);
          },
          every: function every(callbackfn /*, thisArg */) {
            return arrayEvery(validate(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);
          },
          fill: function fill(value /*, start, end */) {
            // eslint-disable-line no-unused-vars
            return arrayFill.apply(validate(this), arguments);
          },
          filter: function filter(callbackfn /*, thisArg */) {
            return speciesFromList(this, arrayFilter(validate(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined));
          },
          find: function find(predicate /*, thisArg */) {
            return arrayFind(validate(this), predicate, arguments.length > 1 ? arguments[1] : undefined);
          },
          findIndex: function findIndex(predicate /*, thisArg */) {
            return arrayFindIndex(validate(this), predicate, arguments.length > 1 ? arguments[1] : undefined);
          },
          forEach: function forEach(callbackfn /*, thisArg */) {
            arrayForEach(validate(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);
          },
          indexOf: function indexOf(searchElement /*, fromIndex */) {
            return arrayIndexOf(validate(this), searchElement, arguments.length > 1 ? arguments[1] : undefined);
          },
          includes: function includes(searchElement /*, fromIndex */) {
            return arrayIncludes(validate(this), searchElement, arguments.length > 1 ? arguments[1] : undefined);
          },
          join: function join(separator) {
            // eslint-disable-line no-unused-vars
            return arrayJoin.apply(validate(this), arguments);
          },
          lastIndexOf: function lastIndexOf(searchElement /*, fromIndex */) {
            // eslint-disable-line no-unused-vars
            return arrayLastIndexOf.apply(validate(this), arguments);
          },
          map: function map(mapfn /*, thisArg */) {
            return $map(validate(this), mapfn, arguments.length > 1 ? arguments[1] : undefined);
          },
          reduce: function reduce(callbackfn /*, initialValue */) {
            // eslint-disable-line no-unused-vars
            return arrayReduce.apply(validate(this), arguments);
          },
          reduceRight: function reduceRight(callbackfn /*, initialValue */) {
            // eslint-disable-line no-unused-vars
            return arrayReduceRight.apply(validate(this), arguments);
          },
          reverse: function reverse() {
            var that = this,
                length = validate(that).length,
                middle = Math.floor(length / 2),
                index = 0,
                value;
            while (index < middle) {
              value = that[index];
              that[index++] = that[--length];
              that[length] = value;
            }return that;
          },
          some: function some(callbackfn /*, thisArg */) {
            return arraySome(validate(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);
          },
          sort: function sort(comparefn) {
            return arraySort.call(validate(this), comparefn);
          },
          subarray: function subarray(begin, end) {
            var O = validate(this),
                length = O.length,
                $begin = toIndex(begin, length);
            return new (speciesConstructor(O, O[DEF_CONSTRUCTOR]))(O.buffer, O.byteOffset + $begin * O.BYTES_PER_ELEMENT, toLength((end === undefined ? length : toIndex(end, length)) - $begin));
          }
        };

        var $slice = function slice(start, end) {
          return speciesFromList(this, arraySlice.call(validate(this), start, end));
        };

        var $set = function set(arrayLike /*, offset */) {
          validate(this);
          var offset = toOffset(arguments[1], 1),
              length = this.length,
              src = toObject(arrayLike),
              len = toLength(src.length),
              index = 0;
          if (len + offset > length) throw RangeError(WRONG_LENGTH);
          while (index < len) {
            this[offset + index] = src[index++];
          }
        };

        var $iterators = {
          entries: function entries() {
            return arrayEntries.call(validate(this));
          },
          keys: function keys() {
            return arrayKeys.call(validate(this));
          },
          values: function values() {
            return arrayValues.call(validate(this));
          }
        };

        var isTAIndex = function isTAIndex(target, key) {
          return isObject(target) && target[TYPED_ARRAY] && (typeof key === 'undefined' ? 'undefined' : _typeof2(key)) != 'symbol' && key in target && String(+key) == String(key);
        };
        var $getDesc = function getOwnPropertyDescriptor(target, key) {
          return isTAIndex(target, key = toPrimitive(key, true)) ? propertyDesc(2, target[key]) : gOPD(target, key);
        };
        var $setDesc = function defineProperty(target, key, desc) {
          if (isTAIndex(target, key = toPrimitive(key, true)) && isObject(desc) && has(desc, 'value') && !has(desc, 'get') && !has(desc, 'set')
          // TODO: add validation descriptor w/o calling accessors
          && !desc.configurable && (!has(desc, 'writable') || desc.writable) && (!has(desc, 'enumerable') || desc.enumerable)) {
            target[key] = desc.value;
            return target;
          } else return dP(target, key, desc);
        };

        if (!ALL_CONSTRUCTORS) {
          $GOPD.f = $getDesc;
          $DP.f = $setDesc;
        }

        $export($export.S + $export.F * !ALL_CONSTRUCTORS, 'Object', {
          getOwnPropertyDescriptor: $getDesc,
          defineProperty: $setDesc
        });

        if (fails(function () {
          arrayToString.call({});
        })) {
          arrayToString = arrayToLocaleString = function toString() {
            return arrayJoin.call(this);
          };
        }

        var $TypedArrayPrototype$ = redefineAll({}, proto);
        redefineAll($TypedArrayPrototype$, $iterators);
        hide($TypedArrayPrototype$, ITERATOR, $iterators.values);
        redefineAll($TypedArrayPrototype$, {
          slice: $slice,
          set: $set,
          constructor: function constructor() {/* noop */},
          toString: arrayToString,
          toLocaleString: $toLocaleString
        });
        addGetter($TypedArrayPrototype$, 'buffer', 'b');
        addGetter($TypedArrayPrototype$, 'byteOffset', 'o');
        addGetter($TypedArrayPrototype$, 'byteLength', 'l');
        addGetter($TypedArrayPrototype$, 'length', 'e');
        dP($TypedArrayPrototype$, TAG, {
          get: function get() {
            return this[TYPED_ARRAY];
          }
        });

        module.exports = function (KEY, BYTES, wrapper, CLAMPED) {
          CLAMPED = !!CLAMPED;
          var NAME = KEY + (CLAMPED ? 'Clamped' : '') + 'Array',
              ISNT_UINT8 = NAME != 'Uint8Array',
              GETTER = 'get' + KEY,
              SETTER = 'set' + KEY,
              TypedArray = global[NAME],
              Base = TypedArray || {},
              TAC = TypedArray && getPrototypeOf(TypedArray),
              FORCED = !TypedArray || !$typed.ABV,
              O = {},
              TypedArrayPrototype = TypedArray && TypedArray[PROTOTYPE];
          var getter = function getter(that, index) {
            var data = that._d;
            return data.v[GETTER](index * BYTES + data.o, LITTLE_ENDIAN);
          };
          var setter = function setter(that, index, value) {
            var data = that._d;
            if (CLAMPED) value = (value = Math.round(value)) < 0 ? 0 : value > 0xff ? 0xff : value & 0xff;
            data.v[SETTER](index * BYTES + data.o, value, LITTLE_ENDIAN);
          };
          var addElement = function addElement(that, index) {
            dP(that, index, {
              get: function get() {
                return getter(this, index);
              },
              set: function set(value) {
                return setter(this, index, value);
              },
              enumerable: true
            });
          };
          if (FORCED) {
            TypedArray = wrapper(function (that, data, $offset, $length) {
              anInstance(that, TypedArray, NAME, '_d');
              var index = 0,
                  offset = 0,
                  buffer,
                  byteLength,
                  length,
                  klass;
              if (!isObject(data)) {
                length = strictToLength(data, true);
                byteLength = length * BYTES;
                buffer = new $ArrayBuffer(byteLength);
              } else if (data instanceof $ArrayBuffer || (klass = classof(data)) == ARRAY_BUFFER || klass == SHARED_BUFFER) {
                buffer = data;
                offset = toOffset($offset, BYTES);
                var $len = data.byteLength;
                if ($length === undefined) {
                  if ($len % BYTES) throw RangeError(WRONG_LENGTH);
                  byteLength = $len - offset;
                  if (byteLength < 0) throw RangeError(WRONG_LENGTH);
                } else {
                  byteLength = toLength($length) * BYTES;
                  if (byteLength + offset > $len) throw RangeError(WRONG_LENGTH);
                }
                length = byteLength / BYTES;
              } else if (TYPED_ARRAY in data) {
                return fromList(TypedArray, data);
              } else {
                return $from.call(TypedArray, data);
              }
              hide(that, '_d', {
                b: buffer,
                o: offset,
                l: byteLength,
                e: length,
                v: new $DataView(buffer)
              });
              while (index < length) {
                addElement(that, index++);
              }
            });
            TypedArrayPrototype = TypedArray[PROTOTYPE] = create($TypedArrayPrototype$);
            hide(TypedArrayPrototype, 'constructor', TypedArray);
          } else if (!$iterDetect(function (iter) {
            // V8 works with iterators, but fails in many other cases
            // https://code.google.com/p/v8/issues/detail?id=4552
            new TypedArray(null); // eslint-disable-line no-new
            new TypedArray(iter); // eslint-disable-line no-new
          }, true)) {
            TypedArray = wrapper(function (that, data, $offset, $length) {
              anInstance(that, TypedArray, NAME);
              var klass;
              // `ws` module bug, temporarily remove validation length for Uint8Array
              // https://github.com/websockets/ws/pull/645
              if (!isObject(data)) return new Base(strictToLength(data, ISNT_UINT8));
              if (data instanceof $ArrayBuffer || (klass = classof(data)) == ARRAY_BUFFER || klass == SHARED_BUFFER) {
                return $length !== undefined ? new Base(data, toOffset($offset, BYTES), $length) : $offset !== undefined ? new Base(data, toOffset($offset, BYTES)) : new Base(data);
              }
              if (TYPED_ARRAY in data) return fromList(TypedArray, data);
              return $from.call(TypedArray, data);
            });
            arrayForEach(TAC !== Function.prototype ? gOPN(Base).concat(gOPN(TAC)) : gOPN(Base), function (key) {
              if (!(key in TypedArray)) hide(TypedArray, key, Base[key]);
            });
            TypedArray[PROTOTYPE] = TypedArrayPrototype;
            if (!LIBRARY) TypedArrayPrototype.constructor = TypedArray;
          }
          var $nativeIterator = TypedArrayPrototype[ITERATOR],
              CORRECT_ITER_NAME = !!$nativeIterator && ($nativeIterator.name == 'values' || $nativeIterator.name == undefined),
              $iterator = $iterators.values;
          hide(TypedArray, TYPED_CONSTRUCTOR, true);
          hide(TypedArrayPrototype, TYPED_ARRAY, NAME);
          hide(TypedArrayPrototype, VIEW, true);
          hide(TypedArrayPrototype, DEF_CONSTRUCTOR, TypedArray);

          if (CLAMPED ? new TypedArray(1)[TAG] != NAME : !(TAG in TypedArrayPrototype)) {
            dP(TypedArrayPrototype, TAG, {
              get: function get() {
                return NAME;
              }
            });
          }

          O[NAME] = TypedArray;

          $export($export.G + $export.W + $export.F * (TypedArray != Base), O);

          $export($export.S, NAME, {
            BYTES_PER_ELEMENT: BYTES,
            from: $from,
            of: $of
          });

          if (!(BYTES_PER_ELEMENT in TypedArrayPrototype)) hide(TypedArrayPrototype, BYTES_PER_ELEMENT, BYTES);

          $export($export.P, NAME, proto);

          setSpecies(NAME);

          $export($export.P + $export.F * FORCED_SET, NAME, { set: $set });

          $export($export.P + $export.F * !CORRECT_ITER_NAME, NAME, $iterators);

          $export($export.P + $export.F * (TypedArrayPrototype.toString != arrayToString), NAME, { toString: arrayToString });

          $export($export.P + $export.F * fails(function () {
            new TypedArray(1).slice();
          }), NAME, { slice: $slice });

          $export($export.P + $export.F * (fails(function () {
            return [1, 2].toLocaleString() != new TypedArray([1, 2]).toLocaleString();
          }) || !fails(function () {
            TypedArrayPrototype.toLocaleString.call([1, 2]);
          })), NAME, { toLocaleString: $toLocaleString });

          Iterators[NAME] = CORRECT_ITER_NAME ? $nativeIterator : $iterator;
          if (!LIBRARY && !CORRECT_ITER_NAME) hide(TypedArrayPrototype, ITERATOR, $iterator);
        };
      } else module.exports = function () {/* empty */};

      /***/
    },
    /* 28 */
    /***/function (module, exports, __webpack_require__) {

      var META = __webpack_require__(39)('meta'),
          isObject = __webpack_require__(4),
          has = __webpack_require__(10),
          setDesc = __webpack_require__(7).f,
          id = 0;
      var isExtensible = Object.isExtensible || function () {
        return true;
      };
      var FREEZE = !__webpack_require__(3)(function () {
        return isExtensible(Object.preventExtensions({}));
      });
      var setMeta = function setMeta(it) {
        setDesc(it, META, { value: {
            i: 'O' + ++id, // object ID
            w: {} // weak collections IDs
          } });
      };
      var fastKey = function fastKey(it, create) {
        // return primitive with prefix
        if (!isObject(it)) return (typeof it === 'undefined' ? 'undefined' : _typeof2(it)) == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it;
        if (!has(it, META)) {
          // can't set metadata to uncaught frozen object
          if (!isExtensible(it)) return 'F';
          // not necessary to add metadata
          if (!create) return 'E';
          // add missing metadata
          setMeta(it);
          // return object ID
        }return it[META].i;
      };
      var getWeak = function getWeak(it, create) {
        if (!has(it, META)) {
          // can't set metadata to uncaught frozen object
          if (!isExtensible(it)) return true;
          // not necessary to add metadata
          if (!create) return false;
          // add missing metadata
          setMeta(it);
          // return hash weak collections IDs
        }return it[META].w;
      };
      // add metadata on freeze-family methods calling
      var onFreeze = function onFreeze(it) {
        if (FREEZE && meta.NEED && isExtensible(it) && !has(it, META)) setMeta(it);
        return it;
      };
      var meta = module.exports = {
        KEY: META,
        NEED: false,
        fastKey: fastKey,
        getWeak: getWeak,
        onFreeze: onFreeze
      };

      /***/
    },
    /* 29 */
    /***/function (module, exports) {

      module.exports = function (bitmap, value) {
        return {
          enumerable: !(bitmap & 1),
          configurable: !(bitmap & 2),
          writable: !(bitmap & 4),
          value: value
        };
      };

      /***/
    },
    /* 30 */
    /***/function (module, exports) {

      // 7.1.4 ToInteger
      var ceil = Math.ceil,
          floor = Math.floor;
      module.exports = function (it) {
        return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it);
      };

      /***/
    },
    /* 31 */
    /***/function (module, exports) {

      module.exports = function (it, Constructor, name, forbiddenField) {
        if (!(it instanceof Constructor) || forbiddenField !== undefined && forbiddenField in it) {
          throw TypeError(name + ': incorrect invocation!');
        }return it;
      };

      /***/
    },
    /* 32 */
    /***/function (module, exports) {

      module.exports = false;

      /***/
    },
    /* 33 */
    /***/function (module, exports, __webpack_require__) {

      // 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties])
      var anObject = __webpack_require__(1),
          dPs = __webpack_require__(100),
          enumBugKeys = __webpack_require__(62),
          IE_PROTO = __webpack_require__(74)('IE_PROTO'),
          Empty = function Empty() {/* empty */},
          PROTOTYPE = 'prototype';

      // Create object with fake `null` prototype: use iframe Object with cleared prototype
      var _createDict = function createDict() {
        // Thrash, waste and sodomy: IE GC bug
        var iframe = __webpack_require__(61)('iframe'),
            i = enumBugKeys.length,
            lt = '<',
            gt = '>',
            iframeDocument;
        iframe.style.display = 'none';
        __webpack_require__(64).appendChild(iframe);
        iframe.src = 'javascript:'; // eslint-disable-line no-script-url
        // createDict = iframe.contentWindow.Object;
        // html.removeChild(iframe);
        iframeDocument = iframe.contentWindow.document;
        iframeDocument.open();
        iframeDocument.write(lt + 'script' + gt + 'document.F=Object' + lt + '/script' + gt);
        iframeDocument.close();
        _createDict = iframeDocument.F;
        while (i--) {
          delete _createDict[PROTOTYPE][enumBugKeys[i]];
        }return _createDict();
      };

      module.exports = Object.create || function create(O, Properties) {
        var result;
        if (O !== null) {
          Empty[PROTOTYPE] = anObject(O);
          result = new Empty();
          Empty[PROTOTYPE] = null;
          // add "__proto__" for Object.getPrototypeOf polyfill
          result[IE_PROTO] = O;
        } else result = _createDict();
        return Properties === undefined ? result : dPs(result, Properties);
      };

      /***/
    },
    /* 34 */
    /***/function (module, exports, __webpack_require__) {

      // 19.1.2.7 / 15.2.3.4 Object.getOwnPropertyNames(O)
      var $keys = __webpack_require__(102),
          hiddenKeys = __webpack_require__(62).concat('length', 'prototype');

      exports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {
        return $keys(O, hiddenKeys);
      };

      /***/
    },
    /* 35 */
    /***/function (module, exports, __webpack_require__) {

      // 19.1.2.14 / 15.2.3.14 Object.keys(O)
      var $keys = __webpack_require__(102),
          enumBugKeys = __webpack_require__(62);

      module.exports = Object.keys || function keys(O) {
        return $keys(O, enumBugKeys);
      };

      /***/
    },
    /* 36 */
    /***/function (module, exports, __webpack_require__) {

      var redefine = __webpack_require__(13);
      module.exports = function (target, src, safe) {
        for (var key in src) {
          redefine(target, key, src[key], safe);
        }return target;
      };

      /***/
    },
    /* 37 */
    /***/function (module, exports, __webpack_require__) {

      "use strict";

      var global = __webpack_require__(2),
          dP = __webpack_require__(7),
          DESCRIPTORS = __webpack_require__(6),
          SPECIES = __webpack_require__(5)('species');

      module.exports = function (KEY) {
        var C = global[KEY];
        if (DESCRIPTORS && C && !C[SPECIES]) dP.f(C, SPECIES, {
          configurable: true,
          get: function get() {
            return this;
          }
        });
      };

      /***/
    },
    /* 38 */
    /***/function (module, exports, __webpack_require__) {

      var toInteger = __webpack_require__(30),
          max = Math.max,
          min = Math.min;
      module.exports = function (index, length) {
        index = toInteger(index);
        return index < 0 ? max(index + length, 0) : min(index, length);
      };

      /***/
    },
    /* 39 */
    /***/function (module, exports) {

      var id = 0,
          px = Math.random();
      module.exports = function (key) {
        return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36));
      };

      /***/
    },
    /* 40 */
    /***/function (module, exports, __webpack_require__) {

      // 22.1.3.31 Array.prototype[@@unscopables]
      var UNSCOPABLES = __webpack_require__(5)('unscopables'),
          ArrayProto = Array.prototype;
      if (ArrayProto[UNSCOPABLES] == undefined) __webpack_require__(12)(ArrayProto, UNSCOPABLES, {});
      module.exports = function (key) {
        ArrayProto[UNSCOPABLES][key] = true;
      };

      /***/
    },
    /* 41 */
    /***/function (module, exports, __webpack_require__) {

      var ctx = __webpack_require__(25),
          call = __webpack_require__(96),
          isArrayIter = __webpack_require__(66),
          anObject = __webpack_require__(1),
          toLength = __webpack_require__(8),
          getIterFn = __webpack_require__(83),
          BREAK = {},
          RETURN = {};
      var exports = module.exports = function (iterable, entries, fn, that, ITERATOR) {
        var iterFn = ITERATOR ? function () {
          return iterable;
        } : getIterFn(iterable),
            f = ctx(fn, that, entries ? 2 : 1),
            index = 0,
            length,
            step,
            iterator,
            result;
        if (typeof iterFn != 'function') throw TypeError(iterable + ' is not iterable!');
        // fast case for arrays with default iterator
        if (isArrayIter(iterFn)) for (length = toLength(iterable.length); length > index; index++) {
          result = entries ? f(anObject(step = iterable[index])[0], step[1]) : f(iterable[index]);
          if (result === BREAK || result === RETURN) return result;
        } else for (iterator = iterFn.call(iterable); !(step = iterator.next()).done;) {
          result = call(iterator, f, step.value, entries);
          if (result === BREAK || result === RETURN) return result;
        }
      };
      exports.BREAK = BREAK;
      exports.RETURN = RETURN;

      /***/
    },
    /* 42 */
    /***/function (module, exports) {

      module.exports = {};

      /***/
    },
    /* 43 */
    /***/function (module, exports, __webpack_require__) {

      var def = __webpack_require__(7).f,
          has = __webpack_require__(10),
          TAG = __webpack_require__(5)('toStringTag');

      module.exports = function (it, tag, stat) {
        if (it && !has(it = stat ? it : it.prototype, TAG)) def(it, TAG, { configurable: true, value: tag });
      };

      /***/
    },
    /* 44 */
    /***/function (module, exports, __webpack_require__) {

      var $export = __webpack_require__(0),
          defined = __webpack_require__(19),
          fails = __webpack_require__(3),
          spaces = __webpack_require__(79),
          space = '[' + spaces + ']',
          non = '\u200B\x85',
          ltrim = RegExp('^' + space + space + '*'),
          rtrim = RegExp(space + space + '*$');

      var exporter = function exporter(KEY, exec, ALIAS) {
        var exp = {};
        var FORCE = fails(function () {
          return !!spaces[KEY]() || non[KEY]() != non;
        });
        var fn = exp[KEY] = FORCE ? exec(trim) : spaces[KEY];
        if (ALIAS) exp[ALIAS] = fn;
        $export($export.P + $export.F * FORCE, 'String', exp);
      };

      // 1 -> String#trimLeft
      // 2 -> String#trimRight
      // 3 -> String#trim
      var trim = exporter.trim = function (string, TYPE) {
        string = String(defined(string));
        if (TYPE & 1) string = string.replace(ltrim, '');
        if (TYPE & 2) string = string.replace(rtrim, '');
        return string;
      };

      module.exports = exporter;

      /***/
    },
    /* 45 */
    /***/function (module, exports, __webpack_require__) {

      // getting tag from 19.1.3.6 Object.prototype.toString()
      var cof = __webpack_require__(18),
          TAG = __webpack_require__(5)('toStringTag')
      // ES3 wrong here
      ,
          ARG = cof(function () {
        return arguments;
      }()) == 'Arguments';

      // fallback for IE11 Script Access Denied error
      var tryGet = function tryGet(it, key) {
        try {
          return it[key];
        } catch (e) {/* empty */}
      };

      module.exports = function (it) {
        var O, T, B;
        return it === undefined ? 'Undefined' : it === null ? 'Null'
        // @@toStringTag case
        : typeof (T = tryGet(O = Object(it), TAG)) == 'string' ? T
        // builtinTag case
        : ARG ? cof(O)
        // ES3 arguments fallback
        : (B = cof(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : B;
      };

      /***/
    },
    /* 46 */
    /***/function (module, exports, __webpack_require__) {

      // fallback for non-array-like ES3 and non-enumerable old V8 strings
      var cof = __webpack_require__(18);
      module.exports = Object('z').propertyIsEnumerable(0) ? Object : function (it) {
        return cof(it) == 'String' ? it.split('') : Object(it);
      };

      /***/
    },
    /* 47 */
    /***/function (module, exports) {

      exports.f = {}.propertyIsEnumerable;

      /***/
    },
    /* 48 */
    /***/function (module, exports, __webpack_require__) {

      // false -> Array#indexOf
      // true  -> Array#includes
      var toIObject = __webpack_require__(15),
          toLength = __webpack_require__(8),
          toIndex = __webpack_require__(38);
      module.exports = function (IS_INCLUDES) {
        return function ($this, el, fromIndex) {
          var O = toIObject($this),
              length = toLength(O.length),
              index = toIndex(fromIndex, length),
              value;
          // Array#includes uses SameValueZero equality algorithm
          if (IS_INCLUDES && el != el) while (length > index) {
            value = O[index++];
            if (value != value) return true;
            // Array#toIndex ignores holes, Array#includes - not
          } else for (; length > index; index++) {
            if (IS_INCLUDES || index in O) {
              if (O[index] === el) return IS_INCLUDES || index || 0;
            }
          }return !IS_INCLUDES && -1;
        };
      };

      /***/
    },
    /* 49 */
    /***/function (module, exports, __webpack_require__) {

      "use strict";

      var global = __webpack_require__(2),
          $export = __webpack_require__(0),
          redefine = __webpack_require__(13),
          redefineAll = __webpack_require__(36),
          meta = __webpack_require__(28),
          forOf = __webpack_require__(41),
          anInstance = __webpack_require__(31),
          isObject = __webpack_require__(4),
          fails = __webpack_require__(3),
          $iterDetect = __webpack_require__(54),
          setToStringTag = __webpack_require__(43),
          inheritIfRequired = __webpack_require__(65);

      module.exports = function (NAME, wrapper, methods, common, IS_MAP, IS_WEAK) {
        var Base = global[NAME],
            C = Base,
            ADDER = IS_MAP ? 'set' : 'add',
            proto = C && C.prototype,
            O = {};
        var fixMethod = function fixMethod(KEY) {
          var fn = proto[KEY];
          redefine(proto, KEY, KEY == 'delete' ? function (a) {
            return IS_WEAK && !isObject(a) ? false : fn.call(this, a === 0 ? 0 : a);
          } : KEY == 'has' ? function has(a) {
            return IS_WEAK && !isObject(a) ? false : fn.call(this, a === 0 ? 0 : a);
          } : KEY == 'get' ? function get(a) {
            return IS_WEAK && !isObject(a) ? undefined : fn.call(this, a === 0 ? 0 : a);
          } : KEY == 'add' ? function add(a) {
            fn.call(this, a === 0 ? 0 : a);return this;
          } : function set(a, b) {
            fn.call(this, a === 0 ? 0 : a, b);return this;
          });
        };
        if (typeof C != 'function' || !(IS_WEAK || proto.forEach && !fails(function () {
          new C().entries().next();
        }))) {
          // create collection constructor
          C = common.getConstructor(wrapper, NAME, IS_MAP, ADDER);
          redefineAll(C.prototype, methods);
          meta.NEED = true;
        } else {
          var instance = new C()
          // early implementations not supports chaining
          ,
              HASNT_CHAINING = instance[ADDER](IS_WEAK ? {} : -0, 1) != instance
          // V8 ~  Chromium 40- weak-collections throws on primitives, but should return false
          ,
              THROWS_ON_PRIMITIVES = fails(function () {
            instance.has(1);
          })
          // most early implementations doesn't supports iterables, most modern - not close it correctly
          ,
              ACCEPT_ITERABLES = $iterDetect(function (iter) {
            new C(iter);
          }) // eslint-disable-line no-new
          // for early implementations -0 and +0 not the same
          ,
              BUGGY_ZERO = !IS_WEAK && fails(function () {
            // V8 ~ Chromium 42- fails only with 5+ elements
            var $instance = new C(),
                index = 5;
            while (index--) {
              $instance[ADDER](index, index);
            }return !$instance.has(-0);
          });
          if (!ACCEPT_ITERABLES) {
            C = wrapper(function (target, iterable) {
              anInstance(target, C, NAME);
              var that = inheritIfRequired(new Base(), target, C);
              if (iterable != undefined) forOf(iterable, IS_MAP, that[ADDER], that);
              return that;
            });
            C.prototype = proto;
            proto.constructor = C;
          }
          if (THROWS_ON_PRIMITIVES || BUGGY_ZERO) {
            fixMethod('delete');
            fixMethod('has');
            IS_MAP && fixMethod('get');
          }
          if (BUGGY_ZERO || HASNT_CHAINING) fixMethod(ADDER);
          // weak collections should not contains .clear method
          if (IS_WEAK && proto.clear) delete proto.clear;
        }

        setToStringTag(C, NAME);

        O[NAME] = C;
        $export($export.G + $export.W + $export.F * (C != Base), O);

        if (!IS_WEAK) common.setStrong(C, NAME, IS_MAP);

        return C;
      };

      /***/
    },
    /* 50 */
    /***/function (module, exports, __webpack_require__) {

      "use strict";

      var hide = __webpack_require__(12),
          redefine = __webpack_require__(13),
          fails = __webpack_require__(3),
          defined = __webpack_require__(19),
          wks = __webpack_require__(5);

      module.exports = function (KEY, length, exec) {
        var SYMBOL = wks(KEY),
            fns = exec(defined, SYMBOL, ''[KEY]),
            strfn = fns[0],
            rxfn = fns[1];
        if (fails(function () {
          var O = {};
          O[SYMBOL] = function () {
            return 7;
          };
          return ''[KEY](O) != 7;
        })) {
          redefine(String.prototype, KEY, strfn);
          hide(RegExp.prototype, SYMBOL, length == 2
          // 21.2.5.8 RegExp.prototype[@@replace](string, replaceValue)
          // 21.2.5.11 RegExp.prototype[@@split](string, limit)
          ? function (string, arg) {
            return rxfn.call(string, this, arg);
          }
          // 21.2.5.6 RegExp.prototype[@@match](string)
          // 21.2.5.9 RegExp.prototype[@@search](string)
          : function (string) {
            return rxfn.call(string, this);
          });
        }
      };

      /***/
    },
    /* 51 */
    /***/function (module, exports, __webpack_require__) {

      "use strict";

      // 21.2.5.3 get RegExp.prototype.flags

      var anObject = __webpack_require__(1);
      module.exports = function () {
        var that = anObject(this),
            result = '';
        if (that.global) result += 'g';
        if (that.ignoreCase) result += 'i';
        if (that.multiline) result += 'm';
        if (that.unicode) result += 'u';
        if (that.sticky) result += 'y';
        return result;
      };

      /***/
    },
    /* 52 */
    /***/function (module, exports) {

      // fast apply, http://jsperf.lnkit.com/fast-apply/5
      module.exports = function (fn, args, that) {
        var un = that === undefined;
        switch (args.length) {
          case 0:
            return un ? fn() : fn.call(that);
          case 1:
            return un ? fn(args[0]) : fn.call(that, args[0]);
          case 2:
            return un ? fn(args[0], args[1]) : fn.call(that, args[0], args[1]);
          case 3:
            return un ? fn(args[0], args[1], args[2]) : fn.call(that, args[0], args[1], args[2]);
          case 4:
            return un ? fn(args[0], args[1], args[2], args[3]) : fn.call(that, args[0], args[1], args[2], args[3]);
        }return fn.apply(that, args);
      };

      /***/
    },
    /* 53 */
    /***/function (module, exports, __webpack_require__) {

      // 7.2.8 IsRegExp(argument)
      var isObject = __webpack_require__(4),
          cof = __webpack_require__(18),
          MATCH = __webpack_require__(5)('match');
      module.exports = function (it) {
        var isRegExp;
        return isObject(it) && ((isRegExp = it[MATCH]) !== undefined ? !!isRegExp : cof(it) == 'RegExp');
      };

      /***/
    },
    /* 54 */
    /***/function (module, exports, __webpack_require__) {

      var ITERATOR = __webpack_require__(5)('iterator'),
          SAFE_CLOSING = false;

      try {
        var riter = [7][ITERATOR]();
        riter['return'] = function () {
          SAFE_CLOSING = true;
        };
        Array.from(riter, function () {
          throw 2;
        });
      } catch (e) {/* empty */}

      module.exports = function (exec, skipClosing) {
        if (!skipClosing && !SAFE_CLOSING) return false;
        var safe = false;
        try {
          var arr = [7],
              iter = arr[ITERATOR]();
          iter.next = function () {
            return { done: safe = true };
          };
          arr[ITERATOR] = function () {
            return iter;
          };
          exec(arr);
        } catch (e) {/* empty */}
        return safe;
      };

      /***/
    },
    /* 55 */
    /***/function (module, exports, __webpack_require__) {

      // Forced replacement prototype accessors methods
      module.exports = __webpack_require__(32) || !__webpack_require__(3)(function () {
        var K = Math.random();
        // In FF throws only define methods
        __defineSetter__.call(null, K, function () {/* empty */});
        delete __webpack_require__(2)[K];
      });

      /***/
    },
    /* 56 */
    /***/function (module, exports) {

      exports.f = Object.getOwnPropertySymbols;

      /***/
    },
    /* 57 */
    /***/function (module, exports, __webpack_require__) {

      var global = __webpack_require__(2),
          SHARED = '__core-js_shared__',
          store = global[SHARED] || (global[SHARED] = {});
      module.exports = function (key) {
        return store[key] || (store[key] = {});
      };

      /***/
    },
    /* 58 */
    /***/function (module, exports, __webpack_require__) {

      var global = __webpack_require__(2),
          hide = __webpack_require__(12),
          uid = __webpack_require__(39),
          TYPED = uid('typed_array'),
          VIEW = uid('view'),
          ABV = !!(global.ArrayBuffer && global.DataView),
          CONSTR = ABV,
          i = 0,
          l = 9,
          Typed;

      var TypedArrayConstructors = 'Int8Array,Uint8Array,Uint8ClampedArray,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array'.split(',');

      while (i < l) {
        if (Typed = global[TypedArrayConstructors[i++]]) {
          hide(Typed.prototype, TYPED, true);
          hide(Typed.prototype, VIEW, true);
        } else CONSTR = false;
      }

      module.exports = {
        ABV: ABV,
        CONSTR: CONSTR,
        TYPED: TYPED,
        VIEW: VIEW
      };

      /***/
    },
    /* 59 */
    /***/function (module, exports, __webpack_require__) {

      "use strict";
      // 22.1.3.6 Array.prototype.fill(value, start = 0, end = this.length)

      var toObject = __webpack_require__(9),
          toIndex = __webpack_require__(38),
          toLength = __webpack_require__(8);
      module.exports = function fill(value /*, start = 0, end = @length */) {
        var O = toObject(this),
            length = toLength(O.length),
            aLen = arguments.length,
            index = toIndex(aLen > 1 ? arguments[1] : undefined, length),
            end = aLen > 2 ? arguments[2] : undefined,
            endPos = end === undefined ? length : toIndex(end, length);
        while (endPos > index) {
          O[index++] = value;
        }return O;
      };

      /***/
    },
    /* 60 */
    /***/function (module, exports, __webpack_require__) {

      "use strict";

      var $defineProperty = __webpack_require__(7),
          createDesc = __webpack_require__(29);

      module.exports = function (object, index, value) {
        if (index in object) $defineProperty.f(object, index, createDesc(0, value));else object[index] = value;
      };

      /***/
    },
    /* 61 */
    /***/function (module, exports, __webpack_require__) {

      var isObject = __webpack_require__(4),
          document = __webpack_require__(2).document
      // in old IE typeof document.createElement is 'object'
      ,
          is = isObject(document) && isObject(document.createElement);
      module.exports = function (it) {
        return is ? document.createElement(it) : {};
      };

      /***/
    },
    /* 62 */
    /***/function (module, exports) {

      // IE 8- don't enum bug keys
      module.exports = 'constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf'.split(',');

      /***/
    },
    /* 63 */
    /***/function (module, exports, __webpack_require__) {

      var MATCH = __webpack_require__(5)('match');
      module.exports = function (KEY) {
        var re = /./;
        try {
          '/./'[KEY](re);
        } catch (e) {
          try {
            re[MATCH] = false;
            return !'/./'[KEY](re);
          } catch (f) {/* empty */}
        }return true;
      };

      /***/
    },
    /* 64 */
    /***/function (module, exports, __webpack_require__) {

      module.exports = __webpack_require__(2).document && document.documentElement;

      /***/
    },
    /* 65 */
    /***/function (module, exports, __webpack_require__) {

      var isObject = __webpack_require__(4),
          setPrototypeOf = __webpack_require__(73).set;
      module.exports = function (that, target, C) {
        var P,
            S = target.constructor;
        if (S !== C && typeof S == 'function' && (P = S.prototype) !== C.prototype && isObject(P) && setPrototypeOf) {
          setPrototypeOf(that, P);
        }return that;
      };

      /***/
    },
    /* 66 */
    /***/function (module, exports, __webpack_require__) {

      // check on default Array iterator
      var Iterators = __webpack_require__(42),
          ITERATOR = __webpack_require__(5)('iterator'),
          ArrayProto = Array.prototype;

      module.exports = function (it) {
        return it !== undefined && (Iterators.Array === it || ArrayProto[ITERATOR] === it);
      };

      /***/
    },
    /* 67 */
    /***/function (module, exports, __webpack_require__) {

      // 7.2.2 IsArray(argument)
      var cof = __webpack_require__(18);
      module.exports = Array.isArray || function isArray(arg) {
        return cof(arg) == 'Array';
      };

      /***/
    },
    /* 68 */
    /***/function (module, exports, __webpack_require__) {

      "use strict";

      var create = __webpack_require__(33),
          descriptor = __webpack_require__(29),
          setToStringTag = __webpack_require__(43),
          IteratorPrototype = {};

      // 25.1.2.1.1 %IteratorPrototype%[@@iterator]()
      __webpack_require__(12)(IteratorPrototype, __webpack_require__(5)('iterator'), function () {
        return this;
      });

      module.exports = function (Constructor, NAME, next) {
        Constructor.prototype = create(IteratorPrototype, { next: descriptor(1, next) });
        setToStringTag(Constructor, NAME + ' Iterator');
      };

      /***/
    },
    /* 69 */
    /***/function (module, exports, __webpack_require__) {

      "use strict";

      var LIBRARY = __webpack_require__(32),
          $export = __webpack_require__(0),
          redefine = __webpack_require__(13),
          hide = __webpack_require__(12),
          has = __webpack_require__(10),
          Iterators = __webpack_require__(42),
          $iterCreate = __webpack_require__(68),
          setToStringTag = __webpack_require__(43),
          getPrototypeOf = __webpack_require__(17),
          ITERATOR = __webpack_require__(5)('iterator'),
          BUGGY = !([].keys && 'next' in [].keys()) // Safari has buggy iterators w/o `next`
      ,
          FF_ITERATOR = '@@iterator',
          KEYS = 'keys',
          VALUES = 'values';

      var returnThis = function returnThis() {
        return this;
      };

      module.exports = function (Base, NAME, Constructor, next, DEFAULT, IS_SET, FORCED) {
        $iterCreate(Constructor, NAME, next);
        var getMethod = function getMethod(kind) {
          if (!BUGGY && kind in proto) return proto[kind];
          switch (kind) {
            case KEYS:
              return function keys() {
                return new Constructor(this, kind);
              };
            case VALUES:
              return function values() {
                return new Constructor(this, kind);
              };
          }return function entries() {
            return new Constructor(this, kind);
          };
        };
        var TAG = NAME + ' Iterator',
            DEF_VALUES = DEFAULT == VALUES,
            VALUES_BUG = false,
            proto = Base.prototype,
            $native = proto[ITERATOR] || proto[FF_ITERATOR] || DEFAULT && proto[DEFAULT],
            $default = $native || getMethod(DEFAULT),
            $entries = DEFAULT ? !DEF_VALUES ? $default : getMethod('entries') : undefined,
            $anyNative = NAME == 'Array' ? proto.entries || $native : $native,
            methods,
            key,
            IteratorPrototype;
        // Fix native
        if ($anyNative) {
          IteratorPrototype = getPrototypeOf($anyNative.call(new Base()));
          if (IteratorPrototype !== Object.prototype) {
            // Set @@toStringTag to native iterators
            setToStringTag(IteratorPrototype, TAG, true);
            // fix for some old engines
            if (!LIBRARY && !has(IteratorPrototype, ITERATOR)) hide(IteratorPrototype, ITERATOR, returnThis);
          }
        }
        // fix Array#{values, @@iterator}.name in V8 / FF
        if (DEF_VALUES && $native && $native.name !== VALUES) {
          VALUES_BUG = true;
          $default = function values() {
            return $native.call(this);
          };
        }
        // Define iterator
        if ((!LIBRARY || FORCED) && (BUGGY || VALUES_BUG || !proto[ITERATOR])) {
          hide(proto, ITERATOR, $default);
        }
        // Plug for library
        Iterators[NAME] = $default;
        Iterators[TAG] = returnThis;
        if (DEFAULT) {
          methods = {
            values: DEF_VALUES ? $default : getMethod(VALUES),
            keys: IS_SET ? $default : getMethod(KEYS),
            entries: $entries
          };
          if (FORCED) for (key in methods) {
            if (!(key in proto)) redefine(proto, key, methods[key]);
          } else $export($export.P + $export.F * (BUGGY || VALUES_BUG), NAME, methods);
        }
        return methods;
      };

      /***/
    },
    /* 70 */
    /***/function (module, exports) {

      // 20.2.2.14 Math.expm1(x)
      var $expm1 = Math.expm1;
      module.exports = !$expm1
      // Old FF bug
      || $expm1(10) > 22025.465794806719 || $expm1(10) < 22025.4657948067165168
      // Tor Browser bug
      || $expm1(-2e-17) != -2e-17 ? function expm1(x) {
        return (x = +x) == 0 ? x : x > -1e-6 && x < 1e-6 ? x + x * x / 2 : Math.exp(x) - 1;
      } : $expm1;

      /***/
    },
    /* 71 */
    /***/function (module, exports) {

      // 20.2.2.28 Math.sign(x)
      module.exports = Math.sign || function sign(x) {
        return (x = +x) == 0 || x != x ? x : x < 0 ? -1 : 1;
      };

      /***/
    },
    /* 72 */
    /***/function (module, exports, __webpack_require__) {

      var global = __webpack_require__(2),
          macrotask = __webpack_require__(80).set,
          Observer = global.MutationObserver || global.WebKitMutationObserver,
          process = global.process,
          Promise = global.Promise,
          isNode = __webpack_require__(18)(process) == 'process';

      module.exports = function () {
        var head, last, notify;

        var flush = function flush() {
          var parent, fn;
          if (isNode && (parent = process.domain)) parent.exit();
          while (head) {
            fn = head.fn;
            head = head.next;
            try {
              fn();
            } catch (e) {
              if (head) notify();else last = undefined;
              throw e;
            }
          }last = undefined;
          if (parent) parent.enter();
        };

        // Node.js
        if (isNode) {
          notify = function notify() {
            process.nextTick(flush);
          };
          // browsers with MutationObserver
        } else if (Observer) {
          var toggle = true,
              node = document.createTextNode('');
          new Observer(flush).observe(node, { characterData: true }); // eslint-disable-line no-new
          notify = function notify() {
            node.data = toggle = !toggle;
          };
          // environments with maybe non-completely correct, but existent Promise
        } else if (Promise && Promise.resolve) {
          var promise = Promise.resolve();
          notify = function notify() {
            promise.then(flush);
          };
          // for other environments - macrotask based on:
          // - setImmediate
          // - MessageChannel
          // - window.postMessag
          // - onreadystatechange
          // - setTimeout
        } else {
          notify = function notify() {
            // strange IE + webpack dev server bug - use .call(global)
            macrotask.call(global, flush);
          };
        }

        return function (fn) {
          var task = { fn: fn, next: undefined };
          if (last) last.next = task;
          if (!head) {
            head = task;
            notify();
          }last = task;
        };
      };

      /***/
    },
    /* 73 */
    /***/function (module, exports, __webpack_require__) {

      // Works with __proto__ only. Old v8 can't work with null proto objects.
      /* eslint-disable no-proto */
      var isObject = __webpack_require__(4),
          anObject = __webpack_require__(1);
      var check = function check(O, proto) {
        anObject(O);
        if (!isObject(proto) && proto !== null) throw TypeError(proto + ": can't set as prototype!");
      };
      module.exports = {
        set: Object.setPrototypeOf || ('__proto__' in {} ? // eslint-disable-line
        function (test, buggy, set) {
          try {
            set = __webpack_require__(25)(Function.call, __webpack_require__(16).f(Object.prototype, '__proto__').set, 2);
            set(test, []);
            buggy = !(test instanceof Array);
          } catch (e) {
            buggy = true;
          }
          return function setPrototypeOf(O, proto) {
            check(O, proto);
            if (buggy) O.__proto__ = proto;else set(O, proto);
            return O;
          };
        }({}, false) : undefined),
        check: check
      };

      /***/
    },
    /* 74 */
    /***/function (module, exports, __webpack_require__) {

      var shared = __webpack_require__(57)('keys'),
          uid = __webpack_require__(39);
      module.exports = function (key) {
        return shared[key] || (shared[key] = uid(key));
      };

      /***/
    },
    /* 75 */
    /***/function (module, exports, __webpack_require__) {

      // 7.3.20 SpeciesConstructor(O, defaultConstructor)
      var anObject = __webpack_require__(1),
          aFunction = __webpack_require__(11),
          SPECIES = __webpack_require__(5)('species');
      module.exports = function (O, D) {
        var C = anObject(O).constructor,
            S;
        return C === undefined || (S = anObject(C)[SPECIES]) == undefined ? D : aFunction(S);
      };

      /***/
    },
    /* 76 */
    /***/function (module, exports, __webpack_require__) {

      var toInteger = __webpack_require__(30),
          defined = __webpack_require__(19);
      // true  -> String#at
      // false -> String#codePointAt
      module.exports = function (TO_STRING) {
        return function (that, pos) {
          var s = String(defined(that)),
              i = toInteger(pos),
              l = s.length,
              a,
              b;
          if (i < 0 || i >= l) return TO_STRING ? '' : undefined;
          a = s.charCodeAt(i);
          return a < 0xd800 || a > 0xdbff || i + 1 === l || (b = s.charCodeAt(i + 1)) < 0xdc00 || b > 0xdfff ? TO_STRING ? s.charAt(i) : a : TO_STRING ? s.slice(i, i + 2) : (a - 0xd800 << 10) + (b - 0xdc00) + 0x10000;
        };
      };

      /***/
    },
    /* 77 */
    /***/function (module, exports, __webpack_require__) {

      // helper for String#{startsWith, endsWith, includes}
      var isRegExp = __webpack_require__(53),
          defined = __webpack_require__(19);

      module.exports = function (that, searchString, NAME) {
        if (isRegExp(searchString)) throw TypeError('String#' + NAME + " doesn't accept regex!");
        return String(defined(that));
      };

      /***/
    },
    /* 78 */
    /***/function (module, exports, __webpack_require__) {

      "use strict";

      var toInteger = __webpack_require__(30),
          defined = __webpack_require__(19);

      module.exports = function repeat(count) {
        var str = String(defined(this)),
            res = '',
            n = toInteger(count);
        if (n < 0 || n == Infinity) throw RangeError("Count can't be negative");
        for (; n > 0; (n >>>= 1) && (str += str)) {
          if (n & 1) res += str;
        }return res;
      };

      /***/
    },
    /* 79 */
    /***/function (module, exports) {

      module.exports = '\t\n\x0B\f\r \xA0\u1680\u180E\u2000\u2001\u2002\u2003' + '\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028\u2029\uFEFF';

      /***/
    },
    /* 80 */
    /***/function (module, exports, __webpack_require__) {

      var ctx = __webpack_require__(25),
          invoke = __webpack_require__(52),
          html = __webpack_require__(64),
          cel = __webpack_require__(61),
          global = __webpack_require__(2),
          process = global.process,
          setTask = global.setImmediate,
          clearTask = global.clearImmediate,
          MessageChannel = global.MessageChannel,
          counter = 0,
          queue = {},
          ONREADYSTATECHANGE = 'onreadystatechange',
          defer,
          channel,
          port;
      var run = function run() {
        var id = +this;
        if (queue.hasOwnProperty(id)) {
          var fn = queue[id];
          delete queue[id];
          fn();
        }
      };
      var listener = function listener(event) {
        run.call(event.data);
      };
      // Node.js 0.9+ & IE10+ has setImmediate, otherwise:
      if (!setTask || !clearTask) {
        setTask = function setImmediate(fn) {
          var args = [],
              i = 1;
          while (arguments.length > i) {
            args.push(arguments[i++]);
          }queue[++counter] = function () {
            invoke(typeof fn == 'function' ? fn : Function(fn), args);
          };
          defer(counter);
          return counter;
        };
        clearTask = function clearImmediate(id) {
          delete queue[id];
        };
        // Node.js 0.8-
        if (__webpack_require__(18)(process) == 'process') {
          defer = function defer(id) {
            process.nextTick(ctx(run, id, 1));
          };
          // Browsers with MessageChannel, includes WebWorkers
        } else if (MessageChannel) {
          channel = new MessageChannel();
          port = channel.port2;
          channel.port1.onmessage = listener;
          defer = ctx(port.postMessage, port, 1);
          // Browsers with postMessage, skip WebWorkers
          // IE8 has postMessage, but it's sync & typeof its postMessage is 'object'
        } else if (global.addEventListener && typeof postMessage == 'function' && !global.importScripts) {
          defer = function defer(id) {
            global.postMessage(id + '', '*');
          };
          global.addEventListener('message', listener, false);
          // IE8-
        } else if (ONREADYSTATECHANGE in cel('script')) {
          defer = function defer(id) {
            html.appendChild(cel('script'))[ONREADYSTATECHANGE] = function () {
              html.removeChild(this);
              run.call(id);
            };
          };
          // Rest old browsers
        } else {
          defer = function defer(id) {
            setTimeout(ctx(run, id, 1), 0);
          };
        }
      }
      module.exports = {
        set: setTask,
        clear: clearTask
      };

      /***/
    },
    /* 81 */
    /***/function (module, exports, __webpack_require__) {

      "use strict";

      var global = __webpack_require__(2),
          DESCRIPTORS = __webpack_require__(6),
          LIBRARY = __webpack_require__(32),
          $typed = __webpack_require__(58),
          hide = __webpack_require__(12),
          redefineAll = __webpack_require__(36),
          fails = __webpack_require__(3),
          anInstance = __webpack_require__(31),
          toInteger = __webpack_require__(30),
          toLength = __webpack_require__(8),
          gOPN = __webpack_require__(34).f,
          dP = __webpack_require__(7).f,
          arrayFill = __webpack_require__(59),
          setToStringTag = __webpack_require__(43),
          ARRAY_BUFFER = 'ArrayBuffer',
          DATA_VIEW = 'DataView',
          PROTOTYPE = 'prototype',
          WRONG_LENGTH = 'Wrong length!',
          WRONG_INDEX = 'Wrong index!',
          $ArrayBuffer = global[ARRAY_BUFFER],
          $DataView = global[DATA_VIEW],
          Math = global.Math,
          RangeError = global.RangeError,
          Infinity = global.Infinity,
          BaseBuffer = $ArrayBuffer,
          abs = Math.abs,
          pow = Math.pow,
          floor = Math.floor,
          log = Math.log,
          LN2 = Math.LN2,
          BUFFER = 'buffer',
          BYTE_LENGTH = 'byteLength',
          BYTE_OFFSET = 'byteOffset',
          $BUFFER = DESCRIPTORS ? '_b' : BUFFER,
          $LENGTH = DESCRIPTORS ? '_l' : BYTE_LENGTH,
          $OFFSET = DESCRIPTORS ? '_o' : BYTE_OFFSET;

      // IEEE754 conversions based on https://github.com/feross/ieee754
      var packIEEE754 = function packIEEE754(value, mLen, nBytes) {
        var buffer = Array(nBytes),
            eLen = nBytes * 8 - mLen - 1,
            eMax = (1 << eLen) - 1,
            eBias = eMax >> 1,
            rt = mLen === 23 ? pow(2, -24) - pow(2, -77) : 0,
            i = 0,
            s = value < 0 || value === 0 && 1 / value < 0 ? 1 : 0,
            e,
            m,
            c;
        value = abs(value);
        if (value != value || value === Infinity) {
          m = value != value ? 1 : 0;
          e = eMax;
        } else {
          e = floor(log(value) / LN2);
          if (value * (c = pow(2, -e)) < 1) {
            e--;
            c *= 2;
          }
          if (e + eBias >= 1) {
            value += rt / c;
          } else {
            value += rt * pow(2, 1 - eBias);
          }
          if (value * c >= 2) {
            e++;
            c /= 2;
          }
          if (e + eBias >= eMax) {
            m = 0;
            e = eMax;
          } else if (e + eBias >= 1) {
            m = (value * c - 1) * pow(2, mLen);
            e = e + eBias;
          } else {
            m = value * pow(2, eBias - 1) * pow(2, mLen);
            e = 0;
          }
        }
        for (; mLen >= 8; buffer[i++] = m & 255, m /= 256, mLen -= 8) {}
        e = e << mLen | m;
        eLen += mLen;
        for (; eLen > 0; buffer[i++] = e & 255, e /= 256, eLen -= 8) {}
        buffer[--i] |= s * 128;
        return buffer;
      };
      var unpackIEEE754 = function unpackIEEE754(buffer, mLen, nBytes) {
        var eLen = nBytes * 8 - mLen - 1,
            eMax = (1 << eLen) - 1,
            eBias = eMax >> 1,
            nBits = eLen - 7,
            i = nBytes - 1,
            s = buffer[i--],
            e = s & 127,
            m;
        s >>= 7;
        for (; nBits > 0; e = e * 256 + buffer[i], i--, nBits -= 8) {}
        m = e & (1 << -nBits) - 1;
        e >>= -nBits;
        nBits += mLen;
        for (; nBits > 0; m = m * 256 + buffer[i], i--, nBits -= 8) {}
        if (e === 0) {
          e = 1 - eBias;
        } else if (e === eMax) {
          return m ? NaN : s ? -Infinity : Infinity;
        } else {
          m = m + pow(2, mLen);
          e = e - eBias;
        }return (s ? -1 : 1) * m * pow(2, e - mLen);
      };

      var unpackI32 = function unpackI32(bytes) {
        return bytes[3] << 24 | bytes[2] << 16 | bytes[1] << 8 | bytes[0];
      };
      var packI8 = function packI8(it) {
        return [it & 0xff];
      };
      var packI16 = function packI16(it) {
        return [it & 0xff, it >> 8 & 0xff];
      };
      var packI32 = function packI32(it) {
        return [it & 0xff, it >> 8 & 0xff, it >> 16 & 0xff, it >> 24 & 0xff];
      };
      var packF64 = function packF64(it) {
        return packIEEE754(it, 52, 8);
      };
      var packF32 = function packF32(it) {
        return packIEEE754(it, 23, 4);
      };

      var addGetter = function addGetter(C, key, internal) {
        dP(C[PROTOTYPE], key, { get: function get() {
            return this[internal];
          } });
      };

      var get = function get(view, bytes, index, isLittleEndian) {
        var numIndex = +index,
            intIndex = toInteger(numIndex);
        if (numIndex != intIndex || intIndex < 0 || intIndex + bytes > view[$LENGTH]) throw RangeError(WRONG_INDEX);
        var store = view[$BUFFER]._b,
            start = intIndex + view[$OFFSET],
            pack = store.slice(start, start + bytes);
        return isLittleEndian ? pack : pack.reverse();
      };
      var set = function set(view, bytes, index, conversion, value, isLittleEndian) {
        var numIndex = +index,
            intIndex = toInteger(numIndex);
        if (numIndex != intIndex || intIndex < 0 || intIndex + bytes > view[$LENGTH]) throw RangeError(WRONG_INDEX);
        var store = view[$BUFFER]._b,
            start = intIndex + view[$OFFSET],
            pack = conversion(+value);
        for (var i = 0; i < bytes; i++) {
          store[start + i] = pack[isLittleEndian ? i : bytes - i - 1];
        }
      };

      var validateArrayBufferArguments = function validateArrayBufferArguments(that, length) {
        anInstance(that, $ArrayBuffer, ARRAY_BUFFER);
        var numberLength = +length,
            byteLength = toLength(numberLength);
        if (numberLength != byteLength) throw RangeError(WRONG_LENGTH);
        return byteLength;
      };

      if (!$typed.ABV) {
        $ArrayBuffer = function ArrayBuffer(length) {
          var byteLength = validateArrayBufferArguments(this, length);
          this._b = arrayFill.call(Array(byteLength), 0);
          this[$LENGTH] = byteLength;
        };

        $DataView = function DataView(buffer, byteOffset, byteLength) {
          anInstance(this, $DataView, DATA_VIEW);
          anInstance(buffer, $ArrayBuffer, DATA_VIEW);
          var bufferLength = buffer[$LENGTH],
              offset = toInteger(byteOffset);
          if (offset < 0 || offset > bufferLength) throw RangeError('Wrong offset!');
          byteLength = byteLength === undefined ? bufferLength - offset : toLength(byteLength);
          if (offset + byteLength > bufferLength) throw RangeError(WRONG_LENGTH);
          this[$BUFFER] = buffer;
          this[$OFFSET] = offset;
          this[$LENGTH] = byteLength;
        };

        if (DESCRIPTORS) {
          addGetter($ArrayBuffer, BYTE_LENGTH, '_l');
          addGetter($DataView, BUFFER, '_b');
          addGetter($DataView, BYTE_LENGTH, '_l');
          addGetter($DataView, BYTE_OFFSET, '_o');
        }

        redefineAll($DataView[PROTOTYPE], {
          getInt8: function getInt8(byteOffset) {
            return get(this, 1, byteOffset)[0] << 24 >> 24;
          },
          getUint8: function getUint8(byteOffset) {
            return get(this, 1, byteOffset)[0];
          },
          getInt16: function getInt16(byteOffset /*, littleEndian */) {
            var bytes = get(this, 2, byteOffset, arguments[1]);
            return (bytes[1] << 8 | bytes[0]) << 16 >> 16;
          },
          getUint16: function getUint16(byteOffset /*, littleEndian */) {
            var bytes = get(this, 2, byteOffset, arguments[1]);
            return bytes[1] << 8 | bytes[0];
          },
          getInt32: function getInt32(byteOffset /*, littleEndian */) {
            return unpackI32(get(this, 4, byteOffset, arguments[1]));
          },
          getUint32: function getUint32(byteOffset /*, littleEndian */) {
            return unpackI32(get(this, 4, byteOffset, arguments[1])) >>> 0;
          },
          getFloat32: function getFloat32(byteOffset /*, littleEndian */) {
            return unpackIEEE754(get(this, 4, byteOffset, arguments[1]), 23, 4);
          },
          getFloat64: function getFloat64(byteOffset /*, littleEndian */) {
            return unpackIEEE754(get(this, 8, byteOffset, arguments[1]), 52, 8);
          },
          setInt8: function setInt8(byteOffset, value) {
            set(this, 1, byteOffset, packI8, value);
          },
          setUint8: function setUint8(byteOffset, value) {
            set(this, 1, byteOffset, packI8, value);
          },
          setInt16: function setInt16(byteOffset, value /*, littleEndian */) {
            set(this, 2, byteOffset, packI16, value, arguments[2]);
          },
          setUint16: function setUint16(byteOffset, value /*, littleEndian */) {
            set(this, 2, byteOffset, packI16, value, arguments[2]);
          },
          setInt32: function setInt32(byteOffset, value /*, littleEndian */) {
            set(this, 4, byteOffset, packI32, value, arguments[2]);
          },
          setUint32: function setUint32(byteOffset, value /*, littleEndian */) {
            set(this, 4, byteOffset, packI32, value, arguments[2]);
          },
          setFloat32: function setFloat32(byteOffset, value /*, littleEndian */) {
            set(this, 4, byteOffset, packF32, value, arguments[2]);
          },
          setFloat64: function setFloat64(byteOffset, value /*, littleEndian */) {
            set(this, 8, byteOffset, packF64, value, arguments[2]);
          }
        });
      } else {
        if (!fails(function () {
          new $ArrayBuffer(); // eslint-disable-line no-new
        }) || !fails(function () {
          new $ArrayBuffer(.5); // eslint-disable-line no-new
        })) {
          $ArrayBuffer = function ArrayBuffer(length) {
            return new BaseBuffer(validateArrayBufferArguments(this, length));
          };
          var ArrayBufferProto = $ArrayBuffer[PROTOTYPE] = BaseBuffer[PROTOTYPE];
          for (var keys = gOPN(BaseBuffer), j = 0, key; keys.length > j;) {
            if (!((key = keys[j++]) in $ArrayBuffer)) hide($ArrayBuffer, key, BaseBuffer[key]);
          };
          if (!LIBRARY) ArrayBufferProto.constructor = $ArrayBuffer;
        }
        // iOS Safari 7.x bug
        var view = new $DataView(new $ArrayBuffer(2)),
            $setInt8 = $DataView[PROTOTYPE].setInt8;
        view.setInt8(0, 2147483648);
        view.setInt8(1, 2147483649);
        if (view.getInt8(0) || !view.getInt8(1)) redefineAll($DataView[PROTOTYPE], {
          setInt8: function setInt8(byteOffset, value) {
            $setInt8.call(this, byteOffset, value << 24 >> 24);
          },
          setUint8: function setUint8(byteOffset, value) {
            $setInt8.call(this, byteOffset, value << 24 >> 24);
          }
        }, true);
      }
      setToStringTag($ArrayBuffer, ARRAY_BUFFER);
      setToStringTag($DataView, DATA_VIEW);
      hide($DataView[PROTOTYPE], $typed.VIEW, true);
      exports[ARRAY_BUFFER] = $ArrayBuffer;
      exports[DATA_VIEW] = $DataView;

      /***/
    },
    /* 82 */
    /***/function (module, exports, __webpack_require__) {

      var global = __webpack_require__(2),
          core = __webpack_require__(24),
          LIBRARY = __webpack_require__(32),
          wksExt = __webpack_require__(109),
          defineProperty = __webpack_require__(7).f;
      module.exports = function (name) {
        var $Symbol = core.Symbol || (core.Symbol = LIBRARY ? {} : global.Symbol || {});
        if (name.charAt(0) != '_' && !(name in $Symbol)) defineProperty($Symbol, name, { value: wksExt.f(name) });
      };

      /***/
    },
    /* 83 */
    /***/function (module, exports, __webpack_require__) {

      var classof = __webpack_require__(45),
          ITERATOR = __webpack_require__(5)('iterator'),
          Iterators = __webpack_require__(42);
      module.exports = __webpack_require__(24).getIteratorMethod = function (it) {
        if (it != undefined) return it[ITERATOR] || it['@@iterator'] || Iterators[classof(it)];
      };

      /***/
    },
    /* 84 */
    /***/function (module, exports, __webpack_require__) {

      "use strict";

      var addToUnscopables = __webpack_require__(40),
          step = __webpack_require__(97),
          Iterators = __webpack_require__(42),
          toIObject = __webpack_require__(15);

      // 22.1.3.4 Array.prototype.entries()
      // 22.1.3.13 Array.prototype.keys()
      // 22.1.3.29 Array.prototype.values()
      // 22.1.3.30 Array.prototype[@@iterator]()
      module.exports = __webpack_require__(69)(Array, 'Array', function (iterated, kind) {
        this._t = toIObject(iterated); // target
        this._i = 0; // next index
        this._k = kind; // kind
        // 22.1.5.2.1 %ArrayIteratorPrototype%.next()
      }, function () {
        var O = this._t,
            kind = this._k,
            index = this._i++;
        if (!O || index >= O.length) {
          this._t = undefined;
          return step(1);
        }
        if (kind == 'keys') return step(0, index);
        if (kind == 'values') return step(0, O[index]);
        return step(0, [index, O[index]]);
      }, 'values');

      // argumentsList[@@iterator] is %ArrayProto_values% (9.4.4.6, 9.4.4.7)
      Iterators.Arguments = Iterators.Array;

      addToUnscopables('keys');
      addToUnscopables('values');
      addToUnscopables('entries');

      /***/
    },
    /* 85 */
    /***/function (module, exports) {

      var g;

      // This works in non-strict mode
      g = function () {
        return this;
      }();

      try {
        // This works if eval is allowed (see CSP)
        g = g || Function("return this")() || (1, eval)("this");
      } catch (e) {
        // This works if the window reference is available
        if ((typeof window === 'undefined' ? 'undefined' : _typeof2(window)) === "object") g = window;
      }

      // g can still be undefined, but nothing to do about it...
      // We return undefined, instead of nothing here, so it's
      // easier to handle this case. if(!global) { ...}

      module.exports = g;

      /***/
    },
    /* 86 */
    /***/function (module, exports, __webpack_require__) {

      var cof = __webpack_require__(18);
      module.exports = function (it, msg) {
        if (typeof it != 'number' && cof(it) != 'Number') throw TypeError(msg);
        return +it;
      };

      /***/
    },
    /* 87 */
    /***/function (module, exports, __webpack_require__) {

      "use strict";
      // 22.1.3.3 Array.prototype.copyWithin(target, start, end = this.length)

      var toObject = __webpack_require__(9),
          toIndex = __webpack_require__(38),
          toLength = __webpack_require__(8);

      module.exports = [].copyWithin || function copyWithin(target /*= 0*/, start /*= 0, end = @length*/) {
        var O = toObject(this),
            len = toLength(O.length),
            to = toIndex(target, len),
            from = toIndex(start, len),
            end = arguments.length > 2 ? arguments[2] : undefined,
            count = Math.min((end === undefined ? len : toIndex(end, len)) - from, len - to),
            inc = 1;
        if (from < to && to < from + count) {
          inc = -1;
          from += count - 1;
          to += count - 1;
        }
        while (count-- > 0) {
          if (from in O) O[to] = O[from];else delete O[to];
          to += inc;
          from += inc;
        }return O;
      };

      /***/
    },
    /* 88 */
    /***/function (module, exports, __webpack_require__) {

      var forOf = __webpack_require__(41);

      module.exports = function (iter, ITERATOR) {
        var result = [];
        forOf(iter, false, result.push, result, ITERATOR);
        return result;
      };

      /***/
    },
    /* 89 */
    /***/function (module, exports, __webpack_require__) {

      var aFunction = __webpack_require__(11),
          toObject = __webpack_require__(9),
          IObject = __webpack_require__(46),
          toLength = __webpack_require__(8);

      module.exports = function (that, callbackfn, aLen, memo, isRight) {
        aFunction(callbackfn);
        var O = toObject(that),
            self = IObject(O),
            length = toLength(O.length),
            index = isRight ? length - 1 : 0,
            i = isRight ? -1 : 1;
        if (aLen < 2) for (;;) {
          if (index in self) {
            memo = self[index];
            index += i;
            break;
          }
          index += i;
          if (isRight ? index < 0 : length <= index) {
            throw TypeError('Reduce of empty array with no initial value');
          }
        }
        for (; isRight ? index >= 0 : length > index; index += i) {
          if (index in self) {
            memo = callbackfn(memo, self[index], index, O);
          }
        }return memo;
      };

      /***/
    },
    /* 90 */
    /***/function (module, exports, __webpack_require__) {

      "use strict";

      var aFunction = __webpack_require__(11),
          isObject = __webpack_require__(4),
          invoke = __webpack_require__(52),
          arraySlice = [].slice,
          factories = {};

      var construct = function construct(F, len, args) {
        if (!(len in factories)) {
          for (var n = [], i = 0; i < len; i++) {
            n[i] = 'a[' + i + ']';
          }factories[len] = Function('F,a', 'return new F(' + n.join(',') + ')');
        }return factories[len](F, args);
      };

      module.exports = Function.bind || function bind(that /*, args... */) {
        var fn = aFunction(this),
            partArgs = arraySlice.call(arguments, 1);
        var bound = function bound() /* args... */{
          var args = partArgs.concat(arraySlice.call(arguments));
          return this instanceof bound ? construct(fn, args.length, args) : invoke(fn, args, that);
        };
        if (isObject(fn.prototype)) bound.prototype = fn.prototype;
        return bound;
      };

      /***/
    },
    /* 91 */
    /***/function (module, exports, __webpack_require__) {

      "use strict";

      var dP = __webpack_require__(7).f,
          create = __webpack_require__(33),
          redefineAll = __webpack_require__(36),
          ctx = __webpack_require__(25),
          anInstance = __webpack_require__(31),
          defined = __webpack_require__(19),
          forOf = __webpack_require__(41),
          $iterDefine = __webpack_require__(69),
          step = __webpack_require__(97),
          setSpecies = __webpack_require__(37),
          DESCRIPTORS = __webpack_require__(6),
          fastKey = __webpack_require__(28).fastKey,
          SIZE = DESCRIPTORS ? '_s' : 'size';

      var getEntry = function getEntry(that, key) {
        // fast case
        var index = fastKey(key),
            entry;
        if (index !== 'F') return that._i[index];
        // frozen object case
        for (entry = that._f; entry; entry = entry.n) {
          if (entry.k == key) return entry;
        }
      };

      module.exports = {
        getConstructor: function getConstructor(wrapper, NAME, IS_MAP, ADDER) {
          var C = wrapper(function (that, iterable) {
            anInstance(that, C, NAME, '_i');
            that._i = create(null); // index
            that._f = undefined; // first entry
            that._l = undefined; // last entry
            that[SIZE] = 0; // size
            if (iterable != undefined) forOf(iterable, IS_MAP, that[ADDER], that);
          });
          redefineAll(C.prototype, {
            // 23.1.3.1 Map.prototype.clear()
            // 23.2.3.2 Set.prototype.clear()
            clear: function clear() {
              for (var that = this, data = that._i, entry = that._f; entry; entry = entry.n) {
                entry.r = true;
                if (entry.p) entry.p = entry.p.n = undefined;
                delete data[entry.i];
              }
              that._f = that._l = undefined;
              that[SIZE] = 0;
            },
            // 23.1.3.3 Map.prototype.delete(key)
            // 23.2.3.4 Set.prototype.delete(value)
            'delete': function _delete(key) {
              var that = this,
                  entry = getEntry(that, key);
              if (entry) {
                var next = entry.n,
                    prev = entry.p;
                delete that._i[entry.i];
                entry.r = true;
                if (prev) prev.n = next;
                if (next) next.p = prev;
                if (that._f == entry) that._f = next;
                if (that._l == entry) that._l = prev;
                that[SIZE]--;
              }return !!entry;
            },
            // 23.2.3.6 Set.prototype.forEach(callbackfn, thisArg = undefined)
            // 23.1.3.5 Map.prototype.forEach(callbackfn, thisArg = undefined)
            forEach: function forEach(callbackfn /*, that = undefined */) {
              anInstance(this, C, 'forEach');
              var f = ctx(callbackfn, arguments.length > 1 ? arguments[1] : undefined, 3),
                  entry;
              while (entry = entry ? entry.n : this._f) {
                f(entry.v, entry.k, this);
                // revert to the last existing entry
                while (entry && entry.r) {
                  entry = entry.p;
                }
              }
            },
            // 23.1.3.7 Map.prototype.has(key)
            // 23.2.3.7 Set.prototype.has(value)
            has: function has(key) {
              return !!getEntry(this, key);
            }
          });
          if (DESCRIPTORS) dP(C.prototype, 'size', {
            get: function get() {
              return defined(this[SIZE]);
            }
          });
          return C;
        },
        def: function def(that, key, value) {
          var entry = getEntry(that, key),
              prev,
              index;
          // change existing entry
          if (entry) {
            entry.v = value;
            // create new entry
          } else {
            that._l = entry = {
              i: index = fastKey(key, true), // <- index
              k: key, // <- key
              v: value, // <- value
              p: prev = that._l, // <- previous entry
              n: undefined, // <- next entry
              r: false // <- removed
            };
            if (!that._f) that._f = entry;
            if (prev) prev.n = entry;
            that[SIZE]++;
            // add to index
            if (index !== 'F') that._i[index] = entry;
          }return that;
        },
        getEntry: getEntry,
        setStrong: function setStrong(C, NAME, IS_MAP) {
          // add .keys, .values, .entries, [@@iterator]
          // 23.1.3.4, 23.1.3.8, 23.1.3.11, 23.1.3.12, 23.2.3.5, 23.2.3.8, 23.2.3.10, 23.2.3.11
          $iterDefine(C, NAME, function (iterated, kind) {
            this._t = iterated; // target
            this._k = kind; // kind
            this._l = undefined; // previous
          }, function () {
            var that = this,
                kind = that._k,
                entry = that._l;
            // revert to the last existing entry
            while (entry && entry.r) {
              entry = entry.p;
            } // get next entry
            if (!that._t || !(that._l = entry = entry ? entry.n : that._t._f)) {
              // or finish the iteration
              that._t = undefined;
              return step(1);
            }
            // return step by kind
            if (kind == 'keys') return step(0, entry.k);
            if (kind == 'values') return step(0, entry.v);
            return step(0, [entry.k, entry.v]);
          }, IS_MAP ? 'entries' : 'values', !IS_MAP, true);

          // add [@@species], 23.1.2.2, 23.2.2.2
          setSpecies(NAME);
        }
      };

      /***/
    },
    /* 92 */
    /***/function (module, exports, __webpack_require__) {

      // https://github.com/DavidBruant/Map-Set.prototype.toJSON
      var classof = __webpack_require__(45),
          from = __webpack_require__(88);
      module.exports = function (NAME) {
        return function toJSON() {
          if (classof(this) != NAME) throw TypeError(NAME + "#toJSON isn't generic");
          return from(this);
        };
      };

      /***/
    },
    /* 93 */
    /***/function (module, exports, __webpack_require__) {

      "use strict";

      var redefineAll = __webpack_require__(36),
          getWeak = __webpack_require__(28).getWeak,
          anObject = __webpack_require__(1),
          isObject = __webpack_require__(4),
          anInstance = __webpack_require__(31),
          forOf = __webpack_require__(41),
          createArrayMethod = __webpack_require__(21),
          $has = __webpack_require__(10),
          arrayFind = createArrayMethod(5),
          arrayFindIndex = createArrayMethod(6),
          id = 0;

      // fallback for uncaught frozen keys
      var uncaughtFrozenStore = function uncaughtFrozenStore(that) {
        return that._l || (that._l = new UncaughtFrozenStore());
      };
      var UncaughtFrozenStore = function UncaughtFrozenStore() {
        this.a = [];
      };
      var findUncaughtFrozen = function findUncaughtFrozen(store, key) {
        return arrayFind(store.a, function (it) {
          return it[0] === key;
        });
      };
      UncaughtFrozenStore.prototype = {
        get: function get(key) {
          var entry = findUncaughtFrozen(this, key);
          if (entry) return entry[1];
        },
        has: function has(key) {
          return !!findUncaughtFrozen(this, key);
        },
        set: function set(key, value) {
          var entry = findUncaughtFrozen(this, key);
          if (entry) entry[1] = value;else this.a.push([key, value]);
        },
        'delete': function _delete(key) {
          var index = arrayFindIndex(this.a, function (it) {
            return it[0] === key;
          });
          if (~index) this.a.splice(index, 1);
          return !!~index;
        }
      };

      module.exports = {
        getConstructor: function getConstructor(wrapper, NAME, IS_MAP, ADDER) {
          var C = wrapper(function (that, iterable) {
            anInstance(that, C, NAME, '_i');
            that._i = id++; // collection id
            that._l = undefined; // leak store for uncaught frozen objects
            if (iterable != undefined) forOf(iterable, IS_MAP, that[ADDER], that);
          });
          redefineAll(C.prototype, {
            // 23.3.3.2 WeakMap.prototype.delete(key)
            // 23.4.3.3 WeakSet.prototype.delete(value)
            'delete': function _delete(key) {
              if (!isObject(key)) return false;
              var data = getWeak(key);
              if (data === true) return uncaughtFrozenStore(this)['delete'](key);
              return data && $has(data, this._i) && delete data[this._i];
            },
            // 23.3.3.4 WeakMap.prototype.has(key)
            // 23.4.3.4 WeakSet.prototype.has(value)
            has: function has(key) {
              if (!isObject(key)) return false;
              var data = getWeak(key);
              if (data === true) return uncaughtFrozenStore(this).has(key);
              return data && $has(data, this._i);
            }
          });
          return C;
        },
        def: function def(that, key, value) {
          var data = getWeak(anObject(key), true);
          if (data === true) uncaughtFrozenStore(that).set(key, value);else data[that._i] = value;
          return that;
        },
        ufstore: uncaughtFrozenStore
      };

      /***/
    },
    /* 94 */
    /***/function (module, exports, __webpack_require__) {

      module.exports = !__webpack_require__(6) && !__webpack_require__(3)(function () {
        return Object.defineProperty(__webpack_require__(61)('div'), 'a', { get: function get() {
            return 7;
          } }).a != 7;
      });

      /***/
    },
    /* 95 */
    /***/function (module, exports, __webpack_require__) {

      // 20.1.2.3 Number.isInteger(number)
      var isObject = __webpack_require__(4),
          floor = Math.floor;
      module.exports = function isInteger(it) {
        return !isObject(it) && isFinite(it) && floor(it) === it;
      };

      /***/
    },
    /* 96 */
    /***/function (module, exports, __webpack_require__) {

      // call something on iterator step with safe closing on error
      var anObject = __webpack_require__(1);
      module.exports = function (iterator, fn, value, entries) {
        try {
          return entries ? fn(anObject(value)[0], value[1]) : fn(value);
          // 7.4.6 IteratorClose(iterator, completion)
        } catch (e) {
          var ret = iterator['return'];
          if (ret !== undefined) anObject(ret.call(iterator));
          throw e;
        }
      };

      /***/
    },
    /* 97 */
    /***/function (module, exports) {

      module.exports = function (done, value) {
        return { value: value, done: !!done };
      };

      /***/
    },
    /* 98 */
    /***/function (module, exports) {

      // 20.2.2.20 Math.log1p(x)
      module.exports = Math.log1p || function log1p(x) {
        return (x = +x) > -1e-8 && x < 1e-8 ? x - x * x / 2 : Math.log(1 + x);
      };

      /***/
    },
    /* 99 */
    /***/function (module, exports, __webpack_require__) {

      "use strict";

      // 19.1.2.1 Object.assign(target, source, ...)

      var getKeys = __webpack_require__(35),
          gOPS = __webpack_require__(56),
          pIE = __webpack_require__(47),
          toObject = __webpack_require__(9),
          IObject = __webpack_require__(46),
          $assign = Object.assign;

      // should work with symbols and should have deterministic property order (V8 bug)
      module.exports = !$assign || __webpack_require__(3)(function () {
        var A = {},
            B = {},
            S = Symbol(),
            K = 'abcdefghijklmnopqrst';
        A[S] = 7;
        K.split('').forEach(function (k) {
          B[k] = k;
        });
        return $assign({}, A)[S] != 7 || Object.keys($assign({}, B)).join('') != K;
      }) ? function assign(target, source) {
        // eslint-disable-line no-unused-vars
        var T = toObject(target),
            aLen = arguments.length,
            index = 1,
            getSymbols = gOPS.f,
            isEnum = pIE.f;
        while (aLen > index) {
          var S = IObject(arguments[index++]),
              keys = getSymbols ? getKeys(S).concat(getSymbols(S)) : getKeys(S),
              length = keys.length,
              j = 0,
              key;
          while (length > j) {
            if (isEnum.call(S, key = keys[j++])) T[key] = S[key];
          }
        }return T;
      } : $assign;

      /***/
    },
    /* 100 */
    /***/function (module, exports, __webpack_require__) {

      var dP = __webpack_require__(7),
          anObject = __webpack_require__(1),
          getKeys = __webpack_require__(35);

      module.exports = __webpack_require__(6) ? Object.defineProperties : function defineProperties(O, Properties) {
        anObject(O);
        var keys = getKeys(Properties),
            length = keys.length,
            i = 0,
            P;
        while (length > i) {
          dP.f(O, P = keys[i++], Properties[P]);
        }return O;
      };

      /***/
    },
    /* 101 */
    /***/function (module, exports, __webpack_require__) {

      // fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window
      var toIObject = __webpack_require__(15),
          gOPN = __webpack_require__(34).f,
          toString = {}.toString;

      var windowNames = (typeof window === 'undefined' ? 'undefined' : _typeof2(window)) == 'object' && window && Object.getOwnPropertyNames ? Object.getOwnPropertyNames(window) : [];

      var getWindowNames = function getWindowNames(it) {
        try {
          return gOPN(it);
        } catch (e) {
          return windowNames.slice();
        }
      };

      module.exports.f = function getOwnPropertyNames(it) {
        return windowNames && toString.call(it) == '[object Window]' ? getWindowNames(it) : gOPN(toIObject(it));
      };

      /***/
    },
    /* 102 */
    /***/function (module, exports, __webpack_require__) {

      var has = __webpack_require__(10),
          toIObject = __webpack_require__(15),
          arrayIndexOf = __webpack_require__(48)(false),
          IE_PROTO = __webpack_require__(74)('IE_PROTO');

      module.exports = function (object, names) {
        var O = toIObject(object),
            i = 0,
            result = [],
            key;
        for (key in O) {
          if (key != IE_PROTO) has(O, key) && result.push(key);
        } // Don't enum bug & hidden keys
        while (names.length > i) {
          if (has(O, key = names[i++])) {
            ~arrayIndexOf(result, key) || result.push(key);
          }
        }return result;
      };

      /***/
    },
    /* 103 */
    /***/function (module, exports, __webpack_require__) {

      var getKeys = __webpack_require__(35),
          toIObject = __webpack_require__(15),
          isEnum = __webpack_require__(47).f;
      module.exports = function (isEntries) {
        return function (it) {
          var O = toIObject(it),
              keys = getKeys(O),
              length = keys.length,
              i = 0,
              result = [],
              key;
          while (length > i) {
            if (isEnum.call(O, key = keys[i++])) {
              result.push(isEntries ? [key, O[key]] : O[key]);
            }
          }return result;
        };
      };

      /***/
    },
    /* 104 */
    /***/function (module, exports, __webpack_require__) {

      // all object keys, includes non-enumerable and symbols
      var gOPN = __webpack_require__(34),
          gOPS = __webpack_require__(56),
          anObject = __webpack_require__(1),
          Reflect = __webpack_require__(2).Reflect;
      module.exports = Reflect && Reflect.ownKeys || function ownKeys(it) {
        var keys = gOPN.f(anObject(it)),
            getSymbols = gOPS.f;
        return getSymbols ? keys.concat(getSymbols(it)) : keys;
      };

      /***/
    },
    /* 105 */
    /***/function (module, exports, __webpack_require__) {

      var $parseFloat = __webpack_require__(2).parseFloat,
          $trim = __webpack_require__(44).trim;

      module.exports = 1 / $parseFloat(__webpack_require__(79) + '-0') !== -Infinity ? function parseFloat(str) {
        var string = $trim(String(str), 3),
            result = $parseFloat(string);
        return result === 0 && string.charAt(0) == '-' ? -0 : result;
      } : $parseFloat;

      /***/
    },
    /* 106 */
    /***/function (module, exports, __webpack_require__) {

      var $parseInt = __webpack_require__(2).parseInt,
          $trim = __webpack_require__(44).trim,
          ws = __webpack_require__(79),
          hex = /^[\-+]?0[xX]/;

      module.exports = $parseInt(ws + '08') !== 8 || $parseInt(ws + '0x16') !== 22 ? function parseInt(str, radix) {
        var string = $trim(String(str), 3);
        return $parseInt(string, radix >>> 0 || (hex.test(string) ? 16 : 10));
      } : $parseInt;

      /***/
    },
    /* 107 */
    /***/function (module, exports) {

      // 7.2.9 SameValue(x, y)
      module.exports = Object.is || function is(x, y) {
        return x === y ? x !== 0 || 1 / x === 1 / y : x != x && y != y;
      };

      /***/
    },
    /* 108 */
    /***/function (module, exports, __webpack_require__) {

      // https://github.com/tc39/proposal-string-pad-start-end
      var toLength = __webpack_require__(8),
          repeat = __webpack_require__(78),
          defined = __webpack_require__(19);

      module.exports = function (that, maxLength, fillString, left) {
        var S = String(defined(that)),
            stringLength = S.length,
            fillStr = fillString === undefined ? ' ' : String(fillString),
            intMaxLength = toLength(maxLength);
        if (intMaxLength <= stringLength || fillStr == '') return S;
        var fillLen = intMaxLength - stringLength,
            stringFiller = repeat.call(fillStr, Math.ceil(fillLen / fillStr.length));
        if (stringFiller.length > fillLen) stringFiller = stringFiller.slice(0, fillLen);
        return left ? stringFiller + S : S + stringFiller;
      };

      /***/
    },
    /* 109 */
    /***/function (module, exports, __webpack_require__) {

      exports.f = __webpack_require__(5);

      /***/
    },
    /* 110 */
    /***/function (module, exports, __webpack_require__) {

      "use strict";

      var strong = __webpack_require__(91);

      // 23.1 Map Objects
      module.exports = __webpack_require__(49)('Map', function (get) {
        return function Map() {
          return get(this, arguments.length > 0 ? arguments[0] : undefined);
        };
      }, {
        // 23.1.3.6 Map.prototype.get(key)
        get: function get(key) {
          var entry = strong.getEntry(this, key);
          return entry && entry.v;
        },
        // 23.1.3.9 Map.prototype.set(key, value)
        set: function set(key, value) {
          return strong.def(this, key === 0 ? 0 : key, value);
        }
      }, strong, true);

      /***/
    },
    /* 111 */
    /***/function (module, exports, __webpack_require__) {

      // 21.2.5.3 get RegExp.prototype.flags()
      if (__webpack_require__(6) && /./g.flags != 'g') __webpack_require__(7).f(RegExp.prototype, 'flags', {
        configurable: true,
        get: __webpack_require__(51)
      });

      /***/
    },
    /* 112 */
    /***/function (module, exports, __webpack_require__) {

      "use strict";

      var strong = __webpack_require__(91);

      // 23.2 Set Objects
      module.exports = __webpack_require__(49)('Set', function (get) {
        return function Set() {
          return get(this, arguments.length > 0 ? arguments[0] : undefined);
        };
      }, {
        // 23.2.3.1 Set.prototype.add(value)
        add: function add(value) {
          return strong.def(this, value = value === 0 ? 0 : value, value);
        }
      }, strong);

      /***/
    },
    /* 113 */
    /***/function (module, exports, __webpack_require__) {

      "use strict";

      var each = __webpack_require__(21)(0),
          redefine = __webpack_require__(13),
          meta = __webpack_require__(28),
          assign = __webpack_require__(99),
          weak = __webpack_require__(93),
          isObject = __webpack_require__(4),
          getWeak = meta.getWeak,
          isExtensible = Object.isExtensible,
          uncaughtFrozenStore = weak.ufstore,
          tmp = {},
          InternalMap;

      var wrapper = function wrapper(get) {
        return function WeakMap() {
          return get(this, arguments.length > 0 ? arguments[0] : undefined);
        };
      };

      var methods = {
        // 23.3.3.3 WeakMap.prototype.get(key)
        get: function get(key) {
          if (isObject(key)) {
            var data = getWeak(key);
            if (data === true) return uncaughtFrozenStore(this).get(key);
            return data ? data[this._i] : undefined;
          }
        },
        // 23.3.3.5 WeakMap.prototype.set(key, value)
        set: function set(key, value) {
          return weak.def(this, key, value);
        }
      };

      // 23.3 WeakMap Objects
      var $WeakMap = module.exports = __webpack_require__(49)('WeakMap', wrapper, methods, weak, true, true);

      // IE11 WeakMap frozen keys fix
      if (new $WeakMap().set((Object.freeze || Object)(tmp), 7).get(tmp) != 7) {
        InternalMap = weak.getConstructor(wrapper);
        assign(InternalMap.prototype, methods);
        meta.NEED = true;
        each(['delete', 'has', 'get', 'set'], function (key) {
          var proto = $WeakMap.prototype,
              method = proto[key];
          redefine(proto, key, function (a, b) {
            // store frozen objects on internal weakmap shim
            if (isObject(a) && !isExtensible(a)) {
              if (!this._f) this._f = new InternalMap();
              var result = this._f[key](a, b);
              return key == 'set' ? this : result;
              // store all the rest on native weakmap
            }return method.call(this, a, b);
          });
        });
      }

      /***/
    },
    /* 114 */
    /***/function (module, exports, __webpack_require__) {

      var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_RESULT__; /*!
                                                                         * URI.js - Mutating URLs
                                                                         * IPv6 Support
                                                                         *
                                                                         * Version: 1.18.12
                                                                         *
                                                                         * Author: Rodney Rehm
                                                                         * Web: http://medialize.github.io/URI.js/
                                                                         *
                                                                         * Licensed under
                                                                         *   MIT License http://www.opensource.org/licenses/mit-license
                                                                         *
                                                                         */

      (function (root, factory) {
        'use strict';
        // https://github.com/umdjs/umd/blob/master/returnExports.js

        if ((typeof module === 'undefined' ? 'undefined' : _typeof2(module)) === 'object' && module.exports) {
          // Node
          module.exports = factory();
        } else if (true) {
          // AMD. Register as an anonymous module.
          !(__WEBPACK_AMD_DEFINE_FACTORY__ = factory, __WEBPACK_AMD_DEFINE_RESULT__ = typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? __WEBPACK_AMD_DEFINE_FACTORY__.call(exports, __webpack_require__, exports, module) : __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
        } else {}
      })(this, function (root) {
        'use strict';

        /*
        var _in = "fe80:0000:0000:0000:0204:61ff:fe9d:f156";
        var _out = IPv6.best(_in);
        var _expected = "fe80::204:61ff:fe9d:f156";
         console.log(_in, _out, _expected, _out === _expected);
        */

        // save current IPv6 variable, if any

        var _IPv6 = root && root.IPv6;

        function bestPresentation(address) {
          // based on:
          // Javascript to test an IPv6 address for proper format, and to
          // present the "best text representation" according to IETF Draft RFC at
          // http://tools.ietf.org/html/draft-ietf-6man-text-addr-representation-04
          // 8 Feb 2010 Rich Brown, Dartware, LLC
          // Please feel free to use this code as long as you provide a link to
          // http://www.intermapper.com
          // http://intermapper.com/support/tools/IPV6-Validator.aspx
          // http://download.dartware.com/thirdparty/ipv6validator.js

          var _address = address.toLowerCase();
          var segments = _address.split(':');
          var length = segments.length;
          var total = 8;

          // trim colons (:: or ::a:b:c… or …a:b:c::)
          if (segments[0] === '' && segments[1] === '' && segments[2] === '') {
            // must have been ::
            // remove first two items
            segments.shift();
            segments.shift();
          } else if (segments[0] === '' && segments[1] === '') {
            // must have been ::xxxx
            // remove the first item
            segments.shift();
          } else if (segments[length - 1] === '' && segments[length - 2] === '') {
            // must have been xxxx::
            segments.pop();
          }

          length = segments.length;

          // adjust total segments for IPv4 trailer
          if (segments[length - 1].indexOf('.') !== -1) {
            // found a "." which means IPv4
            total = 7;
          }

          // fill empty segments them with "0000"
          var pos;
          for (pos = 0; pos < length; pos++) {
            if (segments[pos] === '') {
              break;
            }
          }

          if (pos < total) {
            segments.splice(pos, 1, '0000');
            while (segments.length < total) {
              segments.splice(pos, 0, '0000');
            }
          }

          // strip leading zeros
          var _segments;
          for (var i = 0; i < total; i++) {
            _segments = segments[i].split('');
            for (var j = 0; j < 3; j++) {
              if (_segments[0] === '0' && _segments.length > 1) {
                _segments.splice(0, 1);
              } else {
                break;
              }
            }

            segments[i] = _segments.join('');
          }

          // find longest sequence of zeroes and coalesce them into one segment
          var best = -1;
          var _best = 0;
          var _current = 0;
          var current = -1;
          var inzeroes = false;
          // i; already declared

          for (i = 0; i < total; i++) {
            if (inzeroes) {
              if (segments[i] === '0') {
                _current += 1;
              } else {
                inzeroes = false;
                if (_current > _best) {
                  best = current;
                  _best = _current;
                }
              }
            } else {
              if (segments[i] === '0') {
                inzeroes = true;
                current = i;
                _current = 1;
              }
            }
          }

          if (_current > _best) {
            best = current;
            _best = _current;
          }

          if (_best > 1) {
            segments.splice(best, _best, '');
          }

          length = segments.length;

          // assemble remaining segments
          var result = '';
          if (segments[0] === '') {
            result = ':';
          }

          for (i = 0; i < length; i++) {
            result += segments[i];
            if (i === length - 1) {
              break;
            }

            result += ':';
          }

          if (segments[length - 1] === '') {
            result += ':';
          }

          return result;
        }

        function noConflict() {
          /*jshint validthis: true */
          if (root.IPv6 === this) {
            root.IPv6 = _IPv6;
          }

          return this;
        }

        return {
          best: bestPresentation,
          noConflict: noConflict
        };
      });

      /***/
    },
    /* 115 */
    /***/function (module, exports, __webpack_require__) {

      var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_RESULT__; /*!
                                                                         * URI.js - Mutating URLs
                                                                         * Second Level Domain (SLD) Support
                                                                         *
                                                                         * Version: 1.18.12
                                                                         *
                                                                         * Author: Rodney Rehm
                                                                         * Web: http://medialize.github.io/URI.js/
                                                                         *
                                                                         * Licensed under
                                                                         *   MIT License http://www.opensource.org/licenses/mit-license
                                                                         *
                                                                         */

      (function (root, factory) {
        'use strict';
        // https://github.com/umdjs/umd/blob/master/returnExports.js

        if ((typeof module === 'undefined' ? 'undefined' : _typeof2(module)) === 'object' && module.exports) {
          // Node
          module.exports = factory();
        } else if (true) {
          // AMD. Register as an anonymous module.
          !(__WEBPACK_AMD_DEFINE_FACTORY__ = factory, __WEBPACK_AMD_DEFINE_RESULT__ = typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? __WEBPACK_AMD_DEFINE_FACTORY__.call(exports, __webpack_require__, exports, module) : __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
        } else {}
      })(this, function (root) {
        'use strict';

        // save current SecondLevelDomains variable, if any

        var _SecondLevelDomains = root && root.SecondLevelDomains;

        var SLD = {
          // list of known Second Level Domains
          // converted list of SLDs from https://github.com/gavingmiller/second-level-domains
          // ----
          // publicsuffix.org is more current and actually used by a couple of browsers internally.
          // downside is it also contains domains like "dyndns.org" - which is fine for the security
          // issues browser have to deal with (SOP for cookies, etc) - but is way overboard for URI.js
          // ----
          list: {
            'ac': ' com gov mil net org ',
            'ae': ' ac co gov mil name net org pro sch ',
            'af': ' com edu gov net org ',
            'al': ' com edu gov mil net org ',
            'ao': ' co ed gv it og pb ',
            'ar': ' com edu gob gov int mil net org tur ',
            'at': ' ac co gv or ',
            'au': ' asn com csiro edu gov id net org ',
            'ba': ' co com edu gov mil net org rs unbi unmo unsa untz unze ',
            'bb': ' biz co com edu gov info net org store tv ',
            'bh': ' biz cc com edu gov info net org ',
            'bn': ' com edu gov net org ',
            'bo': ' com edu gob gov int mil net org tv ',
            'br': ' adm adv agr am arq art ato b bio blog bmd cim cng cnt com coop ecn edu eng esp etc eti far flog fm fnd fot fst g12 ggf gov imb ind inf jor jus lel mat med mil mus net nom not ntr odo org ppg pro psc psi qsl rec slg srv tmp trd tur tv vet vlog wiki zlg ',
            'bs': ' com edu gov net org ',
            'bz': ' du et om ov rg ',
            'ca': ' ab bc mb nb nf nl ns nt nu on pe qc sk yk ',
            'ck': ' biz co edu gen gov info net org ',
            'cn': ' ac ah bj com cq edu fj gd gov gs gx gz ha hb he hi hl hn jl js jx ln mil net nm nx org qh sc sd sh sn sx tj tw xj xz yn zj ',
            'co': ' com edu gov mil net nom org ',
            'cr': ' ac c co ed fi go or sa ',
            'cy': ' ac biz com ekloges gov ltd name net org parliament press pro tm ',
            'do': ' art com edu gob gov mil net org sld web ',
            'dz': ' art asso com edu gov net org pol ',
            'ec': ' com edu fin gov info med mil net org pro ',
            'eg': ' com edu eun gov mil name net org sci ',
            'er': ' com edu gov ind mil net org rochest w ',
            'es': ' com edu gob nom org ',
            'et': ' biz com edu gov info name net org ',
            'fj': ' ac biz com info mil name net org pro ',
            'fk': ' ac co gov net nom org ',
            'fr': ' asso com f gouv nom prd presse tm ',
            'gg': ' co net org ',
            'gh': ' com edu gov mil org ',
            'gn': ' ac com gov net org ',
            'gr': ' com edu gov mil net org ',
            'gt': ' com edu gob ind mil net org ',
            'gu': ' com edu gov net org ',
            'hk': ' com edu gov idv net org ',
            'hu': ' 2000 agrar bolt casino city co erotica erotika film forum games hotel info ingatlan jogasz konyvelo lakas media news org priv reklam sex shop sport suli szex tm tozsde utazas video ',
            'id': ' ac co go mil net or sch web ',
            'il': ' ac co gov idf k12 muni net org ',
            'in': ' ac co edu ernet firm gen gov i ind mil net nic org res ',
            'iq': ' com edu gov i mil net org ',
            'ir': ' ac co dnssec gov i id net org sch ',
            'it': ' edu gov ',
            'je': ' co net org ',
            'jo': ' com edu gov mil name net org sch ',
            'jp': ' ac ad co ed go gr lg ne or ',
            'ke': ' ac co go info me mobi ne or sc ',
            'kh': ' com edu gov mil net org per ',
            'ki': ' biz com de edu gov info mob net org tel ',
            'km': ' asso com coop edu gouv k medecin mil nom notaires pharmaciens presse tm veterinaire ',
            'kn': ' edu gov net org ',
            'kr': ' ac busan chungbuk chungnam co daegu daejeon es gangwon go gwangju gyeongbuk gyeonggi gyeongnam hs incheon jeju jeonbuk jeonnam k kg mil ms ne or pe re sc seoul ulsan ',
            'kw': ' com edu gov net org ',
            'ky': ' com edu gov net org ',
            'kz': ' com edu gov mil net org ',
            'lb': ' com edu gov net org ',
            'lk': ' assn com edu gov grp hotel int ltd net ngo org sch soc web ',
            'lr': ' com edu gov net org ',
            'lv': ' asn com conf edu gov id mil net org ',
            'ly': ' com edu gov id med net org plc sch ',
            'ma': ' ac co gov m net org press ',
            'mc': ' asso tm ',
            'me': ' ac co edu gov its net org priv ',
            'mg': ' com edu gov mil nom org prd tm ',
            'mk': ' com edu gov inf name net org pro ',
            'ml': ' com edu gov net org presse ',
            'mn': ' edu gov org ',
            'mo': ' com edu gov net org ',
            'mt': ' com edu gov net org ',
            'mv': ' aero biz com coop edu gov info int mil museum name net org pro ',
            'mw': ' ac co com coop edu gov int museum net org ',
            'mx': ' com edu gob net org ',
            'my': ' com edu gov mil name net org sch ',
            'nf': ' arts com firm info net other per rec store web ',
            'ng': ' biz com edu gov mil mobi name net org sch ',
            'ni': ' ac co com edu gob mil net nom org ',
            'np': ' com edu gov mil net org ',
            'nr': ' biz com edu gov info net org ',
            'om': ' ac biz co com edu gov med mil museum net org pro sch ',
            'pe': ' com edu gob mil net nom org sld ',
            'ph': ' com edu gov i mil net ngo org ',
            'pk': ' biz com edu fam gob gok gon gop gos gov net org web ',
            'pl': ' art bialystok biz com edu gda gdansk gorzow gov info katowice krakow lodz lublin mil net ngo olsztyn org poznan pwr radom slupsk szczecin torun warszawa waw wroc wroclaw zgora ',
            'pr': ' ac biz com edu est gov info isla name net org pro prof ',
            'ps': ' com edu gov net org plo sec ',
            'pw': ' belau co ed go ne or ',
            'ro': ' arts com firm info nom nt org rec store tm www ',
            'rs': ' ac co edu gov in org ',
            'sb': ' com edu gov net org ',
            'sc': ' com edu gov net org ',
            'sh': ' co com edu gov net nom org ',
            'sl': ' com edu gov net org ',
            'st': ' co com consulado edu embaixada gov mil net org principe saotome store ',
            'sv': ' com edu gob org red ',
            'sz': ' ac co org ',
            'tr': ' av bbs bel biz com dr edu gen gov info k12 name net org pol tel tsk tv web ',
            'tt': ' aero biz cat co com coop edu gov info int jobs mil mobi museum name net org pro tel travel ',
            'tw': ' club com ebiz edu game gov idv mil net org ',
            'mu': ' ac co com gov net or org ',
            'mz': ' ac co edu gov org ',
            'na': ' co com ',
            'nz': ' ac co cri geek gen govt health iwi maori mil net org parliament school ',
            'pa': ' abo ac com edu gob ing med net nom org sld ',
            'pt': ' com edu gov int net nome org publ ',
            'py': ' com edu gov mil net org ',
            'qa': ' com edu gov mil net org ',
            're': ' asso com nom ',
            'ru': ' ac adygeya altai amur arkhangelsk astrakhan bashkiria belgorod bir bryansk buryatia cbg chel chelyabinsk chita chukotka chuvashia com dagestan e-burg edu gov grozny int irkutsk ivanovo izhevsk jar joshkar-ola kalmykia kaluga kamchatka karelia kazan kchr kemerovo khabarovsk khakassia khv kirov koenig komi kostroma kranoyarsk kuban kurgan kursk lipetsk magadan mari mari-el marine mil mordovia mosreg msk murmansk nalchik net nnov nov novosibirsk nsk omsk orenburg org oryol penza perm pp pskov ptz rnd ryazan sakhalin samara saratov simbirsk smolensk spb stavropol stv surgut tambov tatarstan tom tomsk tsaritsyn tsk tula tuva tver tyumen udm udmurtia ulan-ude vladikavkaz vladimir vladivostok volgograd vologda voronezh vrn vyatka yakutia yamal yekaterinburg yuzhno-sakhalinsk ',
            'rw': ' ac co com edu gouv gov int mil net ',
            'sa': ' com edu gov med net org pub sch ',
            'sd': ' com edu gov info med net org tv ',
            'se': ' a ac b bd c d e f g h i k l m n o org p parti pp press r s t tm u w x y z ',
            'sg': ' com edu gov idn net org per ',
            'sn': ' art com edu gouv org perso univ ',
            'sy': ' com edu gov mil net news org ',
            'th': ' ac co go in mi net or ',
            'tj': ' ac biz co com edu go gov info int mil name net nic org test web ',
            'tn': ' agrinet com defense edunet ens fin gov ind info intl mincom nat net org perso rnrt rns rnu tourism ',
            'tz': ' ac co go ne or ',
            'ua': ' biz cherkassy chernigov chernovtsy ck cn co com crimea cv dn dnepropetrovsk donetsk dp edu gov if in ivano-frankivsk kh kharkov kherson khmelnitskiy kiev kirovograd km kr ks kv lg lugansk lutsk lviv me mk net nikolaev od odessa org pl poltava pp rovno rv sebastopol sumy te ternopil uzhgorod vinnica vn zaporizhzhe zhitomir zp zt ',
            'ug': ' ac co go ne or org sc ',
            'uk': ' ac bl british-library co cym gov govt icnet jet lea ltd me mil mod national-library-scotland nel net nhs nic nls org orgn parliament plc police sch scot soc ',
            'us': ' dni fed isa kids nsn ',
            'uy': ' com edu gub mil net org ',
            've': ' co com edu gob info mil net org web ',
            'vi': ' co com k12 net org ',
            'vn': ' ac biz com edu gov health info int name net org pro ',
            'ye': ' co com gov ltd me net org plc ',
            'yu': ' ac co edu gov org ',
            'za': ' ac agric alt bourse city co cybernet db edu gov grondar iaccess imt inca landesign law mil net ngo nis nom olivetti org pix school tm web ',
            'zm': ' ac co com edu gov net org sch ',
            // https://en.wikipedia.org/wiki/CentralNic#Second-level_domains
            'com': 'ar br cn de eu gb gr hu jpn kr no qc ru sa se uk us uy za ',
            'net': 'gb jp se uk ',
            'org': 'ae',
            'de': 'com '
          },
          // gorhill 2013-10-25: Using indexOf() instead Regexp(). Significant boost
          // in both performance and memory footprint. No initialization required.
          // http://jsperf.com/uri-js-sld-regex-vs-binary-search/4
          // Following methods use lastIndexOf() rather than array.split() in order
          // to avoid any memory allocations.
          has: function has(domain) {
            var tldOffset = domain.lastIndexOf('.');
            if (tldOffset <= 0 || tldOffset >= domain.length - 1) {
              return false;
            }
            var sldOffset = domain.lastIndexOf('.', tldOffset - 1);
            if (sldOffset <= 0 || sldOffset >= tldOffset - 1) {
              return false;
            }
            var sldList = SLD.list[domain.slice(tldOffset + 1)];
            if (!sldList) {
              return false;
            }
            return sldList.indexOf(' ' + domain.slice(sldOffset + 1, tldOffset) + ' ') >= 0;
          },
          is: function is(domain) {
            var tldOffset = domain.lastIndexOf('.');
            if (tldOffset <= 0 || tldOffset >= domain.length - 1) {
              return false;
            }
            var sldOffset = domain.lastIndexOf('.', tldOffset - 1);
            if (sldOffset >= 0) {
              return false;
            }
            var sldList = SLD.list[domain.slice(tldOffset + 1)];
            if (!sldList) {
              return false;
            }
            return sldList.indexOf(' ' + domain.slice(0, tldOffset) + ' ') >= 0;
          },
          get: function get(domain) {
            var tldOffset = domain.lastIndexOf('.');
            if (tldOffset <= 0 || tldOffset >= domain.length - 1) {
              return null;
            }
            var sldOffset = domain.lastIndexOf('.', tldOffset - 1);
            if (sldOffset <= 0 || sldOffset >= tldOffset - 1) {
              return null;
            }
            var sldList = SLD.list[domain.slice(tldOffset + 1)];
            if (!sldList) {
              return null;
            }
            if (sldList.indexOf(' ' + domain.slice(sldOffset + 1, tldOffset) + ' ') < 0) {
              return null;
            }
            return domain.slice(sldOffset + 1);
          },
          noConflict: function noConflict() {
            if (root.SecondLevelDomains === this) {
              root.SecondLevelDomains = _SecondLevelDomains;
            }
            return this;
          }
        };

        return SLD;
      });

      /***/
    },
    /* 116 */
    /***/function (module, exports, __webpack_require__) {

      /* WEBPACK VAR INJECTION */(function (module, global) {
        var __WEBPACK_AMD_DEFINE_RESULT__; /*! https://mths.be/punycode v1.4.0 by @mathias */
        ;(function (root) {

          /** Detect free variables */
          var freeExports = (typeof exports === 'undefined' ? 'undefined' : _typeof2(exports)) == 'object' && exports && !exports.nodeType && exports;
          var freeModule = (typeof module === 'undefined' ? 'undefined' : _typeof2(module)) == 'object' && module && !module.nodeType && module;
          var freeGlobal = (typeof global === 'undefined' ? 'undefined' : _typeof2(global)) == 'object' && global;
          if (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal || freeGlobal.self === freeGlobal) {
            root = freeGlobal;
          }

          /**
           * The `punycode` object.
           * @name punycode
           * @type Object
           */
          var punycode,


          /** Highest positive signed 32-bit float value */
          maxInt = 2147483647,
              // aka. 0x7FFFFFFF or 2^31-1

          /** Bootstring parameters */
          base = 36,
              tMin = 1,
              tMax = 26,
              skew = 38,
              damp = 700,
              initialBias = 72,
              initialN = 128,
              // 0x80
          delimiter = '-',
              // '\x2D'

          /** Regular expressions */
          regexPunycode = /^xn--/,
              regexNonASCII = /[^\x20-\x7E]/,
              // unprintable ASCII chars + non-ASCII chars
          regexSeparators = /[\x2E\u3002\uFF0E\uFF61]/g,
              // RFC 3490 separators

          /** Error messages */
          errors = {
            'overflow': 'Overflow: input needs wider integers to process',
            'not-basic': 'Illegal input >= 0x80 (not a basic code point)',
            'invalid-input': 'Invalid input'
          },


          /** Convenience shortcuts */
          baseMinusTMin = base - tMin,
              floor = Math.floor,
              stringFromCharCode = String.fromCharCode,


          /** Temporary variable */
          key;

          /*--------------------------------------------------------------------------*/

          /**
           * A generic error utility function.
           * @private
           * @param {String} type The error type.
           * @returns {Error} Throws a `RangeError` with the applicable error message.
           */
          function error(type) {
            throw new RangeError(errors[type]);
          }

          /**
           * A generic `Array#map` utility function.
           * @private
           * @param {Array} array The array to iterate over.
           * @param {Function} callback The function that gets called for every array
           * item.
           * @returns {Array} A new array of values returned by the callback function.
           */
          function map(array, fn) {
            var length = array.length;
            var result = [];
            while (length--) {
              result[length] = fn(array[length]);
            }
            return result;
          }

          /**
           * A simple `Array#map`-like wrapper to work with domain name strings or email
           * addresses.
           * @private
           * @param {String} domain The domain name or email address.
           * @param {Function} callback The function that gets called for every
           * character.
           * @returns {Array} A new string of characters returned by the callback
           * function.
           */
          function mapDomain(string, fn) {
            var parts = string.split('@');
            var result = '';
            if (parts.length > 1) {
              // In email addresses, only the domain name should be punycoded. Leave
              // the local part (i.e. everything up to `@`) intact.
              result = parts[0] + '@';
              string = parts[1];
            }
            // Avoid `split(regex)` for IE8 compatibility. See #17.
            string = string.replace(regexSeparators, '\x2E');
            var labels = string.split('.');
            var encoded = map(labels, fn).join('.');
            return result + encoded;
          }

          /**
           * Creates an array containing the numeric code points of each Unicode
           * character in the string. While JavaScript uses UCS-2 internally,
           * this function will convert a pair of surrogate halves (each of which
           * UCS-2 exposes as separate characters) into a single code point,
           * matching UTF-16.
           * @see `punycode.ucs2.encode`
           * @see <https://mathiasbynens.be/notes/javascript-encoding>
           * @memberOf punycode.ucs2
           * @name decode
           * @param {String} string The Unicode input string (UCS-2).
           * @returns {Array} The new array of code points.
           */
          function ucs2decode(string) {
            var output = [],
                counter = 0,
                length = string.length,
                value,
                extra;
            while (counter < length) {
              value = string.charCodeAt(counter++);
              if (value >= 0xD800 && value <= 0xDBFF && counter < length) {
                // high surrogate, and there is a next character
                extra = string.charCodeAt(counter++);
                if ((extra & 0xFC00) == 0xDC00) {
                  // low surrogate
                  output.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000);
                } else {
                  // unmatched surrogate; only append this code unit, in case the next
                  // code unit is the high surrogate of a surrogate pair
                  output.push(value);
                  counter--;
                }
              } else {
                output.push(value);
              }
            }
            return output;
          }

          /**
           * Creates a string based on an array of numeric code points.
           * @see `punycode.ucs2.decode`
           * @memberOf punycode.ucs2
           * @name encode
           * @param {Array} codePoints The array of numeric code points.
           * @returns {String} The new Unicode string (UCS-2).
           */
          function ucs2encode(array) {
            return map(array, function (value) {
              var output = '';
              if (value > 0xFFFF) {
                value -= 0x10000;
                output += stringFromCharCode(value >>> 10 & 0x3FF | 0xD800);
                value = 0xDC00 | value & 0x3FF;
              }
              output += stringFromCharCode(value);
              return output;
            }).join('');
          }

          /**
           * Converts a basic code point into a digit/integer.
           * @see `digitToBasic()`
           * @private
           * @param {Number} codePoint The basic numeric code point value.
           * @returns {Number} The numeric value of a basic code point (for use in
           * representing integers) in the range `0` to `base - 1`, or `base` if
           * the code point does not represent a value.
           */
          function basicToDigit(codePoint) {
            if (codePoint - 48 < 10) {
              return codePoint - 22;
            }
            if (codePoint - 65 < 26) {
              return codePoint - 65;
            }
            if (codePoint - 97 < 26) {
              return codePoint - 97;
            }
            return base;
          }

          /**
           * Converts a digit/integer into a basic code point.
           * @see `basicToDigit()`
           * @private
           * @param {Number} digit The numeric value of a basic code point.
           * @returns {Number} The basic code point whose value (when used for
           * representing integers) is `digit`, which needs to be in the range
           * `0` to `base - 1`. If `flag` is non-zero, the uppercase form is
           * used; else, the lowercase form is used. The behavior is undefined
           * if `flag` is non-zero and `digit` has no uppercase form.
           */
          function digitToBasic(digit, flag) {
            //  0..25 map to ASCII a..z or A..Z
            // 26..35 map to ASCII 0..9
            return digit + 22 + 75 * (digit < 26) - ((flag != 0) << 5);
          }

          /**
           * Bias adaptation function as per section 3.4 of RFC 3492.
           * https://tools.ietf.org/html/rfc3492#section-3.4
           * @private
           */
          function adapt(delta, numPoints, firstTime) {
            var k = 0;
            delta = firstTime ? floor(delta / damp) : delta >> 1;
            delta += floor(delta / numPoints);
            for (; /* no initialization */delta > baseMinusTMin * tMax >> 1; k += base) {
              delta = floor(delta / baseMinusTMin);
            }
            return floor(k + (baseMinusTMin + 1) * delta / (delta + skew));
          }

          /**
           * Converts a Punycode string of ASCII-only symbols to a string of Unicode
           * symbols.
           * @memberOf punycode
           * @param {String} input The Punycode string of ASCII-only symbols.
           * @returns {String} The resulting string of Unicode symbols.
           */
          function decode(input) {
            // Don't use UCS-2
            var output = [],
                inputLength = input.length,
                out,
                i = 0,
                n = initialN,
                bias = initialBias,
                basic,
                j,
                index,
                oldi,
                w,
                k,
                digit,
                t,

            /** Cached calculation results */
            baseMinusT;

            // Handle the basic code points: let `basic` be the number of input code
            // points before the last delimiter, or `0` if there is none, then copy
            // the first basic code points to the output.

            basic = input.lastIndexOf(delimiter);
            if (basic < 0) {
              basic = 0;
            }

            for (j = 0; j < basic; ++j) {
              // if it's not a basic code point
              if (input.charCodeAt(j) >= 0x80) {
                error('not-basic');
              }
              output.push(input.charCodeAt(j));
            }

            // Main decoding loop: start just after the last delimiter if any basic code
            // points were copied; start at the beginning otherwise.

            for (index = basic > 0 ? basic + 1 : 0; index < inputLength;) /* no final expression */{

              // `index` is the index of the next character to be consumed.
              // Decode a generalized variable-length integer into `delta`,
              // which gets added to `i`. The overflow checking is easier
              // if we increase `i` as we go, then subtract off its starting
              // value at the end to obtain `delta`.
              for (oldi = i, w = 1, k = base;; /* no condition */k += base) {

                if (index >= inputLength) {
                  error('invalid-input');
                }

                digit = basicToDigit(input.charCodeAt(index++));

                if (digit >= base || digit > floor((maxInt - i) / w)) {
                  error('overflow');
                }

                i += digit * w;
                t = k <= bias ? tMin : k >= bias + tMax ? tMax : k - bias;

                if (digit < t) {
                  break;
                }

                baseMinusT = base - t;
                if (w > floor(maxInt / baseMinusT)) {
                  error('overflow');
                }

                w *= baseMinusT;
              }

              out = output.length + 1;
              bias = adapt(i - oldi, out, oldi == 0);

              // `i` was supposed to wrap around from `out` to `0`,
              // incrementing `n` each time, so we'll fix that now:
              if (floor(i / out) > maxInt - n) {
                error('overflow');
              }

              n += floor(i / out);
              i %= out;

              // Insert `n` at position `i` of the output
              output.splice(i++, 0, n);
            }

            return ucs2encode(output);
          }

          /**
           * Converts a string of Unicode symbols (e.g. a domain name label) to a
           * Punycode string of ASCII-only symbols.
           * @memberOf punycode
           * @param {String} input The string of Unicode symbols.
           * @returns {String} The resulting Punycode string of ASCII-only symbols.
           */
          function encode(input) {
            var n,
                delta,
                handledCPCount,
                basicLength,
                bias,
                j,
                m,
                q,
                k,
                t,
                currentValue,
                output = [],

            /** `inputLength` will hold the number of code points in `input`. */
            inputLength,

            /** Cached calculation results */
            handledCPCountPlusOne,
                baseMinusT,
                qMinusT;

            // Convert the input in UCS-2 to Unicode
            input = ucs2decode(input);

            // Cache the length
            inputLength = input.length;

            // Initialize the state
            n = initialN;
            delta = 0;
            bias = initialBias;

            // Handle the basic code points
            for (j = 0; j < inputLength; ++j) {
              currentValue = input[j];
              if (currentValue < 0x80) {
                output.push(stringFromCharCode(currentValue));
              }
            }

            handledCPCount = basicLength = output.length;

            // `handledCPCount` is the number of code points that have been handled;
            // `basicLength` is the number of basic code points.

            // Finish the basic string - if it is not empty - with a delimiter
            if (basicLength) {
              output.push(delimiter);
            }

            // Main encoding loop:
            while (handledCPCount < inputLength) {

              // All non-basic code points < n have been handled already. Find the next
              // larger one:
              for (m = maxInt, j = 0; j < inputLength; ++j) {
                currentValue = input[j];
                if (currentValue >= n && currentValue < m) {
                  m = currentValue;
                }
              }

              // Increase `delta` enough to advance the decoder's <n,i> state to <m,0>,
              // but guard against overflow
              handledCPCountPlusOne = handledCPCount + 1;
              if (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) {
                error('overflow');
              }

              delta += (m - n) * handledCPCountPlusOne;
              n = m;

              for (j = 0; j < inputLength; ++j) {
                currentValue = input[j];

                if (currentValue < n && ++delta > maxInt) {
                  error('overflow');
                }

                if (currentValue == n) {
                  // Represent delta as a generalized variable-length integer
                  for (q = delta, k = base;; /* no condition */k += base) {
                    t = k <= bias ? tMin : k >= bias + tMax ? tMax : k - bias;
                    if (q < t) {
                      break;
                    }
                    qMinusT = q - t;
                    baseMinusT = base - t;
                    output.push(stringFromCharCode(digitToBasic(t + qMinusT % baseMinusT, 0)));
                    q = floor(qMinusT / baseMinusT);
                  }

                  output.push(stringFromCharCode(digitToBasic(q, 0)));
                  bias = adapt(delta, handledCPCountPlusOne, handledCPCount == basicLength);
                  delta = 0;
                  ++handledCPCount;
                }
              }

              ++delta;
              ++n;
            }
            return output.join('');
          }

          /**
           * Converts a Punycode string representing a domain name or an email address
           * to Unicode. Only the Punycoded parts of the input will be converted, i.e.
           * it doesn't matter if you call it on a string that has already been
           * converted to Unicode.
           * @memberOf punycode
           * @param {String} input The Punycoded domain name or email address to
           * convert to Unicode.
           * @returns {String} The Unicode representation of the given Punycode
           * string.
           */
          function toUnicode(input) {
            return mapDomain(input, function (string) {
              return regexPunycode.test(string) ? decode(string.slice(4).toLowerCase()) : string;
            });
          }

          /**
           * Converts a Unicode string representing a domain name or an email address to
           * Punycode. Only the non-ASCII parts of the domain name will be converted,
           * i.e. it doesn't matter if you call it with a domain that's already in
           * ASCII.
           * @memberOf punycode
           * @param {String} input The domain name or email address to convert, as a
           * Unicode string.
           * @returns {String} The Punycode representation of the given domain name or
           * email address.
           */
          function toASCII(input) {
            return mapDomain(input, function (string) {
              return regexNonASCII.test(string) ? 'xn--' + encode(string) : string;
            });
          }

          /*--------------------------------------------------------------------------*/

          /** Define the public API */
          punycode = {
            /**
             * A string representing the current Punycode.js version number.
             * @memberOf punycode
             * @type String
             */
            'version': '1.3.2',
            /**
             * An object of methods to convert from JavaScript's internal character
             * representation (UCS-2) to Unicode code points, and back.
             * @see <https://mathiasbynens.be/notes/javascript-encoding>
             * @memberOf punycode
             * @type Object
             */
            'ucs2': {
              'decode': ucs2decode,
              'encode': ucs2encode
            },
            'decode': decode,
            'encode': encode,
            'toASCII': toASCII,
            'toUnicode': toUnicode
          };

          /** Expose `punycode` */
          // Some AMD build optimizers, like r.js, check for specific condition patterns
          // like the following:
          if (true) {
            !(__WEBPACK_AMD_DEFINE_RESULT__ = function () {
              return punycode;
            }.call(exports, __webpack_require__, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
          } else {}
        })(this);

        /* WEBPACK VAR INJECTION */
      }).call(exports, __webpack_require__(302)(module), __webpack_require__(85));

      /***/
    },
    /* 117 */
    /***/function (module, exports, __webpack_require__) {

      "use strict";

      var _typeof = typeof Symbol === "function" && _typeof2(Symbol.iterator) === "symbol" ? function (obj) {
        return typeof obj === 'undefined' ? 'undefined' : _typeof2(obj);
      } : function (obj) {
        return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj === 'undefined' ? 'undefined' : _typeof2(obj);
      };

      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 _package = __webpack_require__(303);

      function _asyncToGenerator(fn) {
        return function () {
          var gen = fn.apply(this, arguments);return new Promise(function (resolve, reject) {
            function step(key, arg) {
              try {
                var info = gen[key](arg);var value = info.value;
              } catch (error) {
                reject(error);return;
              }if (info.done) {
                resolve(value);
              } else {
                return Promise.resolve(value).then(function (value) {
                  step("next", value);
                }, function (err) {
                  step("throw", err);
                });
              }
            }return step("next");
          });
        };
      }

      function _classCallCheck(instance, Constructor) {
        if (!(instance instanceof Constructor)) {
          throw new TypeError("Cannot call a class as a function");
        }
      }

      var URI = __webpack_require__(301);

      /**
       * A client for the [TrueVault HTTP API](https://docs.truevault.com/).
       *
       * If you already have an API key or access token, use the constructor. If you have a username and password, see
       * `login()`.
       */

      var TrueVaultClient = function () {

        /**
         * See https://docs.truevault.com/overview#authentication for more on authentication concepts in TrueVault.
         *
         * To authenticate, provide one of the following styles of objects based on how you wish to authenticate:
         *
         * - { apiKey: 'your API key' }
         * - { accessToken: 'your access token' }
         * - { httpBasic: 'http basic base64 string' }
         * - null, to indicate no authentication is to be provided to the server
         *
         * @param {object|null} authn Authentication info, or null if no authentication info is to be used.
         * @param {string} host optional parameter specifying TV API host; defaults to https://api.truevault.com
         */
        function TrueVaultClient(authn, host) {
          _classCallCheck(this, TrueVaultClient);

          this.authHeader = null;
          if (authn === null) {
            // no auth
            this.authHeader = null;
          } else if (typeof authn === 'string') {
            // old style: api key or access token
            this.authHeader = TrueVaultClient._makeHeaderForUsername(authn);
          } else if ((typeof authn === 'undefined' ? 'undefined' : _typeof(authn)) === 'object') {
            if (authn.hasOwnProperty('apiKey')) {
              this.authHeader = TrueVaultClient._makeHeaderForUsername(authn['apiKey']);
            } else if (authn.hasOwnProperty('accessToken')) {
              this.authHeader = TrueVaultClient._makeHeaderForUsername(authn['accessToken']);
            } else if (authn.hasOwnProperty('httpBasic')) {
              this.authHeader = 'Basic ' + authn['httpBasic'];
            }
          } else {
            throw new Error('Invalid authentication method provided');
          }

          this.host = host || 'https://api.truevault.com';
        }

        _createClass(TrueVaultClient, [{
          key: 'performRequest',
          value: function () {
            var _ref = _asyncToGenerator(regeneratorRuntime.mark(function _callee(path, options) {
              var uri, response, responseBody, json, error;
              return regeneratorRuntime.wrap(function _callee$(_context) {
                while (1) {
                  switch (_context.prev = _context.next) {
                    case 0:
                      if (!!this.authHeader) {
                        if (!options) {
                          options = {};
                        }
                        if (!options.headers) {
                          options.headers = {};
                        }
                        options.headers.Authorization = this.authHeader;
                      }

                      uri = URI(this.host + '/' + path).addQuery("_tv_sdk", _package.version).toString();
                      _context.next = 4;
                      return fetch(uri, options);

                    case 4:
                      response = _context.sent;
                      _context.next = 7;
                      return response.text();

                    case 7:
                      responseBody = _context.sent;
                      json = void 0;
                      _context.prev = 9;

                      json = JSON.parse(responseBody);
                      _context.next = 16;
                      break;

                    case 13:
                      _context.prev = 13;
                      _context.t0 = _context['catch'](9);
                      throw new Error('non-JSON response: ' + responseBody);

                    case 16:
                      if (!(json.result === 'error')) {
                        _context.next = 22;
                        break;
                      }

                      error = new Error(json.error.message);

                      error.error = json.error;
                      throw error;

                    case 22:
                      return _context.abrupt('return', json);

                    case 23:
                    case 'end':
                      return _context.stop();
                  }
                }
              }, _callee, this, [[9, 13]]);
            }));

            function performRequest(_x, _x2) {
              return _ref.apply(this, arguments);
            }

            return performRequest;
          }()

          /**
           * Useful when you want to create a client starting from a user's username and password as opposed to an API key
           * or access token.
           * See https://docs.truevault.com/authentication#login-a-user.
           * @param {string} accountId account id that the user belongs to.
           * @param {string} username user's username.
           * @param {string} password user's password.
           * @param {string} [mfaCode] current MFA code, if user has MFA configured.
           * @param {string} [host] host optional parameter specifying TV API host; defaults to https://api.truevault.com
           * @returns {Promise.<TrueVaultClient>}
           */

        }, {
          key: 'logout',

          /**
           * Log the authenticated user out, which deactivates its access token. See
           * https://docs.truevault.com/authentication#logout-a-user.
           * @returns {Promise.<Object>}
           */
          value: function () {
            var _ref2 = _asyncToGenerator(regeneratorRuntime.mark(function _callee2() {
              var response;
              return regeneratorRuntime.wrap(function _callee2$(_context2) {
                while (1) {
                  switch (_context2.prev = _context2.next) {
                    case 0:
                      _context2.next = 2;
                      return this.performRequest('v1/auth/logout', { method: 'POST' });

                    case 2:
                      response = _context2.sent;

                      this.authHeader = null;
                      return _context2.abrupt('return', response);

                    case 5:
                    case 'end':
                      return _context2.stop();
                  }
                }
              }, _callee2, this);
            }));

            function logout() {
              return _ref2.apply(this, arguments);
            }

            return logout;
          }()

          /**
           * Get data about the authenticated user. See https://docs.truevault.com/authentication#verify-a-user.
           * @returns {Promise.<Object>}
           */

        }, {
          key: 'readCurrentUser',
          value: function () {
            var _ref3 = _asyncToGenerator(regeneratorRuntime.mark(function _callee3() {
              var response, user;
              return regeneratorRuntime.wrap(function _callee3$(_context3) {
                while (1) {
                  switch (_context3.prev = _context3.next) {
                    case 0:
                      _context3.next = 2;
                      return this.performRequest('v1/auth/me?full=true');

                    case 2:
                      response = _context3.sent;
                      user = response.user;

                      if (user.attributes === null) {
                        user.attributes = {};
                      } else {
                        user.attributes = JSON.parse(atob(user.attributes));
                      }
                      return _context3.abrupt('return', user);

                    case 6:
                    case 'end':
                      return _context3.stop();
                  }
                }
              }, _callee3, this);
            }));

            function readCurrentUser() {
              return _ref3.apply(this, arguments);
            }

            return readCurrentUser;
          }()

          /**
           * List all users in the account. See https://docs.truevault.com/users#list-all-users.
           * @returns {Promise.<Array>}
           */

        }, {
          key: 'listUsers',
          value: function () {
            var _ref4 = _asyncToGenerator(regeneratorRuntime.mark(function _callee4() {
              var response;
              return regeneratorRuntime.wrap(function _callee4$(_context4) {
                while (1) {
                  switch (_context4.prev = _context4.next) {
                    case 0:
                      _context4.next = 2;
                      return this.performRequest('v1/users?full=true');

                    case 2:
                      response = _context4.sent;
                      return _context4.abrupt('return', response.users.map(function (user) {
                        if (user.attributes) {
                          user.attributes = JSON.parse(atob(user.attributes));
                        }
                        return user;
                      }));

                    case 4:
                    case 'end':
                      return _context4.stop();
                  }
                }
              }, _callee4, this);
            }));

            function listUsers() {
              return _ref4.apply(this, arguments);
            }

            return listUsers;
          }()

          /**
           * Read a single user. See https://docs.truevault.com/users#read-a-user.
           * @returns {Promise.<Object>}
           */

        }, {
          key: 'readUser',
          value: function () {
            var _ref5 = _asyncToGenerator(regeneratorRuntime.mark(function _callee5(userId) {
              var response;
              return regeneratorRuntime.wrap(function _callee5$(_context5) {
                while (1) {
                  switch (_context5.prev = _context5.next) {
                    case 0:
                      _context5.next = 2;
                      return this.performRequest('v1/users/' + userId + '?full=true');

                    case 2:
                      response = _context5.sent;

                      response.user.attributes = JSON.parse(atob(response.user.attributes));
                      return _context5.abrupt('return', response.user);

                    case 5:
                    case 'end':
                      return _context5.stop();
                  }
                }
              }, _callee5, this);
            }));

            function readUser(_x3) {
              return _ref5.apply(this, arguments);
            }

            return readUser;
          }()

          /**
           * Reads multiple users. See https://docs.truevault.com/users#read-a-user.
           * @returns {Promise.<Array>}
           */

        }, {
          key: 'readUsers',
          value: function () {
            var _ref6 = _asyncToGenerator(regeneratorRuntime.mark(function _callee6(userIds) {
              var response;
              return regeneratorRuntime.wrap(function _callee6$(_context6) {
                while (1) {
                  switch (_context6.prev = _context6.next) {
                    case 0:
                      _context6.next = 2;
                      return this.performRequest('v2/users/' + userIds.join(',') + '?full=true');

                    case 2:
                      response = _context6.sent;
                      return _context6.abrupt('return', response.users);

                    case 4:
                    case 'end':
                      return _context6.stop();
                  }
                }
              }, _callee6, this);
            }));

            function readUsers(_x4) {
              return _ref6.apply(this, arguments);
            }

            return readUsers;
          }()

          /**
           * Create a new user. See https://docs.truevault.com/users#create-a-user.
           * @param {string} username new user's username.
           * @param {string} password new user's password.
           * @param {Object} [attributes] new user's attributes, if desired.
           * @param {Array} [groupIds] add user to the given groups, if provided.
           * @returns {Promise.<Object>}
           */

        }, {
          key: 'createUser',
          value: function () {
            var _ref7 = _asyncToGenerator(regeneratorRuntime.mark(function _callee7(username, password, attributes, groupIds) {
              var formData, response;
              return regeneratorRuntime.wrap(function _callee7$(_context7) {
                while (1) {
                  switch (_context7.prev = _context7.next) {
                    case 0:
                      formData = new FormData();

                      formData.append("username", username);
                      formData.append("password", password);
                      if (attributes) {
                        formData.append("attributes", btoa(JSON.stringify(attributes)));
                      }
                      if (groupIds) {
                        formData.append("group_ids", groupIds.join(","));
                      }
                      _context7.next = 7;
                      return this.performRequest('v1/users', {
                        method: 'POST',
                        body: formData
                      });

                    case 7:
                      response = _context7.sent;
                      return _context7.abrupt('return', response.user);

                    case 9:
                    case 'end':
                      return _context7.stop();
                  }
                }
              }, _callee7, this);
            }));

            function createUser(_x5, _x6, _x7, _x8) {
              return _ref7.apply(this, arguments);
            }

            return createUser;
          }()

          /**
           * Update a user's attributes. See https://docs.truevault.com/users#update-a-user.
           * @param {string} userId the user's userId
           * @param {Object} attributes
           * @returns {Promise.<Object>}
           */

        }, {
          key: 'updateUserAttributes',
          value: function () {
            var _ref8 = _asyncToGenerator(regeneratorRuntime.mark(function _callee8(userId, attributes) {
              var formData, response;
              return regeneratorRuntime.wrap(function _callee8$(_context8) {
                while (1) {
                  switch (_context8.prev = _context8.next) {
                    case 0:
                      formData = new FormData();

                      formData.append("attributes", btoa(JSON.stringify(attributes)));

                      _context8.next = 4;
                      return this.performRequest('v1/users/' + userId, {
                        method: 'PUT',
                        body: formData
                      });

                    case 4:
                      response = _context8.sent;
                      return _context8.abrupt('return', response.user);

                    case 6:
                    case 'end':
                      return _context8.stop();
                  }
                }
              }, _callee8, this);
            }));

            function updateUserAttributes(_x9, _x10) {
              return _ref8.apply(this, arguments);
            }

            return updateUserAttributes;
          }()

          /**
           * Update a user's status. See https://docs.truevault.com/users#update-a-user.
           * @param {string} userId the user's userId
           * @param {Object} status
           * @returns {Promise.<Object>}
           */

        }, {
          key: 'updateUserStatus',
          value: function () {
            var _ref9 = _asyncToGenerator(regeneratorRuntime.mark(function _callee9(userId, status) {
              var formData, response;
              return regeneratorRuntime.wrap(function _callee9$(_context9) {
                while (1) {
                  switch (_context9.prev = _context9.next) {
                    case 0:
                      formData = new FormData();

                      formData.append("status", status);

                      _context9.next = 4;
                      return this.performRequest('v1/users/' + userId, {
                        method: 'PUT',
                        body: formData
                      });

                    case 4:
                      response = _context9.sent;
                      return _context9.abrupt('return', response.user);

                    case 6:
                    case 'end':
                      return _context9.stop();
                  }
                }
              }, _callee9, this);
            }));

            function updateUserStatus(_x11, _x12) {
              return _ref9.apply(this, arguments);
            }

            return updateUserStatus;
          }()

          /**
           * Update a user's username. See https://docs.truevault.com/users#update-a-user.
           * @param {string} userId the user id to change.
           * @param {string} newUsername user's new username.
           * @returns {Promise.<Object>}
           */

        }, {
          key: 'updateUserUsername',
          value: function () {
            var _ref10 = _asyncToGenerator(regeneratorRuntime.mark(function _callee10(userId, newUsername) {
              var formData, response;
              return regeneratorRuntime.wrap(function _callee10$(_context10) {
                while (1) {
                  switch (_context10.prev = _context10.next) {
                    case 0:
                      formData = new FormData();

                      formData.append("username", newUsername);

                      _context10.next = 4;
                      return this.performRequest('v1/users/' + userId, {
                        method: 'PUT',
                        body: formData
                      });

                    case 4:
                      response = _context10.sent;
                      return _context10.abrupt('return', response.user);

                    case 6:
                    case 'end':
                      return _context10.stop();
                  }
                }
              }, _callee10, this);
            }));

            function updateUserUsername(_x13, _x14) {
              return _ref10.apply(this, arguments);
            }

            return updateUserUsername;
          }()

          /**
           * Update a user's password. See https://docs.truevault.com/users#update-a-user.
           * @param {string} userId the user id to change.
           * @param {string} newPassword user's new password.
           * @returns {Promise.<Object>}
           */

        }, {
          key: 'updateUserPassword',
          value: function () {
            var _ref11 = _asyncToGenerator(regeneratorRuntime.mark(function _callee11(userId, newPassword) {
              var formData, response;
              return regeneratorRuntime.wrap(function _callee11$(_context11) {
                while (1) {
                  switch (_context11.prev = _context11.next) {
                    case 0:
                      formData = new FormData();

                      formData.append("password", newPassword);

                      _context11.next = 4;
                      return this.performRequest('v1/users/' + userId, {
                        method: 'PUT',
                        body: formData
                      });

                    case 4:
                      response = _context11.sent;
                      return _context11.abrupt('return', response.user);

                    case 6:
                    case 'end':
                      return _context11.stop();
                  }
                }
              }, _callee11, this);
            }));

            function updateUserPassword(_x15, _x16) {
              return _ref11.apply(this, arguments);
            }

            return updateUserPassword;
          }()

          /**
           * Delete a user. See https://docs.truevault.com/users#delete-a-user
           * @param {string} userId the user id to delete.
           * @returns {Promise.<Object>}
           */

        }, {
          key: 'deleteUser',
          value: function () {
            var _ref12 = _asyncToGenerator(regeneratorRuntime.mark(function _callee12(userId) {
              var response;
              return regeneratorRuntime.wrap(function _callee12$(_context12) {
                while (1) {
                  switch (_context12.prev = _context12.next) {
                    case 0:
                      _context12.next = 2;
                      return this.performRequest('v1/users/' + userId, {
                        method: 'DELETE'
                      });

                    case 2:
                      response = _context12.sent;
                      return _context12.abrupt('return', response.user);

                    case 4:
                    case 'end':
                      return _context12.stop();
                  }
                }
              }, _callee12, this);
            }));

            function deleteUser(_x17) {
              return _ref12.apply(this, arguments);
            }

            return deleteUser;
          }()

          /**
           * Create an API key for a user. See https://docs.truevault.com/users#create-api-key-for-a-user.
           * @param {string} userId user id.
           * @returns {Promise.<string>}
           */

        }, {
          key: 'createUserApiKey',
          value: function () {
            var _ref13 = _asyncToGenerator(regeneratorRuntime.mark(function _callee13(userId) {
              var response;
              return regeneratorRuntime.wrap(function _callee13$(_context13) {
                while (1) {
                  switch (_context13.prev = _context13.next) {
                    case 0:
                      _context13.next = 2;
                      return this.performRequest('v1/users/' + userId + '/api_key', { method: 'POST' });

                    case 2:
                      response = _context13.sent;
                      return _context13.abrupt('return', response.api_key);

                    case 4:
                    case 'end':
                      return _context13.stop();
                  }
                }
              }, _callee13, this);
            }));

            function createUserApiKey(_x18) {
              return _ref13.apply(this, arguments);
            }

            return createUserApiKey;
          }()

          /**
           * Create an access token for a user. See https://docs.truevault.com/users#create-access-token-for-a-user.
           * @param {string} userId user id.
           * @returns {Promise.<string>}
           */

        }, {
          key: 'createUserAccessToken',
          value: function () {
            var _ref14 = _asyncToGenerator(regeneratorRuntime.mark(function _callee14(userId) {
              var response;
              return regeneratorRuntime.wrap(function _callee14$(_context14) {
                while (1) {
                  switch (_context14.prev = _context14.next) {
                    case 0:
                      _context14.next = 2;
                      return this.performRequest('v1/users/' + userId + '/access_token', { method: 'POST' });

                    case 2:
                      response = _context14.sent;
                      return _context14.abrupt('return', response.user.access_token);

                    case 4:
                    case 'end':
                      return _context14.stop();
                  }
                }
              }, _callee14, this);
            }));

            function createUserAccessToken(_x19) {
              return _ref14.apply(this, arguments);
            }

            return createUserAccessToken;
          }()

          /**
           * Start MFA enrollment for a user. See https://docs.truevault.com/users#start-mfa-enrollment-for-a-user.
           * @param {string} userId user id.
           * @param {string} issuer MFA issuer.
           * @returns {Promise.<string>}
           */

        }, {
          key: 'startUserMfaEnrollment',
          value: function startUserMfaEnrollment(userId, issuer) {
            return this.performRequest('v1/users/' + userId + '/mfa/start_enrollment', {
              method: 'POST',
              headers: { 'Content-Type': 'application/json' },
              body: JSON.stringify({ issuer: issuer })
            });
          }

          /**
           * Finalize MFA enrollment for a user. See https://docs.truevault.com/users#finalize-mfa-enrollment-for-a-user.
           * @param {string} userId user id.
           * @param {string} mfaCode1 first MFA code.
           * @param {string} mfaCode2 second MFA code.
           * @returns {Promise.<string>}
           */

        }, {
          key: 'finalizeMfaEnrollment',
          value: function finalizeMfaEnrollment(userId, mfaCode1, mfaCode2) {
            return this.performRequest('v1/users/' + userId + '/mfa/finalize_enrollment', {
              method: 'POST',
              headers: { 'Content-Type': 'application/json' },
              body: JSON.stringify({ mfa_code_1: mfaCode1, mfa_code_2: mfaCode2 })
            });
          }

          /**
           * Unenroll a user from MFA. See #https://docs.truevault.com/users#unenroll-mfa-for-a-user.
           * @param {string} userId user id.
           * @param {string} mfaCode MFA code for user.
           * @param {string} password user's password.
           * @returns {Promise.<string>}
           */

        }, {
          key: 'unenrollMfa',
          value: function unenrollMfa(userId, mfaCode, password) {
            return this.performRequest('v1/users/' + userId + '/mfa/unenroll', {
              method: 'POST',
              headers: { 'Content-Type': 'application/json' },
              body: JSON.stringify({ mfa_code: mfaCode, password: password })
            });
          }

          /**
           * Create a new group. See https://docs.truevault.com/groups#create-a-group.
           * @param {string} name group name.
           * @param {Object} policy group policy. See https://docs.truevault.com/groups.
           * @param {Array} [userIds] user ids to add to the group.
           * @returns {Promise.<Object>}
           */

        }, {
          key: 'createGroup',
          value: function () {
            var _ref15 = _asyncToGenerator(regeneratorRuntime.mark(function _callee15(name, policy, userIds) {
              var formData, response;
              return regeneratorRuntime.wrap(function _callee15$(_context15) {
                while (1) {
                  switch (_context15.prev = _context15.next) {
                    case 0:
                      formData = new FormData();

                      formData.append("name", name);
                      formData.append("policy", btoa(JSON.stringify(policy)));
                      if (!!userIds) {
                        formData.append("user_ids", userIds.join(','));
                      }
                      _context15.next = 6;
                      return this.performRequest('v1/groups', {
                        method: 'POST',
                        body: formData
                      });

                    case 6:
                      response = _context15.sent;
                      return _context15.abrupt('return', response.group);

                    case 8:
                    case 'end':
                      return _context15.stop();
                  }
                }
              }, _callee15, this);
            }));

            function createGroup(_x20, _x21, _x22) {
              return _ref15.apply(this, arguments);
            }

            return createGroup;
          }()

          /**
           * Update an existing group's name and policy. See https://docs.truevault.com/groups#update-a-group.
           * @param {string} groupId group id to update.
           * @param {string} name group name.
           * @param {Object} policy group policy. See https://docs.truevault.com/groups.
           * @returns {Promise.<Object>}
           */

        }, {
          key: 'updateGroup',
          value: function () {
            var _ref16 = _asyncToGenerator(regeneratorRuntime.mark(function _callee16(groupId, name, policy) {
              var formData, response;
              return regeneratorRuntime.wrap(function _callee16$(_context16) {
                while (1) {
                  switch (_context16.prev = _context16.next) {
                    case 0:
                      formData = new FormData();

                      if (!!name) {
                        formData.append("name", name);
                      }

                      if (!!policy) {
                        formData.append("policy", btoa(JSON.stringify(policy)));
                      }

                      _context16.next = 5;
                      return this.performRequest('v1/groups/' + groupId, {
                        method: 'PUT',
                        body: formData
                      });

                    case 5:
                      response = _context16.sent;
                      return _context16.abrupt('return', response.group);

                    case 7:
                    case 'end':
                      return _context16.stop();
                  }
                }
              }, _callee16, this);
            }));

            function updateGroup(_x23, _x24, _x25) {
              return _ref16.apply(this, arguments);
            }

            return updateGroup;
          }()

          /**
           * Delete a group. See https://docs.truevault.com/groups#delete-a-group.
           * @param {string} groupId group id to delete.
           * @returns {Promise.<Object>}
           */

        }, {
          key: 'deleteGroup',
          value: function () {
            var _ref17 = _asyncToGenerator(regeneratorRuntime.mark(function _callee17(groupId) {
              return regeneratorRuntime.wrap(function _callee17$(_context17) {
                while (1) {
                  switch (_context17.prev = _context17.next) {
                    case 0:
                      return _context17.abrupt('return', this.performRequest('v1/groups/' + groupId, {
                        method: 'DELETE'
                      }));

                    case 1:
                    case 'end':
                      return _context17.stop();
                  }
                }
              }, _callee17, this);
            }));

            function deleteGroup(_x26) {
              return _ref17.apply(this, arguments);
            }

            return deleteGroup;
          }()

          /**
           * List all groups. See https://docs.truevault.com/groups#list-all-groups.
           * @returns {Promise.<Array>}
           */

        }, {
          key: 'listGroups',
          value: function () {
            var _ref18 = _asyncToGenerator(regeneratorRuntime.mark(function _callee18() {
              var response;
              return regeneratorRuntime.wrap(function _callee18$(_context18) {
                while (1) {
                  switch (_context18.prev = _context18.next) {
                    case 0:
                      _context18.next = 2;
                      return this.performRequest('v1/groups');

                    case 2:
                      response = _context18.sent;
                      return _context18.abrupt('return', response.groups);

                    case 4:
                    case 'end':
                      return _context18.stop();
                  }
                }
              }, _callee18, this);
            }));

            function listGroups() {
              return _ref18.apply(this, arguments);
            }

            return listGroups;
          }()

          /**
           * Gets a group, including user ids. See https://docs.truevault.com/groups#read-a-group.
           * @param {string} groupId group id to get.
           * @returns {Promise.<Object>}
           */

        }, {
          key: 'getFullGroup',
          value: function () {
            var _ref19 = _asyncToGenerator(regeneratorRuntime.mark(function _callee19(groupId) {
              var response;
              return regeneratorRuntime.wrap(function _callee19$(_context19) {
                while (1) {
                  switch (_context19.prev = _context19.next) {
                    case 0:
                      _context19.next = 2;
                      return this.performRequest('v1/groups/' + groupId + '?full=true');

                    case 2:
                      response = _context19.sent;
                      return _context19.abrupt('return', response.group);

                    case 4:
                    case 'end':
                      return _context19.stop();
                  }
                }
              }, _callee19, this);
            }));

            function getFullGroup(_x27) {
              return _ref19.apply(this, arguments);
            }

            return getFullGroup;
          }()

          /**
           * Add users to a group. See https://docs.truevault.com/groups#add-users-to-a-group.
           * @param {string} groupId group to add to.
           * @param {Array} userIds user ids to add to the group.
           * @returns {Promise.<Object>}
           */

        }, {
          key: 'addUsersToGroup',
          value: function addUsersToGroup(groupId, userIds) {
            var headers = {
              'Content-Type': 'application/json'
            };

            return this.performRequest('v1/groups/' + groupId + '/membership', {
              method: 'POST',
              headers: headers,
              body: JSON.stringify({ user_ids: userIds })
            });
          }

          /**
           * Add users to a group returning user ids. See https://docs.truevault.com/groups#update-a-group.
           * @param {string} groupId group to add to.
           * @param {Array} userIds user ids to add to the group.
           * @returns {Promise.<Object>}
           */

        }, {
          key: 'addUsersToGroupReturnUserIds',
          value: function () {
            var _ref20 = _asyncToGenerator(regeneratorRuntime.mark(function _callee20(groupId, userIds) {
              var formData, response;
              return regeneratorRuntime.wrap(function _callee20$(_context20) {
                while (1) {
                  switch (_context20.prev = _context20.next) {
                    case 0:
                      formData = new FormData();

                      formData.append('operation', 'APPEND');
                      formData.append('user_ids', userIds.join(','));

                      _context20.next = 5;
                      return this.performRequest('v1/groups/' + groupId, {
                        method: 'PUT',
                        body: formData
                      });

                    case 5:
                      response = _context20.sent;
                      return _context20.abrupt('return', response.group);

                    case 7:
                    case 'end':
                      return _context20.stop();
                  }
                }
              }, _callee20, this);
            }));

            function addUsersToGroupReturnUserIds(_x28, _x29) {
              return _ref20.apply(this, arguments);
            }

            return addUsersToGroupReturnUserIds;
          }()

          /**
           * Remove users from a group. See https://docs.truevault.com/groups#update-a-group
           * @param {string} groupId group to remove from.
           * @param {Array} userIds user ids to remove from the group.
           * @returns {Promise.<Object>}
           */

        }, {
          key: 'removeUsersFromGroup',
          value: function () {
            var _ref21 = _asyncToGenerator(regeneratorRuntime.mark(function _callee21(groupId, userIds) {
              var formData, response;
              return regeneratorRuntime.wrap(function _callee21$(_context21) {
                while (1) {
                  switch (_context21.prev = _context21.next) {
                    case 0:
                      formData = new FormData();

                      formData.append('operation', 'REMOVE');
                      formData.append('user_ids', userIds.join(','));

                      _context21.next = 5;
                      return this.performRequest('v1/groups/' + groupId, {
                        method: 'PUT',
                        body: formData
                      });

                    case 5:
                      response = _context21.sent;
                      return _context21.abrupt('return', response.group);

                    case 7:
                    case 'end':
                      return _context21.stop();
                  }
                }
              }, _callee21, this);
            }));

            function removeUsersFromGroup(_x30, _x31) {
              return _ref21.apply(this, arguments);
            }

            return removeUsersFromGroup;
          }()

          /**
           * Perform a user search. See https://docs.truevault.com/documentsearch#search-users.
           * @param {Object} searchOption search query. See https://docs.truevault.com/documentsearch#defining-search-options.
           * @returns {Promise.<Object>}
           */

        }, {
          key: 'searchUsers',
          value: function searchUsers(searchOption) {
            var formData = new FormData();
            formData.append("search_option", btoa(JSON.stringify(searchOption)));

            return this.performRequest('v1/users/search', {
              method: 'POST',
              body: formData
            });
          }

          /**
           * Create a new vault. See https://docs.truevault.com/vaults#create-a-vault.
           * @param {string} name the name of the new vault.
           * @returns {Promise.<Object>}
           */

        }, {
          key: 'createVault',
          value: function createVault(name) {
            var formData = new FormData();
            formData.append("name", name);

            return this.performRequest('v1/vaults', {
              method: 'POST',
              body: formData
            });
          }

          /**
           * Create a new schema. See https://docs.truevault.com/schemas#create-a-schema.
           * @param {string} vaultId the vault that should contain the schema.
           * @param {string} name the name of the schema.
           * @param {Array} fields field metadata for the schema. See https://docs.truevault.com/schemas.
           * @returns {Promise.<Object>}
           */

        }, {
          key: 'createSchema',
          value: function createSchema(vaultId, name, fields) {
            var schemaDefinition = { name: name, fields: fields };
            var formData = new FormData();
            formData.append("schema", btoa(JSON.stringify(schemaDefinition)));

            return this.performRequest('v1/vaults/' + vaultId + '/schemas', {
              method: 'POST',
              body: formData
            });
          }

          /**
           * Create the user schema. See https://docs.truevault.com/schemas#create-the-user-schema
           * @param {string} accountId account id that the user schema belongs to.
           * @param {string} name the name of the schema.
           * @param {Array} fields field metadata for the schema. See https://docs.truevault.com/schemas.
           * @returns {Promise.<Object>}
           */

        }, {
          key: 'createUserSchema',
          value: function createUserSchema(accountId, name, fields) {
            var schemaDefinition = { name: name, fields: fields };
            var formData = new FormData();
            formData.append("schema", btoa(JSON.stringify(schemaDefinition)));

            return this.performRequest('v1/accounts/' + accountId + '/user_schema', {
              method: 'POST',
              body: formData
            });
          }

          /**
           * Read the user schema. See https://docs.truevault.com/schemas#read-the-user-schema
           * @param {string} accountId account id that the user schema belongs to.
           * @returns {Promise.<Object>}
           */

        }, {
          key: 'readUserSchema',
          value: function readUserSchema(accountId) {
            return this.performRequest('v1/accounts/' + accountId + '/user_schema', {
              method: 'GET',
              body: new FormData()
            });
          }

          /**
           * Update the user schema. See https://docs.truevault.com/schemas#create-the-user-schema
           * @param {string} accountId account id that the user schema belongs to.
           * @param {string} name the name of the schema.
           * @param {Array} fields field metadata for the schema. See https://docs.truevault.com/schemas.
           * @returns {Promise.<Object>}
           */

        }, {
          key: 'updateUserSchema',
          value: function updateUserSchema(accountId, name, fields) {
            var schemaDefinition = { name: name, fields: fields };
            var formData = new FormData();
            formData.append("schema", btoa(JSON.stringify(schemaDefinition)));

            return this.performRequest('v1/accounts/' + accountId + '/user_schema', {
              method: 'PUT',
              body: formData
            });
          }

          /**
           * Delete the user schema. See https://docs.truevault.com/schemas#create-the-user-schema
           * @param {string} accountId account id that the user schema belongs to.
           * @returns {Promise.<Object>}
           */

        }, {
          key: 'deleteUserSchema',
          value: function deleteUserSchema(accountId) {
            return this.performRequest('v1/accounts/' + accountId + '/user_schema', {
              method: 'DELETE',
              body: new FormData()
            });
          }

          /**
           * Create a new document. See https://docs.truevault.com/documents#create-a-document.
           * @param {string} vaultId vault to place the document in.
           * @param {string|null} schemaId schema to associate with the document.
           * @param {Object} document document contents.
           * @param {string|null} [ownerId] the document's owner.
           * @returns {Promise.<Object>}
           */

        }, {
          key: 'createDocument',
          value: function createDocument(vaultId, schemaId, document, ownerId) {
            var formData = new FormData();
            formData.append('document', btoa(JSON.stringify(document)));

            if (!!schemaId) {
              formData.append('schema_id', schemaId);
            }
            if (typeof ownerId === 'string') {
              formData.append('owner_id', ownerId);
            }
            return this.performRequest('v1/vaults/' + vaultId + '/documents', {
              method: 'POST',
              body: formData
            });
          }

          /**
           * List documents in a vault. See https://docs.truevault.com/documents#list-all-documents.
           * @param {string} vaultId vault to look in.
           * @param {boolean} full include document contents in listing.
           * @param {number} [page] which page to get, if pagination is needed.
           * @param {number} [perPage] number of documents per page.
           * @returns {Promise.<Object>}
           */

        }, {
          key: 'listDocuments',
          value: function () {
            var _ref22 = _asyncToGenerator(regeneratorRuntime.mark(function _callee22(vaultId, full, page, perPage) {
              var url, response;
              return regeneratorRuntime.wrap(function _callee22$(_context22) {
                while (1) {
                  switch (_context22.prev = _context22.next) {
                    case 0:
                      url = 'v1/vaults/' + vaultId + '/documents?';

                      if (!!full) {
                        url += '&full=' + full;
                      }
                      if (!!page) {
                        url += '&page=' + page;
                      }
                      if (!!perPage) {
                        url += '&per_page=' + perPage;
                      }
                      _context22.next = 6;
                      return this.performRequest(url);

                    case 6:
                      response = _context22.sent;

                      if (!!full) {
                        response.data.items = response.data.items.map(function (item) {
                          if (item.document) {
                            item.document = JSON.parse(atob(item.document));
                          }
                          return item;
                        });
                      }
                      return _context22.abrupt('return', response.data);

                    case 9:
                    case 'end':
                      return _context22.stop();
                  }
                }
              }, _callee22, this);
            }));

            function listDocuments(_x32, _x33, _x34, _x35) {
              return _ref22.apply(this, arguments);
            }

            return listDocuments;
          }()

          /**
           * Get the contents of one or more documents. See https://docs.truevault.com/documents#read-a-document.
           * @param {string} vaultId vault to look in.
           * @param {Array} documentIds document ids to retrieve.
           * @returns {Promise.<Array>}
           */

        }, {
          key: 'getDocuments',
          value: function () {
            var _ref23 = _asyncToGenerator(regeneratorRuntime.mark(function _callee23(vaultId, documentIds) {
              var requestDocumentIds, response, documents;
              return regeneratorRuntime.wrap(function _callee23$(_context23) {
                while (1) {
                  switch (_context23.prev = _context23.next) {
                    case 0:
                      requestDocumentIds = void 0;

                      if (!(documentIds.length === 0)) {
                        _context23.next = 5;
                        break;
                      }

                      return _context23.abrupt('return', []);

                    case 5:
                      if (documentIds.length === 1) {
                        // Sending a single ID to the API will only return the document's contents. In order to
                        // retrieve a proper multiget response with `id` and `owner_id`, we need to send a
                        // request with two instances of the same document ID. We will then only return the
                        // first result from the response.
                        requestDocumentIds = [documentIds[0], documentIds[0]];
                      } else {
                        requestDocumentIds = documentIds;
                      }

                    case 6:
                      _context23.next = 8;
                      return this.performRequest('v1/vaults/' + vaultId + '/documents/' + requestDocumentIds.join(','));

                    case 8:
                      response = _context23.sent;
                      documents = response.documents.map(function (doc) {
                        doc.document = JSON.parse(atob(doc.document));
                        return doc;
                      });

                      if (!(documentIds.length === 1)) {
                        _context23.next = 12;
                        break;
                      }

                      return _context23.abrupt('return', [documents[0]]);

                    case 12:
                      return _context23.abrupt('return', documents);

                    case 13:
                    case 'end':
                      return _context23.stop();
                  }
                }
              }, _callee23, this);
            }));

            function getDocuments(_x36, _x37) {
              return _ref23.apply(this, arguments);
            }

            return getDocuments;
          }()

          /**
           * Perform a search. See https://docs.truevault.com/documentsearch#search-documents.
           * @param {string} vaultId vault to search in.
           * @param {Object} searchOption search query. See https://docs.truevault.com/documentsearch#defining-search-options.
           * @returns {Promise.<Object>}
           */

        }, {
          key: 'searchDocuments',
          value: function searchDocuments(vaultId, searchOption) {
            var formData = new FormData();
            formData.append("search_option", btoa(JSON.stringify(searchOption)));

            return this.performRequest('v1/vaults/' + vaultId + '/search', {
              method: 'POST',
              body: formData
            });
          }

          /**
           * Update an existing document. See https://docs.truevault.com/documents#update-a-document.
           * @param {string} vaultId vault that contains the document.
           * @param {string} documentId document id to update.
           * @param {Object} document new document contents.
           * @param {string|null} [ownerId] the new document owner.
           * @returns {Promise.<Object>}
           */

        }, {
          key: 'updateDocument',
          value: function updateDocument(vaultId, documentId, document, ownerId) {
            var formData = new FormData();
            formData.append("document", btoa(JSON.stringify(document)));

            if (typeof ownerId === 'string') {
              formData.append("owner_id", ownerId);
            }

            return this.performRequest('v1/vaults/' + vaultId + '/documents/' + documentId, {
              method: 'PUT',
              body: formData
            });
          }

          /**
           * Update a document's owner. See https://docs.truevault.com/documents#update-a-document-s-owner.
           * @param {string} vaultId the vault containing the document.
           * @param {string} document id of the document.
           * @param {string} ownerId the new document owner, or '' to remove owner.
           * @returns {Promise.<Object>}
           */

        }, {
          key: 'updateDocumentOwner',
          value: function updateDocumentOwner(vaultId, documentId, ownerId) {
            var formData = new FormData();
            formData.append('owner_id', ownerId);

            return this.performRequest('v1/vaults/' + vaultId + '/documents/' + documentId + '/owner', {
              method: 'PUT',
              body: formData
            });
          }

          /**
           * Delete a document. See https://docs.truevault.com/documents#delete-a-document.
           * @param {string} vaultId vault that contains the document.
           * @param {string} documentId document id to delete.
           * @returns {Promise.<Object>}
           */

        }, {
          key: 'deleteDocument',
          value: function deleteDocument(vaultId, documentId) {
            return this.performRequest('v1/vaults/' + vaultId + '/documents/' + documentId, {
              method: 'DELETE'
            });
          }

          /**
           * Create a BLOB. See https://docs.truevault.com/blobs#create-a-blob.
           * @param {string} vaultId vault that will contain the blob.
           * @param {File|Blob} file the BLOB's contents.
           * @param {string|null} [ownerId] the BLOB's owner.
           * @returns {Promise.<Object>}
           */

        }, {
          key: 'createBlob',
          value: function createBlob(vaultId, file, ownerId) {
            var formData = new FormData();
            formData.append('file', file);

            if (typeof ownerId === 'string') {
              formData.append('owner_id', ownerId);
            }

            return this.performRequest('v1/vaults/' + vaultId + '/blobs', {
              method: 'POST',
              body: formData
            });
          }

          /**
           * Create a BLOB with a callback for progress updates. See https://docs.truevault.com/blobs#create-a-blob.
           * @param {string} vaultId vault that will contain the blob.
           * @param {File|Blob} file the BLOB's contents.
           * @param {function} progressCallback callback for XHR's `progress` and `load` events.
           * @param {string|null} [ownerId] the BLOB's owner.
           * @returns {Promise.<Object>}
           */

        }, {
          key: 'createBlobWithProgress',
          value: function createBlobWithProgress(vaultId, file, progressCallback, ownerId) {
            var _this = this;

            // We are using XMLHttpRequest here since fetch does not have a progress API
            return new Promise(function (resolve, reject) {
              var xhr = new XMLHttpRequest();

              var formData = new FormData();
              formData.append('file', file);

              if (typeof ownerId === 'string') {
                formData.append('owner_id', ownerId);
              }

              xhr.upload.addEventListener('progress', progressCallback);
              xhr.upload.addEventListener('load', progressCallback);
              xhr.open('post', _this.host + '/v1/vaults/' + vaultId + '/blobs');
              xhr.setRequestHeader('Authorization', _this.authHeader);
              xhr.onload = function () {
                var responseJson = JSON.parse(xhr.responseText);
                if (responseJson.result === 'error') {
                  var error = new Error(responseJson.error.message);
                  error.error = responseJson.error;
                  reject(error);
                } else {
                  resolve(responseJson);
                }
              };
              xhr.onerror = function () {
                return reject(Error('Network error'));
              };
              xhr.send(formData);
            });
          }

          /**
           * Get a BLOB's contents. See https://docs.truevault.com/blobs#read-a-blob.
           * @param {string} vaultId the vault containing the BLOB.
           * @param {string} blobId id of the BLOB.
           * @returns {Promise.<*>}
           */

        }, {
          key: 'getBlob',
          value: function () {
            var _ref24 = _asyncToGenerator(regeneratorRuntime.mark(function _callee24(vaultId, blobId) {
              var headers, response;
              return regeneratorRuntime.wrap(function _callee24$(_context24) {
                while (1) {
                  switch (_context24.prev = _context24.next) {
                    case 0:
                      headers = {
                        Authorization: this.authHeader
                      };
                      _context24.next = 3;
                      return fetch(this.host + '/v1/vaults/' + vaultId + '/blobs/' + blobId, {
                        headers: headers
                      });

                    case 3:
                      response = _context24.sent;
                      return _context24.abrupt('return', response.blob());

                    case 5:
                    case 'end':
                      return _context24.stop();
                  }
                }
              }, _callee24, this);
            }));

            function getBlob(_x38, _x39) {
              return _ref24.apply(this, arguments);
            }

            return getBlob;
          }()

          /**
           * List the BLOBs in a vault. See https://docs.truevault.com/blobs#list-all-blobs.
           * @param {string} vaultId the vault to list.
           * @param {number} [page] if paginating, the page.
           * @param {number} [perPage] if paginating, the number of items per page.
           * @returns {Promise.<Object>}
           */

        }, {
          key: 'listBlobs',
          value: function () {
            var _ref25 = _asyncToGenerator(regeneratorRuntime.mark(function _callee25(vaultId, page, perPage) {
              var url, response;
              return regeneratorRuntime.wrap(function _callee25$(_context25) {
                while (1) {
                  switch (_context25.prev = _context25.next) {
                    case 0:
                      url = 'v1/vaults/' + vaultId + '/blobs?';

                      if (!!page) {
                        url += '&page=' + page;
                      }
                      if (!!perPage) {
                        url += '&per_page=' + perPage;
                      }
                      _context25.next = 5;
                      return this.performRequest(url);

                    case 5:
                      response = _context25.sent;
                      return _context25.abrupt('return', response.data);

                    case 7:
                    case 'end':
                      return _context25.stop();
                  }
                }
              }, _callee25, this);
            }));

            function listBlobs(_x40, _x41, _x42) {
              return _ref25.apply(this, arguments);
            }

            return listBlobs;
          }()

          /**
           * Update a BLOB's contents. See https://docs.truevault.com/blobs#update-a-blob.
           * @param {string} vaultId the vault containing the BLOB.
           * @param {string} blobId id of the BLOB.
           * @param {File|Blob} file the BLOB's contents.
           * @param {string|null} [ownerId] the new BLOB owner.
           * @returns {Promise.<Object>}
           */

        }, {
          key: 'updateBlob',
          value: function updateBlob(vaultId, blobId, file, ownerId) {
            var formData = new FormData();
            formData.append('file', file);

            if (typeof ownerId === 'string') {
              formData.append('owner_id', ownerId);
            }

            return this.performRequest('v1/vaults/' + vaultId + '/blobs/' + blobId, {
              method: 'PUT',
              body: formData
            });
          }

          /**
           * Update a BLOB's owner. See https://docs.truevault.com/blobs#update-a-blob-s-owner.
           * @param {string} vaultId the vault containing the BLOB.
           * @param {string} blobId id of the BLOB.
           * @param {string} ownerId the new BLOB owner, or '' to remove owner.
           * @returns {Promise.<Object>}
           */

        }, {
          key: 'updateBlobOwner',
          value: function updateBlobOwner(vaultId, blobId, ownerId) {
            var formData = new FormData();
            formData.append('owner_id', ownerId);

            return this.performRequest('v1/vaults/' + vaultId + '/blobs/' + blobId + '/owner', {
              method: 'PUT',
              body: formData
            });
          }

          /**
           * Delete a BLOB. See https://docs.truevault.com/blobs#delete-a-blob.
           * @param {string} vaultId the vault containing the BLOB.
           * @param {string} blobId the BLOB to delete.
           * @returns {Promise.<Object>}
           */

        }, {
          key: 'deleteBlob',
          value: function deleteBlob(vaultId, blobId) {
            return this.performRequest('v1/vaults/' + vaultId + '/blobs/' + blobId, {
              method: 'DELETE'
            });
          }

          /**
           * Send an email to a user via Sendgrid. See https://docs.truevault.com/email#email-a-user.
           * @param {string} sendgridApiKey Sendgrid API key.
           * @param {string} userId the user to send to.
           * @param {string} sendgridTemplateId the Sendgrid template to use.
           * @param {string} fromEmailSpecifier the specifier for the "From" address. See https://docs.truevault.com/email#value-specifiers.
           * @param {string} toEmailSpecifier the specifier for the "To" address. See https://docs.truevault.com/email#value-specifiers.
           * @param {Object} substitutions substitutions to use in the template. See https://docs.truevault.com/email#template-substitution.
           * @returns {Promise.<String>}
           */

        }, {
          key: 'sendEmailSendgrid',
          value: function () {
            var _ref26 = _asyncToGenerator(regeneratorRuntime.mark(function _callee26(sendgridApiKey, userId, sendgridTemplateId, fromEmailSpecifier, toEmailSpecifier, substitutions) {
              var headers, response;
              return regeneratorRuntime.wrap(function _callee26$(_context26) {
                while (1) {
                  switch (_context26.prev = _context26.next) {
                    case 0:
                      headers = {
                        'Content-Type': 'application/json'
                      };
                      _context26.next = 3;
                      return this.performRequest('v1/users/' + userId + '/message/email', {
                        method: 'POST',
                        headers: headers,
                        body: JSON.stringify({
                          provider: 'SENDGRID',
                          auth: { sendgrid_api_key: sendgridApiKey },
                          template_id: sendgridTemplateId,
                          from_email_address: fromEmailSpecifier,
                          to_email_address: toEmailSpecifier,
                          substitutions: substitutions
                        })
                      });

                    case 3:
                      response = _context26.sent;
                      return _context26.abrupt('return', response.provider_message_id);

                    case 5:
                    case 'end':
                      return _context26.stop();
                  }
                }
              }, _callee26, this);
            }));

            function sendEmailSendgrid(_x43, _x44, _x45, _x46, _x47, _x48) {
              return _ref26.apply(this, arguments);
            }

            return sendEmailSendgrid;
          }()

          /**
           * Send an SMS message to a user via Twilio.
           * @param {string} twilioAccountSid Twilio Account Sid. See https://www.twilio.com/console
           * @param {string} twilioKeySid Twilio Key Sid. See https://www.twilio.com/docs/api/rest/keys
           * @param {string} twilioKeySecret Twilio Key Secret. See https://www.twilio.com/docs/api/rest/keys
           * @param {string} userId the user to send to.
           * @param {string} fromNumberSpecifier the specifier for the "From" phone number. See https://docs.truevault.com/email#value-specifiers.
           * @param {string} toNumberSpecifier the specifier for the "To" phone number. See https://docs.truevault.com/email#value-specifiers.
           * @param {Object} messageBody The text to send in the body of the message
           * @param {Array} mediaURLs Optional array of value specifiers producing URLs of images to include in the message. See https://docs.truevault.com/email#value-specifiers.
           * @returns {Promise.<String>}
           */

        }, {
          key: 'sendSMSTwilio',
          value: function () {
            var _ref27 = _asyncToGenerator(regeneratorRuntime.mark(function _callee27(twilioAccountSid, twilioKeySid, twilioKeySecret, userId, fromNumberSpecifier, toNumberSpecifier, messageBody, mediaURLs) {
              var headers, response;
              return regeneratorRuntime.wrap(function _callee27$(_context27) {
                while (1) {
                  switch (_context27.prev = _context27.next) {
                    case 0:
                      headers = {
                        'Content-Type': 'application/json'
                      };
                      _context27.next = 3;
                      return this.performRequest('v1/users/' + userId + '/message/sms', {
                        method: 'POST',
                        headers: headers,
                        body: JSON.stringify({
                          provider: 'TWILIO',
                          auth: {
                            account_sid: twilioAccountSid,
                            username: twilioKeySid,
                            password: twilioKeySecret
                          },
                          from_number: fromNumberSpecifier,
                          to_number: toNumberSpecifier,
                          message_body: messageBody,
                          media_urls: mediaURLs || []
                        })
                      });

                    case 3:
                      response = _context27.sent;
                      return _context27.abrupt('return', response.provider_message_id);

                    case 5:
                    case 'end':
                      return _context27.stop();
                  }
                }
              }, _callee27, this);
            }));

            function sendSMSTwilio(_x49, _x50, _x51, _x52, _x53, _x54, _x55, _x56) {
              return _ref27.apply(this, arguments);
            }

            return sendSMSTwilio;
          }()

          /**
           * Create a password reset flow. See https://docs.truevault.com/PasswordResetFlow.html.
           * @param {string} name name of this flow
           * @param {string} sendGridTemplateId SendGrid template id to use when sending password reset emails
           * @param {string} sendGridApiKey SendGrid API key
           * @param {Object} userEmailValueSpec Value specifier for the "To" address. See https://docs.truevault.com/email#value-specifiers.
           * @param {Object} fromEmailValueSpec Value specifier for the "From" address. See https://docs.truevault.com/email#value-specifiers.
           * @param {Object} substitutions substitutions to use in the template. See https://docs.truevault.com/email#template-substitution.
           * @returns {Promise.<Object>}
           */

        }, {
          key: 'createPasswordResetFlow',
          value: function () {
            var _ref28 = _asyncToGenerator(regeneratorRuntime.mark(function _callee28(name, sendGridTemplateId, sendGridApiKey, userEmailValueSpec, fromEmailValueSpec, substitutions) {
              var headers, response;
              return regeneratorRuntime.wrap(function _callee28$(_context28) {
                while (1) {
                  switch (_context28.prev = _context28.next) {
                    case 0:
                      headers = {
                        'Content-Type': 'application/json'
                      };
                      _context28.next = 3;
                      return this.performRequest('v1/password_reset_flows', {
                        method: 'POST',
                        headers: headers,
                        body: JSON.stringify({
                          name: name,
                          sg_api_key: sendGridApiKey,
                          sg_template_id: sendGridTemplateId,
                          user_email_value_spec: userEmailValueSpec,
                          from_email_value_spec: fromEmailValueSpec,
                          substitutions: substitutions
                        })
                      });

                    case 3:
                      response = _context28.sent;
                      return _context28.abrupt('return', response.password_reset_flow);

                    case 5:
                    case 'end':
                      return _context28.stop();
                  }
                }
              }, _callee28, this);
            }));

            function createPasswordResetFlow(_x57, _x58, _x59, _x60, _x61, _x62) {
              return _ref28.apply(this, arguments);
            }

            return createPasswordResetFlow;
          }()

          /**
           * List password reset flows. See https://docs.truevault.com/PasswordResetFlow.html.
           * @returns {Promise.<Object>}
           */

        }, {
          key: 'listPasswordResetFlows',
          value: function () {
            var _ref29 = _asyncToGenerator(regeneratorRuntime.mark(function _callee29() {
              var headers, response;
              return regeneratorRuntime.wrap(function _callee29$(_context29) {
                while (1) {
                  switch (_context29.prev = _context29.next) {
                    case 0:
                      headers = {
                        'Content-Type': 'application/json'
                      };
                      _context29.next = 3;
                      return this.performRequest('v1/password_reset_flows', {
                        headers: headers
                      });

                    case 3:
                      response = _context29.sent;
                      return _context29.abrupt('return', response.password_reset_flows);

                    case 5:
                    case 'end':
                      return _context29.stop();
                  }
                }
              }, _callee29, this);
            }));

            function listPasswordResetFlows() {
              return _ref29.apply(this, arguments);
            }

            return listPasswordResetFlows;
          }()

          /**
           * Send a password reset email to a user. See https://docs.truevault.com/PasswordResetFlow.html.
           * @param {string} flowId the flow to use to send a password reset email
           * @param {string} username
           * @returns {Promise.<Object>}
           */

        }, {
          key: 'sendPasswordResetEmail',
          value: function sendPasswordResetEmail(flowId, username) {
            var headers = {
              'Content-Type': 'application/json'
            };
            return this.performRequest('v1/password_reset_flows/' + flowId + '/email', {
              method: 'POST',
              headers: headers,
              body: JSON.stringify({
                username: username
              })
            });
          }
        }], [{
          key: 'login',
          value: function () {
            var _ref30 = _asyncToGenerator(regeneratorRuntime.mark(function _callee30(accountId, username, password, mfaCode, host) {
              var accessToken;
              return regeneratorRuntime.wrap(function _callee30$(_context30) {
                while (1) {
                  switch (_context30.prev = _context30.next) {
                    case 0:
                      _context30.next = 2;
                      return TrueVaultClient.generateAccessToken(accountId, username, password, mfaCode, host);

                    case 2:
                      accessToken = _context30.sent;
                      return _context30.abrupt('return', new TrueVaultClient({ 'accessToken': accessToken }, host));

                    case 4:
                    case 'end':
                      return _context30.stop();
                  }
                }
              }, _callee30, this);
            }));

            function login(_x63, _x64, _x65, _x66, _x67) {
              return _ref30.apply(this, arguments);
            }

            return login;
          }()

          /**
           * Log in with a username and password and return the resulting access token.
           * See https://docs.truevault.com/authentication#login-a-user.
           * @param {string} accountId account id that the user belongs to.
           * @param {string} username user's username.
           * @param {string} password user's password.
           * @param {string} [mfaCode] current MFA code, if user has MFA configured.
           * @param {string} [host] host optional parameter specifying TV API host; defaults to https://api.truevault.com
           * @returns {Promise.<string>}
           */

        }, {
          key: 'generateAccessToken',
          value: function () {
            var _ref31 = _asyncToGenerator(regeneratorRuntime.mark(function _callee31(accountId, username, password, mfaCode, host) {
              var formData, tvClient, response;
              return regeneratorRuntime.wrap(function _callee31$(_context31) {
                while (1) {
                  switch (_context31.prev = _context31.next) {
                    case 0:
                      formData = new FormData();

                      formData.append("account_id", accountId);
                      formData.append("username", username);
                      formData.append("password", password);
                      if (!!mfaCode) {
                        formData.append("mfa_code", mfaCode);
                      }

                      tvClient = new TrueVaultClient(null, host);
                      _context31.next = 8;
                      return tvClient.performRequest('v1/auth/login', {
                        method: 'POST',
                        body: formData
                      });

                    case 8:
                      response = _context31.sent;
                      return _context31.abrupt('return', response.user.access_token);

                    case 10:
                    case 'end':
                      return _context31.stop();
                  }
                }
              }, _callee31, this);
            }));

            function generateAccessToken(_x68, _x69, _x70, _x71, _x72) {
              return _ref31.apply(this, arguments);
            }

            return generateAccessToken;
          }()
        }, {
          key: '_makeHeaderForUsername',
          value: function _makeHeaderForUsername(username) {
            return 'Basic ' + btoa(username + ':');
          }
        }]);

        return TrueVaultClient;
      }();

      module.exports = TrueVaultClient;

      /***/
    },
    /* 118 */
    /***/function (module, exports, __webpack_require__) {

      "use strict";
      /* WEBPACK VAR INJECTION */
      (function (global) {

        __webpack_require__(299);

        __webpack_require__(300);

        __webpack_require__(119);

        if (global._babelPolyfill) {
          throw new Error("only one instance of babel-polyfill is allowed");
        }
        global._babelPolyfill = true;

        var DEFINE_PROPERTY = "defineProperty";
        function define(O, key, value) {
          O[key] || Object[DEFINE_PROPERTY](O, key, {
            writable: true,
            configurable: true,
            value: value
          });
        }

        define(String.prototype, "padLeft", "".padStart);
        define(String.prototype, "padRight", "".padEnd);

        "pop,reverse,shift,keys,values,entries,indexOf,every,some,forEach,map,filter,find,findIndex,includes,join,slice,concat,push,splice,unshift,sort,lastIndexOf,reduce,reduceRight,copyWithin,fill".split(",").forEach(function (key) {
          [][key] && define(Array, key, Function.call.bind([][key]));
        });
        /* WEBPACK VAR INJECTION */
      }).call(exports, __webpack_require__(85));

      /***/
    },
    /* 119 */
    /***/function (module, exports, __webpack_require__) {

      __webpack_require__(128);
      module.exports = __webpack_require__(24).RegExp.escape;

      /***/
    },
    /* 120 */
    /***/function (module, exports, __webpack_require__) {

      var isObject = __webpack_require__(4),
          isArray = __webpack_require__(67),
          SPECIES = __webpack_require__(5)('species');

      module.exports = function (original) {
        var C;
        if (isArray(original)) {
          C = original.constructor;
          // cross-realm fallback
          if (typeof C == 'function' && (C === Array || isArray(C.prototype))) C = undefined;
          if (isObject(C)) {
            C = C[SPECIES];
            if (C === null) C = undefined;
          }
        }return C === undefined ? Array : C;
      };

      /***/
    },
    /* 121 */
    /***/function (module, exports, __webpack_require__) {

      // 9.4.2.3 ArraySpeciesCreate(originalArray, length)
      var speciesConstructor = __webpack_require__(120);

      module.exports = function (original, length) {
        return new (speciesConstructor(original))(length);
      };

      /***/
    },
    /* 122 */
    /***/function (module, exports, __webpack_require__) {

      "use strict";

      var anObject = __webpack_require__(1),
          toPrimitive = __webpack_require__(23),
          NUMBER = 'number';

      module.exports = function (hint) {
        if (hint !== 'string' && hint !== NUMBER && hint !== 'default') throw TypeError('Incorrect hint');
        return toPrimitive(anObject(this), hint != NUMBER);
      };

      /***/
    },
    /* 123 */
    /***/function (module, exports, __webpack_require__) {

      // all enumerable object keys, includes symbols
      var getKeys = __webpack_require__(35),
          gOPS = __webpack_require__(56),
          pIE = __webpack_require__(47);
      module.exports = function (it) {
        var result = getKeys(it),
            getSymbols = gOPS.f;
        if (getSymbols) {
          var symbols = getSymbols(it),
              isEnum = pIE.f,
              i = 0,
              key;
          while (symbols.length > i) {
            if (isEnum.call(it, key = symbols[i++])) result.push(key);
          }
        }return result;
      };

      /***/
    },
    /* 124 */
    /***/function (module, exports, __webpack_require__) {

      var getKeys = __webpack_require__(35),
          toIObject = __webpack_require__(15);
      module.exports = function (object, el) {
        var O = toIObject(object),
            keys = getKeys(O),
            length = keys.length,
            index = 0,
            key;
        while (length > index) {
          if (O[key = keys[index++]] === el) return key;
        }
      };

      /***/
    },
    /* 125 */
    /***/function (module, exports, __webpack_require__) {

      "use strict";

      var path = __webpack_require__(126),
          invoke = __webpack_require__(52),
          aFunction = __webpack_require__(11);
      module.exports = function () /* ...pargs */{
        var fn = aFunction(this),
            length = arguments.length,
            pargs = Array(length),
            i = 0,
            _ = path._,
            holder = false;
        while (length > i) {
          if ((pargs[i] = arguments[i++]) === _) holder = true;
        }return function () /* ...args */{
          var that = this,
              aLen = arguments.length,
              j = 0,
              k = 0,
              args;
          if (!holder && !aLen) return invoke(fn, pargs, that);
          args = pargs.slice();
          if (holder) for (; length > j; j++) {
            if (args[j] === _) args[j] = arguments[k++];
          }while (aLen > k) {
            args.push(arguments[k++]);
          }return invoke(fn, args, that);
        };
      };

      /***/
    },
    /* 126 */
    /***/function (module, exports, __webpack_require__) {

      module.exports = __webpack_require__(2);

      /***/
    },
    /* 127 */
    /***/function (module, exports) {

      module.exports = function (regExp, replace) {
        var replacer = replace === Object(replace) ? function (part) {
          return replace[part];
        } : replace;
        return function (it) {
          return String(it).replace(regExp, replacer);
        };
      };

      /***/
    },
    /* 128 */
    /***/function (module, exports, __webpack_require__) {

      // https://github.com/benjamingr/RexExp.escape
      var $export = __webpack_require__(0),
          $re = __webpack_require__(127)(/[\\^$*+?.()|[\]{}]/g, '\\$&');

      $export($export.S, 'RegExp', { escape: function escape(it) {
          return $re(it);
        } });

      /***/
    },
    /* 129 */
    /***/function (module, exports, __webpack_require__) {

      // 22.1.3.3 Array.prototype.copyWithin(target, start, end = this.length)
      var $export = __webpack_require__(0);

      $export($export.P, 'Array', { copyWithin: __webpack_require__(87) });

      __webpack_require__(40)('copyWithin');

      /***/
    },
    /* 130 */
    /***/function (module, exports, __webpack_require__) {

      "use strict";

      var $export = __webpack_require__(0),
          $every = __webpack_require__(21)(4);

      $export($export.P + $export.F * !__webpack_require__(20)([].every, true), 'Array', {
        // 22.1.3.5 / 15.4.4.16 Array.prototype.every(callbackfn [, thisArg])
        every: function every(callbackfn /* , thisArg */) {
          return $every(this, callbackfn, arguments[1]);
        }
      });

      /***/
    },
    /* 131 */
    /***/function (module, exports, __webpack_require__) {

      // 22.1.3.6 Array.prototype.fill(value, start = 0, end = this.length)
      var $export = __webpack_require__(0);

      $export($export.P, 'Array', { fill: __webpack_require__(59) });

      __webpack_require__(40)('fill');

      /***/
    },
    /* 132 */
    /***/function (module, exports, __webpack_require__) {

      "use strict";

      var $export = __webpack_require__(0),
          $filter = __webpack_require__(21)(2);

      $export($export.P + $export.F * !__webpack_require__(20)([].filter, true), 'Array', {
        // 22.1.3.7 / 15.4.4.20 Array.prototype.filter(callbackfn [, thisArg])
        filter: function filter(callbackfn /* , thisArg */) {
          return $filter(this, callbackfn, arguments[1]);
        }
      });

      /***/
    },
    /* 133 */
    /***/function (module, exports, __webpack_require__) {

      "use strict";

      // 22.1.3.9 Array.prototype.findIndex(predicate, thisArg = undefined)

      var $export = __webpack_require__(0),
          $find = __webpack_require__(21)(6),
          KEY = 'findIndex',
          forced = true;
      // Shouldn't skip holes
      if (KEY in []) Array(1)[KEY](function () {
        forced = false;
      });
      $export($export.P + $export.F * forced, 'Array', {
        findIndex: function findIndex(callbackfn /*, that = undefined */) {
          return $find(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);
        }
      });
      __webpack_require__(40)(KEY);

      /***/
    },
    /* 134 */
    /***/function (module, exports, __webpack_require__) {

      "use strict";

      // 22.1.3.8 Array.prototype.find(predicate, thisArg = undefined)

      var $export = __webpack_require__(0),
          $find = __webpack_require__(21)(5),
          KEY = 'find',
          forced = true;
      // Shouldn't skip holes
      if (KEY in []) Array(1)[KEY](function () {
        forced = false;
      });
      $export($export.P + $export.F * forced, 'Array', {
        find: function find(callbackfn /*, that = undefined */) {
          return $find(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);
        }
      });
      __webpack_require__(40)(KEY);

      /***/
    },
    /* 135 */
    /***/function (module, exports, __webpack_require__) {

      "use strict";

      var $export = __webpack_require__(0),
          $forEach = __webpack_require__(21)(0),
          STRICT = __webpack_require__(20)([].forEach, true);

      $export($export.P + $export.F * !STRICT, 'Array', {
        // 22.1.3.10 / 15.4.4.18 Array.prototype.forEach(callbackfn [, thisArg])
        forEach: function forEach(callbackfn /* , thisArg */) {
          return $forEach(this, callbackfn, arguments[1]);
        }
      });

      /***/
    },
    /* 136 */
    /***/function (module, exports, __webpack_require__) {

      "use strict";

      var ctx = __webpack_require__(25),
          $export = __webpack_require__(0),
          toObject = __webpack_require__(9),
          call = __webpack_require__(96),
          isArrayIter = __webpack_require__(66),
          toLength = __webpack_require__(8),
          createProperty = __webpack_require__(60),
          getIterFn = __webpack_require__(83);

      $export($export.S + $export.F * !__webpack_require__(54)(function (iter) {
        Array.from(iter);
      }), 'Array', {
        // 22.1.2.1 Array.from(arrayLike, mapfn = undefined, thisArg = undefined)
        from: function from(arrayLike /*, mapfn = undefined, thisArg = undefined*/) {
          var O = toObject(arrayLike),
              C = typeof this == 'function' ? this : Array,
              aLen = arguments.length,
              mapfn = aLen > 1 ? arguments[1] : undefined,
              mapping = mapfn !== undefined,
              index = 0,
              iterFn = getIterFn(O),
              length,
              result,
              step,
              iterator;
          if (mapping) mapfn = ctx(mapfn, aLen > 2 ? arguments[2] : undefined, 2);
          // if object isn't iterable or it's array with default iterator - use simple case
          if (iterFn != undefined && !(C == Array && isArrayIter(iterFn))) {
            for (iterator = iterFn.call(O), result = new C(); !(step = iterator.next()).done; index++) {
              createProperty(result, index, mapping ? call(iterator, mapfn, [step.value, index], true) : step.value);
            }
          } else {
            length = toLength(O.length);
            for (result = new C(length); length > index; index++) {
              createProperty(result, index, mapping ? mapfn(O[index], index) : O[index]);
            }
          }
          result.length = index;
          return result;
        }
      });

      /***/
    },
    /* 137 */
    /***/function (module, exports, __webpack_require__) {

      "use strict";

      var $export = __webpack_require__(0),
          $indexOf = __webpack_require__(48)(false),
          $native = [].indexOf,
          NEGATIVE_ZERO = !!$native && 1 / [1].indexOf(1, -0) < 0;

      $export($export.P + $export.F * (NEGATIVE_ZERO || !__webpack_require__(20)($native)), 'Array', {
        // 22.1.3.11 / 15.4.4.14 Array.prototype.indexOf(searchElement [, fromIndex])
        indexOf: function indexOf(searchElement /*, fromIndex = 0 */) {
          return NEGATIVE_ZERO
          // convert -0 to +0
          ? $native.apply(this, arguments) || 0 : $indexOf(this, searchElement, arguments[1]);
        }
      });

      /***/
    },
    /* 138 */
    /***/function (module, exports, __webpack_require__) {

      // 22.1.2.2 / 15.4.3.2 Array.isArray(arg)
      var $export = __webpack_require__(0);

      $export($export.S, 'Array', { isArray: __webpack_require__(67) });

      /***/
    },
    /* 139 */
    /***/function (module, exports, __webpack_require__) {

      "use strict";

      // 22.1.3.13 Array.prototype.join(separator)

      var $export = __webpack_require__(0),
          toIObject = __webpack_require__(15),
          arrayJoin = [].join;

      // fallback for not array-like strings
      $export($export.P + $export.F * (__webpack_require__(46) != Object || !__webpack_require__(20)(arrayJoin)), 'Array', {
        join: function join(separator) {
          return arrayJoin.call(toIObject(this), separator === undefined ? ',' : separator);
        }
      });

      /***/
    },
    /* 140 */
    /***/function (module, exports, __webpack_require__) {

      "use strict";

      var $export = __webpack_require__(0),
          toIObject = __webpack_require__(15),
          toInteger = __webpack_require__(30),
          toLength = __webpack_require__(8),
          $native = [].lastIndexOf,
          NEGATIVE_ZERO = !!$native && 1 / [1].lastIndexOf(1, -0) < 0;

      $export($export.P + $export.F * (NEGATIVE_ZERO || !__webpack_require__(20)($native)), 'Array', {
        // 22.1.3.14 / 15.4.4.15 Array.prototype.lastIndexOf(searchElement [, fromIndex])
        lastIndexOf: function lastIndexOf(searchElement /*, fromIndex = @[*-1] */) {
          // convert -0 to +0
          if (NEGATIVE_ZERO) return $native.apply(this, arguments) || 0;
          var O = toIObject(this),
              length = toLength(O.length),
              index = length - 1;
          if (arguments.length > 1) index = Math.min(index, toInteger(arguments[1]));
          if (index < 0) index = length + index;
          for (; index >= 0; index--) {
            if (index in O) if (O[index] === searchElement) return index || 0;
          }return -1;
        }
      });

      /***/
    },
    /* 141 */
    /***/function (module, exports, __webpack_require__) {

      "use strict";

      var $export = __webpack_require__(0),
          $map = __webpack_require__(21)(1);

      $export($export.P + $export.F * !__webpack_require__(20)([].map, true), 'Array', {
        // 22.1.3.15 / 15.4.4.19 Array.prototype.map(callbackfn [, thisArg])
        map: function map(callbackfn /* , thisArg */) {
          return $map(this, callbackfn, arguments[1]);
        }
      });

      /***/
    },
    /* 142 */
    /***/function (module, exports, __webpack_require__) {

      "use strict";

      var $export = __webpack_require__(0),
          createProperty = __webpack_require__(60);

      // WebKit Array.of isn't generic
      $export($export.S + $export.F * __webpack_require__(3)(function () {
        function F() {}
        return !(Array.of.call(F) instanceof F);
      }), 'Array', {
        // 22.1.2.3 Array.of( ...items)
        of: function of() /* ...args */{
          var index = 0,
              aLen = arguments.length,
              result = new (typeof this == 'function' ? this : Array)(aLen);
          while (aLen > index) {
            createProperty(result, index, arguments[index++]);
          }result.length = aLen;
          return result;
        }
      });

      /***/
    },
    /* 143 */
    /***/function (module, exports, __webpack_require__) {

      "use strict";

      var $export = __webpack_require__(0),
          $reduce = __webpack_require__(89);

      $export($export.P + $export.F * !__webpack_require__(20)([].reduceRight, true), 'Array', {
        // 22.1.3.19 / 15.4.4.22 Array.prototype.reduceRight(callbackfn [, initialValue])
        reduceRight: function reduceRight(callbackfn /* , initialValue */) {
          return $reduce(this, callbackfn, arguments.length, arguments[1], true);
        }
      });

      /***/
    },
    /* 144 */
    /***/function (module, exports, __webpack_require__) {

      "use strict";

      var $export = __webpack_require__(0),
          $reduce = __webpack_require__(89);

      $export($export.P + $export.F * !__webpack_require__(20)([].reduce, true), 'Array', {
        // 22.1.3.18 / 15.4.4.21 Array.prototype.reduce(callbackfn [, initialValue])
        reduce: function reduce(callbackfn /* , initialValue */) {
          return $reduce(this, callbackfn, arguments.length, arguments[1], false);
        }
      });

      /***/
    },
    /* 145 */
    /***/function (module, exports, __webpack_require__) {

      "use strict";

      var $export = __webpack_require__(0),
          html = __webpack_require__(64),
          cof = __webpack_require__(18),
          toIndex = __webpack_require__(38),
          toLength = __webpack_require__(8),
          arraySlice = [].slice;

      // fallback for not array-like ES3 strings and DOM objects
      $export($export.P + $export.F * __webpack_require__(3)(function () {
        if (html) arraySlice.call(html);
      }), 'Array', {
        slice: function slice(begin, end) {
          var len = toLength(this.length),
              klass = cof(this);
          end = end === undefined ? len : end;
          if (klass == 'Array') return arraySlice.call(this, begin, end);
          var start = toIndex(begin, len),
              upTo = toIndex(end, len),
              size = toLength(upTo - start),
              cloned = Array(size),
              i = 0;
          for (; i < size; i++) {
            cloned[i] = klass == 'String' ? this.charAt(start + i) : this[start + i];
          }return cloned;
        }
      });

      /***/
    },
    /* 146 */
    /***/function (module, exports, __webpack_require__) {

      "use strict";

      var $export = __webpack_require__(0),
          $some = __webpack_require__(21)(3);

      $export($export.P + $export.F * !__webpack_require__(20)([].some, true), 'Array', {
        // 22.1.3.23 / 15.4.4.17 Array.prototype.some(callbackfn [, thisArg])
        some: function some(callbackfn /* , thisArg */) {
          return $some(this, callbackfn, arguments[1]);
        }
      });

      /***/
    },
    /* 147 */
    /***/function (module, exports, __webpack_require__) {

      "use strict";

      var $export = __webpack_require__(0),
          aFunction = __webpack_require__(11),
          toObject = __webpack_require__(9),
          fails = __webpack_require__(3),
          $sort = [].sort,
          test = [1, 2, 3];

      $export($export.P + $export.F * (fails(function () {
        // IE8-
        test.sort(undefined);
      }) || !fails(function () {
        // V8 bug
        test.sort(null);
        // Old WebKit
      }) || !__webpack_require__(20)($sort)), 'Array', {
        // 22.1.3.25 Array.prototype.sort(comparefn)
        sort: function sort(comparefn) {
          return comparefn === undefined ? $sort.call(toObject(this)) : $sort.call(toObject(this), aFunction(comparefn));
        }
      });

      /***/
    },
    /* 148 */
    /***/function (module, exports, __webpack_require__) {

      __webpack_require__(37)('Array');

      /***/
    },
    /* 149 */
    /***/function (module, exports, __webpack_require__) {

      // 20.3.3.1 / 15.9.4.4 Date.now()
      var $export = __webpack_require__(0);

      $export($export.S, 'Date', { now: function now() {
          return new Date().getTime();
        } });

      /***/
    },
    /* 150 */
    /***/function (module, exports, __webpack_require__) {

      "use strict";

      // 20.3.4.36 / 15.9.5.43 Date.prototype.toISOString()

      var $export = __webpack_require__(0),
          fails = __webpack_require__(3),
          getTime = Date.prototype.getTime;

      var lz = function lz(num) {
        return num > 9 ? num : '0' + num;
      };

      // PhantomJS / old WebKit has a broken implementations
      $export($export.P + $export.F * (fails(function () {
        return new Date(-5e13 - 1).toISOString() != '0385-07-25T07:06:39.999Z';
      }) || !fails(function () {
        new Date(NaN).toISOString();
      })), 'Date', {
        toISOString: function toISOString() {
          if (!isFinite(getTime.call(this))) throw RangeError('Invalid time value');
          var d = this,
              y = d.getUTCFullYear(),
              m = d.getUTCMilliseconds(),
              s = y < 0 ? '-' : y > 9999 ? '+' : '';
          return s + ('00000' + Math.abs(y)).slice(s ? -6 : -4) + '-' + lz(d.getUTCMonth() + 1) + '-' + lz(d.getUTCDate()) + 'T' + lz(d.getUTCHours()) + ':' + lz(d.getUTCMinutes()) + ':' + lz(d.getUTCSeconds()) + '.' + (m > 99 ? m : '0' + lz(m)) + 'Z';
        }
      });

      /***/
    },
    /* 151 */
    /***/function (module, exports, __webpack_require__) {

      "use strict";

      var $export = __webpack_require__(0),
          toObject = __webpack_require__(9),
          toPrimitive = __webpack_require__(23);

      $export($export.P + $export.F * __webpack_require__(3)(function () {
        return new Date(NaN).toJSON() !== null || Date.prototype.toJSON.call({ toISOString: function toISOString() {
            return 1;
          } }) !== 1;
      }), 'Date', {
        toJSON: function toJSON(key) {
          var O = toObject(this),
              pv = toPrimitive(O);
          return typeof pv == 'number' && !isFinite(pv) ? null : O.toISOString();
        }
      });

      /***/
    },
    /* 152 */
    /***/function (module, exports, __webpack_require__) {

      var TO_PRIMITIVE = __webpack_require__(5)('toPrimitive'),
          proto = Date.prototype;

      if (!(TO_PRIMITIVE in proto)) __webpack_require__(12)(proto, TO_PRIMITIVE, __webpack_require__(122));

      /***/
    },
    /* 153 */
    /***/function (module, exports, __webpack_require__) {

      var DateProto = Date.prototype,
          INVALID_DATE = 'Invalid Date',
          TO_STRING = 'toString',
          $toString = DateProto[TO_STRING],
          getTime = DateProto.getTime;
      if (new Date(NaN) + '' != INVALID_DATE) {
        __webpack_require__(13)(DateProto, TO_STRING, function toString() {
          var value = getTime.call(this);
          return value === value ? $toString.call(this) : INVALID_DATE;
        });
      }

      /***/
    },
    /* 154 */
    /***/function (module, exports, __webpack_require__) {

      // 19.2.3.2 / 15.3.4.5 Function.prototype.bind(thisArg, args...)
      var $export = __webpack_require__(0);

      $export($export.P, 'Function', { bind: __webpack_require__(90) });

      /***/
    },
    /* 155 */
    /***/function (module, exports, __webpack_require__) {

      "use strict";

      var isObject = __webpack_require__(4),
          getPrototypeOf = __webpack_require__(17),
          HAS_INSTANCE = __webpack_require__(5)('hasInstance'),
          FunctionProto = Function.prototype;
      // 19.2.3.6 Function.prototype[@@hasInstance](V)
      if (!(HAS_INSTANCE in FunctionProto)) __webpack_require__(7).f(FunctionProto, HAS_INSTANCE, { value: function value(O) {
          if (typeof this != 'function' || !isObject(O)) return false;
          if (!isObject(this.prototype)) return O instanceof this;
          // for environment w/o native `@@hasInstance` logic enough `instanceof`, but add this:
          while (O = getPrototypeOf(O)) {
            if (this.prototype === O) return true;
          }return false;
        } });

      /***/
    },
    /* 156 */
    /***/function (module, exports, __webpack_require__) {

      var dP = __webpack_require__(7).f,
          createDesc = __webpack_require__(29),
          has = __webpack_require__(10),
          FProto = Function.prototype,
          nameRE = /^\s*function ([^ (]*)/,
          NAME = 'name';

      var isExtensible = Object.isExtensible || function () {
        return true;
      };

      // 19.2.4.2 name
      NAME in FProto || __webpack_require__(6) && dP(FProto, NAME, {
        configurable: true,
        get: function get() {
          try {
            var that = this,
                name = ('' + that).match(nameRE)[1];
            has(that, NAME) || !isExtensible(that) || dP(that, NAME, createDesc(5, name));
            return name;
          } catch (e) {
            return '';
          }
        }
      });

      /***/
    },
    /* 157 */
    /***/function (module, exports, __webpack_require__) {

      // 20.2.2.3 Math.acosh(x)
      var $export = __webpack_require__(0),
          log1p = __webpack_require__(98),
          sqrt = Math.sqrt,
          $acosh = Math.acosh;

      $export($export.S + $export.F * !($acosh
      // V8 bug: https://code.google.com/p/v8/issues/detail?id=3509
      && Math.floor($acosh(Number.MAX_VALUE)) == 710
      // Tor Browser bug: Math.acosh(Infinity) -> NaN 
      && $acosh(Infinity) == Infinity), 'Math', {
        acosh: function acosh(x) {
          return (x = +x) < 1 ? NaN : x > 94906265.62425156 ? Math.log(x) + Math.LN2 : log1p(x - 1 + sqrt(x - 1) * sqrt(x + 1));
        }
      });

      /***/
    },
    /* 158 */
    /***/function (module, exports, __webpack_require__) {

      // 20.2.2.5 Math.asinh(x)
      var $export = __webpack_require__(0),
          $asinh = Math.asinh;

      function asinh(x) {
        return !isFinite(x = +x) || x == 0 ? x : x < 0 ? -asinh(-x) : Math.log(x + Math.sqrt(x * x + 1));
      }

      // Tor Browser bug: Math.asinh(0) -> -0 
      $export($export.S + $export.F * !($asinh && 1 / $asinh(0) > 0), 'Math', { asinh: asinh });

      /***/
    },
    /* 159 */
    /***/function (module, exports, __webpack_require__) {

      // 20.2.2.7 Math.atanh(x)
      var $export = __webpack_require__(0),
          $atanh = Math.atanh;

      // Tor Browser bug: Math.atanh(-0) -> 0 
      $export($export.S + $export.F * !($atanh && 1 / $atanh(-0) < 0), 'Math', {
        atanh: function atanh(x) {
          return (x = +x) == 0 ? x : Math.log((1 + x) / (1 - x)) / 2;
        }
      });

      /***/
    },
    /* 160 */
    /***/function (module, exports, __webpack_require__) {

      // 20.2.2.9 Math.cbrt(x)
      var $export = __webpack_require__(0),
          sign = __webpack_require__(71);

      $export($export.S, 'Math', {
        cbrt: function cbrt(x) {
          return sign(x = +x) * Math.pow(Math.abs(x), 1 / 3);
        }
      });

      /***/
    },
    /* 161 */
    /***/function (module, exports, __webpack_require__) {

      // 20.2.2.11 Math.clz32(x)
      var $export = __webpack_require__(0);

      $export($export.S, 'Math', {
        clz32: function clz32(x) {
          return (x >>>= 0) ? 31 - Math.floor(Math.log(x + 0.5) * Math.LOG2E) : 32;
        }
      });

      /***/
    },
    /* 162 */
    /***/function (module, exports, __webpack_require__) {

      // 20.2.2.12 Math.cosh(x)
      var $export = __webpack_require__(0),
          exp = Math.exp;

      $export($export.S, 'Math', {
        cosh: function cosh(x) {
          return (exp(x = +x) + exp(-x)) / 2;
        }
      });

      /***/
    },
    /* 163 */
    /***/function (module, exports, __webpack_require__) {

      // 20.2.2.14 Math.expm1(x)
      var $export = __webpack_require__(0),
          $expm1 = __webpack_require__(70);

      $export($export.S + $export.F * ($expm1 != Math.expm1), 'Math', { expm1: $expm1 });

      /***/
    },
    /* 164 */
    /***/function (module, exports, __webpack_require__) {

      // 20.2.2.16 Math.fround(x)
      var $export = __webpack_require__(0),
          sign = __webpack_require__(71),
          pow = Math.pow,
          EPSILON = pow(2, -52),
          EPSILON32 = pow(2, -23),
          MAX32 = pow(2, 127) * (2 - EPSILON32),
          MIN32 = pow(2, -126);

      var roundTiesToEven = function roundTiesToEven(n) {
        return n + 1 / EPSILON - 1 / EPSILON;
      };

      $export($export.S, 'Math', {
        fround: function fround(x) {
          var $abs = Math.abs(x),
              $sign = sign(x),
              a,
              result;
          if ($abs < MIN32) return $sign * roundTiesToEven($abs / MIN32 / EPSILON32) * MIN32 * EPSILON32;
          a = (1 + EPSILON32 / EPSILON) * $abs;
          result = a - (a - $abs);
          if (result > MAX32 || result != result) return $sign * Infinity;
          return $sign * result;
        }
      });

      /***/
    },
    /* 165 */
    /***/function (module, exports, __webpack_require__) {

      // 20.2.2.17 Math.hypot([value1[, value2[, … ]]])
      var $export = __webpack_require__(0),
          abs = Math.abs;

      $export($export.S, 'Math', {
        hypot: function hypot(value1, value2) {
          // eslint-disable-line no-unused-vars
          var sum = 0,
              i = 0,
              aLen = arguments.length,
              larg = 0,
              arg,
              div;
          while (i < aLen) {
            arg = abs(arguments[i++]);
            if (larg < arg) {
              div = larg / arg;
              sum = sum * div * div + 1;
              larg = arg;
            } else if (arg > 0) {
              div = arg / larg;
              sum += div * div;
            } else sum += arg;
          }
          return larg === Infinity ? Infinity : larg * Math.sqrt(sum);
        }
      });

      /***/
    },
    /* 166 */
    /***/function (module, exports, __webpack_require__) {

      // 20.2.2.18 Math.imul(x, y)
      var $export = __webpack_require__(0),
          $imul = Math.imul;

      // some WebKit versions fails with big numbers, some has wrong arity
      $export($export.S + $export.F * __webpack_require__(3)(function () {
        return $imul(0xffffffff, 5) != -5 || $imul.length != 2;
      }), 'Math', {
        imul: function imul(x, y) {
          var UINT16 = 0xffff,
              xn = +x,
              yn = +y,
              xl = UINT16 & xn,
              yl = UINT16 & yn;
          return 0 | xl * yl + ((UINT16 & xn >>> 16) * yl + xl * (UINT16 & yn >>> 16) << 16 >>> 0);
        }
      });

      /***/
    },
    /* 167 */
    /***/function (module, exports, __webpack_require__) {

      // 20.2.2.21 Math.log10(x)
      var $export = __webpack_require__(0);

      $export($export.S, 'Math', {
        log10: function log10(x) {
          return Math.log(x) / Math.LN10;
        }
      });

      /***/
    },
    /* 168 */
    /***/function (module, exports, __webpack_require__) {

      // 20.2.2.20 Math.log1p(x)
      var $export = __webpack_require__(0);

      $export($export.S, 'Math', { log1p: __webpack_require__(98) });

      /***/
    },
    /* 169 */
    /***/function (module, exports, __webpack_require__) {

      // 20.2.2.22 Math.log2(x)
      var $export = __webpack_require__(0);

      $export($export.S, 'Math', {
        log2: function log2(x) {
          return Math.log(x) / Math.LN2;
        }
      });

      /***/
    },
    /* 170 */
    /***/function (module, exports, __webpack_require__) {

      // 20.2.2.28 Math.sign(x)
      var $export = __webpack_require__(0);

      $export($export.S, 'Math', { sign: __webpack_require__(71) });

      /***/
    },
    /* 171 */
    /***/function (module, exports, __webpack_require__) {

      // 20.2.2.30 Math.sinh(x)
      var $export = __webpack_require__(0),
          expm1 = __webpack_require__(70),
          exp = Math.exp;

      // V8 near Chromium 38 has a problem with very small numbers
      $export($export.S + $export.F * __webpack_require__(3)(function () {
        return !Math.sinh(-2e-17) != -2e-17;
      }), 'Math', {
        sinh: function sinh(x) {
          return Math.abs(x = +x) < 1 ? (expm1(x) - expm1(-x)) / 2 : (exp(x - 1) - exp(-x - 1)) * (Math.E / 2);
        }
      });

      /***/
    },
    /* 172 */
    /***/function (module, exports, __webpack_require__) {

      // 20.2.2.33 Math.tanh(x)
      var $export = __webpack_require__(0),
          expm1 = __webpack_require__(70),
          exp = Math.exp;

      $export($export.S, 'Math', {
        tanh: function tanh(x) {
          var a = expm1(x = +x),
              b = expm1(-x);
          return a == Infinity ? 1 : b == Infinity ? -1 : (a - b) / (exp(x) + exp(-x));
        }
      });

      /***/
    },
    /* 173 */
    /***/function (module, exports, __webpack_require__) {

      // 20.2.2.34 Math.trunc(x)
      var $export = __webpack_require__(0);

      $export($export.S, 'Math', {
        trunc: function trunc(it) {
          return (it > 0 ? Math.floor : Math.ceil)(it);
        }
      });

      /***/
    },
    /* 174 */
    /***/function (module, exports, __webpack_require__) {

      "use strict";

      var global = __webpack_require__(2),
          has = __webpack_require__(10),
          cof = __webpack_require__(18),
          inheritIfRequired = __webpack_require__(65),
          toPrimitive = __webpack_require__(23),
          fails = __webpack_require__(3),
          gOPN = __webpack_require__(34).f,
          gOPD = __webpack_require__(16).f,
          dP = __webpack_require__(7).f,
          $trim = __webpack_require__(44).trim,
          NUMBER = 'Number',
          $Number = global[NUMBER],
          Base = $Number,
          proto = $Number.prototype
      // Opera ~12 has broken Object#toString
      ,
          BROKEN_COF = cof(__webpack_require__(33)(proto)) == NUMBER,
          TRIM = 'trim' in String.prototype;

      // 7.1.3 ToNumber(argument)
      var toNumber = function toNumber(argument) {
        var it = toPrimitive(argument, false);
        if (typeof it == 'string' && it.length > 2) {
          it = TRIM ? it.trim() : $trim(it, 3);
          var first = it.charCodeAt(0),
              third,
              radix,
              maxCode;
          if (first === 43 || first === 45) {
            third = it.charCodeAt(2);
            if (third === 88 || third === 120) return NaN; // Number('+0x1') should be NaN, old V8 fix
          } else if (first === 48) {
            switch (it.charCodeAt(1)) {
              case 66:case 98:
                radix = 2;maxCode = 49;break; // fast equal /^0b[01]+$/i
              case 79:case 111:
                radix = 8;maxCode = 55;break; // fast equal /^0o[0-7]+$/i
              default:
                return +it;
            }
            for (var digits = it.slice(2), i = 0, l = digits.length, code; i < l; i++) {
              code = digits.charCodeAt(i);
              // parseInt parses a string to a first unavailable symbol
              // but ToNumber should return NaN if a string contains unavailable symbols
              if (code < 48 || code > maxCode) return NaN;
            }return parseInt(digits, radix);
          }
        }return +it;
      };

      if (!$Number(' 0o1') || !$Number('0b1') || $Number('+0x1')) {
        $Number = function Number(value) {
          var it = arguments.length < 1 ? 0 : value,
              that = this;
          return that instanceof $Number
          // check on 1..constructor(foo) case
          && (BROKEN_COF ? fails(function () {
            proto.valueOf.call(that);
          }) : cof(that) != NUMBER) ? inheritIfRequired(new Base(toNumber(it)), that, $Number) : toNumber(it);
        };
        for (var keys = __webpack_require__(6) ? gOPN(Base) : (
        // ES3:
        'MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,' +
        // ES6 (in case, if modules with ES6 Number statics required before):
        'EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,' + 'MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger').split(','), j = 0, key; keys.length > j; j++) {
          if (has(Base, key = keys[j]) && !has($Number, key)) {
            dP($Number, key, gOPD(Base, key));
          }
        }
        $Number.prototype = proto;
        proto.constructor = $Number;
        __webpack_require__(13)(global, NUMBER, $Number);
      }

      /***/
    },
    /* 175 */
    /***/function (module, exports, __webpack_require__) {

      // 20.1.2.1 Number.EPSILON
      var $export = __webpack_require__(0);

      $export($export.S, 'Number', { EPSILON: Math.pow(2, -52) });

      /***/
    },
    /* 176 */
    /***/function (module, exports, __webpack_require__) {

      // 20.1.2.2 Number.isFinite(number)
      var $export = __webpack_require__(0),
          _isFinite = __webpack_require__(2).isFinite;

      $export($export.S, 'Number', {
        isFinite: function isFinite(it) {
          return typeof it == 'number' && _isFinite(it);
        }
      });

      /***/
    },
    /* 177 */
    /***/function (module, exports, __webpack_require__) {

      // 20.1.2.3 Number.isInteger(number)
      var $export = __webpack_require__(0);

      $export($export.S, 'Number', { isInteger: __webpack_require__(95) });

      /***/
    },
    /* 178 */
    /***/function (module, exports, __webpack_require__) {

      // 20.1.2.4 Number.isNaN(number)
      var $export = __webpack_require__(0);

      $export($export.S, 'Number', {
        isNaN: function isNaN(number) {
          return number != number;
        }
      });

      /***/
    },
    /* 179 */
    /***/function (module, exports, __webpack_require__) {

      // 20.1.2.5 Number.isSafeInteger(number)
      var $export = __webpack_require__(0),
          isInteger = __webpack_require__(95),
          abs = Math.abs;

      $export($export.S, 'Number', {
        isSafeInteger: function isSafeInteger(number) {
          return isInteger(number) && abs(number) <= 0x1fffffffffffff;
        }
      });

      /***/
    },
    /* 180 */
    /***/function (module, exports, __webpack_require__) {

      // 20.1.2.6 Number.MAX_SAFE_INTEGER
      var $export = __webpack_require__(0);

      $export($export.S, 'Number', { MAX_SAFE_INTEGER: 0x1fffffffffffff });

      /***/
    },
    /* 181 */
    /***/function (module, exports, __webpack_require__) {

      // 20.1.2.10 Number.MIN_SAFE_INTEGER
      var $export = __webpack_require__(0);

      $export($export.S, 'Number', { MIN_SAFE_INTEGER: -0x1fffffffffffff });

      /***/
    },
    /* 182 */
    /***/function (module, exports, __webpack_require__) {

      var $export = __webpack_require__(0),
          $parseFloat = __webpack_require__(105);
      // 20.1.2.12 Number.parseFloat(string)
      $export($export.S + $export.F * (Number.parseFloat != $parseFloat), 'Number', { parseFloat: $parseFloat });

      /***/
    },
    /* 183 */
    /***/function (module, exports, __webpack_require__) {

      var $export = __webpack_require__(0),
          $parseInt = __webpack_require__(106);
      // 20.1.2.13 Number.parseInt(string, radix)
      $export($export.S + $export.F * (Number.parseInt != $parseInt), 'Number', { parseInt: $parseInt });

      /***/
    },
    /* 184 */
    /***/function (module, exports, __webpack_require__) {

      "use strict";

      var $export = __webpack_require__(0),
          toInteger = __webpack_require__(30),
          aNumberValue = __webpack_require__(86),
          repeat = __webpack_require__(78),
          $toFixed = 1..toFixed,
          floor = Math.floor,
          data = [0, 0, 0, 0, 0, 0],
          ERROR = 'Number.toFixed: incorrect invocation!',
          ZERO = '0';

      var multiply = function multiply(n, c) {
        var i = -1,
            c2 = c;
        while (++i < 6) {
          c2 += n * data[i];
          data[i] = c2 % 1e7;
          c2 = floor(c2 / 1e7);
        }
      };
      var divide = function divide(n) {
        var i = 6,
            c = 0;
        while (--i >= 0) {
          c += data[i];
          data[i] = floor(c / n);
          c = c % n * 1e7;
        }
      };
      var numToString = function numToString() {
        var i = 6,
            s = '';
        while (--i >= 0) {
          if (s !== '' || i === 0 || data[i] !== 0) {
            var t = String(data[i]);
            s = s === '' ? t : s + repeat.call(ZERO, 7 - t.length) + t;
          }
        }return s;
      };
      var pow = function pow(x, n, acc) {
        return n === 0 ? acc : n % 2 === 1 ? pow(x, n - 1, acc * x) : pow(x * x, n / 2, acc);
      };
      var log = function log(x) {
        var n = 0,
            x2 = x;
        while (x2 >= 4096) {
          n += 12;
          x2 /= 4096;
        }
        while (x2 >= 2) {
          n += 1;
          x2 /= 2;
        }return n;
      };

      $export($export.P + $export.F * (!!$toFixed && (0.00008.toFixed(3) !== '0.000' || 0.9.toFixed(0) !== '1' || 1.255.toFixed(2) !== '1.25' || 1000000000000000128..toFixed(0) !== '1000000000000000128') || !__webpack_require__(3)(function () {
        // V8 ~ Android 4.3-
        $toFixed.call({});
      })), 'Number', {
        toFixed: function toFixed(fractionDigits) {
          var x = aNumberValue(this, ERROR),
              f = toInteger(fractionDigits),
              s = '',
              m = ZERO,
              e,
              z,
              j,
              k;
          if (f < 0 || f > 20) throw RangeError(ERROR);
          if (x != x) return 'NaN';
          if (x <= -1e21 || x >= 1e21) return String(x);
          if (x < 0) {
            s = '-';
            x = -x;
          }
          if (x > 1e-21) {
            e = log(x * pow(2, 69, 1)) - 69;
            z = e < 0 ? x * pow(2, -e, 1) : x / pow(2, e, 1);
            z *= 0x10000000000000;
            e = 52 - e;
            if (e > 0) {
              multiply(0, z);
              j = f;
              while (j >= 7) {
                multiply(1e7, 0);
                j -= 7;
              }
              multiply(pow(10, j, 1), 0);
              j = e - 1;
              while (j >= 23) {
                divide(1 << 23);
                j -= 23;
              }
              divide(1 << j);
              multiply(1, 1);
              divide(2);
              m = numToString();
            } else {
              multiply(0, z);
              multiply(1 << -e, 0);
              m = numToString() + repeat.call(ZERO, f);
            }
          }
          if (f > 0) {
            k = m.length;
            m = s + (k <= f ? '0.' + repeat.call(ZERO, f - k) + m : m.slice(0, k - f) + '.' + m.slice(k - f));
          } else {
            m = s + m;
          }return m;
        }
      });

      /***/
    },
    /* 185 */
    /***/function (module, exports, __webpack_require__) {

      "use strict";

      var $export = __webpack_require__(0),
          $fails = __webpack_require__(3),
          aNumberValue = __webpack_require__(86),
          $toPrecision = 1..toPrecision;

      $export($export.P + $export.F * ($fails(function () {
        // IE7-
        return $toPrecision.call(1, undefined) !== '1';
      }) || !$fails(function () {
        // V8 ~ Android 4.3-
        $toPrecision.call({});
      })), 'Number', {
        toPrecision: function toPrecision(precision) {
          var that = aNumberValue(this, 'Number#toPrecision: incorrect invocation!');
          return precision === undefined ? $toPrecision.call(that) : $toPrecision.call(that, precision);
        }
      });

      /***/
    },
    /* 186 */
    /***/function (module, exports, __webpack_require__) {

      // 19.1.3.1 Object.assign(target, source)
      var $export = __webpack_require__(0);

      $export($export.S + $export.F, 'Object', { assign: __webpack_require__(99) });

      /***/
    },
    /* 187 */
    /***/function (module, exports, __webpack_require__) {

      var $export = __webpack_require__(0);
      // 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties])
      $export($export.S, 'Object', { create: __webpack_require__(33) });

      /***/
    },
    /* 188 */
    /***/function (module, exports, __webpack_require__) {

      var $export = __webpack_require__(0);
      // 19.1.2.3 / 15.2.3.7 Object.defineProperties(O, Properties)
      $export($export.S + $export.F * !__webpack_require__(6), 'Object', { defineProperties: __webpack_require__(100) });

      /***/
    },
    /* 189 */
    /***/function (module, exports, __webpack_require__) {

      var $export = __webpack_require__(0);
      // 19.1.2.4 / 15.2.3.6 Object.defineProperty(O, P, Attributes)
      $export($export.S + $export.F * !__webpack_require__(6), 'Object', { defineProperty: __webpack_require__(7).f });

      /***/
    },
    /* 190 */
    /***/function (module, exports, __webpack_require__) {

      // 19.1.2.5 Object.freeze(O)
      var isObject = __webpack_require__(4),
          meta = __webpack_require__(28).onFreeze;

      __webpack_require__(22)('freeze', function ($freeze) {
        return function freeze(it) {
          return $freeze && isObject(it) ? $freeze(meta(it)) : it;
        };
      });

      /***/
    },
    /* 191 */
    /***/function (module, exports, __webpack_require__) {

      // 19.1.2.6 Object.getOwnPropertyDescriptor(O, P)
      var toIObject = __webpack_require__(15),
          $getOwnPropertyDescriptor = __webpack_require__(16).f;

      __webpack_require__(22)('getOwnPropertyDescriptor', function () {
        return function getOwnPropertyDescriptor(it, key) {
          return $getOwnPropertyDescriptor(toIObject(it), key);
        };
      });

      /***/
    },
    /* 192 */
    /***/function (module, exports, __webpack_require__) {

      // 19.1.2.7 Object.getOwnPropertyNames(O)
      __webpack_require__(22)('getOwnPropertyNames', function () {
        return __webpack_require__(101).f;
      });

      /***/
    },
    /* 193 */
    /***/function (module, exports, __webpack_require__) {

      // 19.1.2.9 Object.getPrototypeOf(O)
      var toObject = __webpack_require__(9),
          $getPrototypeOf = __webpack_require__(17);

      __webpack_require__(22)('getPrototypeOf', function () {
        return function getPrototypeOf(it) {
          return $getPrototypeOf(toObject(it));
        };
      });

      /***/
    },
    /* 194 */
    /***/function (module, exports, __webpack_require__) {

      // 19.1.2.11 Object.isExtensible(O)
      var isObject = __webpack_require__(4);

      __webpack_require__(22)('isExtensible', function ($isExtensible) {
        return function isExtensible(it) {
          return isObject(it) ? $isExtensible ? $isExtensible(it) : true : false;
        };
      });

      /***/
    },
    /* 195 */
    /***/function (module, exports, __webpack_require__) {

      // 19.1.2.12 Object.isFrozen(O)
      var isObject = __webpack_require__(4);

      __webpack_require__(22)('isFrozen', function ($isFrozen) {
        return function isFrozen(it) {
          return isObject(it) ? $isFrozen ? $isFrozen(it) : false : true;
        };
      });

      /***/
    },
    /* 196 */
    /***/function (module, exports, __webpack_require__) {

      // 19.1.2.13 Object.isSealed(O)
      var isObject = __webpack_require__(4);

      __webpack_require__(22)('isSealed', function ($isSealed) {
        return function isSealed(it) {
          return isObject(it) ? $isSealed ? $isSealed(it) : false : true;
        };
      });

      /***/
    },
    /* 197 */
    /***/function (module, exports, __webpack_require__) {

      // 19.1.3.10 Object.is(value1, value2)
      var $export = __webpack_require__(0);
      $export($export.S, 'Object', { is: __webpack_require__(107) });

      /***/
    },
    /* 198 */
    /***/function (module, exports, __webpack_require__) {

      // 19.1.2.14 Object.keys(O)
      var toObject = __webpack_require__(9),
          $keys = __webpack_require__(35);

      __webpack_require__(22)('keys', function () {
        return function keys(it) {
          return $keys(toObject(it));
        };
      });

      /***/
    },
    /* 199 */
    /***/function (module, exports, __webpack_require__) {

      // 19.1.2.15 Object.preventExtensions(O)
      var isObject = __webpack_require__(4),
          meta = __webpack_require__(28).onFreeze;

      __webpack_require__(22)('preventExtensions', function ($preventExtensions) {
        return function preventExtensions(it) {
          return $preventExtensions && isObject(it) ? $preventExtensions(meta(it)) : it;
        };
      });

      /***/
    },
    /* 200 */
    /***/function (module, exports, __webpack_require__) {

      // 19.1.2.17 Object.seal(O)
      var isObject = __webpack_require__(4),
          meta = __webpack_require__(28).onFreeze;

      __webpack_require__(22)('seal', function ($seal) {
        return function seal(it) {
          return $seal && isObject(it) ? $seal(meta(it)) : it;
        };
      });

      /***/
    },
    /* 201 */
    /***/function (module, exports, __webpack_require__) {

      // 19.1.3.19 Object.setPrototypeOf(O, proto)
      var $export = __webpack_require__(0);
      $export($export.S, 'Object', { setPrototypeOf: __webpack_require__(73).set });

      /***/
    },
    /* 202 */
    /***/function (module, exports, __webpack_require__) {

      "use strict";

      // 19.1.3.6 Object.prototype.toString()

      var classof = __webpack_require__(45),
          test = {};
      test[__webpack_require__(5)('toStringTag')] = 'z';
      if (test + '' != '[object z]') {
        __webpack_require__(13)(Object.prototype, 'toString', function toString() {
          return '[object ' + classof(this) + ']';
        }, true);
      }

      /***/
    },
    /* 203 */
    /***/function (module, exports, __webpack_require__) {

      var $export = __webpack_require__(0),
          $parseFloat = __webpack_require__(105);
      // 18.2.4 parseFloat(string)
      $export($export.G + $export.F * (parseFloat != $parseFloat), { parseFloat: $parseFloat });

      /***/
    },
    /* 204 */
    /***/function (module, exports, __webpack_require__) {

      var $export = __webpack_require__(0),
          $parseInt = __webpack_require__(106);
      // 18.2.5 parseInt(string, radix)
      $export($export.G + $export.F * (parseInt != $parseInt), { parseInt: $parseInt });

      /***/
    },
    /* 205 */
    /***/function (module, exports, __webpack_require__) {

      "use strict";

      var LIBRARY = __webpack_require__(32),
          global = __webpack_require__(2),
          ctx = __webpack_require__(25),
          classof = __webpack_require__(45),
          $export = __webpack_require__(0),
          isObject = __webpack_require__(4),
          aFunction = __webpack_require__(11),
          anInstance = __webpack_require__(31),
          forOf = __webpack_require__(41),
          speciesConstructor = __webpack_require__(75),
          task = __webpack_require__(80).set,
          microtask = __webpack_require__(72)(),
          PROMISE = 'Promise',
          TypeError = global.TypeError,
          process = global.process,
          $Promise = global[PROMISE],
          process = global.process,
          isNode = classof(process) == 'process',
          empty = function empty() {/* empty */},
          Internal,
          GenericPromiseCapability,
          Wrapper;

      var USE_NATIVE = !!function () {
        try {
          // correct subclassing with @@species support
          var promise = $Promise.resolve(1),
              FakePromise = (promise.constructor = {})[__webpack_require__(5)('species')] = function (exec) {
            exec(empty, empty);
          };
          // unhandled rejections tracking support, NodeJS Promise without it fails @@species test
          return (isNode || typeof PromiseRejectionEvent == 'function') && promise.then(empty) instanceof FakePromise;
        } catch (e) {/* empty */}
      }();

      // helpers
      var sameConstructor = function sameConstructor(a, b) {
        // with library wrapper special case
        return a === b || a === $Promise && b === Wrapper;
      };
      var isThenable = function isThenable(it) {
        var then;
        return isObject(it) && typeof (then = it.then) == 'function' ? then : false;
      };
      var newPromiseCapability = function newPromiseCapability(C) {
        return sameConstructor($Promise, C) ? new PromiseCapability(C) : new GenericPromiseCapability(C);
      };
      var PromiseCapability = GenericPromiseCapability = function GenericPromiseCapability(C) {
        var resolve, reject;
        this.promise = new C(function ($$resolve, $$reject) {
          if (resolve !== undefined || reject !== undefined) throw TypeError('Bad Promise constructor');
          resolve = $$resolve;
          reject = $$reject;
        });
        this.resolve = aFunction(resolve);
        this.reject = aFunction(reject);
      };
      var perform = function perform(exec) {
        try {
          exec();
        } catch (e) {
          return { error: e };
        }
      };
      var notify = function notify(promise, isReject) {
        if (promise._n) return;
        promise._n = true;
        var chain = promise._c;
        microtask(function () {
          var value = promise._v,
              ok = promise._s == 1,
              i = 0;
          var run = function run(reaction) {
            var handler = ok ? reaction.ok : reaction.fail,
                resolve = reaction.resolve,
                reject = reaction.reject,
                domain = reaction.domain,
                result,
                then;
            try {
              if (handler) {
                if (!ok) {
                  if (promise._h == 2) onHandleUnhandled(promise);
                  promise._h = 1;
                }
                if (handler === true) result = value;else {
                  if (domain) domain.enter();
                  result = handler(value);
                  if (domain) domain.exit();
                }
                if (result === reaction.promise) {
                  reject(TypeError('Promise-chain cycle'));
                } else if (then = isThenable(result)) {
                  then.call(result, resolve, reject);
                } else resolve(result);
              } else reject(value);
            } catch (e) {
              reject(e);
            }
          };
          while (chain.length > i) {
            run(chain[i++]);
          } // variable length - can't use forEach
          promise._c = [];
          promise._n = false;
          if (isReject && !promise._h) onUnhandled(promise);
        });
      };
      var onUnhandled = function onUnhandled(promise) {
        task.call(global, function () {
          var value = promise._v,
              abrupt,
              handler,
              console;
          if (isUnhandled(promise)) {
            abrupt = perform(function () {
              if (isNode) {
                process.emit('unhandledRejection', value, promise);
              } else if (handler = global.onunhandledrejection) {
                handler({ promise: promise, reason: value });
              } else if ((console = global.console) && console.error) {
                console.error('Unhandled promise rejection', value);
              }
            });
            // Browsers should not trigger `rejectionHandled` event if it was handled here, NodeJS - should
            promise._h = isNode || isUnhandled(promise) ? 2 : 1;
          }promise._a = undefined;
          if (abrupt) throw abrupt.error;
        });
      };
      var isUnhandled = function isUnhandled(promise) {
        if (promise._h == 1) return false;
        var chain = promise._a || promise._c,
            i = 0,
            reaction;
        while (chain.length > i) {
          reaction = chain[i++];
          if (reaction.fail || !isUnhandled(reaction.promise)) return false;
        }return true;
      };
      var onHandleUnhandled = function onHandleUnhandled(promise) {
        task.call(global, function () {
          var handler;
          if (isNode) {
            process.emit('rejectionHandled', promise);
          } else if (handler = global.onrejectionhandled) {
            handler({ promise: promise, reason: promise._v });
          }
        });
      };
      var $reject = function $reject(value) {
        var promise = this;
        if (promise._d) return;
        promise._d = true;
        promise = promise._w || promise; // unwrap
        promise._v = value;
        promise._s = 2;
        if (!promise._a) promise._a = promise._c.slice();
        notify(promise, true);
      };
      var $resolve = function $resolve(value) {
        var promise = this,
            then;
        if (promise._d) return;
        promise._d = true;
        promise = promise._w || promise; // unwrap
        try {
          if (promise === value) throw TypeError("Promise can't be resolved itself");
          if (then = isThenable(value)) {
            microtask(function () {
              var wrapper = { _w: promise, _d: false }; // wrap
              try {
                then.call(value, ctx($resolve, wrapper, 1), ctx($reject, wrapper, 1));
              } catch (e) {
                $reject.call(wrapper, e);
              }
            });
          } else {
            promise._v = value;
            promise._s = 1;
            notify(promise, false);
          }
        } catch (e) {
          $reject.call({ _w: promise, _d: false }, e); // wrap
        }
      };

      // constructor polyfill
      if (!USE_NATIVE) {
        // 25.4.3.1 Promise(executor)
        $Promise = function Promise(executor) {
          anInstance(this, $Promise, PROMISE, '_h');
          aFunction(executor);
          Internal.call(this);
          try {
            executor(ctx($resolve, this, 1), ctx($reject, this, 1));
          } catch (err) {
            $reject.call(this, err);
          }
        };
        Internal = function Promise(executor) {
          this._c = []; // <- awaiting reactions
          this._a = undefined; // <- checked in isUnhandled reactions
          this._s = 0; // <- state
          this._d = false; // <- done
          this._v = undefined; // <- value
          this._h = 0; // <- rejection state, 0 - default, 1 - handled, 2 - unhandled
          this._n = false; // <- notify
        };
        Internal.prototype = __webpack_require__(36)($Promise.prototype, {
          // 25.4.5.3 Promise.prototype.then(onFulfilled, onRejected)
          then: function then(onFulfilled, onRejected) {
            var reaction = newPromiseCapability(speciesConstructor(this, $Promise));
            reaction.ok = typeof onFulfilled == 'function' ? onFulfilled : true;
            reaction.fail = typeof onRejected == 'function' && onRejected;
            reaction.domain = isNode ? process.domain : undefined;
            this._c.push(reaction);
            if (this._a) this._a.push(reaction);
            if (this._s) notify(this, false);
            return reaction.promise;
          },
          // 25.4.5.1 Promise.prototype.catch(onRejected)
          'catch': function _catch(onRejected) {
            return this.then(undefined, onRejected);
          }
        });
        PromiseCapability = function PromiseCapability() {
          var promise = new Internal();
          this.promise = promise;
          this.resolve = ctx($resolve, promise, 1);
          this.reject = ctx($reject, promise, 1);
        };
      }

      $export($export.G + $export.W + $export.F * !USE_NATIVE, { Promise: $Promise });
      __webpack_require__(43)($Promise, PROMISE);
      __webpack_require__(37)(PROMISE);
      Wrapper = __webpack_require__(24)[PROMISE];

      // statics
      $export($export.S + $export.F * !USE_NATIVE, PROMISE, {
        // 25.4.4.5 Promise.reject(r)
        reject: function reject(r) {
          var capability = newPromiseCapability(this),
              $$reject = capability.reject;
          $$reject(r);
          return capability.promise;
        }
      });
      $export($export.S + $export.F * (LIBRARY || !USE_NATIVE), PROMISE, {
        // 25.4.4.6 Promise.resolve(x)
        resolve: function resolve(x) {
          // instanceof instead of internal slot check because we should fix it without replacement native Promise core
          if (x instanceof $Promise && sameConstructor(x.constructor, this)) return x;
          var capability = newPromiseCapability(this),
              $$resolve = capability.resolve;
          $$resolve(x);
          return capability.promise;
        }
      });
      $export($export.S + $export.F * !(USE_NATIVE && __webpack_require__(54)(function (iter) {
        $Promise.all(iter)['catch'](empty);
      })), PROMISE, {
        // 25.4.4.1 Promise.all(iterable)
        all: function all(iterable) {
          var C = this,
              capability = newPromiseCapability(C),
              resolve = capability.resolve,
              reject = capability.reject;
          var abrupt = perform(function () {
            var values = [],
                index = 0,
                remaining = 1;
            forOf(iterable, false, function (promise) {
              var $index = index++,
                  alreadyCalled = false;
              values.push(undefined);
              remaining++;
              C.resolve(promise).then(function (value) {
                if (alreadyCalled) return;
                alreadyCalled = true;
                values[$index] = value;
                --remaining || resolve(values);
              }, reject);
            });
            --remaining || resolve(values);
          });
          if (abrupt) reject(abrupt.error);
          return capability.promise;
        },
        // 25.4.4.4 Promise.race(iterable)
        race: function race(iterable) {
          var C = this,
              capability = newPromiseCapability(C),
              reject = capability.reject;
          var abrupt = perform(function () {
            forOf(iterable, false, function (promise) {
              C.resolve(promise).then(capability.resolve, reject);
            });
          });
          if (abrupt) reject(abrupt.error);
          return capability.promise;
        }
      });

      /***/
    },
    /* 206 */
    /***/function (module, exports, __webpack_require__) {

      // 26.1.1 Reflect.apply(target, thisArgument, argumentsList)
      var $export = __webpack_require__(0),
          aFunction = __webpack_require__(11),
          anObject = __webpack_require__(1),
          rApply = (__webpack_require__(2).Reflect || {}).apply,
          fApply = Function.apply;
      // MS Edge argumentsList argument is optional
      $export($export.S + $export.F * !__webpack_require__(3)(function () {
        rApply(function () {});
      }), 'Reflect', {
        apply: function apply(target, thisArgument, argumentsList) {
          var T = aFunction(target),
              L = anObject(argumentsList);
          return rApply ? rApply(T, thisArgument, L) : fApply.call(T, thisArgument, L);
        }
      });

      /***/
    },
    /* 207 */
    /***/function (module, exports, __webpack_require__) {

      // 26.1.2 Reflect.construct(target, argumentsList [, newTarget])
      var $export = __webpack_require__(0),
          create = __webpack_require__(33),
          aFunction = __webpack_require__(11),
          anObject = __webpack_require__(1),
          isObject = __webpack_require__(4),
          fails = __webpack_require__(3),
          bind = __webpack_require__(90),
          rConstruct = (__webpack_require__(2).Reflect || {}).construct;

      // MS Edge supports only 2 arguments and argumentsList argument is optional
      // FF Nightly sets third argument as `new.target`, but does not create `this` from it
      var NEW_TARGET_BUG = fails(function () {
        function F() {}
        return !(rConstruct(function () {}, [], F) instanceof F);
      });
      var ARGS_BUG = !fails(function () {
        rConstruct(function () {});
      });

      $export($export.S + $export.F * (NEW_TARGET_BUG || ARGS_BUG), 'Reflect', {
        construct: function construct(Target, args /*, newTarget*/) {
          aFunction(Target);
          anObject(args);
          var newTarget = arguments.length < 3 ? Target : aFunction(arguments[2]);
          if (ARGS_BUG && !NEW_TARGET_BUG) return rConstruct(Target, args, newTarget);
          if (Target == newTarget) {
            // w/o altered newTarget, optimization for 0-4 arguments
            switch (args.length) {
              case 0:
                return new Target();
              case 1:
                return new Target(args[0]);
              case 2:
                return new Target(args[0], args[1]);
              case 3:
                return new Target(args[0], args[1], args[2]);
              case 4:
                return new Target(args[0], args[1], args[2], args[3]);
            }
            // w/o altered newTarget, lot of arguments case
            var $args = [null];
            $args.push.apply($args, args);
            return new (bind.apply(Target, $args))();
          }
          // with altered newTarget, not support built-in constructors
          var proto = newTarget.prototype,
              instance = create(isObject(proto) ? proto : Object.prototype),
              result = Function.apply.call(Target, instance, args);
          return isObject(result) ? result : instance;
        }
      });

      /***/
    },
    /* 208 */
    /***/function (module, exports, __webpack_require__) {

      // 26.1.3 Reflect.defineProperty(target, propertyKey, attributes)
      var dP = __webpack_require__(7),
          $export = __webpack_require__(0),
          anObject = __webpack_require__(1),
          toPrimitive = __webpack_require__(23);

      // MS Edge has broken Reflect.defineProperty - throwing instead of returning false
      $export($export.S + $export.F * __webpack_require__(3)(function () {
        Reflect.defineProperty(dP.f({}, 1, { value: 1 }), 1, { value: 2 });
      }), 'Reflect', {
        defineProperty: function defineProperty(target, propertyKey, attributes) {
          anObject(target);
          propertyKey = toPrimitive(propertyKey, true);
          anObject(attributes);
          try {
            dP.f(target, propertyKey, attributes);
            return true;
          } catch (e) {
            return false;
          }
        }
      });

      /***/
    },
    /* 209 */
    /***/function (module, exports, __webpack_require__) {

      // 26.1.4 Reflect.deleteProperty(target, propertyKey)
      var $export = __webpack_require__(0),
          gOPD = __webpack_require__(16).f,
          anObject = __webpack_require__(1);

      $export($export.S, 'Reflect', {
        deleteProperty: function deleteProperty(target, propertyKey) {
          var desc = gOPD(anObject(target), propertyKey);
          return desc && !desc.configurable ? false : delete target[propertyKey];
        }
      });

      /***/
    },
    /* 210 */
    /***/function (module, exports, __webpack_require__) {

      "use strict";

      // 26.1.5 Reflect.enumerate(target)

      var $export = __webpack_require__(0),
          anObject = __webpack_require__(1);
      var Enumerate = function Enumerate(iterated) {
        this._t = anObject(iterated); // target
        this._i = 0; // next index
        var keys = this._k = [] // keys
        ,
            key;
        for (key in iterated) {
          keys.push(key);
        }
      };
      __webpack_require__(68)(Enumerate, 'Object', function () {
        var that = this,
            keys = that._k,
            key;
        do {
          if (that._i >= keys.length) return { value: undefined, done: true };
        } while (!((key = keys[that._i++]) in that._t));
        return { value: key, done: false };
      });

      $export($export.S, 'Reflect', {
        enumerate: function enumerate(target) {
          return new Enumerate(target);
        }
      });

      /***/
    },
    /* 211 */
    /***/function (module, exports, __webpack_require__) {

      // 26.1.7 Reflect.getOwnPropertyDescriptor(target, propertyKey)
      var gOPD = __webpack_require__(16),
          $export = __webpack_require__(0),
          anObject = __webpack_require__(1);

      $export($export.S, 'Reflect', {
        getOwnPropertyDescriptor: function getOwnPropertyDescriptor(target, propertyKey) {
          return gOPD.f(anObject(target), propertyKey);
        }
      });

      /***/
    },
    /* 212 */
    /***/function (module, exports, __webpack_require__) {

      // 26.1.8 Reflect.getPrototypeOf(target)
      var $export = __webpack_require__(0),
          getProto = __webpack_require__(17),
          anObject = __webpack_require__(1);

      $export($export.S, 'Reflect', {
        getPrototypeOf: function getPrototypeOf(target) {
          return getProto(anObject(target));
        }
      });

      /***/
    },
    /* 213 */
    /***/function (module, exports, __webpack_require__) {

      // 26.1.6 Reflect.get(target, propertyKey [, receiver])
      var gOPD = __webpack_require__(16),
          getPrototypeOf = __webpack_require__(17),
          has = __webpack_require__(10),
          $export = __webpack_require__(0),
          isObject = __webpack_require__(4),
          anObject = __webpack_require__(1);

      function get(target, propertyKey /*, receiver*/) {
        var receiver = arguments.length < 3 ? target : arguments[2],
            desc,
            proto;
        if (anObject(target) === receiver) return target[propertyKey];
        if (desc = gOPD.f(target, propertyKey)) return has(desc, 'value') ? desc.value : desc.get !== undefined ? desc.get.call(receiver) : undefined;
        if (isObject(proto = getPrototypeOf(target))) return get(proto, propertyKey, receiver);
      }

      $export($export.S, 'Reflect', { get: get });

      /***/
    },
    /* 214 */
    /***/function (module, exports, __webpack_require__) {

      // 26.1.9 Reflect.has(target, propertyKey)
      var $export = __webpack_require__(0);

      $export($export.S, 'Reflect', {
        has: function has(target, propertyKey) {
          return propertyKey in target;
        }
      });

      /***/
    },
    /* 215 */
    /***/function (module, exports, __webpack_require__) {

      // 26.1.10 Reflect.isExtensible(target)
      var $export = __webpack_require__(0),
          anObject = __webpack_require__(1),
          $isExtensible = Object.isExtensible;

      $export($export.S, 'Reflect', {
        isExtensible: function isExtensible(target) {
          anObject(target);
          return $isExtensible ? $isExtensible(target) : true;
        }
      });

      /***/
    },
    /* 216 */
    /***/function (module, exports, __webpack_require__) {

      // 26.1.11 Reflect.ownKeys(target)
      var $export = __webpack_require__(0);

      $export($export.S, 'Reflect', { ownKeys: __webpack_require__(104) });

      /***/
    },
    /* 217 */
    /***/function (module, exports, __webpack_require__) {

      // 26.1.12 Reflect.preventExtensions(target)
      var $export = __webpack_require__(0),
          anObject = __webpack_require__(1),
          $preventExtensions = Object.preventExtensions;

      $export($export.S, 'Reflect', {
        preventExtensions: function preventExtensions(target) {
          anObject(target);
          try {
            if ($preventExtensions) $preventExtensions(target);
            return true;
          } catch (e) {
            return false;
          }
        }
      });

      /***/
    },
    /* 218 */
    /***/function (module, exports, __webpack_require__) {

      // 26.1.14 Reflect.setPrototypeOf(target, proto)
      var $export = __webpack_require__(0),
          setProto = __webpack_require__(73);

      if (setProto) $export($export.S, 'Reflect', {
        setPrototypeOf: function setPrototypeOf(target, proto) {
          setProto.check(target, proto);
          try {
            setProto.set(target, proto);
            return true;
          } catch (e) {
            return false;
          }
        }
      });

      /***/
    },
    /* 219 */
    /***/function (module, exports, __webpack_require__) {

      // 26.1.13 Reflect.set(target, propertyKey, V [, receiver])
      var dP = __webpack_require__(7),
          gOPD = __webpack_require__(16),
          getPrototypeOf = __webpack_require__(17),
          has = __webpack_require__(10),
          $export = __webpack_require__(0),
          createDesc = __webpack_require__(29),
          anObject = __webpack_require__(1),
          isObject = __webpack_require__(4);

      function set(target, propertyKey, V /*, receiver*/) {
        var receiver = arguments.length < 4 ? target : arguments[3],
            ownDesc = gOPD.f(anObject(target), propertyKey),
            existingDescriptor,
            proto;
        if (!ownDesc) {
          if (isObject(proto = getPrototypeOf(target))) {
            return set(proto, propertyKey, V, receiver);
          }
          ownDesc = createDesc(0);
        }
        if (has(ownDesc, 'value')) {
          if (ownDesc.writable === false || !isObject(receiver)) return false;
          existingDescriptor = gOPD.f(receiver, propertyKey) || createDesc(0);
          existingDescriptor.value = V;
          dP.f(receiver, propertyKey, existingDescriptor);
          return true;
        }
        return ownDesc.set === undefined ? false : (ownDesc.set.call(receiver, V), true);
      }

      $export($export.S, 'Reflect', { set: set });

      /***/
    },
    /* 220 */
    /***/function (module, exports, __webpack_require__) {

      var global = __webpack_require__(2),
          inheritIfRequired = __webpack_require__(65),
          dP = __webpack_require__(7).f,
          gOPN = __webpack_require__(34).f,
          isRegExp = __webpack_require__(53),
          $flags = __webpack_require__(51),
          $RegExp = global.RegExp,
          Base = $RegExp,
          proto = $RegExp.prototype,
          re1 = /a/g,
          re2 = /a/g
      // "new" creates a new object, old webkit buggy here
      ,
          CORRECT_NEW = new $RegExp(re1) !== re1;

      if (__webpack_require__(6) && (!CORRECT_NEW || __webpack_require__(3)(function () {
        re2[__webpack_require__(5)('match')] = false;
        // RegExp constructor can alter flags and IsRegExp works correct with @@match
        return $RegExp(re1) != re1 || $RegExp(re2) == re2 || $RegExp(re1, 'i') != '/a/i';
      }))) {
        $RegExp = function RegExp(p, f) {
          var tiRE = this instanceof $RegExp,
              piRE = isRegExp(p),
              fiU = f === undefined;
          return !tiRE && piRE && p.constructor === $RegExp && fiU ? p : inheritIfRequired(CORRECT_NEW ? new Base(piRE && !fiU ? p.source : p, f) : Base((piRE = p instanceof $RegExp) ? p.source : p, piRE && fiU ? $flags.call(p) : f), tiRE ? this : proto, $RegExp);
        };
        var proxy = function proxy(key) {
          key in $RegExp || dP($RegExp, key, {
            configurable: true,
            get: function get() {
              return Base[key];
            },
            set: function set(it) {
              Base[key] = it;
            }
          });
        };
        for (var keys = gOPN(Base), i = 0; keys.length > i;) {
          proxy(keys[i++]);
        }proto.constructor = $RegExp;
        $RegExp.prototype = proto;
        __webpack_require__(13)(global, 'RegExp', $RegExp);
      }

      __webpack_require__(37)('RegExp');

      /***/
    },
    /* 221 */
    /***/function (module, exports, __webpack_require__) {

      // @@match logic
      __webpack_require__(50)('match', 1, function (defined, MATCH, $match) {
        // 21.1.3.11 String.prototype.match(regexp)
        return [function match(regexp) {
          'use strict';

          var O = defined(this),
              fn = regexp == undefined ? undefined : regexp[MATCH];
          return fn !== undefined ? fn.call(regexp, O) : new RegExp(regexp)[MATCH](String(O));
        }, $match];
      });

      /***/
    },
    /* 222 */
    /***/function (module, exports, __webpack_require__) {

      // @@replace logic
      __webpack_require__(50)('replace', 2, function (defined, REPLACE, $replace) {
        // 21.1.3.14 String.prototype.replace(searchValue, replaceValue)
        return [function replace(searchValue, replaceValue) {
          'use strict';

          var O = defined(this),
              fn = searchValue == undefined ? undefined : searchValue[REPLACE];
          return fn !== undefined ? fn.call(searchValue, O, replaceValue) : $replace.call(String(O), searchValue, replaceValue);
        }, $replace];
      });

      /***/
    },
    /* 223 */
    /***/function (module, exports, __webpack_require__) {

      // @@search logic
      __webpack_require__(50)('search', 1, function (defined, SEARCH, $search) {
        // 21.1.3.15 String.prototype.search(regexp)
        return [function search(regexp) {
          'use strict';

          var O = defined(this),
              fn = regexp == undefined ? undefined : regexp[SEARCH];
          return fn !== undefined ? fn.call(regexp, O) : new RegExp(regexp)[SEARCH](String(O));
        }, $search];
      });

      /***/
    },
    /* 224 */
    /***/function (module, exports, __webpack_require__) {

      // @@split logic
      __webpack_require__(50)('split', 2, function (defined, SPLIT, $split) {
        'use strict';

        var isRegExp = __webpack_require__(53),
            _split = $split,
            $push = [].push,
            $SPLIT = 'split',
            LENGTH = 'length',
            LAST_INDEX = 'lastIndex';
        if ('abbc'[$SPLIT](/(b)*/)[1] == 'c' || 'test'[$SPLIT](/(?:)/, -1)[LENGTH] != 4 || 'ab'[$SPLIT](/(?:ab)*/)[LENGTH] != 2 || '.'[$SPLIT](/(.?)(.?)/)[LENGTH] != 4 || '.'[$SPLIT](/()()/)[LENGTH] > 1 || ''[$SPLIT](/.?/)[LENGTH]) {
          var NPCG = /()??/.exec('')[1] === undefined; // nonparticipating capturing group
          // based on es5-shim implementation, need to rework it
          $split = function $split(separator, limit) {
            var string = String(this);
            if (separator === undefined && limit === 0) return [];
            // If `separator` is not a regex, use native split
            if (!isRegExp(separator)) return _split.call(string, separator, limit);
            var output = [];
            var flags = (separator.ignoreCase ? 'i' : '') + (separator.multiline ? 'm' : '') + (separator.unicode ? 'u' : '') + (separator.sticky ? 'y' : '');
            var lastLastIndex = 0;
            var splitLimit = limit === undefined ? 4294967295 : limit >>> 0;
            // Make `global` and avoid `lastIndex` issues by working with a copy
            var separatorCopy = new RegExp(separator.source, flags + 'g');
            var separator2, match, lastIndex, lastLength, i;
            // Doesn't need flags gy, but they don't hurt
            if (!NPCG) separator2 = new RegExp('^' + separatorCopy.source + '$(?!\\s)', flags);
            while (match = separatorCopy.exec(string)) {
              // `separatorCopy.lastIndex` is not reliable cross-browser
              lastIndex = match.index + match[0][LENGTH];
              if (lastIndex > lastLastIndex) {
                output.push(string.slice(lastLastIndex, match.index));
                // Fix browsers whose `exec` methods don't consistently return `undefined` for NPCG
                if (!NPCG && match[LENGTH] > 1) match[0].replace(separator2, function () {
                  for (i = 1; i < arguments[LENGTH] - 2; i++) {
                    if (arguments[i] === undefined) match[i] = undefined;
                  }
                });
                if (match[LENGTH] > 1 && match.index < string[LENGTH]) $push.apply(output, match.slice(1));
                lastLength = match[0][LENGTH];
                lastLastIndex = lastIndex;
                if (output[LENGTH] >= splitLimit) break;
              }
              if (separatorCopy[LAST_INDEX] === match.index) separatorCopy[LAST_INDEX]++; // Avoid an infinite loop
            }
            if (lastLastIndex === string[LENGTH]) {
              if (lastLength || !separatorCopy.test('')) output.push('');
            } else output.push(string.slice(lastLastIndex));
            return output[LENGTH] > splitLimit ? output.slice(0, splitLimit) : output;
          };
          // Chakra, V8
        } else if ('0'[$SPLIT](undefined, 0)[LENGTH]) {
          $split = function $split(separator, limit) {
            return separator === undefined && limit === 0 ? [] : _split.call(this, separator, limit);
          };
        }
        // 21.1.3.17 String.prototype.split(separator, limit)
        return [function split(separator, limit) {
          var O = defined(this),
              fn = separator == undefined ? undefined : separator[SPLIT];
          return fn !== undefined ? fn.call(separator, O, limit) : $split.call(String(O), separator, limit);
        }, $split];
      });

      /***/
    },
    /* 225 */
    /***/function (module, exports, __webpack_require__) {

      "use strict";

      __webpack_require__(111);
      var anObject = __webpack_require__(1),
          $flags = __webpack_require__(51),
          DESCRIPTORS = __webpack_require__(6),
          TO_STRING = 'toString',
          $toString = /./[TO_STRING];

      var define = function define(fn) {
        __webpack_require__(13)(RegExp.prototype, TO_STRING, fn, true);
      };

      // 21.2.5.14 RegExp.prototype.toString()
      if (__webpack_require__(3)(function () {
        return $toString.call({ source: 'a', flags: 'b' }) != '/a/b';
      })) {
        define(function toString() {
          var R = anObject(this);
          return '/'.concat(R.source, '/', 'flags' in R ? R.flags : !DESCRIPTORS && R instanceof RegExp ? $flags.call(R) : undefined);
        });
        // FF44- RegExp#toString has a wrong name
      } else if ($toString.name != TO_STRING) {
        define(function toString() {
          return $toString.call(this);
        });
      }

      /***/
    },
    /* 226 */
    /***/function (module, exports, __webpack_require__) {

      "use strict";

      // B.2.3.2 String.prototype.anchor(name)

      __webpack_require__(14)('anchor', function (createHTML) {
        return function anchor(name) {
          return createHTML(this, 'a', 'name', name);
        };
      });

      /***/
    },
    /* 227 */
    /***/function (module, exports, __webpack_require__) {

      "use strict";

      // B.2.3.3 String.prototype.big()

      __webpack_require__(14)('big', function (createHTML) {
        return function big() {
          return createHTML(this, 'big', '', '');
        };
      });

      /***/
    },
    /* 228 */
    /***/function (module, exports, __webpack_require__) {

      "use strict";

      // B.2.3.4 String.prototype.blink()

      __webpack_require__(14)('blink', function (createHTML) {
        return function blink() {
          return createHTML(this, 'blink', '', '');
        };
      });

      /***/
    },
    /* 229 */
    /***/function (module, exports, __webpack_require__) {

      "use strict";

      // B.2.3.5 String.prototype.bold()

      __webpack_require__(14)('bold', function (createHTML) {
        return function bold() {
          return createHTML(this, 'b', '', '');
        };
      });

      /***/
    },
    /* 230 */
    /***/function (module, exports, __webpack_require__) {

      "use strict";

      var $export = __webpack_require__(0),
          $at = __webpack_require__(76)(false);
      $export($export.P, 'String', {
        // 21.1.3.3 String.prototype.codePointAt(pos)
        codePointAt: function codePointAt(pos) {
          return $at(this, pos);
        }
      });

      /***/
    },
    /* 231 */
    /***/function (module, exports, __webpack_require__) {

      "use strict";
      // 21.1.3.6 String.prototype.endsWith(searchString [, endPosition])

      var $export = __webpack_require__(0),
          toLength = __webpack_require__(8),
          context = __webpack_require__(77),
          ENDS_WITH = 'endsWith',
          $endsWith = ''[ENDS_WITH];

      $export($export.P + $export.F * __webpack_require__(63)(ENDS_WITH), 'String', {
        endsWith: function endsWith(searchString /*, endPosition = @length */) {
          var that = context(this, searchString, ENDS_WITH),
              endPosition = arguments.length > 1 ? arguments[1] : undefined,
              len = toLength(that.length),
              end = endPosition === undefined ? len : Math.min(toLength(endPosition), len),
              search = String(searchString);
          return $endsWith ? $endsWith.call(that, search, end) : that.slice(end - search.length, end) === search;
        }
      });

      /***/
    },
    /* 232 */
    /***/function (module, exports, __webpack_require__) {

      "use strict";

      // B.2.3.6 String.prototype.fixed()

      __webpack_require__(14)('fixed', function (createHTML) {
        return function fixed() {
          return createHTML(this, 'tt', '', '');
        };
      });

      /***/
    },
    /* 233 */
    /***/function (module, exports, __webpack_require__) {

      "use strict";

      // B.2.3.7 String.prototype.fontcolor(color)

      __webpack_require__(14)('fontcolor', function (createHTML) {
        return function fontcolor(color) {
          return createHTML(this, 'font', 'color', color);
        };
      });

      /***/
    },
    /* 234 */
    /***/function (module, exports, __webpack_require__) {

      "use strict";

      // B.2.3.8 String.prototype.fontsize(size)

      __webpack_require__(14)('fontsize', function (createHTML) {
        return function fontsize(size) {
          return createHTML(this, 'font', 'size', size);
        };
      });

      /***/
    },
    /* 235 */
    /***/function (module, exports, __webpack_require__) {

      var $export = __webpack_require__(0),
          toIndex = __webpack_require__(38),
          fromCharCode = String.fromCharCode,
          $fromCodePoint = String.fromCodePoint;

      // length should be 1, old FF problem
      $export($export.S + $export.F * (!!$fromCodePoint && $fromCodePoint.length != 1), 'String', {
        // 21.1.2.2 String.fromCodePoint(...codePoints)
        fromCodePoint: function fromCodePoint(x) {
          // eslint-disable-line no-unused-vars
          var res = [],
              aLen = arguments.length,
              i = 0,
              code;
          while (aLen > i) {
            code = +arguments[i++];
            if (toIndex(code, 0x10ffff) !== code) throw RangeError(code + ' is not a valid code point');
            res.push(code < 0x10000 ? fromCharCode(code) : fromCharCode(((code -= 0x10000) >> 10) + 0xd800, code % 0x400 + 0xdc00));
          }return res.join('');
        }
      });

      /***/
    },
    /* 236 */
    /***/function (module, exports, __webpack_require__) {

      "use strict";
      // 21.1.3.7 String.prototype.includes(searchString, position = 0)

      var $export = __webpack_require__(0),
          context = __webpack_require__(77),
          INCLUDES = 'includes';

      $export($export.P + $export.F * __webpack_require__(63)(INCLUDES), 'String', {
        includes: function includes(searchString /*, position = 0 */) {
          return !!~context(this, searchString, INCLUDES).indexOf(searchString, arguments.length > 1 ? arguments[1] : undefined);
        }
      });

      /***/
    },
    /* 237 */
    /***/function (module, exports, __webpack_require__) {

      "use strict";

      // B.2.3.9 String.prototype.italics()

      __webpack_require__(14)('italics', function (createHTML) {
        return function italics() {
          return createHTML(this, 'i', '', '');
        };
      });

      /***/
    },
    /* 238 */
    /***/function (module, exports, __webpack_require__) {

      "use strict";

      var $at = __webpack_require__(76)(true);

      // 21.1.3.27 String.prototype[@@iterator]()
      __webpack_require__(69)(String, 'String', function (iterated) {
        this._t = String(iterated); // target
        this._i = 0; // next index
        // 21.1.5.2.1 %StringIteratorPrototype%.next()
      }, function () {
        var O = this._t,
            index = this._i,
            point;
        if (index >= O.length) return { value: undefined, done: true };
        point = $at(O, index);
        this._i += point.length;
        return { value: point, done: false };
      });

      /***/
    },
    /* 239 */
    /***/function (module, exports, __webpack_require__) {

      "use strict";

      // B.2.3.10 String.prototype.link(url)

      __webpack_require__(14)('link', function (createHTML) {
        return function link(url) {
          return createHTML(this, 'a', 'href', url);
        };
      });

      /***/
    },
    /* 240 */
    /***/function (module, exports, __webpack_require__) {

      var $export = __webpack_require__(0),
          toIObject = __webpack_require__(15),
          toLength = __webpack_require__(8);

      $export($export.S, 'String', {
        // 21.1.2.4 String.raw(callSite, ...substitutions)
        raw: function raw(callSite) {
          var tpl = toIObject(callSite.raw),
              len = toLength(tpl.length),
              aLen = arguments.length,
              res = [],
              i = 0;
          while (len > i) {
            res.push(String(tpl[i++]));
            if (i < aLen) res.push(String(arguments[i]));
          }return res.join('');
        }
      });

      /***/
    },
    /* 241 */
    /***/function (module, exports, __webpack_require__) {

      var $export = __webpack_require__(0);

      $export($export.P, 'String', {
        // 21.1.3.13 String.prototype.repeat(count)
        repeat: __webpack_require__(78)
      });

      /***/
    },
    /* 242 */
    /***/function (module, exports, __webpack_require__) {

      "use strict";

      // B.2.3.11 String.prototype.small()

      __webpack_require__(14)('small', function (createHTML) {
        return function small() {
          return createHTML(this, 'small', '', '');
        };
      });

      /***/
    },
    /* 243 */
    /***/function (module, exports, __webpack_require__) {

      "use strict";
      // 21.1.3.18 String.prototype.startsWith(searchString [, position ])

      var $export = __webpack_require__(0),
          toLength = __webpack_require__(8),
          context = __webpack_require__(77),
          STARTS_WITH = 'startsWith',
          $startsWith = ''[STARTS_WITH];

      $export($export.P + $export.F * __webpack_require__(63)(STARTS_WITH), 'String', {
        startsWith: function startsWith(searchString /*, position = 0 */) {
          var that = context(this, searchString, STARTS_WITH),
              index = toLength(Math.min(arguments.length > 1 ? arguments[1] : undefined, that.length)),
              search = String(searchString);
          return $startsWith ? $startsWith.call(that, search, index) : that.slice(index, index + search.length) === search;
        }
      });

      /***/
    },
    /* 244 */
    /***/function (module, exports, __webpack_require__) {

      "use strict";

      // B.2.3.12 String.prototype.strike()

      __webpack_require__(14)('strike', function (createHTML) {
        return function strike() {
          return createHTML(this, 'strike', '', '');
        };
      });

      /***/
    },
    /* 245 */
    /***/function (module, exports, __webpack_require__) {

      "use strict";

      // B.2.3.13 String.prototype.sub()

      __webpack_require__(14)('sub', function (createHTML) {
        return function sub() {
          return createHTML(this, 'sub', '', '');
        };
      });

      /***/
    },
    /* 246 */
    /***/function (module, exports, __webpack_require__) {

      "use strict";

      // B.2.3.14 String.prototype.sup()

      __webpack_require__(14)('sup', function (createHTML) {
        return function sup() {
          return createHTML(this, 'sup', '', '');
        };
      });

      /***/
    },
    /* 247 */
    /***/function (module, exports, __webpack_require__) {

      "use strict";

      // 21.1.3.25 String.prototype.trim()

      __webpack_require__(44)('trim', function ($trim) {
        return function trim() {
          return $trim(this, 3);
        };
      });

      /***/
    },
    /* 248 */
    /***/function (module, exports, __webpack_require__) {

      "use strict";

      // ECMAScript 6 symbols shim

      var global = __webpack_require__(2),
          has = __webpack_require__(10),
          DESCRIPTORS = __webpack_require__(6),
          $export = __webpack_require__(0),
          redefine = __webpack_require__(13),
          META = __webpack_require__(28).KEY,
          $fails = __webpack_require__(3),
          shared = __webpack_require__(57),
          setToStringTag = __webpack_require__(43),
          uid = __webpack_require__(39),
          wks = __webpack_require__(5),
          wksExt = __webpack_require__(109),
          wksDefine = __webpack_require__(82),
          keyOf = __webpack_require__(124),
          enumKeys = __webpack_require__(123),
          isArray = __webpack_require__(67),
          anObject = __webpack_require__(1),
          toIObject = __webpack_require__(15),
          toPrimitive = __webpack_require__(23),
          createDesc = __webpack_require__(29),
          _create = __webpack_require__(33),
          gOPNExt = __webpack_require__(101),
          $GOPD = __webpack_require__(16),
          $DP = __webpack_require__(7),
          $keys = __webpack_require__(35),
          gOPD = $GOPD.f,
          dP = $DP.f,
          gOPN = gOPNExt.f,
          $Symbol = global.Symbol,
          $JSON = global.JSON,
          _stringify = $JSON && $JSON.stringify,
          PROTOTYPE = 'prototype',
          HIDDEN = wks('_hidden'),
          TO_PRIMITIVE = wks('toPrimitive'),
          isEnum = {}.propertyIsEnumerable,
          SymbolRegistry = shared('symbol-registry'),
          AllSymbols = shared('symbols'),
          OPSymbols = shared('op-symbols'),
          ObjectProto = Object[PROTOTYPE],
          USE_NATIVE = typeof $Symbol == 'function',
          QObject = global.QObject;
      // Don't use setters in Qt Script, https://github.com/zloirock/core-js/issues/173
      var setter = !QObject || !QObject[PROTOTYPE] || !QObject[PROTOTYPE].findChild;

      // fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687
      var setSymbolDesc = DESCRIPTORS && $fails(function () {
        return _create(dP({}, 'a', {
          get: function get() {
            return dP(this, 'a', { value: 7 }).a;
          }
        })).a != 7;
      }) ? function (it, key, D) {
        var protoDesc = gOPD(ObjectProto, key);
        if (protoDesc) delete ObjectProto[key];
        dP(it, key, D);
        if (protoDesc && it !== ObjectProto) dP(ObjectProto, key, protoDesc);
      } : dP;

      var wrap = function wrap(tag) {
        var sym = AllSymbols[tag] = _create($Symbol[PROTOTYPE]);
        sym._k = tag;
        return sym;
      };

      var isSymbol = USE_NATIVE && _typeof2($Symbol.iterator) == 'symbol' ? function (it) {
        return (typeof it === 'undefined' ? 'undefined' : _typeof2(it)) == 'symbol';
      } : function (it) {
        return it instanceof $Symbol;
      };

      var $defineProperty = function defineProperty(it, key, D) {
        if (it === ObjectProto) $defineProperty(OPSymbols, key, D);
        anObject(it);
        key = toPrimitive(key, true);
        anObject(D);
        if (has(AllSymbols, key)) {
          if (!D.enumerable) {
            if (!has(it, HIDDEN)) dP(it, HIDDEN, createDesc(1, {}));
            it[HIDDEN][key] = true;
          } else {
            if (has(it, HIDDEN) && it[HIDDEN][key]) it[HIDDEN][key] = false;
            D = _create(D, { enumerable: createDesc(0, false) });
          }return setSymbolDesc(it, key, D);
        }return dP(it, key, D);
      };
      var $defineProperties = function defineProperties(it, P) {
        anObject(it);
        var keys = enumKeys(P = toIObject(P)),
            i = 0,
            l = keys.length,
            key;
        while (l > i) {
          $defineProperty(it, key = keys[i++], P[key]);
        }return it;
      };
      var $create = function create(it, P) {
        return P === undefined ? _create(it) : $defineProperties(_create(it), P);
      };
      var $propertyIsEnumerable = function propertyIsEnumerable(key) {
        var E = isEnum.call(this, key = toPrimitive(key, true));
        if (this === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key)) return false;
        return E || !has(this, key) || !has(AllSymbols, key) || has(this, HIDDEN) && this[HIDDEN][key] ? E : true;
      };
      var $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(it, key) {
        it = toIObject(it);
        key = toPrimitive(key, true);
        if (it === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key)) return;
        var D = gOPD(it, key);
        if (D && has(AllSymbols, key) && !(has(it, HIDDEN) && it[HIDDEN][key])) D.enumerable = true;
        return D;
      };
      var $getOwnPropertyNames = function getOwnPropertyNames(it) {
        var names = gOPN(toIObject(it)),
            result = [],
            i = 0,
            key;
        while (names.length > i) {
          if (!has(AllSymbols, key = names[i++]) && key != HIDDEN && key != META) result.push(key);
        }return result;
      };
      var $getOwnPropertySymbols = function getOwnPropertySymbols(it) {
        var IS_OP = it === ObjectProto,
            names = gOPN(IS_OP ? OPSymbols : toIObject(it)),
            result = [],
            i = 0,
            key;
        while (names.length > i) {
          if (has(AllSymbols, key = names[i++]) && (IS_OP ? has(ObjectProto, key) : true)) result.push(AllSymbols[key]);
        }return result;
      };

      // 19.4.1.1 Symbol([description])
      if (!USE_NATIVE) {
        $Symbol = function _Symbol2() {
          if (this instanceof $Symbol) throw TypeError('Symbol is not a constructor!');
          var tag = uid(arguments.length > 0 ? arguments[0] : undefined);
          var $set = function $set(value) {
            if (this === ObjectProto) $set.call(OPSymbols, value);
            if (has(this, HIDDEN) && has(this[HIDDEN], tag)) this[HIDDEN][tag] = false;
            setSymbolDesc(this, tag, createDesc(1, value));
          };
          if (DESCRIPTORS && setter) setSymbolDesc(ObjectProto, tag, { configurable: true, set: $set });
          return wrap(tag);
        };
        redefine($Symbol[PROTOTYPE], 'toString', function toString() {
          return this._k;
        });

        $GOPD.f = $getOwnPropertyDescriptor;
        $DP.f = $defineProperty;
        __webpack_require__(34).f = gOPNExt.f = $getOwnPropertyNames;
        __webpack_require__(47).f = $propertyIsEnumerable;
        __webpack_require__(56).f = $getOwnPropertySymbols;

        if (DESCRIPTORS && !__webpack_require__(32)) {
          redefine(ObjectProto, 'propertyIsEnumerable', $propertyIsEnumerable, true);
        }

        wksExt.f = function (name) {
          return wrap(wks(name));
        };
      }

      $export($export.G + $export.W + $export.F * !USE_NATIVE, { Symbol: $Symbol });

      for (var symbols =
      // 19.4.2.2, 19.4.2.3, 19.4.2.4, 19.4.2.6, 19.4.2.8, 19.4.2.9, 19.4.2.10, 19.4.2.11, 19.4.2.12, 19.4.2.13, 19.4.2.14
      'hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables'.split(','), i = 0; symbols.length > i;) {
        wks(symbols[i++]);
      }for (var symbols = $keys(wks.store), i = 0; symbols.length > i;) {
        wksDefine(symbols[i++]);
      }$export($export.S + $export.F * !USE_NATIVE, 'Symbol', {
        // 19.4.2.1 Symbol.for(key)
        'for': function _for(key) {
          return has(SymbolRegistry, key += '') ? SymbolRegistry[key] : SymbolRegistry[key] = $Symbol(key);
        },
        // 19.4.2.5 Symbol.keyFor(sym)
        keyFor: function keyFor(key) {
          if (isSymbol(key)) return keyOf(SymbolRegistry, key);
          throw TypeError(key + ' is not a symbol!');
        },
        useSetter: function useSetter() {
          setter = true;
        },
        useSimple: function useSimple() {
          setter = false;
        }
      });

      $export($export.S + $export.F * !USE_NATIVE, 'Object', {
        // 19.1.2.2 Object.create(O [, Properties])
        create: $create,
        // 19.1.2.4 Object.defineProperty(O, P, Attributes)
        defineProperty: $defineProperty,
        // 19.1.2.3 Object.defineProperties(O, Properties)
        defineProperties: $defineProperties,
        // 19.1.2.6 Object.getOwnPropertyDescriptor(O, P)
        getOwnPropertyDescriptor: $getOwnPropertyDescriptor,
        // 19.1.2.7 Object.getOwnPropertyNames(O)
        getOwnPropertyNames: $getOwnPropertyNames,
        // 19.1.2.8 Object.getOwnPropertySymbols(O)
        getOwnPropertySymbols: $getOwnPropertySymbols
      });

      // 24.3.2 JSON.stringify(value [, replacer [, space]])
      $JSON && $export($export.S + $export.F * (!USE_NATIVE || $fails(function () {
        var S = $Symbol();
        // MS Edge converts symbol values to JSON as {}
        // WebKit converts symbol values to JSON as null
        // V8 throws on boxed symbols
        return _stringify([S]) != '[null]' || _stringify({ a: S }) != '{}' || _stringify(Object(S)) != '{}';
      })), 'JSON', {
        stringify: function stringify(it) {
          if (it === undefined || isSymbol(it)) return; // IE8 returns string on undefined
          var args = [it],
              i = 1,
              replacer,
              $replacer;
          while (arguments.length > i) {
            args.push(arguments[i++]);
          }replacer = args[1];
          if (typeof replacer == 'function') $replacer = replacer;
          if ($replacer || !isArray(replacer)) replacer = function replacer(key, value) {
            if ($replacer) value = $replacer.call(this, key, value);
            if (!isSymbol(value)) return value;
          };
          args[1] = replacer;
          return _stringify.apply($JSON, args);
        }
      });

      // 19.4.3.4 Symbol.prototype[@@toPrimitive](hint)
      $Symbol[PROTOTYPE][TO_PRIMITIVE] || __webpack_require__(12)($Symbol[PROTOTYPE], TO_PRIMITIVE, $Symbol[PROTOTYPE].valueOf);
      // 19.4.3.5 Symbol.prototype[@@toStringTag]
      setToStringTag($Symbol, 'Symbol');
      // 20.2.1.9 Math[@@toStringTag]
      setToStringTag(Math, 'Math', true);
      // 24.3.3 JSON[@@toStringTag]
      setToStringTag(global.JSON, 'JSON', true);

      /***/
    },
    /* 249 */
    /***/function (module, exports, __webpack_require__) {

      "use strict";

      var $export = __webpack_require__(0),
          $typed = __webpack_require__(58),
          buffer = __webpack_require__(81),
          anObject = __webpack_require__(1),
          toIndex = __webpack_require__(38),
          toLength = __webpack_require__(8),
          isObject = __webpack_require__(4),
          ArrayBuffer = __webpack_require__(2).ArrayBuffer,
          speciesConstructor = __webpack_require__(75),
          $ArrayBuffer = buffer.ArrayBuffer,
          $DataView = buffer.DataView,
          $isView = $typed.ABV && ArrayBuffer.isView,
          $slice = $ArrayBuffer.prototype.slice,
          VIEW = $typed.VIEW,
          ARRAY_BUFFER = 'ArrayBuffer';

      $export($export.G + $export.W + $export.F * (ArrayBuffer !== $ArrayBuffer), { ArrayBuffer: $ArrayBuffer });

      $export($export.S + $export.F * !$typed.CONSTR, ARRAY_BUFFER, {
        // 24.1.3.1 ArrayBuffer.isView(arg)
        isView: function isView(it) {
          return $isView && $isView(it) || isObject(it) && VIEW in it;
        }
      });

      $export($export.P + $export.U + $export.F * __webpack_require__(3)(function () {
        return !new $ArrayBuffer(2).slice(1, undefined).byteLength;
      }), ARRAY_BUFFER, {
        // 24.1.4.3 ArrayBuffer.prototype.slice(start, end)
        slice: function slice(start, end) {
          if ($slice !== undefined && end === undefined) return $slice.call(anObject(this), start); // FF fix
          var len = anObject(this).byteLength,
              first = toIndex(start, len),
              final = toIndex(end === undefined ? len : end, len),
              result = new (speciesConstructor(this, $ArrayBuffer))(toLength(final - first)),
              viewS = new $DataView(this),
              viewT = new $DataView(result),
              index = 0;
          while (first < final) {
            viewT.setUint8(index++, viewS.getUint8(first++));
          }return result;
        }
      });

      __webpack_require__(37)(ARRAY_BUFFER);

      /***/
    },
    /* 250 */
    /***/function (module, exports, __webpack_require__) {

      var $export = __webpack_require__(0);
      $export($export.G + $export.W + $export.F * !__webpack_require__(58).ABV, {
        DataView: __webpack_require__(81).DataView
      });

      /***/
    },
    /* 251 */
    /***/function (module, exports, __webpack_require__) {

      __webpack_require__(27)('Float32', 4, function (init) {
        return function Float32Array(data, byteOffset, length) {
          return init(this, data, byteOffset, length);
        };
      });

      /***/
    },
    /* 252 */
    /***/function (module, exports, __webpack_require__) {

      __webpack_require__(27)('Float64', 8, function (init) {
        return function Float64Array(data, byteOffset, length) {
          return init(this, data, byteOffset, length);
        };
      });

      /***/
    },
    /* 253 */
    /***/function (module, exports, __webpack_require__) {

      __webpack_require__(27)('Int16', 2, function (init) {
        return function Int16Array(data, byteOffset, length) {
          return init(this, data, byteOffset, length);
        };
      });

      /***/
    },
    /* 254 */
    /***/function (module, exports, __webpack_require__) {

      __webpack_require__(27)('Int32', 4, function (init) {
        return function Int32Array(data, byteOffset, length) {
          return init(this, data, byteOffset, length);
        };
      });

      /***/
    },
    /* 255 */
    /***/function (module, exports, __webpack_require__) {

      __webpack_require__(27)('Int8', 1, function (init) {
        return function Int8Array(data, byteOffset, length) {
          return init(this, data, byteOffset, length);
        };
      });

      /***/
    },
    /* 256 */
    /***/function (module, exports, __webpack_require__) {

      __webpack_require__(27)('Uint16', 2, function (init) {
        return function Uint16Array(data, byteOffset, length) {
          return init(this, data, byteOffset, length);
        };
      });

      /***/
    },
    /* 257 */
    /***/function (module, exports, __webpack_require__) {

      __webpack_require__(27)('Uint32', 4, function (init) {
        return function Uint32Array(data, byteOffset, length) {
          return init(this, data, byteOffset, length);
        };
      });

      /***/
    },
    /* 258 */
    /***/function (module, exports, __webpack_require__) {

      __webpack_require__(27)('Uint8', 1, function (init) {
        return function Uint8Array(data, byteOffset, length) {
          return init(this, data, byteOffset, length);
        };
      });

      /***/
    },
    /* 259 */
    /***/function (module, exports, __webpack_require__) {

      __webpack_require__(27)('Uint8', 1, function (init) {
        return function Uint8ClampedArray(data, byteOffset, length) {
          return init(this, data, byteOffset, length);
        };
      }, true);

      /***/
    },
    /* 260 */
    /***/function (module, exports, __webpack_require__) {

      "use strict";

      var weak = __webpack_require__(93);

      // 23.4 WeakSet Objects
      __webpack_require__(49)('WeakSet', function (get) {
        return function WeakSet() {
          return get(this, arguments.length > 0 ? arguments[0] : undefined);
        };
      }, {
        // 23.4.3.1 WeakSet.prototype.add(value)
        add: function add(value) {
          return weak.def(this, value, true);
        }
      }, weak, false, true);

      /***/
    },
    /* 261 */
    /***/function (module, exports, __webpack_require__) {

      "use strict";

      // https://github.com/tc39/Array.prototype.includes

      var $export = __webpack_require__(0),
          $includes = __webpack_require__(48)(true);

      $export($export.P, 'Array', {
        includes: function includes(el /*, fromIndex = 0 */) {
          return $includes(this, el, arguments.length > 1 ? arguments[1] : undefined);
        }
      });

      __webpack_require__(40)('includes');

      /***/
    },
    /* 262 */
    /***/function (module, exports, __webpack_require__) {

      // https://github.com/rwaldron/tc39-notes/blob/master/es6/2014-09/sept-25.md#510-globalasap-for-enqueuing-a-microtask
      var $export = __webpack_require__(0),
          microtask = __webpack_require__(72)(),
          process = __webpack_require__(2).process,
          isNode = __webpack_require__(18)(process) == 'process';

      $export($export.G, {
        asap: function asap(fn) {
          var domain = isNode && process.domain;
          microtask(domain ? domain.bind(fn) : fn);
        }
      });

      /***/
    },
    /* 263 */
    /***/function (module, exports, __webpack_require__) {

      // https://github.com/ljharb/proposal-is-error
      var $export = __webpack_require__(0),
          cof = __webpack_require__(18);

      $export($export.S, 'Error', {
        isError: function isError(it) {
          return cof(it) === 'Error';
        }
      });

      /***/
    },
    /* 264 */
    /***/function (module, exports, __webpack_require__) {

      // https://github.com/DavidBruant/Map-Set.prototype.toJSON
      var $export = __webpack_require__(0);

      $export($export.P + $export.R, 'Map', { toJSON: __webpack_require__(92)('Map') });

      /***/
    },
    /* 265 */
    /***/function (module, exports, __webpack_require__) {

      // https://gist.github.com/BrendanEich/4294d5c212a6d2254703
      var $export = __webpack_require__(0);

      $export($export.S, 'Math', {
        iaddh: function iaddh(x0, x1, y0, y1) {
          var $x0 = x0 >>> 0,
              $x1 = x1 >>> 0,
              $y0 = y0 >>> 0;
          return $x1 + (y1 >>> 0) + (($x0 & $y0 | ($x0 | $y0) & ~($x0 + $y0 >>> 0)) >>> 31) | 0;
        }
      });

      /***/
    },
    /* 266 */
    /***/function (module, exports, __webpack_require__) {

      // https://gist.github.com/BrendanEich/4294d5c212a6d2254703
      var $export = __webpack_require__(0);

      $export($export.S, 'Math', {
        imulh: function imulh(u, v) {
          var UINT16 = 0xffff,
              $u = +u,
              $v = +v,
              u0 = $u & UINT16,
              v0 = $v & UINT16,
              u1 = $u >> 16,
              v1 = $v >> 16,
              t = (u1 * v0 >>> 0) + (u0 * v0 >>> 16);
          return u1 * v1 + (t >> 16) + ((u0 * v1 >>> 0) + (t & UINT16) >> 16);
        }
      });

      /***/
    },
    /* 267 */
    /***/function (module, exports, __webpack_require__) {

      // https://gist.github.com/BrendanEich/4294d5c212a6d2254703
      var $export = __webpack_require__(0);

      $export($export.S, 'Math', {
        isubh: function isubh(x0, x1, y0, y1) {
          var $x0 = x0 >>> 0,
              $x1 = x1 >>> 0,
              $y0 = y0 >>> 0;
          return $x1 - (y1 >>> 0) - ((~$x0 & $y0 | ~($x0 ^ $y0) & $x0 - $y0 >>> 0) >>> 31) | 0;
        }
      });

      /***/
    },
    /* 268 */
    /***/function (module, exports, __webpack_require__) {

      // https://gist.github.com/BrendanEich/4294d5c212a6d2254703
      var $export = __webpack_require__(0);

      $export($export.S, 'Math', {
        umulh: function umulh(u, v) {
          var UINT16 = 0xffff,
              $u = +u,
              $v = +v,
              u0 = $u & UINT16,
              v0 = $v & UINT16,
              u1 = $u >>> 16,
              v1 = $v >>> 16,
              t = (u1 * v0 >>> 0) + (u0 * v0 >>> 16);
          return u1 * v1 + (t >>> 16) + ((u0 * v1 >>> 0) + (t & UINT16) >>> 16);
        }
      });

      /***/
    },
    /* 269 */
    /***/function (module, exports, __webpack_require__) {

      "use strict";

      var $export = __webpack_require__(0),
          toObject = __webpack_require__(9),
          aFunction = __webpack_require__(11),
          $defineProperty = __webpack_require__(7);

      // B.2.2.2 Object.prototype.__defineGetter__(P, getter)
      __webpack_require__(6) && $export($export.P + __webpack_require__(55), 'Object', {
        __defineGetter__: function __defineGetter__(P, getter) {
          $defineProperty.f(toObject(this), P, { get: aFunction(getter), enumerable: true, configurable: true });
        }
      });

      /***/
    },
    /* 270 */
    /***/function (module, exports, __webpack_require__) {

      "use strict";

      var $export = __webpack_require__(0),
          toObject = __webpack_require__(9),
          aFunction = __webpack_require__(11),
          $defineProperty = __webpack_require__(7);

      // B.2.2.3 Object.prototype.__defineSetter__(P, setter)
      __webpack_require__(6) && $export($export.P + __webpack_require__(55), 'Object', {
        __defineSetter__: function __defineSetter__(P, setter) {
          $defineProperty.f(toObject(this), P, { set: aFunction(setter), enumerable: true, configurable: true });
        }
      });

      /***/
    },
    /* 271 */
    /***/function (module, exports, __webpack_require__) {

      // https://github.com/tc39/proposal-object-values-entries
      var $export = __webpack_require__(0),
          $entries = __webpack_require__(103)(true);

      $export($export.S, 'Object', {
        entries: function entries(it) {
          return $entries(it);
        }
      });

      /***/
    },
    /* 272 */
    /***/function (module, exports, __webpack_require__) {

      // https://github.com/tc39/proposal-object-getownpropertydescriptors
      var $export = __webpack_require__(0),
          ownKeys = __webpack_require__(104),
          toIObject = __webpack_require__(15),
          gOPD = __webpack_require__(16),
          createProperty = __webpack_require__(60);

      $export($export.S, 'Object', {
        getOwnPropertyDescriptors: function getOwnPropertyDescriptors(object) {
          var O = toIObject(object),
              getDesc = gOPD.f,
              keys = ownKeys(O),
              result = {},
              i = 0,
              key;
          while (keys.length > i) {
            createProperty(result, key = keys[i++], getDesc(O, key));
          }return result;
        }
      });

      /***/
    },
    /* 273 */
    /***/function (module, exports, __webpack_require__) {

      "use strict";

      var $export = __webpack_require__(0),
          toObject = __webpack_require__(9),
          toPrimitive = __webpack_require__(23),
          getPrototypeOf = __webpack_require__(17),
          getOwnPropertyDescriptor = __webpack_require__(16).f;

      // B.2.2.4 Object.prototype.__lookupGetter__(P)
      __webpack_require__(6) && $export($export.P + __webpack_require__(55), 'Object', {
        __lookupGetter__: function __lookupGetter__(P) {
          var O = toObject(this),
              K = toPrimitive(P, true),
              D;
          do {
            if (D = getOwnPropertyDescriptor(O, K)) return D.get;
          } while (O = getPrototypeOf(O));
        }
      });

      /***/
    },
    /* 274 */
    /***/function (module, exports, __webpack_require__) {

      "use strict";

      var $export = __webpack_require__(0),
          toObject = __webpack_require__(9),
          toPrimitive = __webpack_require__(23),
          getPrototypeOf = __webpack_require__(17),
          getOwnPropertyDescriptor = __webpack_require__(16).f;

      // B.2.2.5 Object.prototype.__lookupSetter__(P)
      __webpack_require__(6) && $export($export.P + __webpack_require__(55), 'Object', {
        __lookupSetter__: function __lookupSetter__(P) {
          var O = toObject(this),
              K = toPrimitive(P, true),
              D;
          do {
            if (D = getOwnPropertyDescriptor(O, K)) return D.set;
          } while (O = getPrototypeOf(O));
        }
      });

      /***/
    },
    /* 275 */
    /***/function (module, exports, __webpack_require__) {

      // https://github.com/tc39/proposal-object-values-entries
      var $export = __webpack_require__(0),
          $values = __webpack_require__(103)(false);

      $export($export.S, 'Object', {
        values: function values(it) {
          return $values(it);
        }
      });

      /***/
    },
    /* 276 */
    /***/function (module, exports, __webpack_require__) {

      "use strict";

      // https://github.com/zenparsing/es-observable

      var $export = __webpack_require__(0),
          global = __webpack_require__(2),
          core = __webpack_require__(24),
          microtask = __webpack_require__(72)(),
          OBSERVABLE = __webpack_require__(5)('observable'),
          aFunction = __webpack_require__(11),
          anObject = __webpack_require__(1),
          anInstance = __webpack_require__(31),
          redefineAll = __webpack_require__(36),
          hide = __webpack_require__(12),
          forOf = __webpack_require__(41),
          RETURN = forOf.RETURN;

      var getMethod = function getMethod(fn) {
        return fn == null ? undefined : aFunction(fn);
      };

      var cleanupSubscription = function cleanupSubscription(subscription) {
        var cleanup = subscription._c;
        if (cleanup) {
          subscription._c = undefined;
          cleanup();
        }
      };

      var subscriptionClosed = function subscriptionClosed(subscription) {
        return subscription._o === undefined;
      };

      var closeSubscription = function closeSubscription(subscription) {
        if (!subscriptionClosed(subscription)) {
          subscription._o = undefined;
          cleanupSubscription(subscription);
        }
      };

      var Subscription = function Subscription(observer, subscriber) {
        anObject(observer);
        this._c = undefined;
        this._o = observer;
        observer = new SubscriptionObserver(this);
        try {
          var cleanup = subscriber(observer),
              subscription = cleanup;
          if (cleanup != null) {
            if (typeof cleanup.unsubscribe === 'function') cleanup = function cleanup() {
              subscription.unsubscribe();
            };else aFunction(cleanup);
            this._c = cleanup;
          }
        } catch (e) {
          observer.error(e);
          return;
        }if (subscriptionClosed(this)) cleanupSubscription(this);
      };

      Subscription.prototype = redefineAll({}, {
        unsubscribe: function unsubscribe() {
          closeSubscription(this);
        }
      });

      var SubscriptionObserver = function SubscriptionObserver(subscription) {
        this._s = subscription;
      };

      SubscriptionObserver.prototype = redefineAll({}, {
        next: function next(value) {
          var subscription = this._s;
          if (!subscriptionClosed(subscription)) {
            var observer = subscription._o;
            try {
              var m = getMethod(observer.next);
              if (m) return m.call(observer, value);
            } catch (e) {
              try {
                closeSubscription(subscription);
              } finally {
                throw e;
              }
            }
          }
        },
        error: function error(value) {
          var subscription = this._s;
          if (subscriptionClosed(subscription)) throw value;
          var observer = subscription._o;
          subscription._o = undefined;
          try {
            var m = getMethod(observer.error);
            if (!m) throw value;
            value = m.call(observer, value);
          } catch (e) {
            try {
              cleanupSubscription(subscription);
            } finally {
              throw e;
            }
          }cleanupSubscription(subscription);
          return value;
        },
        complete: function complete(value) {
          var subscription = this._s;
          if (!subscriptionClosed(subscription)) {
            var observer = subscription._o;
            subscription._o = undefined;
            try {
              var m = getMethod(observer.complete);
              value = m ? m.call(observer, value) : undefined;
            } catch (e) {
              try {
                cleanupSubscription(subscription);
              } finally {
                throw e;
              }
            }cleanupSubscription(subscription);
            return value;
          }
        }
      });

      var $Observable = function Observable(subscriber) {
        anInstance(this, $Observable, 'Observable', '_f')._f = aFunction(subscriber);
      };

      redefineAll($Observable.prototype, {
        subscribe: function subscribe(observer) {
          return new Subscription(observer, this._f);
        },
        forEach: function forEach(fn) {
          var that = this;
          return new (core.Promise || global.Promise)(function (resolve, reject) {
            aFunction(fn);
            var subscription = that.subscribe({
              next: function next(value) {
                try {
                  return fn(value);
                } catch (e) {
                  reject(e);
                  subscription.unsubscribe();
                }
              },
              error: reject,
              complete: resolve
            });
          });
        }
      });

      redefineAll($Observable, {
        from: function from(x) {
          var C = typeof this === 'function' ? this : $Observable;
          var method = getMethod(anObject(x)[OBSERVABLE]);
          if (method) {
            var observable = anObject(method.call(x));
            return observable.constructor === C ? observable : new C(function (observer) {
              return observable.subscribe(observer);
            });
          }
          return new C(function (observer) {
            var done = false;
            microtask(function () {
              if (!done) {
                try {
                  if (forOf(x, false, function (it) {
                    observer.next(it);
                    if (done) return RETURN;
                  }) === RETURN) return;
                } catch (e) {
                  if (done) throw e;
                  observer.error(e);
                  return;
                }observer.complete();
              }
            });
            return function () {
              done = true;
            };
          });
        },
        of: function of() {
          for (var i = 0, l = arguments.length, items = Array(l); i < l;) {
            items[i] = arguments[i++];
          }return new (typeof this === 'function' ? this : $Observable)(function (observer) {
            var done = false;
            microtask(function () {
              if (!done) {
                for (var i = 0; i < items.length; ++i) {
                  observer.next(items[i]);
                  if (done) return;
                }observer.complete();
              }
            });
            return function () {
              done = true;
            };
          });
        }
      });

      hide($Observable.prototype, OBSERVABLE, function () {
        return this;
      });

      $export($export.G, { Observable: $Observable });

      __webpack_require__(37)('Observable');

      /***/
    },
    /* 277 */
    /***/function (module, exports, __webpack_require__) {

      var metadata = __webpack_require__(26),
          anObject = __webpack_require__(1),
          toMetaKey = metadata.key,
          ordinaryDefineOwnMetadata = metadata.set;

      metadata.exp({ defineMetadata: function defineMetadata(metadataKey, metadataValue, target, targetKey) {
          ordinaryDefineOwnMetadata(metadataKey, metadataValue, anObject(target), toMetaKey(targetKey));
        } });

      /***/
    },
    /* 278 */
    /***/function (module, exports, __webpack_require__) {

      var metadata = __webpack_require__(26),
          anObject = __webpack_require__(1),
          toMetaKey = metadata.key,
          getOrCreateMetadataMap = metadata.map,
          store = metadata.store;

      metadata.exp({ deleteMetadata: function deleteMetadata(metadataKey, target /*, targetKey */) {
          var targetKey = arguments.length < 3 ? undefined : toMetaKey(arguments[2]),
              metadataMap = getOrCreateMetadataMap(anObject(target), targetKey, false);
          if (metadataMap === undefined || !metadataMap['delete'](metadataKey)) return false;
          if (metadataMap.size) return true;
          var targetMetadata = store.get(target);
          targetMetadata['delete'](targetKey);
          return !!targetMetadata.size || store['delete'](target);
        } });

      /***/
    },
    /* 279 */
    /***/function (module, exports, __webpack_require__) {

      var Set = __webpack_require__(112),
          from = __webpack_require__(88),
          metadata = __webpack_require__(26),
          anObject = __webpack_require__(1),
          getPrototypeOf = __webpack_require__(17),
          ordinaryOwnMetadataKeys = metadata.keys,
          toMetaKey = metadata.key;

      var ordinaryMetadataKeys = function ordinaryMetadataKeys(O, P) {
        var oKeys = ordinaryOwnMetadataKeys(O, P),
            parent = getPrototypeOf(O);
        if (parent === null) return oKeys;
        var pKeys = ordinaryMetadataKeys(parent, P);
        return pKeys.length ? oKeys.length ? from(new Set(oKeys.concat(pKeys))) : pKeys : oKeys;
      };

      metadata.exp({ getMetadataKeys: function getMetadataKeys(target /*, targetKey */) {
          return ordinaryMetadataKeys(anObject(target), arguments.length < 2 ? undefined : toMetaKey(arguments[1]));
        } });

      /***/
    },
    /* 280 */
    /***/function (module, exports, __webpack_require__) {

      var metadata = __webpack_require__(26),
          anObject = __webpack_require__(1),
          getPrototypeOf = __webpack_require__(17),
          ordinaryHasOwnMetadata = metadata.has,
          ordinaryGetOwnMetadata = metadata.get,
          toMetaKey = metadata.key;

      var ordinaryGetMetadata = function ordinaryGetMetadata(MetadataKey, O, P) {
        var hasOwn = ordinaryHasOwnMetadata(MetadataKey, O, P);
        if (hasOwn) return ordinaryGetOwnMetadata(MetadataKey, O, P);
        var parent = getPrototypeOf(O);
        return parent !== null ? ordinaryGetMetadata(MetadataKey, parent, P) : undefined;
      };

      metadata.exp({ getMetadata: function getMetadata(metadataKey, target /*, targetKey */) {
          return ordinaryGetMetadata(metadataKey, anObject(target), arguments.length < 3 ? undefined : toMetaKey(arguments[2]));
        } });

      /***/
    },
    /* 281 */
    /***/function (module, exports, __webpack_require__) {

      var metadata = __webpack_require__(26),
          anObject = __webpack_require__(1),
          ordinaryOwnMetadataKeys = metadata.keys,
          toMetaKey = metadata.key;

      metadata.exp({ getOwnMetadataKeys: function getOwnMetadataKeys(target /*, targetKey */) {
          return ordinaryOwnMetadataKeys(anObject(target), arguments.length < 2 ? undefined : toMetaKey(arguments[1]));
        } });

      /***/
    },
    /* 282 */
    /***/function (module, exports, __webpack_require__) {

      var metadata = __webpack_require__(26),
          anObject = __webpack_require__(1),
          ordinaryGetOwnMetadata = metadata.get,
          toMetaKey = metadata.key;

      metadata.exp({ getOwnMetadata: function getOwnMetadata(metadataKey, target /*, targetKey */) {
          return ordinaryGetOwnMetadata(metadataKey, anObject(target), arguments.length < 3 ? undefined : toMetaKey(arguments[2]));
        } });

      /***/
    },
    /* 283 */
    /***/function (module, exports, __webpack_require__) {

      var metadata = __webpack_require__(26),
          anObject = __webpack_require__(1),
          getPrototypeOf = __webpack_require__(17),
          ordinaryHasOwnMetadata = metadata.has,
          toMetaKey = metadata.key;

      var ordinaryHasMetadata = function ordinaryHasMetadata(MetadataKey, O, P) {
        var hasOwn = ordinaryHasOwnMetadata(MetadataKey, O, P);
        if (hasOwn) return true;
        var parent = getPrototypeOf(O);
        return parent !== null ? ordinaryHasMetadata(MetadataKey, parent, P) : false;
      };

      metadata.exp({ hasMetadata: function hasMetadata(metadataKey, target /*, targetKey */) {
          return ordinaryHasMetadata(metadataKey, anObject(target), arguments.length < 3 ? undefined : toMetaKey(arguments[2]));
        } });

      /***/
    },
    /* 284 */
    /***/function (module, exports, __webpack_require__) {

      var metadata = __webpack_require__(26),
          anObject = __webpack_require__(1),
          ordinaryHasOwnMetadata = metadata.has,
          toMetaKey = metadata.key;

      metadata.exp({ hasOwnMetadata: function hasOwnMetadata(metadataKey, target /*, targetKey */) {
          return ordinaryHasOwnMetadata(metadataKey, anObject(target), arguments.length < 3 ? undefined : toMetaKey(arguments[2]));
        } });

      /***/
    },
    /* 285 */
    /***/function (module, exports, __webpack_require__) {

      var metadata = __webpack_require__(26),
          anObject = __webpack_require__(1),
          aFunction = __webpack_require__(11),
          toMetaKey = metadata.key,
          ordinaryDefineOwnMetadata = metadata.set;

      metadata.exp({ metadata: function metadata(metadataKey, metadataValue) {
          return function decorator(target, targetKey) {
            ordinaryDefineOwnMetadata(metadataKey, metadataValue, (targetKey !== undefined ? anObject : aFunction)(target), toMetaKey(targetKey));
          };
        } });

      /***/
    },
    /* 286 */
    /***/function (module, exports, __webpack_require__) {

      // https://github.com/DavidBruant/Map-Set.prototype.toJSON
      var $export = __webpack_require__(0);

      $export($export.P + $export.R, 'Set', { toJSON: __webpack_require__(92)('Set') });

      /***/
    },
    /* 287 */
    /***/function (module, exports, __webpack_require__) {

      "use strict";

      // https://github.com/mathiasbynens/String.prototype.at

      var $export = __webpack_require__(0),
          $at = __webpack_require__(76)(true);

      $export($export.P, 'String', {
        at: function at(pos) {
          return $at(this, pos);
        }
      });

      /***/
    },
    /* 288 */
    /***/function (module, exports, __webpack_require__) {

      "use strict";

      // https://tc39.github.io/String.prototype.matchAll/

      var $export = __webpack_require__(0),
          defined = __webpack_require__(19),
          toLength = __webpack_require__(8),
          isRegExp = __webpack_require__(53),
          getFlags = __webpack_require__(51),
          RegExpProto = RegExp.prototype;

      var $RegExpStringIterator = function $RegExpStringIterator(regexp, string) {
        this._r = regexp;
        this._s = string;
      };

      __webpack_require__(68)($RegExpStringIterator, 'RegExp String', function next() {
        var match = this._r.exec(this._s);
        return { value: match, done: match === null };
      });

      $export($export.P, 'String', {
        matchAll: function matchAll(regexp) {
          defined(this);
          if (!isRegExp(regexp)) throw TypeError(regexp + ' is not a regexp!');
          var S = String(this),
              flags = 'flags' in RegExpProto ? String(regexp.flags) : getFlags.call(regexp),
              rx = new RegExp(regexp.source, ~flags.indexOf('g') ? flags : 'g' + flags);
          rx.lastIndex = toLength(regexp.lastIndex);
          return new $RegExpStringIterator(rx, S);
        }
      });

      /***/
    },
    /* 289 */
    /***/function (module, exports, __webpack_require__) {

      "use strict";

      // https://github.com/tc39/proposal-string-pad-start-end

      var $export = __webpack_require__(0),
          $pad = __webpack_require__(108);

      $export($export.P, 'String', {
        padEnd: function padEnd(maxLength /*, fillString = ' ' */) {
          return $pad(this, maxLength, arguments.length > 1 ? arguments[1] : undefined, false);
        }
      });

      /***/
    },
    /* 290 */
    /***/function (module, exports, __webpack_require__) {

      "use strict";

      // https://github.com/tc39/proposal-string-pad-start-end

      var $export = __webpack_require__(0),
          $pad = __webpack_require__(108);

      $export($export.P, 'String', {
        padStart: function padStart(maxLength /*, fillString = ' ' */) {
          return $pad(this, maxLength, arguments.length > 1 ? arguments[1] : undefined, true);
        }
      });

      /***/
    },
    /* 291 */
    /***/function (module, exports, __webpack_require__) {

      "use strict";

      // https://github.com/sebmarkbage/ecmascript-string-left-right-trim

      __webpack_require__(44)('trimLeft', function ($trim) {
        return function trimLeft() {
          return $trim(this, 1);
        };
      }, 'trimStart');

      /***/
    },
    /* 292 */
    /***/function (module, exports, __webpack_require__) {

      "use strict";

      // https://github.com/sebmarkbage/ecmascript-string-left-right-trim

      __webpack_require__(44)('trimRight', function ($trim) {
        return function trimRight() {
          return $trim(this, 2);
        };
      }, 'trimEnd');

      /***/
    },
    /* 293 */
    /***/function (module, exports, __webpack_require__) {

      __webpack_require__(82)('asyncIterator');

      /***/
    },
    /* 294 */
    /***/function (module, exports, __webpack_require__) {

      __webpack_require__(82)('observable');

      /***/
    },
    /* 295 */
    /***/function (module, exports, __webpack_require__) {

      // https://github.com/ljharb/proposal-global
      var $export = __webpack_require__(0);

      $export($export.S, 'System', { global: __webpack_require__(2) });

      /***/
    },
    /* 296 */
    /***/function (module, exports, __webpack_require__) {

      var $iterators = __webpack_require__(84),
          redefine = __webpack_require__(13),
          global = __webpack_require__(2),
          hide = __webpack_require__(12),
          Iterators = __webpack_require__(42),
          wks = __webpack_require__(5),
          ITERATOR = wks('iterator'),
          TO_STRING_TAG = wks('toStringTag'),
          ArrayValues = Iterators.Array;

      for (var collections = ['NodeList', 'DOMTokenList', 'MediaList', 'StyleSheetList', 'CSSRuleList'], i = 0; i < 5; i++) {
        var NAME = collections[i],
            Collection = global[NAME],
            proto = Collection && Collection.prototype,
            key;
        if (proto) {
          if (!proto[ITERATOR]) hide(proto, ITERATOR, ArrayValues);
          if (!proto[TO_STRING_TAG]) hide(proto, TO_STRING_TAG, NAME);
          Iterators[NAME] = ArrayValues;
          for (key in $iterators) {
            if (!proto[key]) redefine(proto, key, $iterators[key], true);
          }
        }
      }

      /***/
    },
    /* 297 */
    /***/function (module, exports, __webpack_require__) {

      var $export = __webpack_require__(0),
          $task = __webpack_require__(80);
      $export($export.G + $export.B, {
        setImmediate: $task.set,
        clearImmediate: $task.clear
      });

      /***/
    },
    /* 298 */
    /***/function (module, exports, __webpack_require__) {

      // ie9- setTimeout & setInterval additional parameters fix
      var global = __webpack_require__(2),
          $export = __webpack_require__(0),
          invoke = __webpack_require__(52),
          partial = __webpack_require__(125),
          navigator = global.navigator,
          MSIE = !!navigator && /MSIE .\./.test(navigator.userAgent); // <- dirty ie9- check
      var wrap = function wrap(set) {
        return MSIE ? function (fn, time /*, ...args */) {
          return set(invoke(partial, [].slice.call(arguments, 2), typeof fn == 'function' ? fn : Function(fn)), time);
        } : set;
      };
      $export($export.G + $export.B + $export.F * MSIE, {
        setTimeout: wrap(global.setTimeout),
        setInterval: wrap(global.setInterval)
      });

      /***/
    },
    /* 299 */
    /***/function (module, exports, __webpack_require__) {

      __webpack_require__(248);
      __webpack_require__(187);
      __webpack_require__(189);
      __webpack_require__(188);
      __webpack_require__(191);
      __webpack_require__(193);
      __webpack_require__(198);
      __webpack_require__(192);
      __webpack_require__(190);
      __webpack_require__(200);
      __webpack_require__(199);
      __webpack_require__(195);
      __webpack_require__(196);
      __webpack_require__(194);
      __webpack_require__(186);
      __webpack_require__(197);
      __webpack_require__(201);
      __webpack_require__(202);
      __webpack_require__(154);
      __webpack_require__(156);
      __webpack_require__(155);
      __webpack_require__(204);
      __webpack_require__(203);
      __webpack_require__(174);
      __webpack_require__(184);
      __webpack_require__(185);
      __webpack_require__(175);
      __webpack_require__(176);
      __webpack_require__(177);
      __webpack_require__(178);
      __webpack_require__(179);
      __webpack_require__(180);
      __webpack_require__(181);
      __webpack_require__(182);
      __webpack_require__(183);
      __webpack_require__(157);
      __webpack_require__(158);
      __webpack_require__(159);
      __webpack_require__(160);
      __webpack_require__(161);
      __webpack_require__(162);
      __webpack_require__(163);
      __webpack_require__(164);
      __webpack_require__(165);
      __webpack_require__(166);
      __webpack_require__(167);
      __webpack_require__(168);
      __webpack_require__(169);
      __webpack_require__(170);
      __webpack_require__(171);
      __webpack_require__(172);
      __webpack_require__(173);
      __webpack_require__(235);
      __webpack_require__(240);
      __webpack_require__(247);
      __webpack_require__(238);
      __webpack_require__(230);
      __webpack_require__(231);
      __webpack_require__(236);
      __webpack_require__(241);
      __webpack_require__(243);
      __webpack_require__(226);
      __webpack_require__(227);
      __webpack_require__(228);
      __webpack_require__(229);
      __webpack_require__(232);
      __webpack_require__(233);
      __webpack_require__(234);
      __webpack_require__(237);
      __webpack_require__(239);
      __webpack_require__(242);
      __webpack_require__(244);
      __webpack_require__(245);
      __webpack_require__(246);
      __webpack_require__(149);
      __webpack_require__(151);
      __webpack_require__(150);
      __webpack_require__(153);
      __webpack_require__(152);
      __webpack_require__(138);
      __webpack_require__(136);
      __webpack_require__(142);
      __webpack_require__(139);
      __webpack_require__(145);
      __webpack_require__(147);
      __webpack_require__(135);
      __webpack_require__(141);
      __webpack_require__(132);
      __webpack_require__(146);
      __webpack_require__(130);
      __webpack_require__(144);
      __webpack_require__(143);
      __webpack_require__(137);
      __webpack_require__(140);
      __webpack_require__(129);
      __webpack_require__(131);
      __webpack_require__(134);
      __webpack_require__(133);
      __webpack_require__(148);
      __webpack_require__(84);
      __webpack_require__(220);
      __webpack_require__(225);
      __webpack_require__(111);
      __webpack_require__(221);
      __webpack_require__(222);
      __webpack_require__(223);
      __webpack_require__(224);
      __webpack_require__(205);
      __webpack_require__(110);
      __webpack_require__(112);
      __webpack_require__(113);
      __webpack_require__(260);
      __webpack_require__(249);
      __webpack_require__(250);
      __webpack_require__(255);
      __webpack_require__(258);
      __webpack_require__(259);
      __webpack_require__(253);
      __webpack_require__(256);
      __webpack_require__(254);
      __webpack_require__(257);
      __webpack_require__(251);
      __webpack_require__(252);
      __webpack_require__(206);
      __webpack_require__(207);
      __webpack_require__(208);
      __webpack_require__(209);
      __webpack_require__(210);
      __webpack_require__(213);
      __webpack_require__(211);
      __webpack_require__(212);
      __webpack_require__(214);
      __webpack_require__(215);
      __webpack_require__(216);
      __webpack_require__(217);
      __webpack_require__(219);
      __webpack_require__(218);
      __webpack_require__(261);
      __webpack_require__(287);
      __webpack_require__(290);
      __webpack_require__(289);
      __webpack_require__(291);
      __webpack_require__(292);
      __webpack_require__(288);
      __webpack_require__(293);
      __webpack_require__(294);
      __webpack_require__(272);
      __webpack_require__(275);
      __webpack_require__(271);
      __webpack_require__(269);
      __webpack_require__(270);
      __webpack_require__(273);
      __webpack_require__(274);
      __webpack_require__(264);
      __webpack_require__(286);
      __webpack_require__(295);
      __webpack_require__(263);
      __webpack_require__(265);
      __webpack_require__(267);
      __webpack_require__(266);
      __webpack_require__(268);
      __webpack_require__(277);
      __webpack_require__(278);
      __webpack_require__(280);
      __webpack_require__(279);
      __webpack_require__(282);
      __webpack_require__(281);
      __webpack_require__(283);
      __webpack_require__(284);
      __webpack_require__(285);
      __webpack_require__(262);
      __webpack_require__(276);
      __webpack_require__(298);
      __webpack_require__(297);
      __webpack_require__(296);
      module.exports = __webpack_require__(24);

      /***/
    },
    /* 300 */
    /***/function (module, exports, __webpack_require__) {

      /* WEBPACK VAR INJECTION */(function (global) {
        /**
        * Copyright (c) 2014, Facebook, Inc.
        * All rights reserved.
        *
        * This source code is licensed under the BSD-style license found in the
        * https://raw.github.com/facebook/regenerator/master/LICENSE file. An
        * additional grant of patent rights can be found in the PATENTS file in
        * the same directory.
        */

        !function (global) {
          "use strict";

          var Op = Object.prototype;
          var hasOwn = Op.hasOwnProperty;
          var undefined; // More compressible than void 0.
          var $Symbol = typeof Symbol === "function" ? Symbol : {};
          var iteratorSymbol = $Symbol.iterator || "@@iterator";
          var asyncIteratorSymbol = $Symbol.asyncIterator || "@@asyncIterator";
          var toStringTagSymbol = $Symbol.toStringTag || "@@toStringTag";

          var inModule = (typeof module === 'undefined' ? 'undefined' : _typeof2(module)) === "object";
          var runtime = global.regeneratorRuntime;
          if (runtime) {
            if (inModule) {
              // If regeneratorRuntime is defined globally and we're in a module,
              // make the exports object identical to regeneratorRuntime.
              module.exports = runtime;
            }
            // Don't bother evaluating the rest of this file if the runtime was
            // already defined globally.
            return;
          }

          // Define the runtime globally (as expected by generated code) as either
          // module.exports (if we're in a module) or a new, empty object.
          runtime = global.regeneratorRuntime = inModule ? module.exports : {};

          function wrap(innerFn, outerFn, self, tryLocsList) {
            // If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator.
            var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator;
            var generator = Object.create(protoGenerator.prototype);
            var context = new Context(tryLocsList || []);

            // The ._invoke method unifies the implementations of the .next,
            // .throw, and .return methods.
            generator._invoke = makeInvokeMethod(innerFn, self, context);

            return generator;
          }
          runtime.wrap = wrap;

          // Try/catch helper to minimize deoptimizations. Returns a completion
          // record like context.tryEntries[i].completion. This interface could
          // have been (and was previously) designed to take a closure to be
          // invoked without arguments, but in all the cases we care about we
          // already have an existing method we want to call, so there's no need
          // to create a new function object. We can even get away with assuming
          // the method takes exactly one argument, since that happens to be true
          // in every case, so we don't have to touch the arguments object. The
          // only additional allocation required is the completion record, which
          // has a stable shape and so hopefully should be cheap to allocate.
          function tryCatch(fn, obj, arg) {
            try {
              return { type: "normal", arg: fn.call(obj, arg) };
            } catch (err) {
              return { type: "throw", arg: err };
            }
          }

          var GenStateSuspendedStart = "suspendedStart";
          var GenStateSuspendedYield = "suspendedYield";
          var GenStateExecuting = "executing";
          var GenStateCompleted = "completed";

          // Returning this object from the innerFn has the same effect as
          // breaking out of the dispatch switch statement.
          var ContinueSentinel = {};

          // Dummy constructor functions that we use as the .constructor and
          // .constructor.prototype properties for functions that return Generator
          // objects. For full spec compliance, you may wish to configure your
          // minifier not to mangle the names of these two functions.
          function Generator() {}
          function GeneratorFunction() {}
          function GeneratorFunctionPrototype() {}

          // This is a polyfill for %IteratorPrototype% for environments that
          // don't natively support it.
          var IteratorPrototype = {};
          IteratorPrototype[iteratorSymbol] = function () {
            return this;
          };

          var getProto = Object.getPrototypeOf;
          var NativeIteratorPrototype = getProto && getProto(getProto(values([])));
          if (NativeIteratorPrototype && NativeIteratorPrototype !== Op && hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) {
            // This environment has a native %IteratorPrototype%; use it instead
            // of the polyfill.
            IteratorPrototype = NativeIteratorPrototype;
          }

          var Gp = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(IteratorPrototype);
          GeneratorFunction.prototype = Gp.constructor = GeneratorFunctionPrototype;
          GeneratorFunctionPrototype.constructor = GeneratorFunction;
          GeneratorFunctionPrototype[toStringTagSymbol] = GeneratorFunction.displayName = "GeneratorFunction";

          // Helper for defining the .next, .throw, and .return methods of the
          // Iterator interface in terms of a single ._invoke method.
          function defineIteratorMethods(prototype) {
            ["next", "throw", "return"].forEach(function (method) {
              prototype[method] = function (arg) {
                return this._invoke(method, arg);
              };
            });
          }

          runtime.isGeneratorFunction = function (genFun) {
            var ctor = typeof genFun === "function" && genFun.constructor;
            return ctor ? ctor === GeneratorFunction ||
            // For the native GeneratorFunction constructor, the best we can
            // do is to check its .name property.
            (ctor.displayName || ctor.name) === "GeneratorFunction" : false;
          };

          runtime.mark = function (genFun) {
            if (Object.setPrototypeOf) {
              Object.setPrototypeOf(genFun, GeneratorFunctionPrototype);
            } else {
              genFun.__proto__ = GeneratorFunctionPrototype;
              if (!(toStringTagSymbol in genFun)) {
                genFun[toStringTagSymbol] = "GeneratorFunction";
              }
            }
            genFun.prototype = Object.create(Gp);
            return genFun;
          };

          // Within the body of any async function, `await x` is transformed to
          // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test
          // `hasOwn.call(value, "__await")` to determine if the yielded value is
          // meant to be awaited.
          runtime.awrap = function (arg) {
            return { __await: arg };
          };

          function AsyncIterator(generator) {
            function invoke(method, arg, resolve, reject) {
              var record = tryCatch(generator[method], generator, arg);
              if (record.type === "throw") {
                reject(record.arg);
              } else {
                var result = record.arg;
                var value = result.value;
                if (value && (typeof value === 'undefined' ? 'undefined' : _typeof2(value)) === "object" && hasOwn.call(value, "__await")) {
                  return Promise.resolve(value.__await).then(function (value) {
                    invoke("next", value, resolve, reject);
                  }, function (err) {
                    invoke("throw", err, resolve, reject);
                  });
                }

                return Promise.resolve(value).then(function (unwrapped) {
                  // When a yielded Promise is resolved, its final value becomes
                  // the .value of the Promise<{value,done}> result for the
                  // current iteration. If the Promise is rejected, however, the
                  // result for this iteration will be rejected with the same
                  // reason. Note that rejections of yielded Promises are not
                  // thrown back into the generator function, as is the case
                  // when an awaited Promise is rejected. This difference in
                  // behavior between yield and await is important, because it
                  // allows the consumer to decide what to do with the yielded
                  // rejection (swallow it and continue, manually .throw it back
                  // into the generator, abandon iteration, whatever). With
                  // await, by contrast, there is no opportunity to examine the
                  // rejection reason outside the generator function, so the
                  // only option is to throw it from the await expression, and
                  // let the generator function handle the exception.
                  result.value = unwrapped;
                  resolve(result);
                }, reject);
              }
            }

            if (_typeof2(global.process) === "object" && global.process.domain) {
              invoke = global.process.domain.bind(invoke);
            }

            var previousPromise;

            function enqueue(method, arg) {
              function callInvokeWithMethodAndArg() {
                return new Promise(function (resolve, reject) {
                  invoke(method, arg, resolve, reject);
                });
              }

              return previousPromise =
              // If enqueue has been called before, then we want to wait until
              // all previous Promises have been resolved before calling invoke,
              // so that results are always delivered in the correct order. If
              // enqueue has not been called before, then it is important to
              // call invoke immediately, without waiting on a callback to fire,
              // so that the async generator function has the opportunity to do
              // any necessary setup in a predictable way. This predictability
              // is why the Promise constructor synchronously invokes its
              // executor callback, and why async functions synchronously
              // execute code before the first await. Since we implement simple
              // async functions in terms of async generators, it is especially
              // important to get this right, even though it requires care.
              previousPromise ? previousPromise.then(callInvokeWithMethodAndArg,
              // Avoid propagating failures to Promises returned by later
              // invocations of the iterator.
              callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg();
            }

            // Define the unified helper method that is used to implement .next,
            // .throw, and .return (see defineIteratorMethods).
            this._invoke = enqueue;
          }

          defineIteratorMethods(AsyncIterator.prototype);
          AsyncIterator.prototype[asyncIteratorSymbol] = function () {
            return this;
          };
          runtime.AsyncIterator = AsyncIterator;

          // Note that simple async functions are implemented on top of
          // AsyncIterator objects; they just return a Promise for the value of
          // the final result produced by the iterator.
          runtime.async = function (innerFn, outerFn, self, tryLocsList) {
            var iter = new AsyncIterator(wrap(innerFn, outerFn, self, tryLocsList));

            return runtime.isGeneratorFunction(outerFn) ? iter // If outerFn is a generator, return the full iterator.
            : iter.next().then(function (result) {
              return result.done ? result.value : iter.next();
            });
          };

          function makeInvokeMethod(innerFn, self, context) {
            var state = GenStateSuspendedStart;

            return function invoke(method, arg) {
              if (state === GenStateExecuting) {
                throw new Error("Generator is already running");
              }

              if (state === GenStateCompleted) {
                if (method === "throw") {
                  throw arg;
                }

                // Be forgiving, per 25.3.3.3.3 of the spec:
                // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume
                return doneResult();
              }

              context.method = method;
              context.arg = arg;

              while (true) {
                var delegate = context.delegate;
                if (delegate) {
                  var delegateResult = maybeInvokeDelegate(delegate, context);
                  if (delegateResult) {
                    if (delegateResult === ContinueSentinel) continue;
                    return delegateResult;
                  }
                }

                if (context.method === "next") {
                  // Setting context._sent for legacy support of Babel's
                  // function.sent implementation.
                  context.sent = context._sent = context.arg;
                } else if (context.method === "throw") {
                  if (state === GenStateSuspendedStart) {
                    state = GenStateCompleted;
                    throw context.arg;
                  }

                  context.dispatchException(context.arg);
                } else if (context.method === "return") {
                  context.abrupt("return", context.arg);
                }

                state = GenStateExecuting;

                var record = tryCatch(innerFn, self, context);
                if (record.type === "normal") {
                  // If an exception is thrown from innerFn, we leave state ===
                  // GenStateExecuting and loop back for another invocation.
                  state = context.done ? GenStateCompleted : GenStateSuspendedYield;

                  if (record.arg === ContinueSentinel) {
                    continue;
                  }

                  return {
                    value: record.arg,
                    done: context.done
                  };
                } else if (record.type === "throw") {
                  state = GenStateCompleted;
                  // Dispatch the exception by looping back around to the
                  // context.dispatchException(context.arg) call above.
                  context.method = "throw";
                  context.arg = record.arg;
                }
              }
            };
          }

          // Call delegate.iterator[context.method](context.arg) and handle the
          // result, either by returning a { value, done } result from the
          // delegate iterator, or by modifying context.method and context.arg,
          // setting context.delegate to null, and returning the ContinueSentinel.
          function maybeInvokeDelegate(delegate, context) {
            var method = delegate.iterator[context.method];
            if (method === undefined) {
              // A .throw or .return when the delegate iterator has no .throw
              // method always terminates the yield* loop.
              context.delegate = null;

              if (context.method === "throw") {
                if (delegate.iterator.return) {
                  // If the delegate iterator has a return method, give it a
                  // chance to clean up.
                  context.method = "return";
                  context.arg = undefined;
                  maybeInvokeDelegate(delegate, context);

                  if (context.method === "throw") {
                    // If maybeInvokeDelegate(context) changed context.method from
                    // "return" to "throw", let that override the TypeError below.
                    return ContinueSentinel;
                  }
                }

                context.method = "throw";
                context.arg = new TypeError("The iterator does not provide a 'throw' method");
              }

              return ContinueSentinel;
            }

            var record = tryCatch(method, delegate.iterator, context.arg);

            if (record.type === "throw") {
              context.method = "throw";
              context.arg = record.arg;
              context.delegate = null;
              return ContinueSentinel;
            }

            var info = record.arg;

            if (!info) {
              context.method = "throw";
              context.arg = new TypeError("iterator result is not an object");
              context.delegate = null;
              return ContinueSentinel;
            }

            if (info.done) {
              // Assign the result of the finished delegate to the temporary
              // variable specified by delegate.resultName (see delegateYield).
              context[delegate.resultName] = info.value;

              // Resume execution at the desired location (see delegateYield).
              context.next = delegate.nextLoc;

              // If context.method was "throw" but the delegate handled the
              // exception, let the outer generator proceed normally. If
              // context.method was "next", forget context.arg since it has been
              // "consumed" by the delegate iterator. If context.method was
              // "return", allow the original .return call to continue in the
              // outer generator.
              if (context.method !== "return") {
                context.method = "next";
                context.arg = undefined;
              }
            } else {
              // Re-yield the result returned by the delegate method.
              return info;
            }

            // The delegate iterator is finished, so forget it and continue with
            // the outer generator.
            context.delegate = null;
            return ContinueSentinel;
          }

          // Define Generator.prototype.{next,throw,return} in terms of the
          // unified ._invoke helper method.
          defineIteratorMethods(Gp);

          Gp[toStringTagSymbol] = "Generator";

          // A Generator should always return itself as the iterator object when the
          // @@iterator function is called on it. Some browsers' implementations of the
          // iterator prototype chain incorrectly implement this, causing the Generator
          // object to not be returned from this call. This ensures that doesn't happen.
          // See https://github.com/facebook/regenerator/issues/274 for more details.
          Gp[iteratorSymbol] = function () {
            return this;
          };

          Gp.toString = function () {
            return "[object Generator]";
          };

          function pushTryEntry(locs) {
            var entry = { tryLoc: locs[0] };

            if (1 in locs) {
              entry.catchLoc = locs[1];
            }

            if (2 in locs) {
              entry.finallyLoc = locs[2];
              entry.afterLoc = locs[3];
            }

            this.tryEntries.push(entry);
          }

          function resetTryEntry(entry) {
            var record = entry.completion || {};
            record.type = "normal";
            delete record.arg;
            entry.completion = record;
          }

          function Context(tryLocsList) {
            // The root entry object (effectively a try statement without a catch
            // or a finally block) gives us a place to store values thrown from
            // locations where there is no enclosing try statement.
            this.tryEntries = [{ tryLoc: "root" }];
            tryLocsList.forEach(pushTryEntry, this);
            this.reset(true);
          }

          runtime.keys = function (object) {
            var keys = [];
            for (var key in object) {
              keys.push(key);
            }
            keys.reverse();

            // Rather than returning an object with a next method, we keep
            // things simple and return the next function itself.
            return function next() {
              while (keys.length) {
                var key = keys.pop();
                if (key in object) {
                  next.value = key;
                  next.done = false;
                  return next;
                }
              }

              // To avoid creating an additional object, we just hang the .value
              // and .done properties off the next function object itself. This
              // also ensures that the minifier will not anonymize the function.
              next.done = true;
              return next;
            };
          };

          function values(iterable) {
            if (iterable) {
              var iteratorMethod = iterable[iteratorSymbol];
              if (iteratorMethod) {
                return iteratorMethod.call(iterable);
              }

              if (typeof iterable.next === "function") {
                return iterable;
              }

              if (!isNaN(iterable.length)) {
                var i = -1,
                    next = function next() {
                  while (++i < iterable.length) {
                    if (hasOwn.call(iterable, i)) {
                      next.value = iterable[i];
                      next.done = false;
                      return next;
                    }
                  }

                  next.value = undefined;
                  next.done = true;

                  return next;
                };

                return next.next = next;
              }
            }

            // Return an iterator with no values.
            return { next: doneResult };
          }
          runtime.values = values;

          function doneResult() {
            return { value: undefined, done: true };
          }

          Context.prototype = {
            constructor: Context,

            reset: function reset(skipTempReset) {
              this.prev = 0;
              this.next = 0;
              // Resetting context._sent for legacy support of Babel's
              // function.sent implementation.
              this.sent = this._sent = undefined;
              this.done = false;
              this.delegate = null;

              this.method = "next";
              this.arg = undefined;

              this.tryEntries.forEach(resetTryEntry);

              if (!skipTempReset) {
                for (var name in this) {
                  // Not sure about the optimal order of these conditions:
                  if (name.charAt(0) === "t" && hasOwn.call(this, name) && !isNaN(+name.slice(1))) {
                    this[name] = undefined;
                  }
                }
              }
            },

            stop: function stop() {
              this.done = true;

              var rootEntry = this.tryEntries[0];
              var rootRecord = rootEntry.completion;
              if (rootRecord.type === "throw") {
                throw rootRecord.arg;
              }

              return this.rval;
            },

            dispatchException: function dispatchException(exception) {
              if (this.done) {
                throw exception;
              }

              var context = this;
              function handle(loc, caught) {
                record.type = "throw";
                record.arg = exception;
                context.next = loc;

                if (caught) {
                  // If the dispatched exception was caught by a catch block,
                  // then let that catch block handle the exception normally.
                  context.method = "next";
                  context.arg = undefined;
                }

                return !!caught;
              }

              for (var i = this.tryEntries.length - 1; i >= 0; --i) {
                var entry = this.tryEntries[i];
                var record = entry.completion;

                if (entry.tryLoc === "root") {
                  // Exception thrown outside of any try block that could handle
                  // it, so set the completion value of the entire function to
                  // throw the exception.
                  return handle("end");
                }

                if (entry.tryLoc <= this.prev) {
                  var hasCatch = hasOwn.call(entry, "catchLoc");
                  var hasFinally = hasOwn.call(entry, "finallyLoc");

                  if (hasCatch && hasFinally) {
                    if (this.prev < entry.catchLoc) {
                      return handle(entry.catchLoc, true);
                    } else if (this.prev < entry.finallyLoc) {
                      return handle(entry.finallyLoc);
                    }
                  } else if (hasCatch) {
                    if (this.prev < entry.catchLoc) {
                      return handle(entry.catchLoc, true);
                    }
                  } else if (hasFinally) {
                    if (this.prev < entry.finallyLoc) {
                      return handle(entry.finallyLoc);
                    }
                  } else {
                    throw new Error("try statement without catch or finally");
                  }
                }
              }
            },

            abrupt: function abrupt(type, arg) {
              for (var i = this.tryEntries.length - 1; i >= 0; --i) {
                var entry = this.tryEntries[i];
                if (entry.tryLoc <= this.prev && hasOwn.call(entry, "finallyLoc") && this.prev < entry.finallyLoc) {
                  var finallyEntry = entry;
                  break;
                }
              }

              if (finallyEntry && (type === "break" || type === "continue") && finallyEntry.tryLoc <= arg && arg <= finallyEntry.finallyLoc) {
                // Ignore the finally entry if control is not jumping to a
                // location outside the try/catch block.
                finallyEntry = null;
              }

              var record = finallyEntry ? finallyEntry.completion : {};
              record.type = type;
              record.arg = arg;

              if (finallyEntry) {
                this.method = "next";
                this.next = finallyEntry.finallyLoc;
                return ContinueSentinel;
              }

              return this.complete(record);
            },

            complete: function complete(record, afterLoc) {
              if (record.type === "throw") {
                throw record.arg;
              }

              if (record.type === "break" || record.type === "continue") {
                this.next = record.arg;
              } else if (record.type === "return") {
                this.rval = this.arg = record.arg;
                this.method = "return";
                this.next = "end";
              } else if (record.type === "normal" && afterLoc) {
                this.next = afterLoc;
              }

              return ContinueSentinel;
            },

            finish: function finish(finallyLoc) {
              for (var i = this.tryEntries.length - 1; i >= 0; --i) {
                var entry = this.tryEntries[i];
                if (entry.finallyLoc === finallyLoc) {
                  this.complete(entry.completion, entry.afterLoc);
                  resetTryEntry(entry);
                  return ContinueSentinel;
                }
              }
            },

            "catch": function _catch(tryLoc) {
              for (var i = this.tryEntries.length - 1; i >= 0; --i) {
                var entry = this.tryEntries[i];
                if (entry.tryLoc === tryLoc) {
                  var record = entry.completion;
                  if (record.type === "throw") {
                    var thrown = record.arg;
                    resetTryEntry(entry);
                  }
                  return thrown;
                }
              }

              // The context.catch method must only be called with a location
              // argument that corresponds to a known catch block.
              throw new Error("illegal catch attempt");
            },

            delegateYield: function delegateYield(iterable, resultName, nextLoc) {
              this.delegate = {
                iterator: values(iterable),
                resultName: resultName,
                nextLoc: nextLoc
              };

              if (this.method === "next") {
                // Deliberately forget the last sent value so that we don't
                // accidentally pass it on to the delegate.
                this.arg = undefined;
              }

              return ContinueSentinel;
            }
          };
        }(
        // Among the various tricks for obtaining a reference to the global
        // object, this seems to be the most reliable technique that does not
        // use indirect eval (which violates Content Security Policy).
        (typeof global === 'undefined' ? 'undefined' : _typeof2(global)) === "object" ? global : (typeof window === 'undefined' ? 'undefined' : _typeof2(window)) === "object" ? window : (typeof self === 'undefined' ? 'undefined' : _typeof2(self)) === "object" ? self : this);

        /* WEBPACK VAR INJECTION */
      }).call(exports, __webpack_require__(85));

      /***/
    },
    /* 301 */
    /***/function (module, exports, __webpack_require__) {

      var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__; /*!
                                                                                                       * URI.js - Mutating URLs
                                                                                                       *
                                                                                                       * Version: 1.18.12
                                                                                                       *
                                                                                                       * Author: Rodney Rehm
                                                                                                       * Web: http://medialize.github.io/URI.js/
                                                                                                       *
                                                                                                       * Licensed under
                                                                                                       *   MIT License http://www.opensource.org/licenses/mit-license
                                                                                                       *
                                                                                                       */
      (function (root, factory) {
        'use strict';
        // https://github.com/umdjs/umd/blob/master/returnExports.js

        if ((typeof module === 'undefined' ? 'undefined' : _typeof2(module)) === 'object' && module.exports) {
          // Node
          module.exports = factory(__webpack_require__(116), __webpack_require__(114), __webpack_require__(115));
        } else if (true) {
          // AMD. Register as an anonymous module.
          !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(116), __webpack_require__(114), __webpack_require__(115)], __WEBPACK_AMD_DEFINE_FACTORY__ = factory, __WEBPACK_AMD_DEFINE_RESULT__ = typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? __WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__) : __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
        } else {}
      })(this, function (punycode, IPv6, SLD, root) {
        'use strict';
        /*global location, escape, unescape */
        // FIXME: v2.0.0 renamce non-camelCase properties to uppercase
        /*jshint camelcase: false */

        // save current URI variable, if any

        var _URI = root && root.URI;

        function URI(url, base) {
          var _urlSupplied = arguments.length >= 1;
          var _baseSupplied = arguments.length >= 2;

          // Allow instantiation without the 'new' keyword
          if (!(this instanceof URI)) {
            if (_urlSupplied) {
              if (_baseSupplied) {
                return new URI(url, base);
              }

              return new URI(url);
            }

            return new URI();
          }

          if (url === undefined) {
            if (_urlSupplied) {
              throw new TypeError('undefined is not a valid argument for URI');
            }

            if (typeof location !== 'undefined') {
              url = location.href + '';
            } else {
              url = '';
            }
          }

          if (url === null) {
            if (_urlSupplied) {
              throw new TypeError('null is not a valid argument for URI');
            }
          }

          this.href(url);

          // resolve to base according to http://dvcs.w3.org/hg/url/raw-file/tip/Overview.html#constructor
          if (base !== undefined) {
            return this.absoluteTo(base);
          }

          return this;
        }

        function isInteger(value) {
          return (/^[0-9]+$/.test(value)
          );
        }

        URI.version = '1.18.12';

        var p = URI.prototype;
        var hasOwn = Object.prototype.hasOwnProperty;

        function escapeRegEx(string) {
          // https://github.com/medialize/URI.js/commit/85ac21783c11f8ccab06106dba9735a31a86924d#commitcomment-821963
          return string.replace(/([.*+?^=!:${}()|[\]\/\\])/g, '\\$1');
        }

        function getType(value) {
          // IE8 doesn't return [Object Undefined] but [Object Object] for undefined value
          if (value === undefined) {
            return 'Undefined';
          }

          return String(Object.prototype.toString.call(value)).slice(8, -1);
        }

        function isArray(obj) {
          return getType(obj) === 'Array';
        }

        function filterArrayValues(data, value) {
          var lookup = {};
          var i, length;

          if (getType(value) === 'RegExp') {
            lookup = null;
          } else if (isArray(value)) {
            for (i = 0, length = value.length; i < length; i++) {
              lookup[value[i]] = true;
            }
          } else {
            lookup[value] = true;
          }

          for (i = 0, length = data.length; i < length; i++) {
            /*jshint laxbreak: true */
            var _match = lookup && lookup[data[i]] !== undefined || !lookup && value.test(data[i]);
            /*jshint laxbreak: false */
            if (_match) {
              data.splice(i, 1);
              length--;
              i--;
            }
          }

          return data;
        }

        function arrayContains(list, value) {
          var i, length;

          // value may be string, number, array, regexp
          if (isArray(value)) {
            // Note: this can be optimized to O(n) (instead of current O(m * n))
            for (i = 0, length = value.length; i < length; i++) {
              if (!arrayContains(list, value[i])) {
                return false;
              }
            }

            return true;
          }

          var _type = getType(value);
          for (i = 0, length = list.length; i < length; i++) {
            if (_type === 'RegExp') {
              if (typeof list[i] === 'string' && list[i].match(value)) {
                return true;
              }
            } else if (list[i] === value) {
              return true;
            }
          }

          return false;
        }

        function arraysEqual(one, two) {
          if (!isArray(one) || !isArray(two)) {
            return false;
          }

          // arrays can't be equal if they have different amount of content
          if (one.length !== two.length) {
            return false;
          }

          one.sort();
          two.sort();

          for (var i = 0, l = one.length; i < l; i++) {
            if (one[i] !== two[i]) {
              return false;
            }
          }

          return true;
        }

        function trimSlashes(text) {
          var trim_expression = /^\/+|\/+$/g;
          return text.replace(trim_expression, '');
        }

        URI._parts = function () {
          return {
            protocol: null,
            username: null,
            password: null,
            hostname: null,
            urn: null,
            port: null,
            path: null,
            query: null,
            fragment: null,
            // state
            duplicateQueryParameters: URI.duplicateQueryParameters,
            escapeQuerySpace: URI.escapeQuerySpace
          };
        };
        // state: allow duplicate query parameters (a=1&a=1)
        URI.duplicateQueryParameters = false;
        // state: replaces + with %20 (space in query strings)
        URI.escapeQuerySpace = true;
        // static properties
        URI.protocol_expression = /^[a-z][a-z0-9.+-]*$/i;
        URI.idn_expression = /[^a-z0-9\._-]/i;
        URI.punycode_expression = /(xn--)/i;
        // well, 333.444.555.666 matches, but it sure ain't no IPv4 - do we care?
        URI.ip4_expression = /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/;
        // credits to Rich Brown
        // source: http://forums.intermapper.com/viewtopic.php?p=1096#1096
        // specification: http://www.ietf.org/rfc/rfc4291.txt
        URI.ip6_expression = /^\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(%.+)?\s*$/;
        // expression used is "gruber revised" (@gruber v2) determined to be the
        // best solution in a regex-golf we did a couple of ages ago at
        // * http://mathiasbynens.be/demo/url-regex
        // * http://rodneyrehm.de/t/url-regex.html
        URI.find_uri_expression = /\b((?:[a-z][\w-]+:(?:\/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'".,<>?«»“”‘’]))/ig;
        URI.findUri = {
          // valid "scheme://" or "www."
          start: /\b(?:([a-z][a-z0-9.+-]*:\/\/)|www\.)/gi,
          // everything up to the next whitespace
          end: /[\s\r\n]|$/,
          // trim trailing punctuation captured by end RegExp
          trim: /[`!()\[\]{};:'".,<>?«»“”„‘’]+$/,
          // balanced parens inclusion (), [], {}, <>
          parens: /(\([^\)]*\)|\[[^\]]*\]|\{[^}]*\}|<[^>]*>)/g
        };
        // http://www.iana.org/assignments/uri-schemes.html
        // http://en.wikipedia.org/wiki/List_of_TCP_and_UDP_port_numbers#Well-known_ports
        URI.defaultPorts = {
          http: '80',
          https: '443',
          ftp: '21',
          gopher: '70',
          ws: '80',
          wss: '443'
        };
        // list of protocols which always require a hostname
        URI.hostProtocols = ['http', 'https'];

        // allowed hostname characters according to RFC 3986
        // ALPHA DIGIT "-" "." "_" "~" "!" "$" "&" "'" "(" ")" "*" "+" "," ";" "=" %encoded
        // I've never seen a (non-IDN) hostname other than: ALPHA DIGIT . - _
        URI.invalid_hostname_characters = /[^a-zA-Z0-9\.\-:_]/;
        // map DOM Elements to their URI attribute
        URI.domAttributes = {
          'a': 'href',
          'blockquote': 'cite',
          'link': 'href',
          'base': 'href',
          'script': 'src',
          'form': 'action',
          'img': 'src',
          'area': 'href',
          'iframe': 'src',
          'embed': 'src',
          'source': 'src',
          'track': 'src',
          'input': 'src', // but only if type="image"
          'audio': 'src',
          'video': 'src'
        };
        URI.getDomAttribute = function (node) {
          if (!node || !node.nodeName) {
            return undefined;
          }

          var nodeName = node.nodeName.toLowerCase();
          // <input> should only expose src for type="image"
          if (nodeName === 'input' && node.type !== 'image') {
            return undefined;
          }

          return URI.domAttributes[nodeName];
        };

        function escapeForDumbFirefox36(value) {
          // https://github.com/medialize/URI.js/issues/91
          return escape(value);
        }

        // encoding / decoding according to RFC3986
        function strictEncodeURIComponent(string) {
          // see https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/encodeURIComponent
          return encodeURIComponent(string).replace(/[!'()*]/g, escapeForDumbFirefox36).replace(/\*/g, '%2A');
        }
        URI.encode = strictEncodeURIComponent;
        URI.decode = decodeURIComponent;
        URI.iso8859 = function () {
          URI.encode = escape;
          URI.decode = unescape;
        };
        URI.unicode = function () {
          URI.encode = strictEncodeURIComponent;
          URI.decode = decodeURIComponent;
        };
        URI.characters = {
          pathname: {
            encode: {
              // RFC3986 2.1: For consistency, URI producers and normalizers should
              // use uppercase hexadecimal digits for all percent-encodings.
              expression: /%(24|26|2B|2C|3B|3D|3A|40)/ig,
              map: {
                // -._~!'()*
                '%24': '$',
                '%26': '&',
                '%2B': '+',
                '%2C': ',',
                '%3B': ';',
                '%3D': '=',
                '%3A': ':',
                '%40': '@'
              }
            },
            decode: {
              expression: /[\/\?#]/g,
              map: {
                '/': '%2F',
                '?': '%3F',
                '#': '%23'
              }
            }
          },
          reserved: {
            encode: {
              // RFC3986 2.1: For consistency, URI producers and normalizers should
              // use uppercase hexadecimal digits for all percent-encodings.
              expression: /%(21|23|24|26|27|28|29|2A|2B|2C|2F|3A|3B|3D|3F|40|5B|5D)/ig,
              map: {
                // gen-delims
                '%3A': ':',
                '%2F': '/',
                '%3F': '?',
                '%23': '#',
                '%5B': '[',
                '%5D': ']',
                '%40': '@',
                // sub-delims
                '%21': '!',
                '%24': '$',
                '%26': '&',
                '%27': '\'',
                '%28': '(',
                '%29': ')',
                '%2A': '*',
                '%2B': '+',
                '%2C': ',',
                '%3B': ';',
                '%3D': '='
              }
            }
          },
          urnpath: {
            // The characters under `encode` are the characters called out by RFC 2141 as being acceptable
            // for usage in a URN. RFC2141 also calls out "-", ".", and "_" as acceptable characters, but
            // these aren't encoded by encodeURIComponent, so we don't have to call them out here. Also
            // note that the colon character is not featured in the encoding map; this is because URI.js
            // gives the colons in URNs semantic meaning as the delimiters of path segements, and so it
            // should not appear unencoded in a segment itself.
            // See also the note above about RFC3986 and capitalalized hex digits.
            encode: {
              expression: /%(21|24|27|28|29|2A|2B|2C|3B|3D|40)/ig,
              map: {
                '%21': '!',
                '%24': '$',
                '%27': '\'',
                '%28': '(',
                '%29': ')',
                '%2A': '*',
                '%2B': '+',
                '%2C': ',',
                '%3B': ';',
                '%3D': '=',
                '%40': '@'
              }
            },
            // These characters are the characters called out by RFC2141 as "reserved" characters that
            // should never appear in a URN, plus the colon character (see note above).
            decode: {
              expression: /[\/\?#:]/g,
              map: {
                '/': '%2F',
                '?': '%3F',
                '#': '%23',
                ':': '%3A'
              }
            }
          }
        };
        URI.encodeQuery = function (string, escapeQuerySpace) {
          var escaped = URI.encode(string + '');
          if (escapeQuerySpace === undefined) {
            escapeQuerySpace = URI.escapeQuerySpace;
          }

          return escapeQuerySpace ? escaped.replace(/%20/g, '+') : escaped;
        };
        URI.decodeQuery = function (string, escapeQuerySpace) {
          string += '';
          if (escapeQuerySpace === undefined) {
            escapeQuerySpace = URI.escapeQuerySpace;
          }

          try {
            return URI.decode(escapeQuerySpace ? string.replace(/\+/g, '%20') : string);
          } catch (e) {
            // we're not going to mess with weird encodings,
            // give up and return the undecoded original string
            // see https://github.com/medialize/URI.js/issues/87
            // see https://github.com/medialize/URI.js/issues/92
            return string;
          }
        };
        // generate encode/decode path functions
        var _parts = { 'encode': 'encode', 'decode': 'decode' };
        var _part;
        var generateAccessor = function generateAccessor(_group, _part) {
          return function (string) {
            try {
              return URI[_part](string + '').replace(URI.characters[_group][_part].expression, function (c) {
                return URI.characters[_group][_part].map[c];
              });
            } catch (e) {
              // we're not going to mess with weird encodings,
              // give up and return the undecoded original string
              // see https://github.com/medialize/URI.js/issues/87
              // see https://github.com/medialize/URI.js/issues/92
              return string;
            }
          };
        };

        for (_part in _parts) {
          URI[_part + 'PathSegment'] = generateAccessor('pathname', _parts[_part]);
          URI[_part + 'UrnPathSegment'] = generateAccessor('urnpath', _parts[_part]);
        }

        var generateSegmentedPathFunction = function generateSegmentedPathFunction(_sep, _codingFuncName, _innerCodingFuncName) {
          return function (string) {
            // Why pass in names of functions, rather than the function objects themselves? The
            // definitions of some functions (but in particular, URI.decode) will occasionally change due
            // to URI.js having ISO8859 and Unicode modes. Passing in the name and getting it will ensure
            // that the functions we use here are "fresh".
            var actualCodingFunc;
            if (!_innerCodingFuncName) {
              actualCodingFunc = URI[_codingFuncName];
            } else {
              actualCodingFunc = function actualCodingFunc(string) {
                return URI[_codingFuncName](URI[_innerCodingFuncName](string));
              };
            }

            var segments = (string + '').split(_sep);

            for (var i = 0, length = segments.length; i < length; i++) {
              segments[i] = actualCodingFunc(segments[i]);
            }

            return segments.join(_sep);
          };
        };

        // This takes place outside the above loop because we don't want, e.g., encodeUrnPath functions.
        URI.decodePath = generateSegmentedPathFunction('/', 'decodePathSegment');
        URI.decodeUrnPath = generateSegmentedPathFunction(':', 'decodeUrnPathSegment');
        URI.recodePath = generateSegmentedPathFunction('/', 'encodePathSegment', 'decode');
        URI.recodeUrnPath = generateSegmentedPathFunction(':', 'encodeUrnPathSegment', 'decode');

        URI.encodeReserved = generateAccessor('reserved', 'encode');

        URI.parse = function (string, parts) {
          var pos;
          if (!parts) {
            parts = {};
          }
          // [protocol"://"[username[":"password]"@"]hostname[":"port]"/"?][path]["?"querystring]["#"fragment]

          // extract fragment
          pos = string.indexOf('#');
          if (pos > -1) {
            // escaping?
            parts.fragment = string.substring(pos + 1) || null;
            string = string.substring(0, pos);
          }

          // extract query
          pos = string.indexOf('?');
          if (pos > -1) {
            // escaping?
            parts.query = string.substring(pos + 1) || null;
            string = string.substring(0, pos);
          }

          // extract protocol
          if (string.substring(0, 2) === '//') {
            // relative-scheme
            parts.protocol = null;
            string = string.substring(2);
            // extract "user:pass@host:port"
            string = URI.parseAuthority(string, parts);
          } else {
            pos = string.indexOf(':');
            if (pos > -1) {
              parts.protocol = string.substring(0, pos) || null;
              if (parts.protocol && !parts.protocol.match(URI.protocol_expression)) {
                // : may be within the path
                parts.protocol = undefined;
              } else if (string.substring(pos + 1, pos + 3) === '//') {
                string = string.substring(pos + 3);

                // extract "user:pass@host:port"
                string = URI.parseAuthority(string, parts);
              } else {
                string = string.substring(pos + 1);
                parts.urn = true;
              }
            }
          }

          // what's left must be the path
          parts.path = string;

          // and we're done
          return parts;
        };
        URI.parseHost = function (string, parts) {
          // Copy chrome, IE, opera backslash-handling behavior.
          // Back slashes before the query string get converted to forward slashes
          // See: https://github.com/joyent/node/blob/386fd24f49b0e9d1a8a076592a404168faeecc34/lib/url.js#L115-L124
          // See: https://code.google.com/p/chromium/issues/detail?id=25916
          // https://github.com/medialize/URI.js/pull/233
          string = string.replace(/\\/g, '/');

          // extract host:port
          var pos = string.indexOf('/');
          var bracketPos;
          var t;

          if (pos === -1) {
            pos = string.length;
          }

          if (string.charAt(0) === '[') {
            // IPv6 host - http://tools.ietf.org/html/draft-ietf-6man-text-addr-representation-04#section-6
            // I claim most client software breaks on IPv6 anyways. To simplify things, URI only accepts
            // IPv6+port in the format [2001:db8::1]:80 (for the time being)
            bracketPos = string.indexOf(']');
            parts.hostname = string.substring(1, bracketPos) || null;
            parts.port = string.substring(bracketPos + 2, pos) || null;
            if (parts.port === '/') {
              parts.port = null;
            }
          } else {
            var firstColon = string.indexOf(':');
            var firstSlash = string.indexOf('/');
            var nextColon = string.indexOf(':', firstColon + 1);
            if (nextColon !== -1 && (firstSlash === -1 || nextColon < firstSlash)) {
              // IPv6 host contains multiple colons - but no port
              // this notation is actually not allowed by RFC 3986, but we're a liberal parser
              parts.hostname = string.substring(0, pos) || null;
              parts.port = null;
            } else {
              t = string.substring(0, pos).split(':');
              parts.hostname = t[0] || null;
              parts.port = t[1] || null;
            }
          }

          if (parts.hostname && string.substring(pos).charAt(0) !== '/') {
            pos++;
            string = '/' + string;
          }

          URI.ensureValidHostname(parts.hostname, parts.protocol);

          if (parts.port) {
            URI.ensureValidPort(parts.port);
          }

          return string.substring(pos) || '/';
        };
        URI.parseAuthority = function (string, parts) {
          string = URI.parseUserinfo(string, parts);
          return URI.parseHost(string, parts);
        };
        URI.parseUserinfo = function (string, parts) {
          // extract username:password
          var firstSlash = string.indexOf('/');
          var pos = string.lastIndexOf('@', firstSlash > -1 ? firstSlash : string.length - 1);
          var t;

          // authority@ must come before /path
          if (pos > -1 && (firstSlash === -1 || pos < firstSlash)) {
            t = string.substring(0, pos).split(':');
            parts.username = t[0] ? URI.decode(t[0]) : null;
            t.shift();
            parts.password = t[0] ? URI.decode(t.join(':')) : null;
            string = string.substring(pos + 1);
          } else {
            parts.username = null;
            parts.password = null;
          }

          return string;
        };
        URI.parseQuery = function (string, escapeQuerySpace) {
          if (!string) {
            return {};
          }

          // throw out the funky business - "?"[name"="value"&"]+
          string = string.replace(/&+/g, '&').replace(/^\?*&*|&+$/g, '');

          if (!string) {
            return {};
          }

          var items = {};
          var splits = string.split('&');
          var length = splits.length;
          var v, name, value;

          for (var i = 0; i < length; i++) {
            v = splits[i].split('=');
            name = URI.decodeQuery(v.shift(), escapeQuerySpace);
            // no "=" is null according to http://dvcs.w3.org/hg/url/raw-file/tip/Overview.html#collect-url-parameters
            value = v.length ? URI.decodeQuery(v.join('='), escapeQuerySpace) : null;

            if (hasOwn.call(items, name)) {
              if (typeof items[name] === 'string' || items[name] === null) {
                items[name] = [items[name]];
              }

              items[name].push(value);
            } else {
              items[name] = value;
            }
          }

          return items;
        };

        URI.build = function (parts) {
          var t = '';

          if (parts.protocol) {
            t += parts.protocol + ':';
          }

          if (!parts.urn && (t || parts.hostname)) {
            t += '//';
          }

          t += URI.buildAuthority(parts) || '';

          if (typeof parts.path === 'string') {
            if (parts.path.charAt(0) !== '/' && typeof parts.hostname === 'string') {
              t += '/';
            }

            t += parts.path;
          }

          if (typeof parts.query === 'string' && parts.query) {
            t += '?' + parts.query;
          }

          if (typeof parts.fragment === 'string' && parts.fragment) {
            t += '#' + parts.fragment;
          }
          return t;
        };
        URI.buildHost = function (parts) {
          var t = '';

          if (!parts.hostname) {
            return '';
          } else if (URI.ip6_expression.test(parts.hostname)) {
            t += '[' + parts.hostname + ']';
          } else {
            t += parts.hostname;
          }

          if (parts.port) {
            t += ':' + parts.port;
          }

          return t;
        };
        URI.buildAuthority = function (parts) {
          return URI.buildUserinfo(parts) + URI.buildHost(parts);
        };
        URI.buildUserinfo = function (parts) {
          var t = '';

          if (parts.username) {
            t += URI.encode(parts.username);
          }

          if (parts.password) {
            t += ':' + URI.encode(parts.password);
          }

          if (t) {
            t += '@';
          }

          return t;
        };
        URI.buildQuery = function (data, duplicateQueryParameters, escapeQuerySpace) {
          // according to http://tools.ietf.org/html/rfc3986 or http://labs.apache.org/webarch/uri/rfc/rfc3986.html
          // being »-._~!$&'()*+,;=:@/?« %HEX and alnum are allowed
          // the RFC explicitly states ?/foo being a valid use case, no mention of parameter syntax!
          // URI.js treats the query string as being application/x-www-form-urlencoded
          // see http://www.w3.org/TR/REC-html40/interact/forms.html#form-content-type

          var t = '';
          var unique, key, i, length;
          for (key in data) {
            if (hasOwn.call(data, key) && key) {
              if (isArray(data[key])) {
                unique = {};
                for (i = 0, length = data[key].length; i < length; i++) {
                  if (data[key][i] !== undefined && unique[data[key][i] + ''] === undefined) {
                    t += '&' + URI.buildQueryParameter(key, data[key][i], escapeQuerySpace);
                    if (duplicateQueryParameters !== true) {
                      unique[data[key][i] + ''] = true;
                    }
                  }
                }
              } else if (data[key] !== undefined) {
                t += '&' + URI.buildQueryParameter(key, data[key], escapeQuerySpace);
              }
            }
          }

          return t.substring(1);
        };
        URI.buildQueryParameter = function (name, value, escapeQuerySpace) {
          // http://www.w3.org/TR/REC-html40/interact/forms.html#form-content-type -- application/x-www-form-urlencoded
          // don't append "=" for null values, according to http://dvcs.w3.org/hg/url/raw-file/tip/Overview.html#url-parameter-serialization
          return URI.encodeQuery(name, escapeQuerySpace) + (value !== null ? '=' + URI.encodeQuery(value, escapeQuerySpace) : '');
        };

        URI.addQuery = function (data, name, value) {
          if ((typeof name === 'undefined' ? 'undefined' : _typeof2(name)) === 'object') {
            for (var key in name) {
              if (hasOwn.call(name, key)) {
                URI.addQuery(data, key, name[key]);
              }
            }
          } else if (typeof name === 'string') {
            if (data[name] === undefined) {
              data[name] = value;
              return;
            } else if (typeof data[name] === 'string') {
              data[name] = [data[name]];
            }

            if (!isArray(value)) {
              value = [value];
            }

            data[name] = (data[name] || []).concat(value);
          } else {
            throw new TypeError('URI.addQuery() accepts an object, string as the name parameter');
          }
        };
        URI.removeQuery = function (data, name, value) {
          var i, length, key;

          if (isArray(name)) {
            for (i = 0, length = name.length; i < length; i++) {
              data[name[i]] = undefined;
            }
          } else if (getType(name) === 'RegExp') {
            for (key in data) {
              if (name.test(key)) {
                data[key] = undefined;
              }
            }
          } else if ((typeof name === 'undefined' ? 'undefined' : _typeof2(name)) === 'object') {
            for (key in name) {
              if (hasOwn.call(name, key)) {
                URI.removeQuery(data, key, name[key]);
              }
            }
          } else if (typeof name === 'string') {
            if (value !== undefined) {
              if (getType(value) === 'RegExp') {
                if (!isArray(data[name]) && value.test(data[name])) {
                  data[name] = undefined;
                } else {
                  data[name] = filterArrayValues(data[name], value);
                }
              } else if (data[name] === String(value) && (!isArray(value) || value.length === 1)) {
                data[name] = undefined;
              } else if (isArray(data[name])) {
                data[name] = filterArrayValues(data[name], value);
              }
            } else {
              data[name] = undefined;
            }
          } else {
            throw new TypeError('URI.removeQuery() accepts an object, string, RegExp as the first parameter');
          }
        };
        URI.hasQuery = function (data, name, value, withinArray) {
          switch (getType(name)) {
            case 'String':
              // Nothing to do here
              break;

            case 'RegExp':
              for (var key in data) {
                if (hasOwn.call(data, key)) {
                  if (name.test(key) && (value === undefined || URI.hasQuery(data, key, value))) {
                    return true;
                  }
                }
              }

              return false;

            case 'Object':
              for (var _key in name) {
                if (hasOwn.call(name, _key)) {
                  if (!URI.hasQuery(data, _key, name[_key])) {
                    return false;
                  }
                }
              }

              return true;

            default:
              throw new TypeError('URI.hasQuery() accepts a string, regular expression or object as the name parameter');
          }

          switch (getType(value)) {
            case 'Undefined':
              // true if exists (but may be empty)
              return name in data; // data[name] !== undefined;

            case 'Boolean':
              // true if exists and non-empty
              var _booly = Boolean(isArray(data[name]) ? data[name].length : data[name]);
              return value === _booly;

            case 'Function':
              // allow complex comparison
              return !!value(data[name], name, data);

            case 'Array':
              if (!isArray(data[name])) {
                return false;
              }

              var op = withinArray ? arrayContains : arraysEqual;
              return op(data[name], value);

            case 'RegExp':
              if (!isArray(data[name])) {
                return Boolean(data[name] && data[name].match(value));
              }

              if (!withinArray) {
                return false;
              }

              return arrayContains(data[name], value);

            case 'Number':
              value = String(value);
            /* falls through */
            case 'String':
              if (!isArray(data[name])) {
                return data[name] === value;
              }

              if (!withinArray) {
                return false;
              }

              return arrayContains(data[name], value);

            default:
              throw new TypeError('URI.hasQuery() accepts undefined, boolean, string, number, RegExp, Function as the value parameter');
          }
        };

        URI.joinPaths = function () {
          var input = [];
          var segments = [];
          var nonEmptySegments = 0;

          for (var i = 0; i < arguments.length; i++) {
            var url = new URI(arguments[i]);
            input.push(url);
            var _segments = url.segment();
            for (var s = 0; s < _segments.length; s++) {
              if (typeof _segments[s] === 'string') {
                segments.push(_segments[s]);
              }

              if (_segments[s]) {
                nonEmptySegments++;
              }
            }
          }

          if (!segments.length || !nonEmptySegments) {
            return new URI('');
          }

          var uri = new URI('').segment(segments);

          if (input[0].path() === '' || input[0].path().slice(0, 1) === '/') {
            uri.path('/' + uri.path());
          }

          return uri.normalize();
        };

        URI.commonPath = function (one, two) {
          var length = Math.min(one.length, two.length);
          var pos;

          // find first non-matching character
          for (pos = 0; pos < length; pos++) {
            if (one.charAt(pos) !== two.charAt(pos)) {
              pos--;
              break;
            }
          }

          if (pos < 1) {
            return one.charAt(0) === two.charAt(0) && one.charAt(0) === '/' ? '/' : '';
          }

          // revert to last /
          if (one.charAt(pos) !== '/' || two.charAt(pos) !== '/') {
            pos = one.substring(0, pos).lastIndexOf('/');
          }

          return one.substring(0, pos + 1);
        };

        URI.withinString = function (string, callback, options) {
          options || (options = {});
          var _start = options.start || URI.findUri.start;
          var _end = options.end || URI.findUri.end;
          var _trim = options.trim || URI.findUri.trim;
          var _parens = options.parens || URI.findUri.parens;
          var _attributeOpen = /[a-z0-9-]=["']?$/i;

          _start.lastIndex = 0;
          while (true) {
            var match = _start.exec(string);
            if (!match) {
              break;
            }

            var start = match.index;
            if (options.ignoreHtml) {
              // attribut(e=["']?$)
              var attributeOpen = string.slice(Math.max(start - 3, 0), start);
              if (attributeOpen && _attributeOpen.test(attributeOpen)) {
                continue;
              }
            }

            var end = start + string.slice(start).search(_end);
            var slice = string.slice(start, end);
            // make sure we include well balanced parens
            var parensEnd = -1;
            while (true) {
              var parensMatch = _parens.exec(slice);
              if (!parensMatch) {
                break;
              }

              var parensMatchEnd = parensMatch.index + parensMatch[0].length;
              parensEnd = Math.max(parensEnd, parensMatchEnd);
            }

            if (parensEnd > -1) {
              slice = slice.slice(0, parensEnd) + slice.slice(parensEnd).replace(_trim, '');
            } else {
              slice = slice.replace(_trim, '');
            }

            if (slice.length <= match[0].length) {
              // the extract only contains the starting marker of a URI,
              // e.g. "www" or "http://"
              continue;
            }

            if (options.ignore && options.ignore.test(slice)) {
              continue;
            }

            end = start + slice.length;
            var result = callback(slice, start, end, string);
            if (result === undefined) {
              _start.lastIndex = end;
              continue;
            }

            result = String(result);
            string = string.slice(0, start) + result + string.slice(end);
            _start.lastIndex = start + result.length;
          }

          _start.lastIndex = 0;
          return string;
        };

        URI.ensureValidHostname = function (v, protocol) {
          // Theoretically URIs allow percent-encoding in Hostnames (according to RFC 3986)
          // they are not part of DNS and therefore ignored by URI.js

          var hasHostname = !!v; // not null and not an empty string
          var hasProtocol = !!protocol;
          var rejectEmptyHostname = false;

          if (hasProtocol) {
            rejectEmptyHostname = arrayContains(URI.hostProtocols, protocol);
          }

          if (rejectEmptyHostname && !hasHostname) {
            throw new TypeError('Hostname cannot be empty, if protocol is ' + protocol);
          } else if (v && v.match(URI.invalid_hostname_characters)) {
            // test punycode
            if (!punycode) {
              throw new TypeError('Hostname "' + v + '" contains characters other than [A-Z0-9.-:_] and Punycode.js is not available');
            }
            if (punycode.toASCII(v).match(URI.invalid_hostname_characters)) {
              throw new TypeError('Hostname "' + v + '" contains characters other than [A-Z0-9.-:_]');
            }
          }
        };

        URI.ensureValidPort = function (v) {
          if (!v) {
            return;
          }

          var port = Number(v);
          if (isInteger(port) && port > 0 && port < 65536) {
            return;
          }

          throw new TypeError('Port "' + v + '" is not a valid port');
        };

        // noConflict
        URI.noConflict = function (removeAll) {
          if (removeAll) {
            var unconflicted = {
              URI: this.noConflict()
            };

            if (root.URITemplate && typeof root.URITemplate.noConflict === 'function') {
              unconflicted.URITemplate = root.URITemplate.noConflict();
            }

            if (root.IPv6 && typeof root.IPv6.noConflict === 'function') {
              unconflicted.IPv6 = root.IPv6.noConflict();
            }

            if (root.SecondLevelDomains && typeof root.SecondLevelDomains.noConflict === 'function') {
              unconflicted.SecondLevelDomains = root.SecondLevelDomains.noConflict();
            }

            return unconflicted;
          } else if (root.URI === this) {
            root.URI = _URI;
          }

          return this;
        };

        p.build = function (deferBuild) {
          if (deferBuild === true) {
            this._deferred_build = true;
          } else if (deferBuild === undefined || this._deferred_build) {
            this._string = URI.build(this._parts);
            this._deferred_build = false;
          }

          return this;
        };

        p.clone = function () {
          return new URI(this);
        };

        p.valueOf = p.toString = function () {
          return this.build(false)._string;
        };

        function generateSimpleAccessor(_part) {
          return function (v, build) {
            if (v === undefined) {
              return this._parts[_part] || '';
            } else {
              this._parts[_part] = v || null;
              this.build(!build);
              return this;
            }
          };
        }

        function generatePrefixAccessor(_part, _key) {
          return function (v, build) {
            if (v === undefined) {
              return this._parts[_part] || '';
            } else {
              if (v !== null) {
                v = v + '';
                if (v.charAt(0) === _key) {
                  v = v.substring(1);
                }
              }

              this._parts[_part] = v;
              this.build(!build);
              return this;
            }
          };
        }

        p.protocol = generateSimpleAccessor('protocol');
        p.username = generateSimpleAccessor('username');
        p.password = generateSimpleAccessor('password');
        p.hostname = generateSimpleAccessor('hostname');
        p.port = generateSimpleAccessor('port');
        p.query = generatePrefixAccessor('query', '?');
        p.fragment = generatePrefixAccessor('fragment', '#');

        p.search = function (v, build) {
          var t = this.query(v, build);
          return typeof t === 'string' && t.length ? '?' + t : t;
        };
        p.hash = function (v, build) {
          var t = this.fragment(v, build);
          return typeof t === 'string' && t.length ? '#' + t : t;
        };

        p.pathname = function (v, build) {
          if (v === undefined || v === true) {
            var res = this._parts.path || (this._parts.hostname ? '/' : '');
            return v ? (this._parts.urn ? URI.decodeUrnPath : URI.decodePath)(res) : res;
          } else {
            if (this._parts.urn) {
              this._parts.path = v ? URI.recodeUrnPath(v) : '';
            } else {
              this._parts.path = v ? URI.recodePath(v) : '/';
            }
            this.build(!build);
            return this;
          }
        };
        p.path = p.pathname;
        p.href = function (href, build) {
          var key;

          if (href === undefined) {
            return this.toString();
          }

          this._string = '';
          this._parts = URI._parts();

          var _URI = href instanceof URI;
          var _object = (typeof href === 'undefined' ? 'undefined' : _typeof2(href)) === 'object' && (href.hostname || href.path || href.pathname);
          if (href.nodeName) {
            var attribute = URI.getDomAttribute(href);
            href = href[attribute] || '';
            _object = false;
          }

          // window.location is reported to be an object, but it's not the sort
          // of object we're looking for:
          // * location.protocol ends with a colon
          // * location.query != object.search
          // * location.hash != object.fragment
          // simply serializing the unknown object should do the trick
          // (for location, not for everything...)
          if (!_URI && _object && href.pathname !== undefined) {
            href = href.toString();
          }

          if (typeof href === 'string' || href instanceof String) {
            this._parts = URI.parse(String(href), this._parts);
          } else if (_URI || _object) {
            var src = _URI ? href._parts : href;
            for (key in src) {
              if (hasOwn.call(this._parts, key)) {
                this._parts[key] = src[key];
              }
            }
          } else {
            throw new TypeError('invalid input');
          }

          this.build(!build);
          return this;
        };

        // identification accessors
        p.is = function (what) {
          var ip = false;
          var ip4 = false;
          var ip6 = false;
          var name = false;
          var sld = false;
          var idn = false;
          var punycode = false;
          var relative = !this._parts.urn;

          if (this._parts.hostname) {
            relative = false;
            ip4 = URI.ip4_expression.test(this._parts.hostname);
            ip6 = URI.ip6_expression.test(this._parts.hostname);
            ip = ip4 || ip6;
            name = !ip;
            sld = name && SLD && SLD.has(this._parts.hostname);
            idn = name && URI.idn_expression.test(this._parts.hostname);
            punycode = name && URI.punycode_expression.test(this._parts.hostname);
          }

          switch (what.toLowerCase()) {
            case 'relative':
              return relative;

            case 'absolute':
              return !relative;

            // hostname identification
            case 'domain':
            case 'name':
              return name;

            case 'sld':
              return sld;

            case 'ip':
              return ip;

            case 'ip4':
            case 'ipv4':
            case 'inet4':
              return ip4;

            case 'ip6':
            case 'ipv6':
            case 'inet6':
              return ip6;

            case 'idn':
              return idn;

            case 'url':
              return !this._parts.urn;

            case 'urn':
              return !!this._parts.urn;

            case 'punycode':
              return punycode;
          }

          return null;
        };

        // component specific input validation
        var _protocol = p.protocol;
        var _port = p.port;
        var _hostname = p.hostname;

        p.protocol = function (v, build) {
          if (v !== undefined) {
            if (v) {
              // accept trailing ://
              v = v.replace(/:(\/\/)?$/, '');

              if (!v.match(URI.protocol_expression)) {
                throw new TypeError('Protocol "' + v + '" contains characters other than [A-Z0-9.+-] or doesn\'t start with [A-Z]');
              }
            }
          }
          return _protocol.call(this, v, build);
        };
        p.scheme = p.protocol;
        p.port = function (v, build) {
          if (this._parts.urn) {
            return v === undefined ? '' : this;
          }

          if (v !== undefined) {
            if (v === 0) {
              v = null;
            }

            if (v) {
              v += '';
              if (v.charAt(0) === ':') {
                v = v.substring(1);
              }

              URI.ensureValidPort(v);
            }
          }
          return _port.call(this, v, build);
        };
        p.hostname = function (v, build) {
          if (this._parts.urn) {
            return v === undefined ? '' : this;
          }

          if (v !== undefined) {
            var x = {};
            var res = URI.parseHost(v, x);
            if (res !== '/') {
              throw new TypeError('Hostname "' + v + '" contains characters other than [A-Z0-9.-]');
            }

            v = x.hostname;
            URI.ensureValidHostname(v, this._parts.protocol);
          }
          return _hostname.call(this, v, build);
        };

        // compound accessors
        p.origin = function (v, build) {
          if (this._parts.urn) {
            return v === undefined ? '' : this;
          }

          if (v === undefined) {
            var protocol = this.protocol();
            var authority = this.authority();
            if (!authority) {
              return '';
            }

            return (protocol ? protocol + '://' : '') + this.authority();
          } else {
            var origin = URI(v);
            this.protocol(origin.protocol()).authority(origin.authority()).build(!build);
            return this;
          }
        };
        p.host = function (v, build) {
          if (this._parts.urn) {
            return v === undefined ? '' : this;
          }

          if (v === undefined) {
            return this._parts.hostname ? URI.buildHost(this._parts) : '';
          } else {
            var res = URI.parseHost(v, this._parts);
            if (res !== '/') {
              throw new TypeError('Hostname "' + v + '" contains characters other than [A-Z0-9.-]');
            }

            this.build(!build);
            return this;
          }
        };
        p.authority = function (v, build) {
          if (this._parts.urn) {
            return v === undefined ? '' : this;
          }

          if (v === undefined) {
            return this._parts.hostname ? URI.buildAuthority(this._parts) : '';
          } else {
            var res = URI.parseAuthority(v, this._parts);
            if (res !== '/') {
              throw new TypeError('Hostname "' + v + '" contains characters other than [A-Z0-9.-]');
            }

            this.build(!build);
            return this;
          }
        };
        p.userinfo = function (v, build) {
          if (this._parts.urn) {
            return v === undefined ? '' : this;
          }

          if (v === undefined) {
            var t = URI.buildUserinfo(this._parts);
            return t ? t.substring(0, t.length - 1) : t;
          } else {
            if (v[v.length - 1] !== '@') {
              v += '@';
            }

            URI.parseUserinfo(v, this._parts);
            this.build(!build);
            return this;
          }
        };
        p.resource = function (v, build) {
          var parts;

          if (v === undefined) {
            return this.path() + this.search() + this.hash();
          }

          parts = URI.parse(v);
          this._parts.path = parts.path;
          this._parts.query = parts.query;
          this._parts.fragment = parts.fragment;
          this.build(!build);
          return this;
        };

        // fraction accessors
        p.subdomain = function (v, build) {
          if (this._parts.urn) {
            return v === undefined ? '' : this;
          }

          // convenience, return "www" from "www.example.org"
          if (v === undefined) {
            if (!this._parts.hostname || this.is('IP')) {
              return '';
            }

            // grab domain and add another segment
            var end = this._parts.hostname.length - this.domain().length - 1;
            return this._parts.hostname.substring(0, end) || '';
          } else {
            var e = this._parts.hostname.length - this.domain().length;
            var sub = this._parts.hostname.substring(0, e);
            var replace = new RegExp('^' + escapeRegEx(sub));

            if (v && v.charAt(v.length - 1) !== '.') {
              v += '.';
            }

            if (v.indexOf(':') !== -1) {
              throw new TypeError('Domains cannot contain colons');
            }

            if (v) {
              URI.ensureValidHostname(v, this._parts.protocol);
            }

            this._parts.hostname = this._parts.hostname.replace(replace, v);
            this.build(!build);
            return this;
          }
        };
        p.domain = function (v, build) {
          if (this._parts.urn) {
            return v === undefined ? '' : this;
          }

          if (typeof v === 'boolean') {
            build = v;
            v = undefined;
          }

          // convenience, return "example.org" from "www.example.org"
          if (v === undefined) {
            if (!this._parts.hostname || this.is('IP')) {
              return '';
            }

            // if hostname consists of 1 or 2 segments, it must be the domain
            var t = this._parts.hostname.match(/\./g);
            if (t && t.length < 2) {
              return this._parts.hostname;
            }

            // grab tld and add another segment
            var end = this._parts.hostname.length - this.tld(build).length - 1;
            end = this._parts.hostname.lastIndexOf('.', end - 1) + 1;
            return this._parts.hostname.substring(end) || '';
          } else {
            if (!v) {
              throw new TypeError('cannot set domain empty');
            }

            if (v.indexOf(':') !== -1) {
              throw new TypeError('Domains cannot contain colons');
            }

            URI.ensureValidHostname(v, this._parts.protocol);

            if (!this._parts.hostname || this.is('IP')) {
              this._parts.hostname = v;
            } else {
              var replace = new RegExp(escapeRegEx(this.domain()) + '$');
              this._parts.hostname = this._parts.hostname.replace(replace, v);
            }

            this.build(!build);
            return this;
          }
        };
        p.tld = function (v, build) {
          if (this._parts.urn) {
            return v === undefined ? '' : this;
          }

          if (typeof v === 'boolean') {
            build = v;
            v = undefined;
          }

          // return "org" from "www.example.org"
          if (v === undefined) {
            if (!this._parts.hostname || this.is('IP')) {
              return '';
            }

            var pos = this._parts.hostname.lastIndexOf('.');
            var tld = this._parts.hostname.substring(pos + 1);

            if (build !== true && SLD && SLD.list[tld.toLowerCase()]) {
              return SLD.get(this._parts.hostname) || tld;
            }

            return tld;
          } else {
            var replace;

            if (!v) {
              throw new TypeError('cannot set TLD empty');
            } else if (v.match(/[^a-zA-Z0-9-]/)) {
              if (SLD && SLD.is(v)) {
                replace = new RegExp(escapeRegEx(this.tld()) + '$');
                this._parts.hostname = this._parts.hostname.replace(replace, v);
              } else {
                throw new TypeError('TLD "' + v + '" contains characters other than [A-Z0-9]');
              }
            } else if (!this._parts.hostname || this.is('IP')) {
              throw new ReferenceError('cannot set TLD on non-domain host');
            } else {
              replace = new RegExp(escapeRegEx(this.tld()) + '$');
              this._parts.hostname = this._parts.hostname.replace(replace, v);
            }

            this.build(!build);
            return this;
          }
        };
        p.directory = function (v, build) {
          if (this._parts.urn) {
            return v === undefined ? '' : this;
          }

          if (v === undefined || v === true) {
            if (!this._parts.path && !this._parts.hostname) {
              return '';
            }

            if (this._parts.path === '/') {
              return '/';
            }

            var end = this._parts.path.length - this.filename().length - 1;
            var res = this._parts.path.substring(0, end) || (this._parts.hostname ? '/' : '');

            return v ? URI.decodePath(res) : res;
          } else {
            var e = this._parts.path.length - this.filename().length;
            var directory = this._parts.path.substring(0, e);
            var replace = new RegExp('^' + escapeRegEx(directory));

            // fully qualifier directories begin with a slash
            if (!this.is('relative')) {
              if (!v) {
                v = '/';
              }

              if (v.charAt(0) !== '/') {
                v = '/' + v;
              }
            }

            // directories always end with a slash
            if (v && v.charAt(v.length - 1) !== '/') {
              v += '/';
            }

            v = URI.recodePath(v);
            this._parts.path = this._parts.path.replace(replace, v);
            this.build(!build);
            return this;
          }
        };
        p.filename = function (v, build) {
          if (this._parts.urn) {
            return v === undefined ? '' : this;
          }

          if (typeof v !== 'string') {
            if (!this._parts.path || this._parts.path === '/') {
              return '';
            }

            var pos = this._parts.path.lastIndexOf('/');
            var res = this._parts.path.substring(pos + 1);

            return v ? URI.decodePathSegment(res) : res;
          } else {
            var mutatedDirectory = false;

            if (v.charAt(0) === '/') {
              v = v.substring(1);
            }

            if (v.match(/\.?\//)) {
              mutatedDirectory = true;
            }

            var replace = new RegExp(escapeRegEx(this.filename()) + '$');
            v = URI.recodePath(v);
            this._parts.path = this._parts.path.replace(replace, v);

            if (mutatedDirectory) {
              this.normalizePath(build);
            } else {
              this.build(!build);
            }

            return this;
          }
        };
        p.suffix = function (v, build) {
          if (this._parts.urn) {
            return v === undefined ? '' : this;
          }

          if (v === undefined || v === true) {
            if (!this._parts.path || this._parts.path === '/') {
              return '';
            }

            var filename = this.filename();
            var pos = filename.lastIndexOf('.');
            var s, res;

            if (pos === -1) {
              return '';
            }

            // suffix may only contain alnum characters (yup, I made this up.)
            s = filename.substring(pos + 1);
            res = /^[a-z0-9%]+$/i.test(s) ? s : '';
            return v ? URI.decodePathSegment(res) : res;
          } else {
            if (v.charAt(0) === '.') {
              v = v.substring(1);
            }

            var suffix = this.suffix();
            var replace;

            if (!suffix) {
              if (!v) {
                return this;
              }

              this._parts.path += '.' + URI.recodePath(v);
            } else if (!v) {
              replace = new RegExp(escapeRegEx('.' + suffix) + '$');
            } else {
              replace = new RegExp(escapeRegEx(suffix) + '$');
            }

            if (replace) {
              v = URI.recodePath(v);
              this._parts.path = this._parts.path.replace(replace, v);
            }

            this.build(!build);
            return this;
          }
        };
        p.segment = function (segment, v, build) {
          var separator = this._parts.urn ? ':' : '/';
          var path = this.path();
          var absolute = path.substring(0, 1) === '/';
          var segments = path.split(separator);

          if (segment !== undefined && typeof segment !== 'number') {
            build = v;
            v = segment;
            segment = undefined;
          }

          if (segment !== undefined && typeof segment !== 'number') {
            throw new Error('Bad segment "' + segment + '", must be 0-based integer');
          }

          if (absolute) {
            segments.shift();
          }

          if (segment < 0) {
            // allow negative indexes to address from the end
            segment = Math.max(segments.length + segment, 0);
          }

          if (v === undefined) {
            /*jshint laxbreak: true */
            return segment === undefined ? segments : segments[segment];
            /*jshint laxbreak: false */
          } else if (segment === null || segments[segment] === undefined) {
            if (isArray(v)) {
              segments = [];
              // collapse empty elements within array
              for (var i = 0, l = v.length; i < l; i++) {
                if (!v[i].length && (!segments.length || !segments[segments.length - 1].length)) {
                  continue;
                }

                if (segments.length && !segments[segments.length - 1].length) {
                  segments.pop();
                }

                segments.push(trimSlashes(v[i]));
              }
            } else if (v || typeof v === 'string') {
              v = trimSlashes(v);
              if (segments[segments.length - 1] === '') {
                // empty trailing elements have to be overwritten
                // to prevent results such as /foo//bar
                segments[segments.length - 1] = v;
              } else {
                segments.push(v);
              }
            }
          } else {
            if (v) {
              segments[segment] = trimSlashes(v);
            } else {
              segments.splice(segment, 1);
            }
          }

          if (absolute) {
            segments.unshift('');
          }

          return this.path(segments.join(separator), build);
        };
        p.segmentCoded = function (segment, v, build) {
          var segments, i, l;

          if (typeof segment !== 'number') {
            build = v;
            v = segment;
            segment = undefined;
          }

          if (v === undefined) {
            segments = this.segment(segment, v, build);
            if (!isArray(segments)) {
              segments = segments !== undefined ? URI.decode(segments) : undefined;
            } else {
              for (i = 0, l = segments.length; i < l; i++) {
                segments[i] = URI.decode(segments[i]);
              }
            }

            return segments;
          }

          if (!isArray(v)) {
            v = typeof v === 'string' || v instanceof String ? URI.encode(v) : v;
          } else {
            for (i = 0, l = v.length; i < l; i++) {
              v[i] = URI.encode(v[i]);
            }
          }

          return this.segment(segment, v, build);
        };

        // mutating query string
        var q = p.query;
        p.query = function (v, build) {
          if (v === true) {
            return URI.parseQuery(this._parts.query, this._parts.escapeQuerySpace);
          } else if (typeof v === 'function') {
            var data = URI.parseQuery(this._parts.query, this._parts.escapeQuerySpace);
            var result = v.call(this, data);
            this._parts.query = URI.buildQuery(result || data, this._parts.duplicateQueryParameters, this._parts.escapeQuerySpace);
            this.build(!build);
            return this;
          } else if (v !== undefined && typeof v !== 'string') {
            this._parts.query = URI.buildQuery(v, this._parts.duplicateQueryParameters, this._parts.escapeQuerySpace);
            this.build(!build);
            return this;
          } else {
            return q.call(this, v, build);
          }
        };
        p.setQuery = function (name, value, build) {
          var data = URI.parseQuery(this._parts.query, this._parts.escapeQuerySpace);

          if (typeof name === 'string' || name instanceof String) {
            data[name] = value !== undefined ? value : null;
          } else if ((typeof name === 'undefined' ? 'undefined' : _typeof2(name)) === 'object') {
            for (var key in name) {
              if (hasOwn.call(name, key)) {
                data[key] = name[key];
              }
            }
          } else {
            throw new TypeError('URI.addQuery() accepts an object, string as the name parameter');
          }

          this._parts.query = URI.buildQuery(data, this._parts.duplicateQueryParameters, this._parts.escapeQuerySpace);
          if (typeof name !== 'string') {
            build = value;
          }

          this.build(!build);
          return this;
        };
        p.addQuery = function (name, value, build) {
          var data = URI.parseQuery(this._parts.query, this._parts.escapeQuerySpace);
          URI.addQuery(data, name, value === undefined ? null : value);
          this._parts.query = URI.buildQuery(data, this._parts.duplicateQueryParameters, this._parts.escapeQuerySpace);
          if (typeof name !== 'string') {
            build = value;
          }

          this.build(!build);
          return this;
        };
        p.removeQuery = function (name, value, build) {
          var data = URI.parseQuery(this._parts.query, this._parts.escapeQuerySpace);
          URI.removeQuery(data, name, value);
          this._parts.query = URI.buildQuery(data, this._parts.duplicateQueryParameters, this._parts.escapeQuerySpace);
          if (typeof name !== 'string') {
            build = value;
          }

          this.build(!build);
          return this;
        };
        p.hasQuery = function (name, value, withinArray) {
          var data = URI.parseQuery(this._parts.query, this._parts.escapeQuerySpace);
          return URI.hasQuery(data, name, value, withinArray);
        };
        p.setSearch = p.setQuery;
        p.addSearch = p.addQuery;
        p.removeSearch = p.removeQuery;
        p.hasSearch = p.hasQuery;

        // sanitizing URLs
        p.normalize = function () {
          if (this._parts.urn) {
            return this.normalizeProtocol(false).normalizePath(false).normalizeQuery(false).normalizeFragment(false).build();
          }

          return this.normalizeProtocol(false).normalizeHostname(false).normalizePort(false).normalizePath(false).normalizeQuery(false).normalizeFragment(false).build();
        };
        p.normalizeProtocol = function (build) {
          if (typeof this._parts.protocol === 'string') {
            this._parts.protocol = this._parts.protocol.toLowerCase();
            this.build(!build);
          }

          return this;
        };
        p.normalizeHostname = function (build) {
          if (this._parts.hostname) {
            if (this.is('IDN') && punycode) {
              this._parts.hostname = punycode.toASCII(this._parts.hostname);
            } else if (this.is('IPv6') && IPv6) {
              this._parts.hostname = IPv6.best(this._parts.hostname);
            }

            this._parts.hostname = this._parts.hostname.toLowerCase();
            this.build(!build);
          }

          return this;
        };
        p.normalizePort = function (build) {
          // remove port of it's the protocol's default
          if (typeof this._parts.protocol === 'string' && this._parts.port === URI.defaultPorts[this._parts.protocol]) {
            this._parts.port = null;
            this.build(!build);
          }

          return this;
        };
        p.normalizePath = function (build) {
          var _path = this._parts.path;
          if (!_path) {
            return this;
          }

          if (this._parts.urn) {
            this._parts.path = URI.recodeUrnPath(this._parts.path);
            this.build(!build);
            return this;
          }

          if (this._parts.path === '/') {
            return this;
          }

          _path = URI.recodePath(_path);

          var _was_relative;
          var _leadingParents = '';
          var _parent, _pos;

          // handle relative paths
          if (_path.charAt(0) !== '/') {
            _was_relative = true;
            _path = '/' + _path;
          }

          // handle relative files (as opposed to directories)
          if (_path.slice(-3) === '/..' || _path.slice(-2) === '/.') {
            _path += '/';
          }

          // resolve simples
          _path = _path.replace(/(\/(\.\/)+)|(\/\.$)/g, '/').replace(/\/{2,}/g, '/');

          // remember leading parents
          if (_was_relative) {
            _leadingParents = _path.substring(1).match(/^(\.\.\/)+/) || '';
            if (_leadingParents) {
              _leadingParents = _leadingParents[0];
            }
          }

          // resolve parents
          while (true) {
            _parent = _path.search(/\/\.\.(\/|$)/);
            if (_parent === -1) {
              // no more ../ to resolve
              break;
            } else if (_parent === 0) {
              // top level cannot be relative, skip it
              _path = _path.substring(3);
              continue;
            }

            _pos = _path.substring(0, _parent).lastIndexOf('/');
            if (_pos === -1) {
              _pos = _parent;
            }
            _path = _path.substring(0, _pos) + _path.substring(_parent + 3);
          }

          // revert to relative
          if (_was_relative && this.is('relative')) {
            _path = _leadingParents + _path.substring(1);
          }

          this._parts.path = _path;
          this.build(!build);
          return this;
        };
        p.normalizePathname = p.normalizePath;
        p.normalizeQuery = function (build) {
          if (typeof this._parts.query === 'string') {
            if (!this._parts.query.length) {
              this._parts.query = null;
            } else {
              this.query(URI.parseQuery(this._parts.query, this._parts.escapeQuerySpace));
            }

            this.build(!build);
          }

          return this;
        };
        p.normalizeFragment = function (build) {
          if (!this._parts.fragment) {
            this._parts.fragment = null;
            this.build(!build);
          }

          return this;
        };
        p.normalizeSearch = p.normalizeQuery;
        p.normalizeHash = p.normalizeFragment;

        p.iso8859 = function () {
          // expect unicode input, iso8859 output
          var e = URI.encode;
          var d = URI.decode;

          URI.encode = escape;
          URI.decode = decodeURIComponent;
          try {
            this.normalize();
          } finally {
            URI.encode = e;
            URI.decode = d;
          }
          return this;
        };

        p.unicode = function () {
          // expect iso8859 input, unicode output
          var e = URI.encode;
          var d = URI.decode;

          URI.encode = strictEncodeURIComponent;
          URI.decode = unescape;
          try {
            this.normalize();
          } finally {
            URI.encode = e;
            URI.decode = d;
          }
          return this;
        };

        p.readable = function () {
          var uri = this.clone();
          // removing username, password, because they shouldn't be displayed according to RFC 3986
          uri.username('').password('').normalize();
          var t = '';
          if (uri._parts.protocol) {
            t += uri._parts.protocol + '://';
          }

          if (uri._parts.hostname) {
            if (uri.is('punycode') && punycode) {
              t += punycode.toUnicode(uri._parts.hostname);
              if (uri._parts.port) {
                t += ':' + uri._parts.port;
              }
            } else {
              t += uri.host();
            }
          }

          if (uri._parts.hostname && uri._parts.path && uri._parts.path.charAt(0) !== '/') {
            t += '/';
          }

          t += uri.path(true);
          if (uri._parts.query) {
            var q = '';
            for (var i = 0, qp = uri._parts.query.split('&'), l = qp.length; i < l; i++) {
              var kv = (qp[i] || '').split('=');
              q += '&' + URI.decodeQuery(kv[0], this._parts.escapeQuerySpace).replace(/&/g, '%26');

              if (kv[1] !== undefined) {
                q += '=' + URI.decodeQuery(kv[1], this._parts.escapeQuerySpace).replace(/&/g, '%26');
              }
            }
            t += '?' + q.substring(1);
          }

          t += URI.decodeQuery(uri.hash(), true);
          return t;
        };

        // resolving relative and absolute URLs
        p.absoluteTo = function (base) {
          var resolved = this.clone();
          var properties = ['protocol', 'username', 'password', 'hostname', 'port'];
          var basedir, i, p;

          if (this._parts.urn) {
            throw new Error('URNs do not have any generally defined hierarchical components');
          }

          if (!(base instanceof URI)) {
            base = new URI(base);
          }

          if (resolved._parts.protocol) {
            // Directly returns even if this._parts.hostname is empty.
            return resolved;
          } else {
            resolved._parts.protocol = base._parts.protocol;
          }

          if (this._parts.hostname) {
            return resolved;
          }

          for (i = 0; p = properties[i]; i++) {
            resolved._parts[p] = base._parts[p];
          }

          if (!resolved._parts.path) {
            resolved._parts.path = base._parts.path;
            if (!resolved._parts.query) {
              resolved._parts.query = base._parts.query;
            }
          } else {
            if (resolved._parts.path.substring(-2) === '..') {
              resolved._parts.path += '/';
            }

            if (resolved.path().charAt(0) !== '/') {
              basedir = base.directory();
              basedir = basedir ? basedir : base.path().indexOf('/') === 0 ? '/' : '';
              resolved._parts.path = (basedir ? basedir + '/' : '') + resolved._parts.path;
              resolved.normalizePath();
            }
          }

          resolved.build();
          return resolved;
        };
        p.relativeTo = function (base) {
          var relative = this.clone().normalize();
          var relativeParts, baseParts, common, relativePath, basePath;

          if (relative._parts.urn) {
            throw new Error('URNs do not have any generally defined hierarchical components');
          }

          base = new URI(base).normalize();
          relativeParts = relative._parts;
          baseParts = base._parts;
          relativePath = relative.path();
          basePath = base.path();

          if (relativePath.charAt(0) !== '/') {
            throw new Error('URI is already relative');
          }

          if (basePath.charAt(0) !== '/') {
            throw new Error('Cannot calculate a URI relative to another relative URI');
          }

          if (relativeParts.protocol === baseParts.protocol) {
            relativeParts.protocol = null;
          }

          if (relativeParts.username !== baseParts.username || relativeParts.password !== baseParts.password) {
            return relative.build();
          }

          if (relativeParts.protocol !== null || relativeParts.username !== null || relativeParts.password !== null) {
            return relative.build();
          }

          if (relativeParts.hostname === baseParts.hostname && relativeParts.port === baseParts.port) {
            relativeParts.hostname = null;
            relativeParts.port = null;
          } else {
            return relative.build();
          }

          if (relativePath === basePath) {
            relativeParts.path = '';
            return relative.build();
          }

          // determine common sub path
          common = URI.commonPath(relativePath, basePath);

          // If the paths have nothing in common, return a relative URL with the absolute path.
          if (!common) {
            return relative.build();
          }

          var parents = baseParts.path.substring(common.length).replace(/[^\/]*$/, '').replace(/.*?\//g, '../');

          relativeParts.path = parents + relativeParts.path.substring(common.length) || './';

          return relative.build();
        };

        // comparing URIs
        p.equals = function (uri) {
          var one = this.clone();
          var two = new URI(uri);
          var one_map = {};
          var two_map = {};
          var checked = {};
          var one_query, two_query, key;

          one.normalize();
          two.normalize();

          // exact match
          if (one.toString() === two.toString()) {
            return true;
          }

          // extract query string
          one_query = one.query();
          two_query = two.query();
          one.query('');
          two.query('');

          // definitely not equal if not even non-query parts match
          if (one.toString() !== two.toString()) {
            return false;
          }

          // query parameters have the same length, even if they're permuted
          if (one_query.length !== two_query.length) {
            return false;
          }

          one_map = URI.parseQuery(one_query, this._parts.escapeQuerySpace);
          two_map = URI.parseQuery(two_query, this._parts.escapeQuerySpace);

          for (key in one_map) {
            if (hasOwn.call(one_map, key)) {
              if (!isArray(one_map[key])) {
                if (one_map[key] !== two_map[key]) {
                  return false;
                }
              } else if (!arraysEqual(one_map[key], two_map[key])) {
                return false;
              }

              checked[key] = true;
            }
          }

          for (key in two_map) {
            if (hasOwn.call(two_map, key)) {
              if (!checked[key]) {
                // two contains a parameter not present in one
                return false;
              }
            }
          }

          return true;
        };

        // state
        p.duplicateQueryParameters = function (v) {
          this._parts.duplicateQueryParameters = !!v;
          return this;
        };

        p.escapeQuerySpace = function (v) {
          this._parts.escapeQuerySpace = !!v;
          return this;
        };

        return URI;
      });

      /***/
    },
    /* 302 */
    /***/function (module, exports) {

      module.exports = function (module) {
        if (!module.webpackPolyfill) {
          module.deprecate = function () {};
          module.paths = [];
          // module.parent = undefined by default
          if (!module.children) module.children = [];
          Object.defineProperty(module, "loaded", {
            enumerable: true,
            get: function get() {
              return module.l;
            }
          });
          Object.defineProperty(module, "id", {
            enumerable: true,
            get: function get() {
              return module.i;
            }
          });
          module.webpackPolyfill = 1;
        }
        return module;
      };

      /***/
    },
    /* 303 */
    /***/function (module, exports) {

      module.exports = {
        "name": "truevault",
        "description": "The official TrueVault JavaScript SDK",
        "version": "0.11.0",
        "repository": {
          "type": "git",
          "url": "https://github.com/truevault/truevault-js-sdk"
        },
        "keywords": ["truevault", "js", "javascript", "sdk", "rest", "api"],
        "license": "BSD-3-Clause",
        "main": "build/index.js",
        "dependencies": {
          "urijs": "^1.18.12"
        },
        "devDependencies": {
          "babel-core": "^6.25.0",
          "babel-loader": "^7.0.0",
          "babel-polyfill": "^6.23.0",
          "babel-preset-env": "^1.5.2",
          "webpack": "^2.6.1",
          "documentation": "^4.0.0-rc.1"
        }
      };

      /***/
    },
    /* 304 */
    /***/function (module, exports, __webpack_require__) {

      __webpack_require__(118);
      module.exports = __webpack_require__(117);

      /***/
    }]
    /******/)
  );
});
/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../webpack/buildin/module.js */ "./node_modules/webpack/buildin/module.js")(module)))

module.exports = function (module) {
	if (!module.webpackPolyfill) {
		module.deprecate = function () {};
		module.paths = [];
		// module.parent = undefined by default
		if (!module.children) module.children = [];
		Object.defineProperty(module, "loaded", {
			enumerable: true,
			get: function get() {
				return module.l;
			}
		});
		Object.defineProperty(module, "id", {
			enumerable: true,
			get: function get() {
				return module.i;
			}
		});
		module.webpackPolyfill = 1;
	}
	return module;
};

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.TrueVaultClient = undefined;

var _truevault = __webpack_require__(/*! truevault */ "./node_modules/truevault/build/index.js");

var _truevault2 = _interopRequireDefault(_truevault);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

__webpack_require__.p = (function(path, proxy) {
          if (!proxy) {
            proxy = 'localhost';
          };
          if (document.location.hostname === proxy) {
            return path;
          } else {
            return SHOPIFY_CDN;
          };
        })("/dev", "localhost"); // eslint-disable-line camelcase
var TrueVaultClient = exports.TrueVaultClient = _truevault2.default;

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.Hammer = undefined;

__webpack_require__(/*! expose-loader?jQuery!jquery */ "./node_modules/expose-loader/index.js?jQuery!./node_modules/jquery/dist/jquery.js-exposed");

__webpack_require__(/*! expose-loader?$!jquery */ "./node_modules/expose-loader/index.js?$!./node_modules/jquery/dist/jquery.js-exposed");

__webpack_require__(/*! jquery-zoom */ "./node_modules/jquery-zoom/jquery.zoom.js");

var _hammerjs = __webpack_require__(/*! hammerjs */ "./node_modules/hammerjs/hammer.js");

var _hammerjs2 = _interopRequireDefault(_hammerjs);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

__webpack_require__.p = (function(path, proxy) {
          if (!proxy) {
            proxy = 'localhost';
          };
          if (document.location.hostname === proxy) {
            return path;
          } else {
            return SHOPIFY_CDN;
          };
        })("/dev", "localhost"); // eslint-disable-line camelcase
var Hammer = exports.Hammer = _hammerjs2.default;/* WEBPACK VAR INJECTION */(function(global) {module.exports = global["jQuery"] = __webpack_require__(/*! -!./node_modules/babel-loader/lib!./jquery.js */ "./node_modules/babel-loader/lib/index.js!./node_modules/jquery/dist/jquery.js");
/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js")))/* WEBPACK VAR INJECTION */(function(module) {var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;

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; };

/*!
 * jQuery JavaScript Library v3.6.1
 * https://jquery.com/
 *
 * Includes Sizzle.js
 * https://sizzlejs.com/
 *
 * Copyright OpenJS Foundation and other contributors
 * Released under the MIT license
 * https://jquery.org/license
 *
 * Date: 2022-08-26T17:52Z
 */
(function (global, factory) {

	"use strict";

	if (( false ? undefined : _typeof(module)) === "object" && _typeof(module.exports) === "object") {

		// For CommonJS and CommonJS-like environments where a proper `window`
		// is present, execute the factory and get jQuery.
		// For environments that do not have a `window` with a `document`
		// (such as Node.js), expose a factory as module.exports.
		// This accentuates the need for the creation of a real `window`.
		// e.g. var jQuery = require("jquery")(window);
		// See ticket trac-14549 for more info.
		module.exports = global.document ? factory(global, true) : function (w) {
			if (!w.document) {
				throw new Error("jQuery requires a window with a document");
			}
			return factory(w);
		};
	} else {
		factory(global);
	}

	// Pass this if window is not defined yet
})(typeof window !== "undefined" ? window : undefined, function (window, noGlobal) {

	// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1
	// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode
	// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common
	// enough that all such attempts are guarded in a try block.
	"use strict";

	var arr = [];

	var getProto = Object.getPrototypeOf;

	var _slice = arr.slice;

	var flat = arr.flat ? function (array) {
		return arr.flat.call(array);
	} : function (array) {
		return arr.concat.apply([], array);
	};

	var push = arr.push;

	var indexOf = arr.indexOf;

	var class2type = {};

	var toString = class2type.toString;

	var hasOwn = class2type.hasOwnProperty;

	var fnToString = hasOwn.toString;

	var ObjectFunctionString = fnToString.call(Object);

	var support = {};

	var isFunction = function isFunction(obj) {

		// Support: Chrome <=57, Firefox <=52
		// In some browsers, typeof returns "function" for HTML <object> elements
		// (i.e., `typeof document.createElement( "object" ) === "function"`).
		// We don't want to classify *any* DOM node as a function.
		// Support: QtWeb <=3.8.5, WebKit <=534.34, wkhtmltopdf tool <=0.12.5
		// Plus for old WebKit, typeof returns "function" for HTML collections
		// (e.g., `typeof document.getElementsByTagName("div") === "function"`). (gh-4756)
		return typeof obj === "function" && typeof obj.nodeType !== "number" && typeof obj.item !== "function";
	};

	var isWindow = function isWindow(obj) {
		return obj != null && obj === obj.window;
	};

	var document = window.document;

	var preservedScriptAttributes = {
		type: true,
		src: true,
		nonce: true,
		noModule: true
	};

	function DOMEval(code, node, doc) {
		doc = doc || document;

		var i,
		    val,
		    script = doc.createElement("script");

		script.text = code;
		if (node) {
			for (i in preservedScriptAttributes) {

				// Support: Firefox 64+, Edge 18+
				// Some browsers don't support the "nonce" property on scripts.
				// On the other hand, just using `getAttribute` is not enough as
				// the `nonce` attribute is reset to an empty string whenever it
				// becomes browsing-context connected.
				// See https://github.com/whatwg/html/issues/2369
				// See https://html.spec.whatwg.org/#nonce-attributes
				// The `node.getAttribute` check was added for the sake of
				// `jQuery.globalEval` so that it can fake a nonce-containing node
				// via an object.
				val = node[i] || node.getAttribute && node.getAttribute(i);
				if (val) {
					script.setAttribute(i, val);
				}
			}
		}
		doc.head.appendChild(script).parentNode.removeChild(script);
	}

	function toType(obj) {
		if (obj == null) {
			return obj + "";
		}

		// Support: Android <=2.3 only (functionish RegExp)
		return (typeof obj === "undefined" ? "undefined" : _typeof(obj)) === "object" || typeof obj === "function" ? class2type[toString.call(obj)] || "object" : typeof obj === "undefined" ? "undefined" : _typeof(obj);
	}
	/* global Symbol */
	// Defining this global in .eslintrc.json would create a danger of using the global
	// unguarded in another place, it seems safer to define global only for this module


	var version = "3.6.1",


	// Define a local copy of jQuery
	jQuery = function jQuery(selector, context) {

		// The jQuery object is actually just the init constructor 'enhanced'
		// Need init if jQuery is called (just allow error to be thrown if not included)
		return new jQuery.fn.init(selector, context);
	};

	jQuery.fn = jQuery.prototype = {

		// The current version of jQuery being used
		jquery: version,

		constructor: jQuery,

		// The default length of a jQuery object is 0
		length: 0,

		toArray: function toArray() {
			return _slice.call(this);
		},

		// Get the Nth element in the matched element set OR
		// Get the whole matched element set as a clean array
		get: function get(num) {

			// Return all the elements in a clean array
			if (num == null) {
				return _slice.call(this);
			}

			// Return just the one element from the set
			return num < 0 ? this[num + this.length] : this[num];
		},

		// Take an array of elements and push it onto the stack
		// (returning the new matched element set)
		pushStack: function pushStack(elems) {

			// Build a new jQuery matched element set
			var ret = jQuery.merge(this.constructor(), elems);

			// Add the old object onto the stack (as a reference)
			ret.prevObject = this;

			// Return the newly-formed element set
			return ret;
		},

		// Execute a callback for every element in the matched set.
		each: function each(callback) {
			return jQuery.each(this, callback);
		},

		map: function map(callback) {
			return this.pushStack(jQuery.map(this, function (elem, i) {
				return callback.call(elem, i, elem);
			}));
		},

		slice: function slice() {
			return this.pushStack(_slice.apply(this, arguments));
		},

		first: function first() {
			return this.eq(0);
		},

		last: function last() {
			return this.eq(-1);
		},

		even: function even() {
			return this.pushStack(jQuery.grep(this, function (_elem, i) {
				return (i + 1) % 2;
			}));
		},

		odd: function odd() {
			return this.pushStack(jQuery.grep(this, function (_elem, i) {
				return i % 2;
			}));
		},

		eq: function eq(i) {
			var len = this.length,
			    j = +i + (i < 0 ? len : 0);
			return this.pushStack(j >= 0 && j < len ? [this[j]] : []);
		},

		end: function end() {
			return this.prevObject || this.constructor();
		},

		// For internal use only.
		// Behaves like an Array's method, not like a jQuery method.
		push: push,
		sort: arr.sort,
		splice: arr.splice
	};

	jQuery.extend = jQuery.fn.extend = function () {
		var options,
		    name,
		    src,
		    copy,
		    copyIsArray,
		    clone,
		    target = arguments[0] || {},
		    i = 1,
		    length = arguments.length,
		    deep = false;

		// Handle a deep copy situation
		if (typeof target === "boolean") {
			deep = target;

			// Skip the boolean and the target
			target = arguments[i] || {};
			i++;
		}

		// Handle case when target is a string or something (possible in deep copy)
		if ((typeof target === "undefined" ? "undefined" : _typeof(target)) !== "object" && !isFunction(target)) {
			target = {};
		}

		// Extend jQuery itself if only one argument is passed
		if (i === length) {
			target = this;
			i--;
		}

		for (; i < length; i++) {

			// Only deal with non-null/undefined values
			if ((options = arguments[i]) != null) {

				// Extend the base object
				for (name in options) {
					copy = options[name];

					// Prevent Object.prototype pollution
					// Prevent never-ending loop
					if (name === "__proto__" || target === copy) {
						continue;
					}

					// Recurse if we're merging plain objects or arrays
					if (deep && copy && (jQuery.isPlainObject(copy) || (copyIsArray = Array.isArray(copy)))) {
						src = target[name];

						// Ensure proper type for the source value
						if (copyIsArray && !Array.isArray(src)) {
							clone = [];
						} else if (!copyIsArray && !jQuery.isPlainObject(src)) {
							clone = {};
						} else {
							clone = src;
						}
						copyIsArray = false;

						// Never move original objects, clone them
						target[name] = jQuery.extend(deep, clone, copy);

						// Don't bring in undefined values
					} else if (copy !== undefined) {
						target[name] = copy;
					}
				}
			}
		}

		// Return the modified object
		return target;
	};

	jQuery.extend({

		// Unique for each copy of jQuery on the page
		expando: "jQuery" + (version + Math.random()).replace(/\D/g, ""),

		// Assume jQuery is ready without the ready module
		isReady: true,

		error: function error(msg) {
			throw new Error(msg);
		},

		noop: function noop() {},

		isPlainObject: function isPlainObject(obj) {
			var proto, Ctor;

			// Detect obvious negatives
			// Use toString instead of jQuery.type to catch host objects
			if (!obj || toString.call(obj) !== "[object Object]") {
				return false;
			}

			proto = getProto(obj);

			// Objects with no prototype (e.g., `Object.create( null )`) are plain
			if (!proto) {
				return true;
			}

			// Objects with prototype are plain iff they were constructed by a global Object function
			Ctor = hasOwn.call(proto, "constructor") && proto.constructor;
			return typeof Ctor === "function" && fnToString.call(Ctor) === ObjectFunctionString;
		},

		isEmptyObject: function isEmptyObject(obj) {
			var name;

			for (name in obj) {
				return false;
			}
			return true;
		},

		// Evaluates a script in a provided context; falls back to the global one
		// if not specified.
		globalEval: function globalEval(code, options, doc) {
			DOMEval(code, { nonce: options && options.nonce }, doc);
		},

		each: function each(obj, callback) {
			var length,
			    i = 0;

			if (isArrayLike(obj)) {
				length = obj.length;
				for (; i < length; i++) {
					if (callback.call(obj[i], i, obj[i]) === false) {
						break;
					}
				}
			} else {
				for (i in obj) {
					if (callback.call(obj[i], i, obj[i]) === false) {
						break;
					}
				}
			}

			return obj;
		},

		// results is for internal usage only
		makeArray: function makeArray(arr, results) {
			var ret = results || [];

			if (arr != null) {
				if (isArrayLike(Object(arr))) {
					jQuery.merge(ret, typeof arr === "string" ? [arr] : arr);
				} else {
					push.call(ret, arr);
				}
			}

			return ret;
		},

		inArray: function inArray(elem, arr, i) {
			return arr == null ? -1 : indexOf.call(arr, elem, i);
		},

		// Support: Android <=4.0 only, PhantomJS 1 only
		// push.apply(_, arraylike) throws on ancient WebKit
		merge: function merge(first, second) {
			var len = +second.length,
			    j = 0,
			    i = first.length;

			for (; j < len; j++) {
				first[i++] = second[j];
			}

			first.length = i;

			return first;
		},

		grep: function grep(elems, callback, invert) {
			var callbackInverse,
			    matches = [],
			    i = 0,
			    length = elems.length,
			    callbackExpect = !invert;

			// Go through the array, only saving the items
			// that pass the validator function
			for (; i < length; i++) {
				callbackInverse = !callback(elems[i], i);
				if (callbackInverse !== callbackExpect) {
					matches.push(elems[i]);
				}
			}

			return matches;
		},

		// arg is for internal usage only
		map: function map(elems, callback, arg) {
			var length,
			    value,
			    i = 0,
			    ret = [];

			// Go through the array, translating each of the items to their new values
			if (isArrayLike(elems)) {
				length = elems.length;
				for (; i < length; i++) {
					value = callback(elems[i], i, arg);

					if (value != null) {
						ret.push(value);
					}
				}

				// Go through every key on the object,
			} else {
				for (i in elems) {
					value = callback(elems[i], i, arg);

					if (value != null) {
						ret.push(value);
					}
				}
			}

			// Flatten any nested arrays
			return flat(ret);
		},

		// A global GUID counter for objects
		guid: 1,

		// jQuery.support is not used in Core but other projects attach their
		// properties to it so it needs to exist.
		support: support
	});

	if (typeof Symbol === "function") {
		jQuery.fn[Symbol.iterator] = arr[Symbol.iterator];
	}

	// Populate the class2type map
	jQuery.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "), function (_i, name) {
		class2type["[object " + name + "]"] = name.toLowerCase();
	});

	function isArrayLike(obj) {

		// Support: real iOS 8.2 only (not reproducible in simulator)
		// `in` check used to prevent JIT error (gh-2145)
		// hasOwn isn't used here due to false negatives
		// regarding Nodelist length in IE
		var length = !!obj && "length" in obj && obj.length,
		    type = toType(obj);

		if (isFunction(obj) || isWindow(obj)) {
			return false;
		}

		return type === "array" || length === 0 || typeof length === "number" && length > 0 && length - 1 in obj;
	}
	var Sizzle =
	/*!
  * Sizzle CSS Selector Engine v2.3.6
  * https://sizzlejs.com/
  *
  * Copyright JS Foundation and other contributors
  * Released under the MIT license
  * https://js.foundation/
  *
  * Date: 2021-02-16
  */
	function (window) {
		var i,
		    support,
		    Expr,
		    getText,
		    isXML,
		    tokenize,
		    compile,
		    select,
		    outermostContext,
		    sortInput,
		    hasDuplicate,


		// Local document vars
		setDocument,
		    document,
		    docElem,
		    documentIsHTML,
		    rbuggyQSA,
		    rbuggyMatches,
		    matches,
		    contains,


		// Instance-specific data
		expando = "sizzle" + 1 * new Date(),
		    preferredDoc = window.document,
		    dirruns = 0,
		    done = 0,
		    classCache = createCache(),
		    tokenCache = createCache(),
		    compilerCache = createCache(),
		    nonnativeSelectorCache = createCache(),
		    sortOrder = function sortOrder(a, b) {
			if (a === b) {
				hasDuplicate = true;
			}
			return 0;
		},


		// Instance methods
		hasOwn = {}.hasOwnProperty,
		    arr = [],
		    pop = arr.pop,
		    pushNative = arr.push,
		    push = arr.push,
		    slice = arr.slice,


		// Use a stripped-down indexOf as it's faster than native
		// https://jsperf.com/thor-indexof-vs-for/5
		indexOf = function indexOf(list, elem) {
			var i = 0,
			    len = list.length;
			for (; i < len; i++) {
				if (list[i] === elem) {
					return i;
				}
			}
			return -1;
		},
		    booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|" + "ismap|loop|multiple|open|readonly|required|scoped",


		// Regular expressions

		// http://www.w3.org/TR/css3-selectors/#whitespace
		whitespace = "[\\x20\\t\\r\\n\\f]",


		// https://www.w3.org/TR/css-syntax-3/#ident-token-diagram
		identifier = "(?:\\\\[\\da-fA-F]{1,6}" + whitespace + "?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+",


		// Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors
		attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace +

		// Operator (capture 2)
		"*([*^$|!~]?=)" + whitespace +

		// "Attribute values must be CSS identifiers [capture 5]
		// or strings [capture 3 or capture 4]"
		"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace + "*\\]",
		    pseudos = ":(" + identifier + ")(?:\\((" +

		// To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:
		// 1. quoted (capture 3; capture 4 or capture 5)
		"('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" +

		// 2. simple (capture 6)
		"((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" +

		// 3. anything else (capture 2)
		".*" + ")\\)|)",


		// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
		rwhitespace = new RegExp(whitespace + "+", "g"),
		    rtrim = new RegExp("^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g"),
		    rcomma = new RegExp("^" + whitespace + "*," + whitespace + "*"),
		    rcombinators = new RegExp("^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*"),
		    rdescend = new RegExp(whitespace + "|>"),
		    rpseudo = new RegExp(pseudos),
		    ridentifier = new RegExp("^" + identifier + "$"),
		    matchExpr = {
			"ID": new RegExp("^#(" + identifier + ")"),
			"CLASS": new RegExp("^\\.(" + identifier + ")"),
			"TAG": new RegExp("^(" + identifier + "|[*])"),
			"ATTR": new RegExp("^" + attributes),
			"PSEUDO": new RegExp("^" + pseudos),
			"CHILD": new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace + "*(\\d+)|))" + whitespace + "*\\)|)", "i"),
			"bool": new RegExp("^(?:" + booleans + ")$", "i"),

			// For use in libraries implementing .is()
			// We use this for POS matching in `select`
			"needsContext": new RegExp("^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i")
		},
		    rhtml = /HTML$/i,
		    rinputs = /^(?:input|select|textarea|button)$/i,
		    rheader = /^h\d$/i,
		    rnative = /^[^{]+\{\s*\[native \w/,


		// Easily-parseable/retrievable ID or TAG or CLASS selectors
		rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
		    rsibling = /[+~]/,


		// CSS escapes
		// http://www.w3.org/TR/CSS21/syndata.html#escaped-characters
		runescape = new RegExp("\\\\[\\da-fA-F]{1,6}" + whitespace + "?|\\\\([^\\r\\n\\f])", "g"),
		    funescape = function funescape(escape, nonHex) {
			var high = "0x" + escape.slice(1) - 0x10000;

			return nonHex ?

			// Strip the backslash prefix from a non-hex escape sequence
			nonHex :

			// Replace a hexadecimal escape sequence with the encoded Unicode code point
			// Support: IE <=11+
			// For values outside the Basic Multilingual Plane (BMP), manually construct a
			// surrogate pair
			high < 0 ? String.fromCharCode(high + 0x10000) : String.fromCharCode(high >> 10 | 0xD800, high & 0x3FF | 0xDC00);
		},


		// CSS string/identifier serialization
		// https://drafts.csswg.org/cssom/#common-serializing-idioms
		rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,
		    fcssescape = function fcssescape(ch, asCodePoint) {
			if (asCodePoint) {

				// U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER
				if (ch === "\0") {
					return "\uFFFD";
				}

				// Control characters and (dependent upon position) numbers get escaped as code points
				return ch.slice(0, -1) + "\\" + ch.charCodeAt(ch.length - 1).toString(16) + " ";
			}

			// Other potentially-special ASCII characters get backslash-escaped
			return "\\" + ch;
		},


		// Used for iframes
		// See setDocument()
		// Removing the function wrapper causes a "Permission Denied"
		// error in IE
		unloadHandler = function unloadHandler() {
			setDocument();
		},
		    inDisabledFieldset = addCombinator(function (elem) {
			return elem.disabled === true && elem.nodeName.toLowerCase() === "fieldset";
		}, { dir: "parentNode", next: "legend" });

		// Optimize for push.apply( _, NodeList )
		try {
			push.apply(arr = slice.call(preferredDoc.childNodes), preferredDoc.childNodes);

			// Support: Android<4.0
			// Detect silently failing push.apply
			// eslint-disable-next-line no-unused-expressions
			arr[preferredDoc.childNodes.length].nodeType;
		} catch (e) {
			push = { apply: arr.length ?

				// Leverage slice if possible
				function (target, els) {
					pushNative.apply(target, slice.call(els));
				} :

				// Support: IE<9
				// Otherwise append directly
				function (target, els) {
					var j = target.length,
					    i = 0;

					// Can't trust NodeList.length
					while (target[j++] = els[i++]) {}
					target.length = j - 1;
				}
			};
		}

		function Sizzle(selector, context, results, seed) {
			var m,
			    i,
			    elem,
			    nid,
			    match,
			    groups,
			    newSelector,
			    newContext = context && context.ownerDocument,


			// nodeType defaults to 9, since context defaults to document
			nodeType = context ? context.nodeType : 9;

			results = results || [];

			// Return early from calls with invalid selector or context
			if (typeof selector !== "string" || !selector || nodeType !== 1 && nodeType !== 9 && nodeType !== 11) {

				return results;
			}

			// Try to shortcut find operations (as opposed to filters) in HTML documents
			if (!seed) {
				setDocument(context);
				context = context || document;

				if (documentIsHTML) {

					// If the selector is sufficiently simple, try using a "get*By*" DOM method
					// (excepting DocumentFragment context, where the methods don't exist)
					if (nodeType !== 11 && (match = rquickExpr.exec(selector))) {

						// ID selector
						if (m = match[1]) {

							// Document context
							if (nodeType === 9) {
								if (elem = context.getElementById(m)) {

									// Support: IE, Opera, Webkit
									// TODO: identify versions
									// getElementById can match elements by name instead of ID
									if (elem.id === m) {
										results.push(elem);
										return results;
									}
								} else {
									return results;
								}

								// Element context
							} else {

								// Support: IE, Opera, Webkit
								// TODO: identify versions
								// getElementById can match elements by name instead of ID
								if (newContext && (elem = newContext.getElementById(m)) && contains(context, elem) && elem.id === m) {

									results.push(elem);
									return results;
								}
							}

							// Type selector
						} else if (match[2]) {
							push.apply(results, context.getElementsByTagName(selector));
							return results;

							// Class selector
						} else if ((m = match[3]) && support.getElementsByClassName && context.getElementsByClassName) {

							push.apply(results, context.getElementsByClassName(m));
							return results;
						}
					}

					// Take advantage of querySelectorAll
					if (support.qsa && !nonnativeSelectorCache[selector + " "] && (!rbuggyQSA || !rbuggyQSA.test(selector)) && (

					// Support: IE 8 only
					// Exclude object elements
					nodeType !== 1 || context.nodeName.toLowerCase() !== "object")) {

						newSelector = selector;
						newContext = context;

						// qSA considers elements outside a scoping root when evaluating child or
						// descendant combinators, which is not what we want.
						// In such cases, we work around the behavior by prefixing every selector in the
						// list with an ID selector referencing the scope context.
						// The technique has to be used as well when a leading combinator is used
						// as such selectors are not recognized by querySelectorAll.
						// Thanks to Andrew Dupont for this technique.
						if (nodeType === 1 && (rdescend.test(selector) || rcombinators.test(selector))) {

							// Expand context for sibling selectors
							newContext = rsibling.test(selector) && testContext(context.parentNode) || context;

							// We can use :scope instead of the ID hack if the browser
							// supports it & if we're not changing the context.
							if (newContext !== context || !support.scope) {

								// Capture the context ID, setting it first if necessary
								if (nid = context.getAttribute("id")) {
									nid = nid.replace(rcssescape, fcssescape);
								} else {
									context.setAttribute("id", nid = expando);
								}
							}

							// Prefix every selector in the list
							groups = tokenize(selector);
							i = groups.length;
							while (i--) {
								groups[i] = (nid ? "#" + nid : ":scope") + " " + toSelector(groups[i]);
							}
							newSelector = groups.join(",");
						}

						try {
							push.apply(results, newContext.querySelectorAll(newSelector));
							return results;
						} catch (qsaError) {
							nonnativeSelectorCache(selector, true);
						} finally {
							if (nid === expando) {
								context.removeAttribute("id");
							}
						}
					}
				}
			}

			// All others
			return select(selector.replace(rtrim, "$1"), context, results, seed);
		}

		/**
   * Create key-value caches of limited size
   * @returns {function(string, object)} Returns the Object data after storing it on itself with
   *	property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)
   *	deleting the oldest entry
   */
		function createCache() {
			var keys = [];

			function cache(key, value) {

				// Use (key + " ") to avoid collision with native prototype properties (see Issue #157)
				if (keys.push(key + " ") > Expr.cacheLength) {

					// Only keep the most recent entries
					delete cache[keys.shift()];
				}
				return cache[key + " "] = value;
			}
			return cache;
		}

		/**
   * Mark a function for special use by Sizzle
   * @param {Function} fn The function to mark
   */
		function markFunction(fn) {
			fn[expando] = true;
			return fn;
		}

		/**
   * Support testing using an element
   * @param {Function} fn Passed the created element and returns a boolean result
   */
		function assert(fn) {
			var el = document.createElement("fieldset");

			try {
				return !!fn(el);
			} catch (e) {
				return false;
			} finally {

				// Remove from its parent by default
				if (el.parentNode) {
					el.parentNode.removeChild(el);
				}

				// release memory in IE
				el = null;
			}
		}

		/**
   * Adds the same handler for all of the specified attrs
   * @param {String} attrs Pipe-separated list of attributes
   * @param {Function} handler The method that will be applied
   */
		function addHandle(attrs, handler) {
			var arr = attrs.split("|"),
			    i = arr.length;

			while (i--) {
				Expr.attrHandle[arr[i]] = handler;
			}
		}

		/**
   * Checks document order of two siblings
   * @param {Element} a
   * @param {Element} b
   * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b
   */
		function siblingCheck(a, b) {
			var cur = b && a,
			    diff = cur && a.nodeType === 1 && b.nodeType === 1 && a.sourceIndex - b.sourceIndex;

			// Use IE sourceIndex if available on both nodes
			if (diff) {
				return diff;
			}

			// Check if b follows a
			if (cur) {
				while (cur = cur.nextSibling) {
					if (cur === b) {
						return -1;
					}
				}
			}

			return a ? 1 : -1;
		}

		/**
   * Returns a function to use in pseudos for input types
   * @param {String} type
   */
		function createInputPseudo(type) {
			return function (elem) {
				var name = elem.nodeName.toLowerCase();
				return name === "input" && elem.type === type;
			};
		}

		/**
   * Returns a function to use in pseudos for buttons
   * @param {String} type
   */
		function createButtonPseudo(type) {
			return function (elem) {
				var name = elem.nodeName.toLowerCase();
				return (name === "input" || name === "button") && elem.type === type;
			};
		}

		/**
   * Returns a function to use in pseudos for :enabled/:disabled
   * @param {Boolean} disabled true for :disabled; false for :enabled
   */
		function createDisabledPseudo(disabled) {

			// Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable
			return function (elem) {

				// Only certain elements can match :enabled or :disabled
				// https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled
				// https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled
				if ("form" in elem) {

					// Check for inherited disabledness on relevant non-disabled elements:
					// * listed form-associated elements in a disabled fieldset
					//   https://html.spec.whatwg.org/multipage/forms.html#category-listed
					//   https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled
					// * option elements in a disabled optgroup
					//   https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled
					// All such elements have a "form" property.
					if (elem.parentNode && elem.disabled === false) {

						// Option elements defer to a parent optgroup if present
						if ("label" in elem) {
							if ("label" in elem.parentNode) {
								return elem.parentNode.disabled === disabled;
							} else {
								return elem.disabled === disabled;
							}
						}

						// Support: IE 6 - 11
						// Use the isDisabled shortcut property to check for disabled fieldset ancestors
						return elem.isDisabled === disabled ||

						// Where there is no isDisabled, check manually
						/* jshint -W018 */
						elem.isDisabled !== !disabled && inDisabledFieldset(elem) === disabled;
					}

					return elem.disabled === disabled;

					// Try to winnow out elements that can't be disabled before trusting the disabled property.
					// Some victims get caught in our net (label, legend, menu, track), but it shouldn't
					// even exist on them, let alone have a boolean value.
				} else if ("label" in elem) {
					return elem.disabled === disabled;
				}

				// Remaining elements are neither :enabled nor :disabled
				return false;
			};
		}

		/**
   * Returns a function to use in pseudos for positionals
   * @param {Function} fn
   */
		function createPositionalPseudo(fn) {
			return markFunction(function (argument) {
				argument = +argument;
				return markFunction(function (seed, matches) {
					var j,
					    matchIndexes = fn([], seed.length, argument),
					    i = matchIndexes.length;

					// Match elements found at the specified indexes
					while (i--) {
						if (seed[j = matchIndexes[i]]) {
							seed[j] = !(matches[j] = seed[j]);
						}
					}
				});
			});
		}

		/**
   * Checks a node for validity as a Sizzle context
   * @param {Element|Object=} context
   * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value
   */
		function testContext(context) {
			return context && typeof context.getElementsByTagName !== "undefined" && context;
		}

		// Expose support vars for convenience
		support = Sizzle.support = {};

		/**
   * Detects XML nodes
   * @param {Element|Object} elem An element or a document
   * @returns {Boolean} True iff elem is a non-HTML XML node
   */
		isXML = Sizzle.isXML = function (elem) {
			var namespace = elem && elem.namespaceURI,
			    docElem = elem && (elem.ownerDocument || elem).documentElement;

			// Support: IE <=8
			// Assume HTML when documentElement doesn't yet exist, such as inside loading iframes
			// https://bugs.jquery.com/ticket/4833
			return !rhtml.test(namespace || docElem && docElem.nodeName || "HTML");
		};

		/**
   * Sets document-related variables once based on the current document
   * @param {Element|Object} [doc] An element or document object to use to set the document
   * @returns {Object} Returns the current document
   */
		setDocument = Sizzle.setDocument = function (node) {
			var hasCompare,
			    subWindow,
			    doc = node ? node.ownerDocument || node : preferredDoc;

			// Return early if doc is invalid or already selected
			// Support: IE 11+, Edge 17 - 18+
			// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
			// two documents; shallow comparisons work.
			// eslint-disable-next-line eqeqeq
			if (doc == document || doc.nodeType !== 9 || !doc.documentElement) {
				return document;
			}

			// Update global variables
			document = doc;
			docElem = document.documentElement;
			documentIsHTML = !isXML(document);

			// Support: IE 9 - 11+, Edge 12 - 18+
			// Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936)
			// Support: IE 11+, Edge 17 - 18+
			// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
			// two documents; shallow comparisons work.
			// eslint-disable-next-line eqeqeq
			if (preferredDoc != document && (subWindow = document.defaultView) && subWindow.top !== subWindow) {

				// Support: IE 11, Edge
				if (subWindow.addEventListener) {
					subWindow.addEventListener("unload", unloadHandler, false);

					// Support: IE 9 - 10 only
				} else if (subWindow.attachEvent) {
					subWindow.attachEvent("onunload", unloadHandler);
				}
			}

			// Support: IE 8 - 11+, Edge 12 - 18+, Chrome <=16 - 25 only, Firefox <=3.6 - 31 only,
			// Safari 4 - 5 only, Opera <=11.6 - 12.x only
			// IE/Edge & older browsers don't support the :scope pseudo-class.
			// Support: Safari 6.0 only
			// Safari 6.0 supports :scope but it's an alias of :root there.
			support.scope = assert(function (el) {
				docElem.appendChild(el).appendChild(document.createElement("div"));
				return typeof el.querySelectorAll !== "undefined" && !el.querySelectorAll(":scope fieldset div").length;
			});

			/* Attributes
   ---------------------------------------------------------------------- */

			// Support: IE<8
			// Verify that getAttribute really returns attributes and not properties
			// (excepting IE8 booleans)
			support.attributes = assert(function (el) {
				el.className = "i";
				return !el.getAttribute("className");
			});

			/* getElement(s)By*
   ---------------------------------------------------------------------- */

			// Check if getElementsByTagName("*") returns only elements
			support.getElementsByTagName = assert(function (el) {
				el.appendChild(document.createComment(""));
				return !el.getElementsByTagName("*").length;
			});

			// Support: IE<9
			support.getElementsByClassName = rnative.test(document.getElementsByClassName);

			// Support: IE<10
			// Check if getElementById returns elements by name
			// The broken getElementById methods don't pick up programmatically-set names,
			// so use a roundabout getElementsByName test
			support.getById = assert(function (el) {
				docElem.appendChild(el).id = expando;
				return !document.getElementsByName || !document.getElementsByName(expando).length;
			});

			// ID filter and find
			if (support.getById) {
				Expr.filter["ID"] = function (id) {
					var attrId = id.replace(runescape, funescape);
					return function (elem) {
						return elem.getAttribute("id") === attrId;
					};
				};
				Expr.find["ID"] = function (id, context) {
					if (typeof context.getElementById !== "undefined" && documentIsHTML) {
						var elem = context.getElementById(id);
						return elem ? [elem] : [];
					}
				};
			} else {
				Expr.filter["ID"] = function (id) {
					var attrId = id.replace(runescape, funescape);
					return function (elem) {
						var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id");
						return node && node.value === attrId;
					};
				};

				// Support: IE 6 - 7 only
				// getElementById is not reliable as a find shortcut
				Expr.find["ID"] = function (id, context) {
					if (typeof context.getElementById !== "undefined" && documentIsHTML) {
						var node,
						    i,
						    elems,
						    elem = context.getElementById(id);

						if (elem) {

							// Verify the id attribute
							node = elem.getAttributeNode("id");
							if (node && node.value === id) {
								return [elem];
							}

							// Fall back on getElementsByName
							elems = context.getElementsByName(id);
							i = 0;
							while (elem = elems[i++]) {
								node = elem.getAttributeNode("id");
								if (node && node.value === id) {
									return [elem];
								}
							}
						}

						return [];
					}
				};
			}

			// Tag
			Expr.find["TAG"] = support.getElementsByTagName ? function (tag, context) {
				if (typeof context.getElementsByTagName !== "undefined") {
					return context.getElementsByTagName(tag);

					// DocumentFragment nodes don't have gEBTN
				} else if (support.qsa) {
					return context.querySelectorAll(tag);
				}
			} : function (tag, context) {
				var elem,
				    tmp = [],
				    i = 0,


				// By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too
				results = context.getElementsByTagName(tag);

				// Filter out possible comments
				if (tag === "*") {
					while (elem = results[i++]) {
						if (elem.nodeType === 1) {
							tmp.push(elem);
						}
					}

					return tmp;
				}
				return results;
			};

			// Class
			Expr.find["CLASS"] = support.getElementsByClassName && function (className, context) {
				if (typeof context.getElementsByClassName !== "undefined" && documentIsHTML) {
					return context.getElementsByClassName(className);
				}
			};

			/* QSA/matchesSelector
   ---------------------------------------------------------------------- */

			// QSA and matchesSelector support

			// matchesSelector(:active) reports false when true (IE9/Opera 11.5)
			rbuggyMatches = [];

			// qSa(:focus) reports false when true (Chrome 21)
			// We allow this because of a bug in IE8/9 that throws an error
			// whenever `document.activeElement` is accessed on an iframe
			// So, we allow :focus to pass through QSA all the time to avoid the IE error
			// See https://bugs.jquery.com/ticket/13378
			rbuggyQSA = [];

			if (support.qsa = rnative.test(document.querySelectorAll)) {

				// Build QSA regex
				// Regex strategy adopted from Diego Perini
				assert(function (el) {

					var input;

					// Select is set to empty string on purpose
					// This is to test IE's treatment of not explicitly
					// setting a boolean content attribute,
					// since its presence should be enough
					// https://bugs.jquery.com/ticket/12359
					docElem.appendChild(el).innerHTML = "<a id='" + expando + "'></a>" + "<select id='" + expando + "-\r\\' msallowcapture=''>" + "<option selected=''></option></select>";

					// Support: IE8, Opera 11-12.16
					// Nothing should be selected when empty strings follow ^= or $= or *=
					// The test attribute must be unknown in Opera but "safe" for WinRT
					// https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section
					if (el.querySelectorAll("[msallowcapture^='']").length) {
						rbuggyQSA.push("[*^$]=" + whitespace + "*(?:''|\"\")");
					}

					// Support: IE8
					// Boolean attributes and "value" are not treated correctly
					if (!el.querySelectorAll("[selected]").length) {
						rbuggyQSA.push("\\[" + whitespace + "*(?:value|" + booleans + ")");
					}

					// Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+
					if (!el.querySelectorAll("[id~=" + expando + "-]").length) {
						rbuggyQSA.push("~=");
					}

					// Support: IE 11+, Edge 15 - 18+
					// IE 11/Edge don't find elements on a `[name='']` query in some cases.
					// Adding a temporary attribute to the document before the selection works
					// around the issue.
					// Interestingly, IE 10 & older don't seem to have the issue.
					input = document.createElement("input");
					input.setAttribute("name", "");
					el.appendChild(input);
					if (!el.querySelectorAll("[name='']").length) {
						rbuggyQSA.push("\\[" + whitespace + "*name" + whitespace + "*=" + whitespace + "*(?:''|\"\")");
					}

					// Webkit/Opera - :checked should return selected option elements
					// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
					// IE8 throws error here and will not see later tests
					if (!el.querySelectorAll(":checked").length) {
						rbuggyQSA.push(":checked");
					}

					// Support: Safari 8+, iOS 8+
					// https://bugs.webkit.org/show_bug.cgi?id=136851
					// In-page `selector#id sibling-combinator selector` fails
					if (!el.querySelectorAll("a#" + expando + "+*").length) {
						rbuggyQSA.push(".#.+[+~]");
					}

					// Support: Firefox <=3.6 - 5 only
					// Old Firefox doesn't throw on a badly-escaped identifier.
					el.querySelectorAll("\\\f");
					rbuggyQSA.push("[\\r\\n\\f]");
				});

				assert(function (el) {
					el.innerHTML = "<a href='' disabled='disabled'></a>" + "<select disabled='disabled'><option/></select>";

					// Support: Windows 8 Native Apps
					// The type and name attributes are restricted during .innerHTML assignment
					var input = document.createElement("input");
					input.setAttribute("type", "hidden");
					el.appendChild(input).setAttribute("name", "D");

					// Support: IE8
					// Enforce case-sensitivity of name attribute
					if (el.querySelectorAll("[name=d]").length) {
						rbuggyQSA.push("name" + whitespace + "*[*^$|!~]?=");
					}

					// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
					// IE8 throws error here and will not see later tests
					if (el.querySelectorAll(":enabled").length !== 2) {
						rbuggyQSA.push(":enabled", ":disabled");
					}

					// Support: IE9-11+
					// IE's :disabled selector does not pick up the children of disabled fieldsets
					docElem.appendChild(el).disabled = true;
					if (el.querySelectorAll(":disabled").length !== 2) {
						rbuggyQSA.push(":enabled", ":disabled");
					}

					// Support: Opera 10 - 11 only
					// Opera 10-11 does not throw on post-comma invalid pseudos
					el.querySelectorAll("*,:x");
					rbuggyQSA.push(",.*:");
				});
			}

			if (support.matchesSelector = rnative.test(matches = docElem.matches || docElem.webkitMatchesSelector || docElem.mozMatchesSelector || docElem.oMatchesSelector || docElem.msMatchesSelector)) {

				assert(function (el) {

					// Check to see if it's possible to do matchesSelector
					// on a disconnected node (IE 9)
					support.disconnectedMatch = matches.call(el, "*");

					// This should fail with an exception
					// Gecko does not error, returns false instead
					matches.call(el, "[s!='']:x");
					rbuggyMatches.push("!=", pseudos);
				});
			}

			rbuggyQSA = rbuggyQSA.length && new RegExp(rbuggyQSA.join("|"));
			rbuggyMatches = rbuggyMatches.length && new RegExp(rbuggyMatches.join("|"));

			/* Contains
   ---------------------------------------------------------------------- */
			hasCompare = rnative.test(docElem.compareDocumentPosition);

			// Element contains another
			// Purposefully self-exclusive
			// As in, an element does not contain itself
			contains = hasCompare || rnative.test(docElem.contains) ? function (a, b) {
				var adown = a.nodeType === 9 ? a.documentElement : a,
				    bup = b && b.parentNode;
				return a === bup || !!(bup && bup.nodeType === 1 && (adown.contains ? adown.contains(bup) : a.compareDocumentPosition && a.compareDocumentPosition(bup) & 16));
			} : function (a, b) {
				if (b) {
					while (b = b.parentNode) {
						if (b === a) {
							return true;
						}
					}
				}
				return false;
			};

			/* Sorting
   ---------------------------------------------------------------------- */

			// Document order sorting
			sortOrder = hasCompare ? function (a, b) {

				// Flag for duplicate removal
				if (a === b) {
					hasDuplicate = true;
					return 0;
				}

				// Sort on method existence if only one input has compareDocumentPosition
				var compare = !a.compareDocumentPosition - !b.compareDocumentPosition;
				if (compare) {
					return compare;
				}

				// Calculate position if both inputs belong to the same document
				// Support: IE 11+, Edge 17 - 18+
				// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
				// two documents; shallow comparisons work.
				// eslint-disable-next-line eqeqeq
				compare = (a.ownerDocument || a) == (b.ownerDocument || b) ? a.compareDocumentPosition(b) :

				// Otherwise we know they are disconnected
				1;

				// Disconnected nodes
				if (compare & 1 || !support.sortDetached && b.compareDocumentPosition(a) === compare) {

					// Choose the first element that is related to our preferred document
					// Support: IE 11+, Edge 17 - 18+
					// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
					// two documents; shallow comparisons work.
					// eslint-disable-next-line eqeqeq
					if (a == document || a.ownerDocument == preferredDoc && contains(preferredDoc, a)) {
						return -1;
					}

					// Support: IE 11+, Edge 17 - 18+
					// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
					// two documents; shallow comparisons work.
					// eslint-disable-next-line eqeqeq
					if (b == document || b.ownerDocument == preferredDoc && contains(preferredDoc, b)) {
						return 1;
					}

					// Maintain original order
					return sortInput ? indexOf(sortInput, a) - indexOf(sortInput, b) : 0;
				}

				return compare & 4 ? -1 : 1;
			} : function (a, b) {

				// Exit early if the nodes are identical
				if (a === b) {
					hasDuplicate = true;
					return 0;
				}

				var cur,
				    i = 0,
				    aup = a.parentNode,
				    bup = b.parentNode,
				    ap = [a],
				    bp = [b];

				// Parentless nodes are either documents or disconnected
				if (!aup || !bup) {

					// Support: IE 11+, Edge 17 - 18+
					// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
					// two documents; shallow comparisons work.
					/* eslint-disable eqeqeq */
					return a == document ? -1 : b == document ? 1 :
					/* eslint-enable eqeqeq */
					aup ? -1 : bup ? 1 : sortInput ? indexOf(sortInput, a) - indexOf(sortInput, b) : 0;

					// If the nodes are siblings, we can do a quick check
				} else if (aup === bup) {
					return siblingCheck(a, b);
				}

				// Otherwise we need full lists of their ancestors for comparison
				cur = a;
				while (cur = cur.parentNode) {
					ap.unshift(cur);
				}
				cur = b;
				while (cur = cur.parentNode) {
					bp.unshift(cur);
				}

				// Walk down the tree looking for a discrepancy
				while (ap[i] === bp[i]) {
					i++;
				}

				return i ?

				// Do a sibling check if the nodes have a common ancestor
				siblingCheck(ap[i], bp[i]) :

				// Otherwise nodes in our document sort first
				// Support: IE 11+, Edge 17 - 18+
				// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
				// two documents; shallow comparisons work.
				/* eslint-disable eqeqeq */
				ap[i] == preferredDoc ? -1 : bp[i] == preferredDoc ? 1 :
				/* eslint-enable eqeqeq */
				0;
			};

			return document;
		};

		Sizzle.matches = function (expr, elements) {
			return Sizzle(expr, null, null, elements);
		};

		Sizzle.matchesSelector = function (elem, expr) {
			setDocument(elem);

			if (support.matchesSelector && documentIsHTML && !nonnativeSelectorCache[expr + " "] && (!rbuggyMatches || !rbuggyMatches.test(expr)) && (!rbuggyQSA || !rbuggyQSA.test(expr))) {

				try {
					var ret = matches.call(elem, expr);

					// IE 9's matchesSelector returns false on disconnected nodes
					if (ret || support.disconnectedMatch ||

					// As well, disconnected nodes are said to be in a document
					// fragment in IE 9
					elem.document && elem.document.nodeType !== 11) {
						return ret;
					}
				} catch (e) {
					nonnativeSelectorCache(expr, true);
				}
			}

			return Sizzle(expr, document, null, [elem]).length > 0;
		};

		Sizzle.contains = function (context, elem) {

			// Set document vars if needed
			// Support: IE 11+, Edge 17 - 18+
			// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
			// two documents; shallow comparisons work.
			// eslint-disable-next-line eqeqeq
			if ((context.ownerDocument || context) != document) {
				setDocument(context);
			}
			return contains(context, elem);
		};

		Sizzle.attr = function (elem, name) {

			// Set document vars if needed
			// Support: IE 11+, Edge 17 - 18+
			// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
			// two documents; shallow comparisons work.
			// eslint-disable-next-line eqeqeq
			if ((elem.ownerDocument || elem) != document) {
				setDocument(elem);
			}

			var fn = Expr.attrHandle[name.toLowerCase()],


			// Don't get fooled by Object.prototype properties (jQuery #13807)
			val = fn && hasOwn.call(Expr.attrHandle, name.toLowerCase()) ? fn(elem, name, !documentIsHTML) : undefined;

			return val !== undefined ? val : support.attributes || !documentIsHTML ? elem.getAttribute(name) : (val = elem.getAttributeNode(name)) && val.specified ? val.value : null;
		};

		Sizzle.escape = function (sel) {
			return (sel + "").replace(rcssescape, fcssescape);
		};

		Sizzle.error = function (msg) {
			throw new Error("Syntax error, unrecognized expression: " + msg);
		};

		/**
   * Document sorting and removing duplicates
   * @param {ArrayLike} results
   */
		Sizzle.uniqueSort = function (results) {
			var elem,
			    duplicates = [],
			    j = 0,
			    i = 0;

			// Unless we *know* we can detect duplicates, assume their presence
			hasDuplicate = !support.detectDuplicates;
			sortInput = !support.sortStable && results.slice(0);
			results.sort(sortOrder);

			if (hasDuplicate) {
				while (elem = results[i++]) {
					if (elem === results[i]) {
						j = duplicates.push(i);
					}
				}
				while (j--) {
					results.splice(duplicates[j], 1);
				}
			}

			// Clear input after sorting to release objects
			// See https://github.com/jquery/sizzle/pull/225
			sortInput = null;

			return results;
		};

		/**
   * Utility function for retrieving the text value of an array of DOM nodes
   * @param {Array|Element} elem
   */
		getText = Sizzle.getText = function (elem) {
			var node,
			    ret = "",
			    i = 0,
			    nodeType = elem.nodeType;

			if (!nodeType) {

				// If no nodeType, this is expected to be an array
				while (node = elem[i++]) {

					// Do not traverse comment nodes
					ret += getText(node);
				}
			} else if (nodeType === 1 || nodeType === 9 || nodeType === 11) {

				// Use textContent for elements
				// innerText usage removed for consistency of new lines (jQuery #11153)
				if (typeof elem.textContent === "string") {
					return elem.textContent;
				} else {

					// Traverse its children
					for (elem = elem.firstChild; elem; elem = elem.nextSibling) {
						ret += getText(elem);
					}
				}
			} else if (nodeType === 3 || nodeType === 4) {
				return elem.nodeValue;
			}

			// Do not include comment or processing instruction nodes

			return ret;
		};

		Expr = Sizzle.selectors = {

			// Can be adjusted by the user
			cacheLength: 50,

			createPseudo: markFunction,

			match: matchExpr,

			attrHandle: {},

			find: {},

			relative: {
				">": { dir: "parentNode", first: true },
				" ": { dir: "parentNode" },
				"+": { dir: "previousSibling", first: true },
				"~": { dir: "previousSibling" }
			},

			preFilter: {
				"ATTR": function ATTR(match) {
					match[1] = match[1].replace(runescape, funescape);

					// Move the given value to match[3] whether quoted or unquoted
					match[3] = (match[3] || match[4] || match[5] || "").replace(runescape, funescape);

					if (match[2] === "~=") {
						match[3] = " " + match[3] + " ";
					}

					return match.slice(0, 4);
				},

				"CHILD": function CHILD(match) {

					/* matches from matchExpr["CHILD"]
     	1 type (only|nth|...)
     	2 what (child|of-type)
     	3 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
     	4 xn-component of xn+y argument ([+-]?\d*n|)
     	5 sign of xn-component
     	6 x of xn-component
     	7 sign of y-component
     	8 y of y-component
     */
					match[1] = match[1].toLowerCase();

					if (match[1].slice(0, 3) === "nth") {

						// nth-* requires argument
						if (!match[3]) {
							Sizzle.error(match[0]);
						}

						// numeric x and y parameters for Expr.filter.CHILD
						// remember that false/true cast respectively to 0/1
						match[4] = +(match[4] ? match[5] + (match[6] || 1) : 2 * (match[3] === "even" || match[3] === "odd"));
						match[5] = +(match[7] + match[8] || match[3] === "odd");

						// other types prohibit arguments
					} else if (match[3]) {
						Sizzle.error(match[0]);
					}

					return match;
				},

				"PSEUDO": function PSEUDO(match) {
					var excess,
					    unquoted = !match[6] && match[2];

					if (matchExpr["CHILD"].test(match[0])) {
						return null;
					}

					// Accept quoted arguments as-is
					if (match[3]) {
						match[2] = match[4] || match[5] || "";

						// Strip excess characters from unquoted arguments
					} else if (unquoted && rpseudo.test(unquoted) && (

					// Get excess from tokenize (recursively)
					excess = tokenize(unquoted, true)) && (

					// advance to the next closing parenthesis
					excess = unquoted.indexOf(")", unquoted.length - excess) - unquoted.length)) {

						// excess is a negative index
						match[0] = match[0].slice(0, excess);
						match[2] = unquoted.slice(0, excess);
					}

					// Return only captures needed by the pseudo filter method (type and argument)
					return match.slice(0, 3);
				}
			},

			filter: {

				"TAG": function TAG(nodeNameSelector) {
					var nodeName = nodeNameSelector.replace(runescape, funescape).toLowerCase();
					return nodeNameSelector === "*" ? function () {
						return true;
					} : function (elem) {
						return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
					};
				},

				"CLASS": function CLASS(className) {
					var pattern = classCache[className + " "];

					return pattern || (pattern = new RegExp("(^|" + whitespace + ")" + className + "(" + whitespace + "|$)")) && classCache(className, function (elem) {
						return pattern.test(typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "");
					});
				},

				"ATTR": function ATTR(name, operator, check) {
					return function (elem) {
						var result = Sizzle.attr(elem, name);

						if (result == null) {
							return operator === "!=";
						}
						if (!operator) {
							return true;
						}

						result += "";

						/* eslint-disable max-len */

						return operator === "=" ? result === check : operator === "!=" ? result !== check : operator === "^=" ? check && result.indexOf(check) === 0 : operator === "*=" ? check && result.indexOf(check) > -1 : operator === "$=" ? check && result.slice(-check.length) === check : operator === "~=" ? (" " + result.replace(rwhitespace, " ") + " ").indexOf(check) > -1 : operator === "|=" ? result === check || result.slice(0, check.length + 1) === check + "-" : false;
						/* eslint-enable max-len */
					};
				},

				"CHILD": function CHILD(type, what, _argument, first, last) {
					var simple = type.slice(0, 3) !== "nth",
					    forward = type.slice(-4) !== "last",
					    ofType = what === "of-type";

					return first === 1 && last === 0 ?

					// Shortcut for :nth-*(n)
					function (elem) {
						return !!elem.parentNode;
					} : function (elem, _context, xml) {
						var cache,
						    uniqueCache,
						    outerCache,
						    node,
						    nodeIndex,
						    start,
						    dir = simple !== forward ? "nextSibling" : "previousSibling",
						    parent = elem.parentNode,
						    name = ofType && elem.nodeName.toLowerCase(),
						    useCache = !xml && !ofType,
						    diff = false;

						if (parent) {

							// :(first|last|only)-(child|of-type)
							if (simple) {
								while (dir) {
									node = elem;
									while (node = node[dir]) {
										if (ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1) {

											return false;
										}
									}

									// Reverse direction for :only-* (if we haven't yet done so)
									start = dir = type === "only" && !start && "nextSibling";
								}
								return true;
							}

							start = [forward ? parent.firstChild : parent.lastChild];

							// non-xml :nth-child(...) stores cache data on `parent`
							if (forward && useCache) {

								// Seek `elem` from a previously-cached index

								// ...in a gzip-friendly way
								node = parent;
								outerCache = node[expando] || (node[expando] = {});

								// Support: IE <9 only
								// Defend against cloned attroperties (jQuery gh-1709)
								uniqueCache = outerCache[node.uniqueID] || (outerCache[node.uniqueID] = {});

								cache = uniqueCache[type] || [];
								nodeIndex = cache[0] === dirruns && cache[1];
								diff = nodeIndex && cache[2];
								node = nodeIndex && parent.childNodes[nodeIndex];

								while (node = ++nodeIndex && node && node[dir] || (

								// Fallback to seeking `elem` from the start
								diff = nodeIndex = 0) || start.pop()) {

									// When found, cache indexes on `parent` and break
									if (node.nodeType === 1 && ++diff && node === elem) {
										uniqueCache[type] = [dirruns, nodeIndex, diff];
										break;
									}
								}
							} else {

								// Use previously-cached element index if available
								if (useCache) {

									// ...in a gzip-friendly way
									node = elem;
									outerCache = node[expando] || (node[expando] = {});

									// Support: IE <9 only
									// Defend against cloned attroperties (jQuery gh-1709)
									uniqueCache = outerCache[node.uniqueID] || (outerCache[node.uniqueID] = {});

									cache = uniqueCache[type] || [];
									nodeIndex = cache[0] === dirruns && cache[1];
									diff = nodeIndex;
								}

								// xml :nth-child(...)
								// or :nth-last-child(...) or :nth(-last)?-of-type(...)
								if (diff === false) {

									// Use the same loop as above to seek `elem` from the start
									while (node = ++nodeIndex && node && node[dir] || (diff = nodeIndex = 0) || start.pop()) {

										if ((ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1) && ++diff) {

											// Cache the index of each encountered element
											if (useCache) {
												outerCache = node[expando] || (node[expando] = {});

												// Support: IE <9 only
												// Defend against cloned attroperties (jQuery gh-1709)
												uniqueCache = outerCache[node.uniqueID] || (outerCache[node.uniqueID] = {});

												uniqueCache[type] = [dirruns, diff];
											}

											if (node === elem) {
												break;
											}
										}
									}
								}
							}

							// Incorporate the offset, then check against cycle size
							diff -= last;
							return diff === first || diff % first === 0 && diff / first >= 0;
						}
					};
				},

				"PSEUDO": function PSEUDO(pseudo, argument) {

					// pseudo-class names are case-insensitive
					// http://www.w3.org/TR/selectors/#pseudo-classes
					// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
					// Remember that setFilters inherits from pseudos
					var args,
					    fn = Expr.pseudos[pseudo] || Expr.setFilters[pseudo.toLowerCase()] || Sizzle.error("unsupported pseudo: " + pseudo);

					// The user may use createPseudo to indicate that
					// arguments are needed to create the filter function
					// just as Sizzle does
					if (fn[expando]) {
						return fn(argument);
					}

					// But maintain support for old signatures
					if (fn.length > 1) {
						args = [pseudo, pseudo, "", argument];
						return Expr.setFilters.hasOwnProperty(pseudo.toLowerCase()) ? markFunction(function (seed, matches) {
							var idx,
							    matched = fn(seed, argument),
							    i = matched.length;
							while (i--) {
								idx = indexOf(seed, matched[i]);
								seed[idx] = !(matches[idx] = matched[i]);
							}
						}) : function (elem) {
							return fn(elem, 0, args);
						};
					}

					return fn;
				}
			},

			pseudos: {

				// Potentially complex pseudos
				"not": markFunction(function (selector) {

					// Trim the selector passed to compile
					// to avoid treating leading and trailing
					// spaces as combinators
					var input = [],
					    results = [],
					    matcher = compile(selector.replace(rtrim, "$1"));

					return matcher[expando] ? markFunction(function (seed, matches, _context, xml) {
						var elem,
						    unmatched = matcher(seed, null, xml, []),
						    i = seed.length;

						// Match elements unmatched by `matcher`
						while (i--) {
							if (elem = unmatched[i]) {
								seed[i] = !(matches[i] = elem);
							}
						}
					}) : function (elem, _context, xml) {
						input[0] = elem;
						matcher(input, null, xml, results);

						// Don't keep the element (issue #299)
						input[0] = null;
						return !results.pop();
					};
				}),

				"has": markFunction(function (selector) {
					return function (elem) {
						return Sizzle(selector, elem).length > 0;
					};
				}),

				"contains": markFunction(function (text) {
					text = text.replace(runescape, funescape);
					return function (elem) {
						return (elem.textContent || getText(elem)).indexOf(text) > -1;
					};
				}),

				// "Whether an element is represented by a :lang() selector
				// is based solely on the element's language value
				// being equal to the identifier C,
				// or beginning with the identifier C immediately followed by "-".
				// The matching of C against the element's language value is performed case-insensitively.
				// The identifier C does not have to be a valid language name."
				// http://www.w3.org/TR/selectors/#lang-pseudo
				"lang": markFunction(function (lang) {

					// lang value must be a valid identifier
					if (!ridentifier.test(lang || "")) {
						Sizzle.error("unsupported lang: " + lang);
					}
					lang = lang.replace(runescape, funescape).toLowerCase();
					return function (elem) {
						var elemLang;
						do {
							if (elemLang = documentIsHTML ? elem.lang : elem.getAttribute("xml:lang") || elem.getAttribute("lang")) {

								elemLang = elemLang.toLowerCase();
								return elemLang === lang || elemLang.indexOf(lang + "-") === 0;
							}
						} while ((elem = elem.parentNode) && elem.nodeType === 1);
						return false;
					};
				}),

				// Miscellaneous
				"target": function target(elem) {
					var hash = window.location && window.location.hash;
					return hash && hash.slice(1) === elem.id;
				},

				"root": function root(elem) {
					return elem === docElem;
				},

				"focus": function focus(elem) {
					return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);
				},

				// Boolean properties
				"enabled": createDisabledPseudo(false),
				"disabled": createDisabledPseudo(true),

				"checked": function checked(elem) {

					// In CSS3, :checked should return both checked and selected elements
					// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
					var nodeName = elem.nodeName.toLowerCase();
					return nodeName === "input" && !!elem.checked || nodeName === "option" && !!elem.selected;
				},

				"selected": function selected(elem) {

					// Accessing this property makes selected-by-default
					// options in Safari work properly
					if (elem.parentNode) {
						// eslint-disable-next-line no-unused-expressions
						elem.parentNode.selectedIndex;
					}

					return elem.selected === true;
				},

				// Contents
				"empty": function empty(elem) {

					// http://www.w3.org/TR/selectors/#empty-pseudo
					// :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),
					//   but not by others (comment: 8; processing instruction: 7; etc.)
					// nodeType < 6 works because attributes (2) do not appear as children
					for (elem = elem.firstChild; elem; elem = elem.nextSibling) {
						if (elem.nodeType < 6) {
							return false;
						}
					}
					return true;
				},

				"parent": function parent(elem) {
					return !Expr.pseudos["empty"](elem);
				},

				// Element/input types
				"header": function header(elem) {
					return rheader.test(elem.nodeName);
				},

				"input": function input(elem) {
					return rinputs.test(elem.nodeName);
				},

				"button": function button(elem) {
					var name = elem.nodeName.toLowerCase();
					return name === "input" && elem.type === "button" || name === "button";
				},

				"text": function text(elem) {
					var attr;
					return elem.nodeName.toLowerCase() === "input" && elem.type === "text" && (

					// Support: IE<8
					// New HTML5 attribute values (e.g., "search") appear with elem.type === "text"
					(attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text");
				},

				// Position-in-collection
				"first": createPositionalPseudo(function () {
					return [0];
				}),

				"last": createPositionalPseudo(function (_matchIndexes, length) {
					return [length - 1];
				}),

				"eq": createPositionalPseudo(function (_matchIndexes, length, argument) {
					return [argument < 0 ? argument + length : argument];
				}),

				"even": createPositionalPseudo(function (matchIndexes, length) {
					var i = 0;
					for (; i < length; i += 2) {
						matchIndexes.push(i);
					}
					return matchIndexes;
				}),

				"odd": createPositionalPseudo(function (matchIndexes, length) {
					var i = 1;
					for (; i < length; i += 2) {
						matchIndexes.push(i);
					}
					return matchIndexes;
				}),

				"lt": createPositionalPseudo(function (matchIndexes, length, argument) {
					var i = argument < 0 ? argument + length : argument > length ? length : argument;
					for (; --i >= 0;) {
						matchIndexes.push(i);
					}
					return matchIndexes;
				}),

				"gt": createPositionalPseudo(function (matchIndexes, length, argument) {
					var i = argument < 0 ? argument + length : argument;
					for (; ++i < length;) {
						matchIndexes.push(i);
					}
					return matchIndexes;
				})
			}
		};

		Expr.pseudos["nth"] = Expr.pseudos["eq"];

		// Add button/input type pseudos
		for (i in { radio: true, checkbox: true, file: true, password: true, image: true }) {
			Expr.pseudos[i] = createInputPseudo(i);
		}
		for (i in { submit: true, reset: true }) {
			Expr.pseudos[i] = createButtonPseudo(i);
		}

		// Easy API for creating new setFilters
		function setFilters() {}
		setFilters.prototype = Expr.filters = Expr.pseudos;
		Expr.setFilters = new setFilters();

		tokenize = Sizzle.tokenize = function (selector, parseOnly) {
			var matched,
			    match,
			    tokens,
			    type,
			    soFar,
			    groups,
			    preFilters,
			    cached = tokenCache[selector + " "];

			if (cached) {
				return parseOnly ? 0 : cached.slice(0);
			}

			soFar = selector;
			groups = [];
			preFilters = Expr.preFilter;

			while (soFar) {

				// Comma and first run
				if (!matched || (match = rcomma.exec(soFar))) {
					if (match) {

						// Don't consume trailing commas as valid
						soFar = soFar.slice(match[0].length) || soFar;
					}
					groups.push(tokens = []);
				}

				matched = false;

				// Combinators
				if (match = rcombinators.exec(soFar)) {
					matched = match.shift();
					tokens.push({
						value: matched,

						// Cast descendant combinators to space
						type: match[0].replace(rtrim, " ")
					});
					soFar = soFar.slice(matched.length);
				}

				// Filters
				for (type in Expr.filter) {
					if ((match = matchExpr[type].exec(soFar)) && (!preFilters[type] || (match = preFilters[type](match)))) {
						matched = match.shift();
						tokens.push({
							value: matched,
							type: type,
							matches: match
						});
						soFar = soFar.slice(matched.length);
					}
				}

				if (!matched) {
					break;
				}
			}

			// Return the length of the invalid excess
			// if we're just parsing
			// Otherwise, throw an error or return tokens
			return parseOnly ? soFar.length : soFar ? Sizzle.error(selector) :

			// Cache the tokens
			tokenCache(selector, groups).slice(0);
		};

		function toSelector(tokens) {
			var i = 0,
			    len = tokens.length,
			    selector = "";
			for (; i < len; i++) {
				selector += tokens[i].value;
			}
			return selector;
		}

		function addCombinator(matcher, combinator, base) {
			var dir = combinator.dir,
			    skip = combinator.next,
			    key = skip || dir,
			    checkNonElements = base && key === "parentNode",
			    doneName = done++;

			return combinator.first ?

			// Check against closest ancestor/preceding element
			function (elem, context, xml) {
				while (elem = elem[dir]) {
					if (elem.nodeType === 1 || checkNonElements) {
						return matcher(elem, context, xml);
					}
				}
				return false;
			} :

			// Check against all ancestor/preceding elements
			function (elem, context, xml) {
				var oldCache,
				    uniqueCache,
				    outerCache,
				    newCache = [dirruns, doneName];

				// We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching
				if (xml) {
					while (elem = elem[dir]) {
						if (elem.nodeType === 1 || checkNonElements) {
							if (matcher(elem, context, xml)) {
								return true;
							}
						}
					}
				} else {
					while (elem = elem[dir]) {
						if (elem.nodeType === 1 || checkNonElements) {
							outerCache = elem[expando] || (elem[expando] = {});

							// Support: IE <9 only
							// Defend against cloned attroperties (jQuery gh-1709)
							uniqueCache = outerCache[elem.uniqueID] || (outerCache[elem.uniqueID] = {});

							if (skip && skip === elem.nodeName.toLowerCase()) {
								elem = elem[dir] || elem;
							} else if ((oldCache = uniqueCache[key]) && oldCache[0] === dirruns && oldCache[1] === doneName) {

								// Assign to newCache so results back-propagate to previous elements
								return newCache[2] = oldCache[2];
							} else {

								// Reuse newcache so results back-propagate to previous elements
								uniqueCache[key] = newCache;

								// A match means we're done; a fail means we have to keep checking
								if (newCache[2] = matcher(elem, context, xml)) {
									return true;
								}
							}
						}
					}
				}
				return false;
			};
		}

		function elementMatcher(matchers) {
			return matchers.length > 1 ? function (elem, context, xml) {
				var i = matchers.length;
				while (i--) {
					if (!matchers[i](elem, context, xml)) {
						return false;
					}
				}
				return true;
			} : matchers[0];
		}

		function multipleContexts(selector, contexts, results) {
			var i = 0,
			    len = contexts.length;
			for (; i < len; i++) {
				Sizzle(selector, contexts[i], results);
			}
			return results;
		}

		function condense(unmatched, map, filter, context, xml) {
			var elem,
			    newUnmatched = [],
			    i = 0,
			    len = unmatched.length,
			    mapped = map != null;

			for (; i < len; i++) {
				if (elem = unmatched[i]) {
					if (!filter || filter(elem, context, xml)) {
						newUnmatched.push(elem);
						if (mapped) {
							map.push(i);
						}
					}
				}
			}

			return newUnmatched;
		}

		function setMatcher(preFilter, selector, matcher, postFilter, postFinder, postSelector) {
			if (postFilter && !postFilter[expando]) {
				postFilter = setMatcher(postFilter);
			}
			if (postFinder && !postFinder[expando]) {
				postFinder = setMatcher(postFinder, postSelector);
			}
			return markFunction(function (seed, results, context, xml) {
				var temp,
				    i,
				    elem,
				    preMap = [],
				    postMap = [],
				    preexisting = results.length,


				// Get initial elements from seed or context
				elems = seed || multipleContexts(selector || "*", context.nodeType ? [context] : context, []),


				// Prefilter to get matcher input, preserving a map for seed-results synchronization
				matcherIn = preFilter && (seed || !selector) ? condense(elems, preMap, preFilter, context, xml) : elems,
				    matcherOut = matcher ?

				// If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
				postFinder || (seed ? preFilter : preexisting || postFilter) ?

				// ...intermediate processing is necessary
				[] :

				// ...otherwise use results directly
				results : matcherIn;

				// Find primary matches
				if (matcher) {
					matcher(matcherIn, matcherOut, context, xml);
				}

				// Apply postFilter
				if (postFilter) {
					temp = condense(matcherOut, postMap);
					postFilter(temp, [], context, xml);

					// Un-match failing elements by moving them back to matcherIn
					i = temp.length;
					while (i--) {
						if (elem = temp[i]) {
							matcherOut[postMap[i]] = !(matcherIn[postMap[i]] = elem);
						}
					}
				}

				if (seed) {
					if (postFinder || preFilter) {
						if (postFinder) {

							// Get the final matcherOut by condensing this intermediate into postFinder contexts
							temp = [];
							i = matcherOut.length;
							while (i--) {
								if (elem = matcherOut[i]) {

									// Restore matcherIn since elem is not yet a final match
									temp.push(matcherIn[i] = elem);
								}
							}
							postFinder(null, matcherOut = [], temp, xml);
						}

						// Move matched elements from seed to results to keep them synchronized
						i = matcherOut.length;
						while (i--) {
							if ((elem = matcherOut[i]) && (temp = postFinder ? indexOf(seed, elem) : preMap[i]) > -1) {

								seed[temp] = !(results[temp] = elem);
							}
						}
					}

					// Add elements to results, through postFinder if defined
				} else {
					matcherOut = condense(matcherOut === results ? matcherOut.splice(preexisting, matcherOut.length) : matcherOut);
					if (postFinder) {
						postFinder(null, results, matcherOut, xml);
					} else {
						push.apply(results, matcherOut);
					}
				}
			});
		}

		function matcherFromTokens(tokens) {
			var checkContext,
			    matcher,
			    j,
			    len = tokens.length,
			    leadingRelative = Expr.relative[tokens[0].type],
			    implicitRelative = leadingRelative || Expr.relative[" "],
			    i = leadingRelative ? 1 : 0,


			// The foundational matcher ensures that elements are reachable from top-level context(s)
			matchContext = addCombinator(function (elem) {
				return elem === checkContext;
			}, implicitRelative, true),
			    matchAnyContext = addCombinator(function (elem) {
				return indexOf(checkContext, elem) > -1;
			}, implicitRelative, true),
			    matchers = [function (elem, context, xml) {
				var ret = !leadingRelative && (xml || context !== outermostContext) || ((checkContext = context).nodeType ? matchContext(elem, context, xml) : matchAnyContext(elem, context, xml));

				// Avoid hanging onto element (issue #299)
				checkContext = null;
				return ret;
			}];

			for (; i < len; i++) {
				if (matcher = Expr.relative[tokens[i].type]) {
					matchers = [addCombinator(elementMatcher(matchers), matcher)];
				} else {
					matcher = Expr.filter[tokens[i].type].apply(null, tokens[i].matches);

					// Return special upon seeing a positional matcher
					if (matcher[expando]) {

						// Find the next relative operator (if any) for proper handling
						j = ++i;
						for (; j < len; j++) {
							if (Expr.relative[tokens[j].type]) {
								break;
							}
						}
						return setMatcher(i > 1 && elementMatcher(matchers), i > 1 && toSelector(

						// If the preceding token was a descendant combinator, insert an implicit any-element `*`
						tokens.slice(0, i - 1).concat({ value: tokens[i - 2].type === " " ? "*" : "" })).replace(rtrim, "$1"), matcher, i < j && matcherFromTokens(tokens.slice(i, j)), j < len && matcherFromTokens(tokens = tokens.slice(j)), j < len && toSelector(tokens));
					}
					matchers.push(matcher);
				}
			}

			return elementMatcher(matchers);
		}

		function matcherFromGroupMatchers(elementMatchers, setMatchers) {
			var bySet = setMatchers.length > 0,
			    byElement = elementMatchers.length > 0,
			    superMatcher = function superMatcher(seed, context, xml, results, outermost) {
				var elem,
				    j,
				    matcher,
				    matchedCount = 0,
				    i = "0",
				    unmatched = seed && [],
				    setMatched = [],
				    contextBackup = outermostContext,


				// We must always have either seed elements or outermost context
				elems = seed || byElement && Expr.find["TAG"]("*", outermost),


				// Use integer dirruns iff this is the outermost matcher
				dirrunsUnique = dirruns += contextBackup == null ? 1 : Math.random() || 0.1,
				    len = elems.length;

				if (outermost) {

					// Support: IE 11+, Edge 17 - 18+
					// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
					// two documents; shallow comparisons work.
					// eslint-disable-next-line eqeqeq
					outermostContext = context == document || context || outermost;
				}

				// Add elements passing elementMatchers directly to results
				// Support: IE<9, Safari
				// Tolerate NodeList properties (IE: "length"; Safari: <number>) matching elements by id
				for (; i !== len && (elem = elems[i]) != null; i++) {
					if (byElement && elem) {
						j = 0;

						// Support: IE 11+, Edge 17 - 18+
						// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
						// two documents; shallow comparisons work.
						// eslint-disable-next-line eqeqeq
						if (!context && elem.ownerDocument != document) {
							setDocument(elem);
							xml = !documentIsHTML;
						}
						while (matcher = elementMatchers[j++]) {
							if (matcher(elem, context || document, xml)) {
								results.push(elem);
								break;
							}
						}
						if (outermost) {
							dirruns = dirrunsUnique;
						}
					}

					// Track unmatched elements for set filters
					if (bySet) {

						// They will have gone through all possible matchers
						if (elem = !matcher && elem) {
							matchedCount--;
						}

						// Lengthen the array for every element, matched or not
						if (seed) {
							unmatched.push(elem);
						}
					}
				}

				// `i` is now the count of elements visited above, and adding it to `matchedCount`
				// makes the latter nonnegative.
				matchedCount += i;

				// Apply set filters to unmatched elements
				// NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount`
				// equals `i`), unless we didn't visit _any_ elements in the above loop because we have
				// no element matchers and no seed.
				// Incrementing an initially-string "0" `i` allows `i` to remain a string only in that
				// case, which will result in a "00" `matchedCount` that differs from `i` but is also
				// numerically zero.
				if (bySet && i !== matchedCount) {
					j = 0;
					while (matcher = setMatchers[j++]) {
						matcher(unmatched, setMatched, context, xml);
					}

					if (seed) {

						// Reintegrate element matches to eliminate the need for sorting
						if (matchedCount > 0) {
							while (i--) {
								if (!(unmatched[i] || setMatched[i])) {
									setMatched[i] = pop.call(results);
								}
							}
						}

						// Discard index placeholder values to get only actual matches
						setMatched = condense(setMatched);
					}

					// Add matches to results
					push.apply(results, setMatched);

					// Seedless set matches succeeding multiple successful matchers stipulate sorting
					if (outermost && !seed && setMatched.length > 0 && matchedCount + setMatchers.length > 1) {

						Sizzle.uniqueSort(results);
					}
				}

				// Override manipulation of globals by nested matchers
				if (outermost) {
					dirruns = dirrunsUnique;
					outermostContext = contextBackup;
				}

				return unmatched;
			};

			return bySet ? markFunction(superMatcher) : superMatcher;
		}

		compile = Sizzle.compile = function (selector, match /* Internal Use Only */) {
			var i,
			    setMatchers = [],
			    elementMatchers = [],
			    cached = compilerCache[selector + " "];

			if (!cached) {

				// Generate a function of recursive functions that can be used to check each element
				if (!match) {
					match = tokenize(selector);
				}
				i = match.length;
				while (i--) {
					cached = matcherFromTokens(match[i]);
					if (cached[expando]) {
						setMatchers.push(cached);
					} else {
						elementMatchers.push(cached);
					}
				}

				// Cache the compiled function
				cached = compilerCache(selector, matcherFromGroupMatchers(elementMatchers, setMatchers));

				// Save selector and tokenization
				cached.selector = selector;
			}
			return cached;
		};

		/**
   * A low-level selection function that works with Sizzle's compiled
   *  selector functions
   * @param {String|Function} selector A selector or a pre-compiled
   *  selector function built with Sizzle.compile
   * @param {Element} context
   * @param {Array} [results]
   * @param {Array} [seed] A set of elements to match against
   */
		select = Sizzle.select = function (selector, context, results, seed) {
			var i,
			    tokens,
			    token,
			    type,
			    find,
			    compiled = typeof selector === "function" && selector,
			    match = !seed && tokenize(selector = compiled.selector || selector);

			results = results || [];

			// Try to minimize operations if there is only one selector in the list and no seed
			// (the latter of which guarantees us context)
			if (match.length === 1) {

				// Reduce context if the leading compound selector is an ID
				tokens = match[0] = match[0].slice(0);
				if (tokens.length > 2 && (token = tokens[0]).type === "ID" && context.nodeType === 9 && documentIsHTML && Expr.relative[tokens[1].type]) {

					context = (Expr.find["ID"](token.matches[0].replace(runescape, funescape), context) || [])[0];
					if (!context) {
						return results;

						// Precompiled matchers will still verify ancestry, so step up a level
					} else if (compiled) {
						context = context.parentNode;
					}

					selector = selector.slice(tokens.shift().value.length);
				}

				// Fetch a seed set for right-to-left matching
				i = matchExpr["needsContext"].test(selector) ? 0 : tokens.length;
				while (i--) {
					token = tokens[i];

					// Abort if we hit a combinator
					if (Expr.relative[type = token.type]) {
						break;
					}
					if (find = Expr.find[type]) {

						// Search, expanding context for leading sibling combinators
						if (seed = find(token.matches[0].replace(runescape, funescape), rsibling.test(tokens[0].type) && testContext(context.parentNode) || context)) {

							// If seed is empty or no tokens remain, we can return early
							tokens.splice(i, 1);
							selector = seed.length && toSelector(tokens);
							if (!selector) {
								push.apply(results, seed);
								return results;
							}

							break;
						}
					}
				}
			}

			// Compile and execute a filtering function if one is not provided
			// Provide `match` to avoid retokenization if we modified the selector above
			(compiled || compile(selector, match))(seed, context, !documentIsHTML, results, !context || rsibling.test(selector) && testContext(context.parentNode) || context);
			return results;
		};

		// One-time assignments

		// Sort stability
		support.sortStable = expando.split("").sort(sortOrder).join("") === expando;

		// Support: Chrome 14-35+
		// Always assume duplicates if they aren't passed to the comparison function
		support.detectDuplicates = !!hasDuplicate;

		// Initialize against the default document
		setDocument();

		// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)
		// Detached nodes confoundingly follow *each other*
		support.sortDetached = assert(function (el) {

			// Should return 1, but returns 4 (following)
			return el.compareDocumentPosition(document.createElement("fieldset")) & 1;
		});

		// Support: IE<8
		// Prevent attribute/property "interpolation"
		// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
		if (!assert(function (el) {
			el.innerHTML = "<a href='#'></a>";
			return el.firstChild.getAttribute("href") === "#";
		})) {
			addHandle("type|href|height|width", function (elem, name, isXML) {
				if (!isXML) {
					return elem.getAttribute(name, name.toLowerCase() === "type" ? 1 : 2);
				}
			});
		}

		// Support: IE<9
		// Use defaultValue in place of getAttribute("value")
		if (!support.attributes || !assert(function (el) {
			el.innerHTML = "<input/>";
			el.firstChild.setAttribute("value", "");
			return el.firstChild.getAttribute("value") === "";
		})) {
			addHandle("value", function (elem, _name, isXML) {
				if (!isXML && elem.nodeName.toLowerCase() === "input") {
					return elem.defaultValue;
				}
			});
		}

		// Support: IE<9
		// Use getAttributeNode to fetch booleans when getAttribute lies
		if (!assert(function (el) {
			return el.getAttribute("disabled") == null;
		})) {
			addHandle(booleans, function (elem, name, isXML) {
				var val;
				if (!isXML) {
					return elem[name] === true ? name.toLowerCase() : (val = elem.getAttributeNode(name)) && val.specified ? val.value : null;
				}
			});
		}

		return Sizzle;
	}(window);

	jQuery.find = Sizzle;
	jQuery.expr = Sizzle.selectors;

	// Deprecated
	jQuery.expr[":"] = jQuery.expr.pseudos;
	jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort;
	jQuery.text = Sizzle.getText;
	jQuery.isXMLDoc = Sizzle.isXML;
	jQuery.contains = Sizzle.contains;
	jQuery.escapeSelector = Sizzle.escape;

	var dir = function dir(elem, _dir, until) {
		var matched = [],
		    truncate = until !== undefined;

		while ((elem = elem[_dir]) && elem.nodeType !== 9) {
			if (elem.nodeType === 1) {
				if (truncate && jQuery(elem).is(until)) {
					break;
				}
				matched.push(elem);
			}
		}
		return matched;
	};

	var _siblings = function _siblings(n, elem) {
		var matched = [];

		for (; n; n = n.nextSibling) {
			if (n.nodeType === 1 && n !== elem) {
				matched.push(n);
			}
		}

		return matched;
	};

	var rneedsContext = jQuery.expr.match.needsContext;

	function nodeName(elem, name) {

		return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
	}
	var rsingleTag = /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;

	// Implement the identical functionality for filter and not
	function winnow(elements, qualifier, not) {
		if (isFunction(qualifier)) {
			return jQuery.grep(elements, function (elem, i) {
				return !!qualifier.call(elem, i, elem) !== not;
			});
		}

		// Single element
		if (qualifier.nodeType) {
			return jQuery.grep(elements, function (elem) {
				return elem === qualifier !== not;
			});
		}

		// Arraylike of elements (jQuery, arguments, Array)
		if (typeof qualifier !== "string") {
			return jQuery.grep(elements, function (elem) {
				return indexOf.call(qualifier, elem) > -1 !== not;
			});
		}

		// Filtered directly for both simple and complex selectors
		return jQuery.filter(qualifier, elements, not);
	}

	jQuery.filter = function (expr, elems, not) {
		var elem = elems[0];

		if (not) {
			expr = ":not(" + expr + ")";
		}

		if (elems.length === 1 && elem.nodeType === 1) {
			return jQuery.find.matchesSelector(elem, expr) ? [elem] : [];
		}

		return jQuery.find.matches(expr, jQuery.grep(elems, function (elem) {
			return elem.nodeType === 1;
		}));
	};

	jQuery.fn.extend({
		find: function find(selector) {
			var i,
			    ret,
			    len = this.length,
			    self = this;

			if (typeof selector !== "string") {
				return this.pushStack(jQuery(selector).filter(function () {
					for (i = 0; i < len; i++) {
						if (jQuery.contains(self[i], this)) {
							return true;
						}
					}
				}));
			}

			ret = this.pushStack([]);

			for (i = 0; i < len; i++) {
				jQuery.find(selector, self[i], ret);
			}

			return len > 1 ? jQuery.uniqueSort(ret) : ret;
		},
		filter: function filter(selector) {
			return this.pushStack(winnow(this, selector || [], false));
		},
		not: function not(selector) {
			return this.pushStack(winnow(this, selector || [], true));
		},
		is: function is(selector) {
			return !!winnow(this,

			// If this is a positional/relative selector, check membership in the returned set
			// so $("p:first").is("p:last") won't return true for a doc with two "p".
			typeof selector === "string" && rneedsContext.test(selector) ? jQuery(selector) : selector || [], false).length;
		}
	});

	// Initialize a jQuery object


	// A central reference to the root jQuery(document)
	var rootjQuery,


	// A simple way to check for HTML strings
	// Prioritize #id over <tag> to avoid XSS via location.hash (trac-9521)
	// Strict HTML recognition (trac-11290: must start with <)
	// Shortcut simple #id case for speed
	rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,
	    init = jQuery.fn.init = function (selector, context, root) {
		var match, elem;

		// HANDLE: $(""), $(null), $(undefined), $(false)
		if (!selector) {
			return this;
		}

		// Method init() accepts an alternate rootjQuery
		// so migrate can support jQuery.sub (gh-2101)
		root = root || rootjQuery;

		// Handle HTML strings
		if (typeof selector === "string") {
			if (selector[0] === "<" && selector[selector.length - 1] === ">" && selector.length >= 3) {

				// Assume that strings that start and end with <> are HTML and skip the regex check
				match = [null, selector, null];
			} else {
				match = rquickExpr.exec(selector);
			}

			// Match html or make sure no context is specified for #id
			if (match && (match[1] || !context)) {

				// HANDLE: $(html) -> $(array)
				if (match[1]) {
					context = context instanceof jQuery ? context[0] : context;

					// Option to run scripts is true for back-compat
					// Intentionally let the error be thrown if parseHTML is not present
					jQuery.merge(this, jQuery.parseHTML(match[1], context && context.nodeType ? context.ownerDocument || context : document, true));

					// HANDLE: $(html, props)
					if (rsingleTag.test(match[1]) && jQuery.isPlainObject(context)) {
						for (match in context) {

							// Properties of context are called as methods if possible
							if (isFunction(this[match])) {
								this[match](context[match]);

								// ...and otherwise set as attributes
							} else {
								this.attr(match, context[match]);
							}
						}
					}

					return this;

					// HANDLE: $(#id)
				} else {
					elem = document.getElementById(match[2]);

					if (elem) {

						// Inject the element directly into the jQuery object
						this[0] = elem;
						this.length = 1;
					}
					return this;
				}

				// HANDLE: $(expr, $(...))
			} else if (!context || context.jquery) {
				return (context || root).find(selector);

				// HANDLE: $(expr, context)
				// (which is just equivalent to: $(context).find(expr)
			} else {
				return this.constructor(context).find(selector);
			}

			// HANDLE: $(DOMElement)
		} else if (selector.nodeType) {
			this[0] = selector;
			this.length = 1;
			return this;

			// HANDLE: $(function)
			// Shortcut for document ready
		} else if (isFunction(selector)) {
			return root.ready !== undefined ? root.ready(selector) :

			// Execute immediately if ready is not present
			selector(jQuery);
		}

		return jQuery.makeArray(selector, this);
	};

	// Give the init function the jQuery prototype for later instantiation
	init.prototype = jQuery.fn;

	// Initialize central reference
	rootjQuery = jQuery(document);

	var rparentsprev = /^(?:parents|prev(?:Until|All))/,


	// Methods guaranteed to produce a unique set when starting from a unique set
	guaranteedUnique = {
		children: true,
		contents: true,
		next: true,
		prev: true
	};

	jQuery.fn.extend({
		has: function has(target) {
			var targets = jQuery(target, this),
			    l = targets.length;

			return this.filter(function () {
				var i = 0;
				for (; i < l; i++) {
					if (jQuery.contains(this, targets[i])) {
						return true;
					}
				}
			});
		},

		closest: function closest(selectors, context) {
			var cur,
			    i = 0,
			    l = this.length,
			    matched = [],
			    targets = typeof selectors !== "string" && jQuery(selectors);

			// Positional selectors never match, since there's no _selection_ context
			if (!rneedsContext.test(selectors)) {
				for (; i < l; i++) {
					for (cur = this[i]; cur && cur !== context; cur = cur.parentNode) {

						// Always skip document fragments
						if (cur.nodeType < 11 && (targets ? targets.index(cur) > -1 :

						// Don't pass non-elements to Sizzle
						cur.nodeType === 1 && jQuery.find.matchesSelector(cur, selectors))) {

							matched.push(cur);
							break;
						}
					}
				}
			}

			return this.pushStack(matched.length > 1 ? jQuery.uniqueSort(matched) : matched);
		},

		// Determine the position of an element within the set
		index: function index(elem) {

			// No argument, return index in parent
			if (!elem) {
				return this[0] && this[0].parentNode ? this.first().prevAll().length : -1;
			}

			// Index in selector
			if (typeof elem === "string") {
				return indexOf.call(jQuery(elem), this[0]);
			}

			// Locate the position of the desired element
			return indexOf.call(this,

			// If it receives a jQuery object, the first element is used
			elem.jquery ? elem[0] : elem);
		},

		add: function add(selector, context) {
			return this.pushStack(jQuery.uniqueSort(jQuery.merge(this.get(), jQuery(selector, context))));
		},

		addBack: function addBack(selector) {
			return this.add(selector == null ? this.prevObject : this.prevObject.filter(selector));
		}
	});

	function sibling(cur, dir) {
		while ((cur = cur[dir]) && cur.nodeType !== 1) {}
		return cur;
	}

	jQuery.each({
		parent: function parent(elem) {
			var parent = elem.parentNode;
			return parent && parent.nodeType !== 11 ? parent : null;
		},
		parents: function parents(elem) {
			return dir(elem, "parentNode");
		},
		parentsUntil: function parentsUntil(elem, _i, until) {
			return dir(elem, "parentNode", until);
		},
		next: function next(elem) {
			return sibling(elem, "nextSibling");
		},
		prev: function prev(elem) {
			return sibling(elem, "previousSibling");
		},
		nextAll: function nextAll(elem) {
			return dir(elem, "nextSibling");
		},
		prevAll: function prevAll(elem) {
			return dir(elem, "previousSibling");
		},
		nextUntil: function nextUntil(elem, _i, until) {
			return dir(elem, "nextSibling", until);
		},
		prevUntil: function prevUntil(elem, _i, until) {
			return dir(elem, "previousSibling", until);
		},
		siblings: function siblings(elem) {
			return _siblings((elem.parentNode || {}).firstChild, elem);
		},
		children: function children(elem) {
			return _siblings(elem.firstChild);
		},
		contents: function contents(elem) {
			if (elem.contentDocument != null &&

			// Support: IE 11+
			// <object> elements with no `data` attribute has an object
			// `contentDocument` with a `null` prototype.
			getProto(elem.contentDocument)) {

				return elem.contentDocument;
			}

			// Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only
			// Treat the template element as a regular one in browsers that
			// don't support it.
			if (nodeName(elem, "template")) {
				elem = elem.content || elem;
			}

			return jQuery.merge([], elem.childNodes);
		}
	}, function (name, fn) {
		jQuery.fn[name] = function (until, selector) {
			var matched = jQuery.map(this, fn, until);

			if (name.slice(-5) !== "Until") {
				selector = until;
			}

			if (selector && typeof selector === "string") {
				matched = jQuery.filter(selector, matched);
			}

			if (this.length > 1) {

				// Remove duplicates
				if (!guaranteedUnique[name]) {
					jQuery.uniqueSort(matched);
				}

				// Reverse order for parents* and prev-derivatives
				if (rparentsprev.test(name)) {
					matched.reverse();
				}
			}

			return this.pushStack(matched);
		};
	});
	var rnothtmlwhite = /[^\x20\t\r\n\f]+/g;

	// Convert String-formatted options into Object-formatted ones
	function createOptions(options) {
		var object = {};
		jQuery.each(options.match(rnothtmlwhite) || [], function (_, flag) {
			object[flag] = true;
		});
		return object;
	}

	/*
  * Create a callback list using the following parameters:
  *
  *	options: an optional list of space-separated options that will change how
  *			the callback list behaves or a more traditional option object
  *
  * By default a callback list will act like an event callback list and can be
  * "fired" multiple times.
  *
  * Possible options:
  *
  *	once:			will ensure the callback list can only be fired once (like a Deferred)
  *
  *	memory:			will keep track of previous values and will call any callback added
  *					after the list has been fired right away with the latest "memorized"
  *					values (like a Deferred)
  *
  *	unique:			will ensure a callback can only be added once (no duplicate in the list)
  *
  *	stopOnFalse:	interrupt callings when a callback returns false
  *
  */
	jQuery.Callbacks = function (options) {

		// Convert options from String-formatted to Object-formatted if needed
		// (we check in cache first)
		options = typeof options === "string" ? createOptions(options) : jQuery.extend({}, options);

		var // Flag to know if list is currently firing
		firing,


		// Last fire value for non-forgettable lists
		memory,


		// Flag to know if list was already fired
		_fired,


		// Flag to prevent firing
		_locked,


		// Actual callback list
		list = [],


		// Queue of execution data for repeatable lists
		queue = [],


		// Index of currently firing callback (modified by add/remove as needed)
		firingIndex = -1,


		// Fire callbacks
		fire = function fire() {

			// Enforce single-firing
			_locked = _locked || options.once;

			// Execute callbacks for all pending executions,
			// respecting firingIndex overrides and runtime changes
			_fired = firing = true;
			for (; queue.length; firingIndex = -1) {
				memory = queue.shift();
				while (++firingIndex < list.length) {

					// Run callback and check for early termination
					if (list[firingIndex].apply(memory[0], memory[1]) === false && options.stopOnFalse) {

						// Jump to end and forget the data so .add doesn't re-fire
						firingIndex = list.length;
						memory = false;
					}
				}
			}

			// Forget the data if we're done with it
			if (!options.memory) {
				memory = false;
			}

			firing = false;

			// Clean up if we're done firing for good
			if (_locked) {

				// Keep an empty list if we have data for future add calls
				if (memory) {
					list = [];

					// Otherwise, this object is spent
				} else {
					list = "";
				}
			}
		},


		// Actual Callbacks object
		self = {

			// Add a callback or a collection of callbacks to the list
			add: function add() {
				if (list) {

					// If we have memory from a past run, we should fire after adding
					if (memory && !firing) {
						firingIndex = list.length - 1;
						queue.push(memory);
					}

					(function add(args) {
						jQuery.each(args, function (_, arg) {
							if (isFunction(arg)) {
								if (!options.unique || !self.has(arg)) {
									list.push(arg);
								}
							} else if (arg && arg.length && toType(arg) !== "string") {

								// Inspect recursively
								add(arg);
							}
						});
					})(arguments);

					if (memory && !firing) {
						fire();
					}
				}
				return this;
			},

			// Remove a callback from the list
			remove: function remove() {
				jQuery.each(arguments, function (_, arg) {
					var index;
					while ((index = jQuery.inArray(arg, list, index)) > -1) {
						list.splice(index, 1);

						// Handle firing indexes
						if (index <= firingIndex) {
							firingIndex--;
						}
					}
				});
				return this;
			},

			// Check if a given callback is in the list.
			// If no argument is given, return whether or not list has callbacks attached.
			has: function has(fn) {
				return fn ? jQuery.inArray(fn, list) > -1 : list.length > 0;
			},

			// Remove all callbacks from the list
			empty: function empty() {
				if (list) {
					list = [];
				}
				return this;
			},

			// Disable .fire and .add
			// Abort any current/pending executions
			// Clear all callbacks and values
			disable: function disable() {
				_locked = queue = [];
				list = memory = "";
				return this;
			},
			disabled: function disabled() {
				return !list;
			},

			// Disable .fire
			// Also disable .add unless we have memory (since it would have no effect)
			// Abort any pending executions
			lock: function lock() {
				_locked = queue = [];
				if (!memory && !firing) {
					list = memory = "";
				}
				return this;
			},
			locked: function locked() {
				return !!_locked;
			},

			// Call all callbacks with the given context and arguments
			fireWith: function fireWith(context, args) {
				if (!_locked) {
					args = args || [];
					args = [context, args.slice ? args.slice() : args];
					queue.push(args);
					if (!firing) {
						fire();
					}
				}
				return this;
			},

			// Call all the callbacks with the given arguments
			fire: function fire() {
				self.fireWith(this, arguments);
				return this;
			},

			// To know if the callbacks have already been called at least once
			fired: function fired() {
				return !!_fired;
			}
		};

		return self;
	};

	function Identity(v) {
		return v;
	}
	function Thrower(ex) {
		throw ex;
	}

	function adoptValue(value, resolve, reject, noValue) {
		var method;

		try {

			// Check for promise aspect first to privilege synchronous behavior
			if (value && isFunction(method = value.promise)) {
				method.call(value).done(resolve).fail(reject);

				// Other thenables
			} else if (value && isFunction(method = value.then)) {
				method.call(value, resolve, reject);

				// Other non-thenables
			} else {

				// Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer:
				// * false: [ value ].slice( 0 ) => resolve( value )
				// * true: [ value ].slice( 1 ) => resolve()
				resolve.apply(undefined, [value].slice(noValue));
			}

			// For Promises/A+, convert exceptions into rejections
			// Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in
			// Deferred#then to conditionally suppress rejection.
		} catch (value) {

			// Support: Android 4.0 only
			// Strict mode functions invoked without .call/.apply get global-object context
			reject.apply(undefined, [value]);
		}
	}

	jQuery.extend({

		Deferred: function Deferred(func) {
			var tuples = [

			// action, add listener, callbacks,
			// ... .then handlers, argument index, [final state]
			["notify", "progress", jQuery.Callbacks("memory"), jQuery.Callbacks("memory"), 2], ["resolve", "done", jQuery.Callbacks("once memory"), jQuery.Callbacks("once memory"), 0, "resolved"], ["reject", "fail", jQuery.Callbacks("once memory"), jQuery.Callbacks("once memory"), 1, "rejected"]],
			    _state = "pending",
			    _promise = {
				state: function state() {
					return _state;
				},
				always: function always() {
					deferred.done(arguments).fail(arguments);
					return this;
				},
				"catch": function _catch(fn) {
					return _promise.then(null, fn);
				},

				// Keep pipe for back-compat
				pipe: function pipe() /* fnDone, fnFail, fnProgress */{
					var fns = arguments;

					return jQuery.Deferred(function (newDefer) {
						jQuery.each(tuples, function (_i, tuple) {

							// Map tuples (progress, done, fail) to arguments (done, fail, progress)
							var fn = isFunction(fns[tuple[4]]) && fns[tuple[4]];

							// deferred.progress(function() { bind to newDefer or newDefer.notify })
							// deferred.done(function() { bind to newDefer or newDefer.resolve })
							// deferred.fail(function() { bind to newDefer or newDefer.reject })
							deferred[tuple[1]](function () {
								var returned = fn && fn.apply(this, arguments);
								if (returned && isFunction(returned.promise)) {
									returned.promise().progress(newDefer.notify).done(newDefer.resolve).fail(newDefer.reject);
								} else {
									newDefer[tuple[0] + "With"](this, fn ? [returned] : arguments);
								}
							});
						});
						fns = null;
					}).promise();
				},
				then: function then(onFulfilled, onRejected, onProgress) {
					var maxDepth = 0;
					function resolve(depth, deferred, handler, special) {
						return function () {
							var that = this,
							    args = arguments,
							    mightThrow = function mightThrow() {
								var returned, then;

								// Support: Promises/A+ section 2.3.3.3.3
								// https://promisesaplus.com/#point-59
								// Ignore double-resolution attempts
								if (depth < maxDepth) {
									return;
								}

								returned = handler.apply(that, args);

								// Support: Promises/A+ section 2.3.1
								// https://promisesaplus.com/#point-48
								if (returned === deferred.promise()) {
									throw new TypeError("Thenable self-resolution");
								}

								// Support: Promises/A+ sections 2.3.3.1, 3.5
								// https://promisesaplus.com/#point-54
								// https://promisesaplus.com/#point-75
								// Retrieve `then` only once
								then = returned && (

								// Support: Promises/A+ section 2.3.4
								// https://promisesaplus.com/#point-64
								// Only check objects and functions for thenability
								(typeof returned === "undefined" ? "undefined" : _typeof(returned)) === "object" || typeof returned === "function") && returned.then;

								// Handle a returned thenable
								if (isFunction(then)) {

									// Special processors (notify) just wait for resolution
									if (special) {
										then.call(returned, resolve(maxDepth, deferred, Identity, special), resolve(maxDepth, deferred, Thrower, special));

										// Normal processors (resolve) also hook into progress
									} else {

										// ...and disregard older resolution values
										maxDepth++;

										then.call(returned, resolve(maxDepth, deferred, Identity, special), resolve(maxDepth, deferred, Thrower, special), resolve(maxDepth, deferred, Identity, deferred.notifyWith));
									}

									// Handle all other returned values
								} else {

									// Only substitute handlers pass on context
									// and multiple values (non-spec behavior)
									if (handler !== Identity) {
										that = undefined;
										args = [returned];
									}

									// Process the value(s)
									// Default process is resolve
									(special || deferred.resolveWith)(that, args);
								}
							},


							// Only normal processors (resolve) catch and reject exceptions
							process = special ? mightThrow : function () {
								try {
									mightThrow();
								} catch (e) {

									if (jQuery.Deferred.exceptionHook) {
										jQuery.Deferred.exceptionHook(e, process.stackTrace);
									}

									// Support: Promises/A+ section 2.3.3.3.4.1
									// https://promisesaplus.com/#point-61
									// Ignore post-resolution exceptions
									if (depth + 1 >= maxDepth) {

										// Only substitute handlers pass on context
										// and multiple values (non-spec behavior)
										if (handler !== Thrower) {
											that = undefined;
											args = [e];
										}

										deferred.rejectWith(that, args);
									}
								}
							};

							// Support: Promises/A+ section 2.3.3.3.1
							// https://promisesaplus.com/#point-57
							// Re-resolve promises immediately to dodge false rejection from
							// subsequent errors
							if (depth) {
								process();
							} else {

								// Call an optional hook to record the stack, in case of exception
								// since it's otherwise lost when execution goes async
								if (jQuery.Deferred.getStackHook) {
									process.stackTrace = jQuery.Deferred.getStackHook();
								}
								window.setTimeout(process);
							}
						};
					}

					return jQuery.Deferred(function (newDefer) {

						// progress_handlers.add( ... )
						tuples[0][3].add(resolve(0, newDefer, isFunction(onProgress) ? onProgress : Identity, newDefer.notifyWith));

						// fulfilled_handlers.add( ... )
						tuples[1][3].add(resolve(0, newDefer, isFunction(onFulfilled) ? onFulfilled : Identity));

						// rejected_handlers.add( ... )
						tuples[2][3].add(resolve(0, newDefer, isFunction(onRejected) ? onRejected : Thrower));
					}).promise();
				},

				// Get a promise for this deferred
				// If obj is provided, the promise aspect is added to the object
				promise: function promise(obj) {
					return obj != null ? jQuery.extend(obj, _promise) : _promise;
				}
			},
			    deferred = {};

			// Add list-specific methods
			jQuery.each(tuples, function (i, tuple) {
				var list = tuple[2],
				    stateString = tuple[5];

				// promise.progress = list.add
				// promise.done = list.add
				// promise.fail = list.add
				_promise[tuple[1]] = list.add;

				// Handle state
				if (stateString) {
					list.add(function () {

						// state = "resolved" (i.e., fulfilled)
						// state = "rejected"
						_state = stateString;
					},

					// rejected_callbacks.disable
					// fulfilled_callbacks.disable
					tuples[3 - i][2].disable,

					// rejected_handlers.disable
					// fulfilled_handlers.disable
					tuples[3 - i][3].disable,

					// progress_callbacks.lock
					tuples[0][2].lock,

					// progress_handlers.lock
					tuples[0][3].lock);
				}

				// progress_handlers.fire
				// fulfilled_handlers.fire
				// rejected_handlers.fire
				list.add(tuple[3].fire);

				// deferred.notify = function() { deferred.notifyWith(...) }
				// deferred.resolve = function() { deferred.resolveWith(...) }
				// deferred.reject = function() { deferred.rejectWith(...) }
				deferred[tuple[0]] = function () {
					deferred[tuple[0] + "With"](this === deferred ? undefined : this, arguments);
					return this;
				};

				// deferred.notifyWith = list.fireWith
				// deferred.resolveWith = list.fireWith
				// deferred.rejectWith = list.fireWith
				deferred[tuple[0] + "With"] = list.fireWith;
			});

			// Make the deferred a promise
			_promise.promise(deferred);

			// Call given func if any
			if (func) {
				func.call(deferred, deferred);
			}

			// All done!
			return deferred;
		},

		// Deferred helper
		when: function when(singleValue) {
			var

			// count of uncompleted subordinates
			remaining = arguments.length,


			// count of unprocessed arguments
			i = remaining,


			// subordinate fulfillment data
			resolveContexts = Array(i),
			    resolveValues = _slice.call(arguments),


			// the primary Deferred
			primary = jQuery.Deferred(),


			// subordinate callback factory
			updateFunc = function updateFunc(i) {
				return function (value) {
					resolveContexts[i] = this;
					resolveValues[i] = arguments.length > 1 ? _slice.call(arguments) : value;
					if (! --remaining) {
						primary.resolveWith(resolveContexts, resolveValues);
					}
				};
			};

			// Single- and empty arguments are adopted like Promise.resolve
			if (remaining <= 1) {
				adoptValue(singleValue, primary.done(updateFunc(i)).resolve, primary.reject, !remaining);

				// Use .then() to unwrap secondary thenables (cf. gh-3000)
				if (primary.state() === "pending" || isFunction(resolveValues[i] && resolveValues[i].then)) {

					return primary.then();
				}
			}

			// Multiple arguments are aggregated like Promise.all array elements
			while (i--) {
				adoptValue(resolveValues[i], updateFunc(i), primary.reject);
			}

			return primary.promise();
		}
	});

	// These usually indicate a programmer mistake during development,
	// warn about them ASAP rather than swallowing them by default.
	var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;

	jQuery.Deferred.exceptionHook = function (error, stack) {

		// Support: IE 8 - 9 only
		// Console exists when dev tools are open, which can happen at any time
		if (window.console && window.console.warn && error && rerrorNames.test(error.name)) {
			window.console.warn("jQuery.Deferred exception: " + error.message, error.stack, stack);
		}
	};

	jQuery.readyException = function (error) {
		window.setTimeout(function () {
			throw error;
		});
	};

	// The deferred used on DOM ready
	var readyList = jQuery.Deferred();

	jQuery.fn.ready = function (fn) {

		readyList.then(fn)

		// Wrap jQuery.readyException in a function so that the lookup
		// happens at the time of error handling instead of callback
		// registration.
		.catch(function (error) {
			jQuery.readyException(error);
		});

		return this;
	};

	jQuery.extend({

		// Is the DOM ready to be used? Set to true once it occurs.
		isReady: false,

		// A counter to track how many items to wait for before
		// the ready event fires. See trac-6781
		readyWait: 1,

		// Handle when the DOM is ready
		ready: function ready(wait) {

			// Abort if there are pending holds or we're already ready
			if (wait === true ? --jQuery.readyWait : jQuery.isReady) {
				return;
			}

			// Remember that the DOM is ready
			jQuery.isReady = true;

			// If a normal DOM Ready event fired, decrement, and wait if need be
			if (wait !== true && --jQuery.readyWait > 0) {
				return;
			}

			// If there are functions bound, to execute
			readyList.resolveWith(document, [jQuery]);
		}
	});

	jQuery.ready.then = readyList.then;

	// The ready event handler and self cleanup method
	function completed() {
		document.removeEventListener("DOMContentLoaded", completed);
		window.removeEventListener("load", completed);
		jQuery.ready();
	}

	// Catch cases where $(document).ready() is called
	// after the browser event has already occurred.
	// Support: IE <=9 - 10 only
	// Older IE sometimes signals "interactive" too soon
	if (document.readyState === "complete" || document.readyState !== "loading" && !document.documentElement.doScroll) {

		// Handle it asynchronously to allow scripts the opportunity to delay ready
		window.setTimeout(jQuery.ready);
	} else {

		// Use the handy event callback
		document.addEventListener("DOMContentLoaded", completed);

		// A fallback to window.onload, that will always work
		window.addEventListener("load", completed);
	}

	// Multifunctional method to get and set values of a collection
	// The value/s can optionally be executed if it's a function
	var access = function access(elems, fn, key, value, chainable, emptyGet, raw) {
		var i = 0,
		    len = elems.length,
		    bulk = key == null;

		// Sets many values
		if (toType(key) === "object") {
			chainable = true;
			for (i in key) {
				access(elems, fn, i, key[i], true, emptyGet, raw);
			}

			// Sets one value
		} else if (value !== undefined) {
			chainable = true;

			if (!isFunction(value)) {
				raw = true;
			}

			if (bulk) {

				// Bulk operations run against the entire set
				if (raw) {
					fn.call(elems, value);
					fn = null;

					// ...except when executing function values
				} else {
					bulk = fn;
					fn = function fn(elem, _key, value) {
						return bulk.call(jQuery(elem), value);
					};
				}
			}

			if (fn) {
				for (; i < len; i++) {
					fn(elems[i], key, raw ? value : value.call(elems[i], i, fn(elems[i], key)));
				}
			}
		}

		if (chainable) {
			return elems;
		}

		// Gets
		if (bulk) {
			return fn.call(elems);
		}

		return len ? fn(elems[0], key) : emptyGet;
	};

	// Matches dashed string for camelizing
	var rmsPrefix = /^-ms-/,
	    rdashAlpha = /-([a-z])/g;

	// Used by camelCase as callback to replace()
	function fcamelCase(_all, letter) {
		return letter.toUpperCase();
	}

	// Convert dashed to camelCase; used by the css and data modules
	// Support: IE <=9 - 11, Edge 12 - 15
	// Microsoft forgot to hump their vendor prefix (trac-9572)
	function camelCase(string) {
		return string.replace(rmsPrefix, "ms-").replace(rdashAlpha, fcamelCase);
	}
	var acceptData = function acceptData(owner) {

		// Accepts only:
		//  - Node
		//    - Node.ELEMENT_NODE
		//    - Node.DOCUMENT_NODE
		//  - Object
		//    - Any
		return owner.nodeType === 1 || owner.nodeType === 9 || !+owner.nodeType;
	};

	function Data() {
		this.expando = jQuery.expando + Data.uid++;
	}

	Data.uid = 1;

	Data.prototype = {

		cache: function cache(owner) {

			// Check if the owner object already has a cache
			var value = owner[this.expando];

			// If not, create one
			if (!value) {
				value = {};

				// We can accept data for non-element nodes in modern browsers,
				// but we should not, see trac-8335.
				// Always return an empty object.
				if (acceptData(owner)) {

					// If it is a node unlikely to be stringify-ed or looped over
					// use plain assignment
					if (owner.nodeType) {
						owner[this.expando] = value;

						// Otherwise secure it in a non-enumerable property
						// configurable must be true to allow the property to be
						// deleted when data is removed
					} else {
						Object.defineProperty(owner, this.expando, {
							value: value,
							configurable: true
						});
					}
				}
			}

			return value;
		},
		set: function set(owner, data, value) {
			var prop,
			    cache = this.cache(owner);

			// Handle: [ owner, key, value ] args
			// Always use camelCase key (gh-2257)
			if (typeof data === "string") {
				cache[camelCase(data)] = value;

				// Handle: [ owner, { properties } ] args
			} else {

				// Copy the properties one-by-one to the cache object
				for (prop in data) {
					cache[camelCase(prop)] = data[prop];
				}
			}
			return cache;
		},
		get: function get(owner, key) {
			return key === undefined ? this.cache(owner) :

			// Always use camelCase key (gh-2257)
			owner[this.expando] && owner[this.expando][camelCase(key)];
		},
		access: function access(owner, key, value) {

			// In cases where either:
			//
			//   1. No key was specified
			//   2. A string key was specified, but no value provided
			//
			// Take the "read" path and allow the get method to determine
			// which value to return, respectively either:
			//
			//   1. The entire cache object
			//   2. The data stored at the key
			//
			if (key === undefined || key && typeof key === "string" && value === undefined) {

				return this.get(owner, key);
			}

			// When the key is not a string, or both a key and value
			// are specified, set or extend (existing objects) with either:
			//
			//   1. An object of properties
			//   2. A key and value
			//
			this.set(owner, key, value);

			// Since the "set" path can have two possible entry points
			// return the expected data based on which path was taken[*]
			return value !== undefined ? value : key;
		},
		remove: function remove(owner, key) {
			var i,
			    cache = owner[this.expando];

			if (cache === undefined) {
				return;
			}

			if (key !== undefined) {

				// Support array or space separated string of keys
				if (Array.isArray(key)) {

					// If key is an array of keys...
					// We always set camelCase keys, so remove that.
					key = key.map(camelCase);
				} else {
					key = camelCase(key);

					// If a key with the spaces exists, use it.
					// Otherwise, create an array by matching non-whitespace
					key = key in cache ? [key] : key.match(rnothtmlwhite) || [];
				}

				i = key.length;

				while (i--) {
					delete cache[key[i]];
				}
			}

			// Remove the expando if there's no more data
			if (key === undefined || jQuery.isEmptyObject(cache)) {

				// Support: Chrome <=35 - 45
				// Webkit & Blink performance suffers when deleting properties
				// from DOM nodes, so set to undefined instead
				// https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted)
				if (owner.nodeType) {
					owner[this.expando] = undefined;
				} else {
					delete owner[this.expando];
				}
			}
		},
		hasData: function hasData(owner) {
			var cache = owner[this.expando];
			return cache !== undefined && !jQuery.isEmptyObject(cache);
		}
	};
	var dataPriv = new Data();

	var dataUser = new Data();

	//	Implementation Summary
	//
	//	1. Enforce API surface and semantic compatibility with 1.9.x branch
	//	2. Improve the module's maintainability by reducing the storage
	//		paths to a single mechanism.
	//	3. Use the same single mechanism to support "private" and "user" data.
	//	4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData)
	//	5. Avoid exposing implementation details on user objects (eg. expando properties)
	//	6. Provide a clear path for implementation upgrade to WeakMap in 2014

	var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,
	    rmultiDash = /[A-Z]/g;

	function getData(data) {
		if (data === "true") {
			return true;
		}

		if (data === "false") {
			return false;
		}

		if (data === "null") {
			return null;
		}

		// Only convert to a number if it doesn't change the string
		if (data === +data + "") {
			return +data;
		}

		if (rbrace.test(data)) {
			return JSON.parse(data);
		}

		return data;
	}

	function dataAttr(elem, key, data) {
		var name;

		// If nothing was found internally, try to fetch any
		// data from the HTML5 data-* attribute
		if (data === undefined && elem.nodeType === 1) {
			name = "data-" + key.replace(rmultiDash, "-$&").toLowerCase();
			data = elem.getAttribute(name);

			if (typeof data === "string") {
				try {
					data = getData(data);
				} catch (e) {}

				// Make sure we set the data so it isn't changed later
				dataUser.set(elem, key, data);
			} else {
				data = undefined;
			}
		}
		return data;
	}

	jQuery.extend({
		hasData: function hasData(elem) {
			return dataUser.hasData(elem) || dataPriv.hasData(elem);
		},

		data: function data(elem, name, _data) {
			return dataUser.access(elem, name, _data);
		},

		removeData: function removeData(elem, name) {
			dataUser.remove(elem, name);
		},

		// TODO: Now that all calls to _data and _removeData have been replaced
		// with direct calls to dataPriv methods, these can be deprecated.
		_data: function _data(elem, name, data) {
			return dataPriv.access(elem, name, data);
		},

		_removeData: function _removeData(elem, name) {
			dataPriv.remove(elem, name);
		}
	});

	jQuery.fn.extend({
		data: function data(key, value) {
			var i,
			    name,
			    data,
			    elem = this[0],
			    attrs = elem && elem.attributes;

			// Gets all values
			if (key === undefined) {
				if (this.length) {
					data = dataUser.get(elem);

					if (elem.nodeType === 1 && !dataPriv.get(elem, "hasDataAttrs")) {
						i = attrs.length;
						while (i--) {

							// Support: IE 11 only
							// The attrs elements can be null (trac-14894)
							if (attrs[i]) {
								name = attrs[i].name;
								if (name.indexOf("data-") === 0) {
									name = camelCase(name.slice(5));
									dataAttr(elem, name, data[name]);
								}
							}
						}
						dataPriv.set(elem, "hasDataAttrs", true);
					}
				}

				return data;
			}

			// Sets multiple values
			if ((typeof key === "undefined" ? "undefined" : _typeof(key)) === "object") {
				return this.each(function () {
					dataUser.set(this, key);
				});
			}

			return access(this, function (value) {
				var data;

				// The calling jQuery object (element matches) is not empty
				// (and therefore has an element appears at this[ 0 ]) and the
				// `value` parameter was not undefined. An empty jQuery object
				// will result in `undefined` for elem = this[ 0 ] which will
				// throw an exception if an attempt to read a data cache is made.
				if (elem && value === undefined) {

					// Attempt to get data from the cache
					// The key will always be camelCased in Data
					data = dataUser.get(elem, key);
					if (data !== undefined) {
						return data;
					}

					// Attempt to "discover" the data in
					// HTML5 custom data-* attrs
					data = dataAttr(elem, key);
					if (data !== undefined) {
						return data;
					}

					// We tried really hard, but the data doesn't exist.
					return;
				}

				// Set the data...
				this.each(function () {

					// We always store the camelCased key
					dataUser.set(this, key, value);
				});
			}, null, value, arguments.length > 1, null, true);
		},

		removeData: function removeData(key) {
			return this.each(function () {
				dataUser.remove(this, key);
			});
		}
	});

	jQuery.extend({
		queue: function queue(elem, type, data) {
			var queue;

			if (elem) {
				type = (type || "fx") + "queue";
				queue = dataPriv.get(elem, type);

				// Speed up dequeue by getting out quickly if this is just a lookup
				if (data) {
					if (!queue || Array.isArray(data)) {
						queue = dataPriv.access(elem, type, jQuery.makeArray(data));
					} else {
						queue.push(data);
					}
				}
				return queue || [];
			}
		},

		dequeue: function dequeue(elem, type) {
			type = type || "fx";

			var queue = jQuery.queue(elem, type),
			    startLength = queue.length,
			    fn = queue.shift(),
			    hooks = jQuery._queueHooks(elem, type),
			    next = function next() {
				jQuery.dequeue(elem, type);
			};

			// If the fx queue is dequeued, always remove the progress sentinel
			if (fn === "inprogress") {
				fn = queue.shift();
				startLength--;
			}

			if (fn) {

				// Add a progress sentinel to prevent the fx queue from being
				// automatically dequeued
				if (type === "fx") {
					queue.unshift("inprogress");
				}

				// Clear up the last queue stop function
				delete hooks.stop;
				fn.call(elem, next, hooks);
			}

			if (!startLength && hooks) {
				hooks.empty.fire();
			}
		},

		// Not public - generate a queueHooks object, or return the current one
		_queueHooks: function _queueHooks(elem, type) {
			var key = type + "queueHooks";
			return dataPriv.get(elem, key) || dataPriv.access(elem, key, {
				empty: jQuery.Callbacks("once memory").add(function () {
					dataPriv.remove(elem, [type + "queue", key]);
				})
			});
		}
	});

	jQuery.fn.extend({
		queue: function queue(type, data) {
			var setter = 2;

			if (typeof type !== "string") {
				data = type;
				type = "fx";
				setter--;
			}

			if (arguments.length < setter) {
				return jQuery.queue(this[0], type);
			}

			return data === undefined ? this : this.each(function () {
				var queue = jQuery.queue(this, type, data);

				// Ensure a hooks for this queue
				jQuery._queueHooks(this, type);

				if (type === "fx" && queue[0] !== "inprogress") {
					jQuery.dequeue(this, type);
				}
			});
		},
		dequeue: function dequeue(type) {
			return this.each(function () {
				jQuery.dequeue(this, type);
			});
		},
		clearQueue: function clearQueue(type) {
			return this.queue(type || "fx", []);
		},

		// Get a promise resolved when queues of a certain type
		// are emptied (fx is the type by default)
		promise: function promise(type, obj) {
			var tmp,
			    count = 1,
			    defer = jQuery.Deferred(),
			    elements = this,
			    i = this.length,
			    resolve = function resolve() {
				if (! --count) {
					defer.resolveWith(elements, [elements]);
				}
			};

			if (typeof type !== "string") {
				obj = type;
				type = undefined;
			}
			type = type || "fx";

			while (i--) {
				tmp = dataPriv.get(elements[i], type + "queueHooks");
				if (tmp && tmp.empty) {
					count++;
					tmp.empty.add(resolve);
				}
			}
			resolve();
			return defer.promise(obj);
		}
	});
	var pnum = /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source;

	var rcssNum = new RegExp("^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i");

	var cssExpand = ["Top", "Right", "Bottom", "Left"];

	var documentElement = document.documentElement;

	var isAttached = function isAttached(elem) {
		return jQuery.contains(elem.ownerDocument, elem);
	},
	    composed = { composed: true };

	// Support: IE 9 - 11+, Edge 12 - 18+, iOS 10.0 - 10.2 only
	// Check attachment across shadow DOM boundaries when possible (gh-3504)
	// Support: iOS 10.0-10.2 only
	// Early iOS 10 versions support `attachShadow` but not `getRootNode`,
	// leading to errors. We need to check for `getRootNode`.
	if (documentElement.getRootNode) {
		isAttached = function isAttached(elem) {
			return jQuery.contains(elem.ownerDocument, elem) || elem.getRootNode(composed) === elem.ownerDocument;
		};
	}
	var isHiddenWithinTree = function isHiddenWithinTree(elem, el) {

		// isHiddenWithinTree might be called from jQuery#filter function;
		// in that case, element will be second argument
		elem = el || elem;

		// Inline style trumps all
		return elem.style.display === "none" || elem.style.display === "" &&

		// Otherwise, check computed style
		// Support: Firefox <=43 - 45
		// Disconnected elements can have computed display: none, so first confirm that elem is
		// in the document.
		isAttached(elem) && jQuery.css(elem, "display") === "none";
	};

	function adjustCSS(elem, prop, valueParts, tween) {
		var adjusted,
		    scale,
		    maxIterations = 20,
		    currentValue = tween ? function () {
			return tween.cur();
		} : function () {
			return jQuery.css(elem, prop, "");
		},
		    initial = currentValue(),
		    unit = valueParts && valueParts[3] || (jQuery.cssNumber[prop] ? "" : "px"),


		// Starting value computation is required for potential unit mismatches
		initialInUnit = elem.nodeType && (jQuery.cssNumber[prop] || unit !== "px" && +initial) && rcssNum.exec(jQuery.css(elem, prop));

		if (initialInUnit && initialInUnit[3] !== unit) {

			// Support: Firefox <=54
			// Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144)
			initial = initial / 2;

			// Trust units reported by jQuery.css
			unit = unit || initialInUnit[3];

			// Iteratively approximate from a nonzero starting point
			initialInUnit = +initial || 1;

			while (maxIterations--) {

				// Evaluate and update our best guess (doubling guesses that zero out).
				// Finish if the scale equals or crosses 1 (making the old*new product non-positive).
				jQuery.style(elem, prop, initialInUnit + unit);
				if ((1 - scale) * (1 - (scale = currentValue() / initial || 0.5)) <= 0) {
					maxIterations = 0;
				}
				initialInUnit = initialInUnit / scale;
			}

			initialInUnit = initialInUnit * 2;
			jQuery.style(elem, prop, initialInUnit + unit);

			// Make sure we update the tween properties later on
			valueParts = valueParts || [];
		}

		if (valueParts) {
			initialInUnit = +initialInUnit || +initial || 0;

			// Apply relative offset (+=/-=) if specified
			adjusted = valueParts[1] ? initialInUnit + (valueParts[1] + 1) * valueParts[2] : +valueParts[2];
			if (tween) {
				tween.unit = unit;
				tween.start = initialInUnit;
				tween.end = adjusted;
			}
		}
		return adjusted;
	}

	var defaultDisplayMap = {};

	function getDefaultDisplay(elem) {
		var temp,
		    doc = elem.ownerDocument,
		    nodeName = elem.nodeName,
		    display = defaultDisplayMap[nodeName];

		if (display) {
			return display;
		}

		temp = doc.body.appendChild(doc.createElement(nodeName));
		display = jQuery.css(temp, "display");

		temp.parentNode.removeChild(temp);

		if (display === "none") {
			display = "block";
		}
		defaultDisplayMap[nodeName] = display;

		return display;
	}

	function showHide(elements, show) {
		var display,
		    elem,
		    values = [],
		    index = 0,
		    length = elements.length;

		// Determine new display value for elements that need to change
		for (; index < length; index++) {
			elem = elements[index];
			if (!elem.style) {
				continue;
			}

			display = elem.style.display;
			if (show) {

				// Since we force visibility upon cascade-hidden elements, an immediate (and slow)
				// check is required in this first loop unless we have a nonempty display value (either
				// inline or about-to-be-restored)
				if (display === "none") {
					values[index] = dataPriv.get(elem, "display") || null;
					if (!values[index]) {
						elem.style.display = "";
					}
				}
				if (elem.style.display === "" && isHiddenWithinTree(elem)) {
					values[index] = getDefaultDisplay(elem);
				}
			} else {
				if (display !== "none") {
					values[index] = "none";

					// Remember what we're overwriting
					dataPriv.set(elem, "display", display);
				}
			}
		}

		// Set the display of the elements in a second loop to avoid constant reflow
		for (index = 0; index < length; index++) {
			if (values[index] != null) {
				elements[index].style.display = values[index];
			}
		}

		return elements;
	}

	jQuery.fn.extend({
		show: function show() {
			return showHide(this, true);
		},
		hide: function hide() {
			return showHide(this);
		},
		toggle: function toggle(state) {
			if (typeof state === "boolean") {
				return state ? this.show() : this.hide();
			}

			return this.each(function () {
				if (isHiddenWithinTree(this)) {
					jQuery(this).show();
				} else {
					jQuery(this).hide();
				}
			});
		}
	});
	var rcheckableType = /^(?:checkbox|radio)$/i;

	var rtagName = /<([a-z][^\/\0>\x20\t\r\n\f]*)/i;

	var rscriptType = /^$|^module$|\/(?:java|ecma)script/i;

	(function () {
		var fragment = document.createDocumentFragment(),
		    div = fragment.appendChild(document.createElement("div")),
		    input = document.createElement("input");

		// Support: Android 4.0 - 4.3 only
		// Check state lost if the name is set (trac-11217)
		// Support: Windows Web Apps (WWA)
		// `name` and `type` must use .setAttribute for WWA (trac-14901)
		input.setAttribute("type", "radio");
		input.setAttribute("checked", "checked");
		input.setAttribute("name", "t");

		div.appendChild(input);

		// Support: Android <=4.1 only
		// Older WebKit doesn't clone checked state correctly in fragments
		support.checkClone = div.cloneNode(true).cloneNode(true).lastChild.checked;

		// Support: IE <=11 only
		// Make sure textarea (and checkbox) defaultValue is properly cloned
		div.innerHTML = "<textarea>x</textarea>";
		support.noCloneChecked = !!div.cloneNode(true).lastChild.defaultValue;

		// Support: IE <=9 only
		// IE <=9 replaces <option> tags with their contents when inserted outside of
		// the select element.
		div.innerHTML = "<option></option>";
		support.option = !!div.lastChild;
	})();

	// We have to close these tags to support XHTML (trac-13200)
	var wrapMap = {

		// XHTML parsers do not magically insert elements in the
		// same way that tag soup parsers do. So we cannot shorten
		// this by omitting <tbody> or other required elements.
		thead: [1, "<table>", "</table>"],
		col: [2, "<table><colgroup>", "</colgroup></table>"],
		tr: [2, "<table><tbody>", "</tbody></table>"],
		td: [3, "<table><tbody><tr>", "</tr></tbody></table>"],

		_default: [0, "", ""]
	};

	wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
	wrapMap.th = wrapMap.td;

	// Support: IE <=9 only
	if (!support.option) {
		wrapMap.optgroup = wrapMap.option = [1, "<select multiple='multiple'>", "</select>"];
	}

	function getAll(context, tag) {

		// Support: IE <=9 - 11 only
		// Use typeof to avoid zero-argument method invocation on host objects (trac-15151)
		var ret;

		if (typeof context.getElementsByTagName !== "undefined") {
			ret = context.getElementsByTagName(tag || "*");
		} else if (typeof context.querySelectorAll !== "undefined") {
			ret = context.querySelectorAll(tag || "*");
		} else {
			ret = [];
		}

		if (tag === undefined || tag && nodeName(context, tag)) {
			return jQuery.merge([context], ret);
		}

		return ret;
	}

	// Mark scripts as having already been evaluated
	function setGlobalEval(elems, refElements) {
		var i = 0,
		    l = elems.length;

		for (; i < l; i++) {
			dataPriv.set(elems[i], "globalEval", !refElements || dataPriv.get(refElements[i], "globalEval"));
		}
	}

	var rhtml = /<|&#?\w+;/;

	function buildFragment(elems, context, scripts, selection, ignored) {
		var elem,
		    tmp,
		    tag,
		    wrap,
		    attached,
		    j,
		    fragment = context.createDocumentFragment(),
		    nodes = [],
		    i = 0,
		    l = elems.length;

		for (; i < l; i++) {
			elem = elems[i];

			if (elem || elem === 0) {

				// Add nodes directly
				if (toType(elem) === "object") {

					// Support: Android <=4.0 only, PhantomJS 1 only
					// push.apply(_, arraylike) throws on ancient WebKit
					jQuery.merge(nodes, elem.nodeType ? [elem] : elem);

					// Convert non-html into a text node
				} else if (!rhtml.test(elem)) {
					nodes.push(context.createTextNode(elem));

					// Convert html into DOM nodes
				} else {
					tmp = tmp || fragment.appendChild(context.createElement("div"));

					// Deserialize a standard representation
					tag = (rtagName.exec(elem) || ["", ""])[1].toLowerCase();
					wrap = wrapMap[tag] || wrapMap._default;
					tmp.innerHTML = wrap[1] + jQuery.htmlPrefilter(elem) + wrap[2];

					// Descend through wrappers to the right content
					j = wrap[0];
					while (j--) {
						tmp = tmp.lastChild;
					}

					// Support: Android <=4.0 only, PhantomJS 1 only
					// push.apply(_, arraylike) throws on ancient WebKit
					jQuery.merge(nodes, tmp.childNodes);

					// Remember the top-level container
					tmp = fragment.firstChild;

					// Ensure the created nodes are orphaned (trac-12392)
					tmp.textContent = "";
				}
			}
		}

		// Remove wrapper from fragment
		fragment.textContent = "";

		i = 0;
		while (elem = nodes[i++]) {

			// Skip elements already in the context collection (trac-4087)
			if (selection && jQuery.inArray(elem, selection) > -1) {
				if (ignored) {
					ignored.push(elem);
				}
				continue;
			}

			attached = isAttached(elem);

			// Append to fragment
			tmp = getAll(fragment.appendChild(elem), "script");

			// Preserve script evaluation history
			if (attached) {
				setGlobalEval(tmp);
			}

			// Capture executables
			if (scripts) {
				j = 0;
				while (elem = tmp[j++]) {
					if (rscriptType.test(elem.type || "")) {
						scripts.push(elem);
					}
				}
			}
		}

		return fragment;
	}

	var rtypenamespace = /^([^.]*)(?:\.(.+)|)/;

	function returnTrue() {
		return true;
	}

	function returnFalse() {
		return false;
	}

	// Support: IE <=9 - 11+
	// focus() and blur() are asynchronous, except when they are no-op.
	// So expect focus to be synchronous when the element is already active,
	// and blur to be synchronous when the element is not already active.
	// (focus and blur are always synchronous in other supported browsers,
	// this just defines when we can count on it).
	function expectSync(elem, type) {
		return elem === safeActiveElement() === (type === "focus");
	}

	// Support: IE <=9 only
	// Accessing document.activeElement can throw unexpectedly
	// https://bugs.jquery.com/ticket/13393
	function safeActiveElement() {
		try {
			return document.activeElement;
		} catch (err) {}
	}

	function _on(elem, types, selector, data, fn, one) {
		var origFn, type;

		// Types can be a map of types/handlers
		if ((typeof types === "undefined" ? "undefined" : _typeof(types)) === "object") {

			// ( types-Object, selector, data )
			if (typeof selector !== "string") {

				// ( types-Object, data )
				data = data || selector;
				selector = undefined;
			}
			for (type in types) {
				_on(elem, type, selector, data, types[type], one);
			}
			return elem;
		}

		if (data == null && fn == null) {

			// ( types, fn )
			fn = selector;
			data = selector = undefined;
		} else if (fn == null) {
			if (typeof selector === "string") {

				// ( types, selector, fn )
				fn = data;
				data = undefined;
			} else {

				// ( types, data, fn )
				fn = data;
				data = selector;
				selector = undefined;
			}
		}
		if (fn === false) {
			fn = returnFalse;
		} else if (!fn) {
			return elem;
		}

		if (one === 1) {
			origFn = fn;
			fn = function fn(event) {

				// Can use an empty set, since event contains the info
				jQuery().off(event);
				return origFn.apply(this, arguments);
			};

			// Use same guid so caller can remove using origFn
			fn.guid = origFn.guid || (origFn.guid = jQuery.guid++);
		}
		return elem.each(function () {
			jQuery.event.add(this, types, fn, data, selector);
		});
	}

	/*
  * Helper functions for managing events -- not part of the public interface.
  * Props to Dean Edwards' addEvent library for many of the ideas.
  */
	jQuery.event = {

		global: {},

		add: function add(elem, types, handler, data, selector) {

			var handleObjIn,
			    eventHandle,
			    tmp,
			    events,
			    t,
			    handleObj,
			    special,
			    handlers,
			    type,
			    namespaces,
			    origType,
			    elemData = dataPriv.get(elem);

			// Only attach events to objects that accept data
			if (!acceptData(elem)) {
				return;
			}

			// Caller can pass in an object of custom data in lieu of the handler
			if (handler.handler) {
				handleObjIn = handler;
				handler = handleObjIn.handler;
				selector = handleObjIn.selector;
			}

			// Ensure that invalid selectors throw exceptions at attach time
			// Evaluate against documentElement in case elem is a non-element node (e.g., document)
			if (selector) {
				jQuery.find.matchesSelector(documentElement, selector);
			}

			// Make sure that the handler has a unique ID, used to find/remove it later
			if (!handler.guid) {
				handler.guid = jQuery.guid++;
			}

			// Init the element's event structure and main handler, if this is the first
			if (!(events = elemData.events)) {
				events = elemData.events = Object.create(null);
			}
			if (!(eventHandle = elemData.handle)) {
				eventHandle = elemData.handle = function (e) {

					// Discard the second event of a jQuery.event.trigger() and
					// when an event is called after a page has unloaded
					return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ? jQuery.event.dispatch.apply(elem, arguments) : undefined;
				};
			}

			// Handle multiple events separated by a space
			types = (types || "").match(rnothtmlwhite) || [""];
			t = types.length;
			while (t--) {
				tmp = rtypenamespace.exec(types[t]) || [];
				type = origType = tmp[1];
				namespaces = (tmp[2] || "").split(".").sort();

				// There *must* be a type, no attaching namespace-only handlers
				if (!type) {
					continue;
				}

				// If event changes its type, use the special event handlers for the changed type
				special = jQuery.event.special[type] || {};

				// If selector defined, determine special event api type, otherwise given type
				type = (selector ? special.delegateType : special.bindType) || type;

				// Update special based on newly reset type
				special = jQuery.event.special[type] || {};

				// handleObj is passed to all event handlers
				handleObj = jQuery.extend({
					type: type,
					origType: origType,
					data: data,
					handler: handler,
					guid: handler.guid,
					selector: selector,
					needsContext: selector && jQuery.expr.match.needsContext.test(selector),
					namespace: namespaces.join(".")
				}, handleObjIn);

				// Init the event handler queue if we're the first
				if (!(handlers = events[type])) {
					handlers = events[type] = [];
					handlers.delegateCount = 0;

					// Only use addEventListener if the special events handler returns false
					if (!special.setup || special.setup.call(elem, data, namespaces, eventHandle) === false) {

						if (elem.addEventListener) {
							elem.addEventListener(type, eventHandle);
						}
					}
				}

				if (special.add) {
					special.add.call(elem, handleObj);

					if (!handleObj.handler.guid) {
						handleObj.handler.guid = handler.guid;
					}
				}

				// Add to the element's handler list, delegates in front
				if (selector) {
					handlers.splice(handlers.delegateCount++, 0, handleObj);
				} else {
					handlers.push(handleObj);
				}

				// Keep track of which events have ever been used, for event optimization
				jQuery.event.global[type] = true;
			}
		},

		// Detach an event or set of events from an element
		remove: function remove(elem, types, handler, selector, mappedTypes) {

			var j,
			    origCount,
			    tmp,
			    events,
			    t,
			    handleObj,
			    special,
			    handlers,
			    type,
			    namespaces,
			    origType,
			    elemData = dataPriv.hasData(elem) && dataPriv.get(elem);

			if (!elemData || !(events = elemData.events)) {
				return;
			}

			// Once for each type.namespace in types; type may be omitted
			types = (types || "").match(rnothtmlwhite) || [""];
			t = types.length;
			while (t--) {
				tmp = rtypenamespace.exec(types[t]) || [];
				type = origType = tmp[1];
				namespaces = (tmp[2] || "").split(".").sort();

				// Unbind all events (on this namespace, if provided) for the element
				if (!type) {
					for (type in events) {
						jQuery.event.remove(elem, type + types[t], handler, selector, true);
					}
					continue;
				}

				special = jQuery.event.special[type] || {};
				type = (selector ? special.delegateType : special.bindType) || type;
				handlers = events[type] || [];
				tmp = tmp[2] && new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)");

				// Remove matching events
				origCount = j = handlers.length;
				while (j--) {
					handleObj = handlers[j];

					if ((mappedTypes || origType === handleObj.origType) && (!handler || handler.guid === handleObj.guid) && (!tmp || tmp.test(handleObj.namespace)) && (!selector || selector === handleObj.selector || selector === "**" && handleObj.selector)) {
						handlers.splice(j, 1);

						if (handleObj.selector) {
							handlers.delegateCount--;
						}
						if (special.remove) {
							special.remove.call(elem, handleObj);
						}
					}
				}

				// Remove generic event handler if we removed something and no more handlers exist
				// (avoids potential for endless recursion during removal of special event handlers)
				if (origCount && !handlers.length) {
					if (!special.teardown || special.teardown.call(elem, namespaces, elemData.handle) === false) {

						jQuery.removeEvent(elem, type, elemData.handle);
					}

					delete events[type];
				}
			}

			// Remove data and the expando if it's no longer used
			if (jQuery.isEmptyObject(events)) {
				dataPriv.remove(elem, "handle events");
			}
		},

		dispatch: function dispatch(nativeEvent) {

			var i,
			    j,
			    ret,
			    matched,
			    handleObj,
			    handlerQueue,
			    args = new Array(arguments.length),


			// Make a writable jQuery.Event from the native event object
			event = jQuery.event.fix(nativeEvent),
			    handlers = (dataPriv.get(this, "events") || Object.create(null))[event.type] || [],
			    special = jQuery.event.special[event.type] || {};

			// Use the fix-ed jQuery.Event rather than the (read-only) native event
			args[0] = event;

			for (i = 1; i < arguments.length; i++) {
				args[i] = arguments[i];
			}

			event.delegateTarget = this;

			// Call the preDispatch hook for the mapped type, and let it bail if desired
			if (special.preDispatch && special.preDispatch.call(this, event) === false) {
				return;
			}

			// Determine handlers
			handlerQueue = jQuery.event.handlers.call(this, event, handlers);

			// Run delegates first; they may want to stop propagation beneath us
			i = 0;
			while ((matched = handlerQueue[i++]) && !event.isPropagationStopped()) {
				event.currentTarget = matched.elem;

				j = 0;
				while ((handleObj = matched.handlers[j++]) && !event.isImmediatePropagationStopped()) {

					// If the event is namespaced, then each handler is only invoked if it is
					// specially universal or its namespaces are a superset of the event's.
					if (!event.rnamespace || handleObj.namespace === false || event.rnamespace.test(handleObj.namespace)) {

						event.handleObj = handleObj;
						event.data = handleObj.data;

						ret = ((jQuery.event.special[handleObj.origType] || {}).handle || handleObj.handler).apply(matched.elem, args);

						if (ret !== undefined) {
							if ((event.result = ret) === false) {
								event.preventDefault();
								event.stopPropagation();
							}
						}
					}
				}
			}

			// Call the postDispatch hook for the mapped type
			if (special.postDispatch) {
				special.postDispatch.call(this, event);
			}

			return event.result;
		},

		handlers: function handlers(event, _handlers) {
			var i,
			    handleObj,
			    sel,
			    matchedHandlers,
			    matchedSelectors,
			    handlerQueue = [],
			    delegateCount = _handlers.delegateCount,
			    cur = event.target;

			// Find delegate handlers
			if (delegateCount &&

			// Support: IE <=9
			// Black-hole SVG <use> instance trees (trac-13180)
			cur.nodeType &&

			// Support: Firefox <=42
			// Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861)
			// https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click
			// Support: IE 11 only
			// ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343)
			!(event.type === "click" && event.button >= 1)) {

				for (; cur !== this; cur = cur.parentNode || this) {

					// Don't check non-elements (trac-13208)
					// Don't process clicks on disabled elements (trac-6911, trac-8165, trac-11382, trac-11764)
					if (cur.nodeType === 1 && !(event.type === "click" && cur.disabled === true)) {
						matchedHandlers = [];
						matchedSelectors = {};
						for (i = 0; i < delegateCount; i++) {
							handleObj = _handlers[i];

							// Don't conflict with Object.prototype properties (trac-13203)
							sel = handleObj.selector + " ";

							if (matchedSelectors[sel] === undefined) {
								matchedSelectors[sel] = handleObj.needsContext ? jQuery(sel, this).index(cur) > -1 : jQuery.find(sel, this, null, [cur]).length;
							}
							if (matchedSelectors[sel]) {
								matchedHandlers.push(handleObj);
							}
						}
						if (matchedHandlers.length) {
							handlerQueue.push({ elem: cur, handlers: matchedHandlers });
						}
					}
				}
			}

			// Add the remaining (directly-bound) handlers
			cur = this;
			if (delegateCount < _handlers.length) {
				handlerQueue.push({ elem: cur, handlers: _handlers.slice(delegateCount) });
			}

			return handlerQueue;
		},

		addProp: function addProp(name, hook) {
			Object.defineProperty(jQuery.Event.prototype, name, {
				enumerable: true,
				configurable: true,

				get: isFunction(hook) ? function () {
					if (this.originalEvent) {
						return hook(this.originalEvent);
					}
				} : function () {
					if (this.originalEvent) {
						return this.originalEvent[name];
					}
				},

				set: function set(value) {
					Object.defineProperty(this, name, {
						enumerable: true,
						configurable: true,
						writable: true,
						value: value
					});
				}
			});
		},

		fix: function fix(originalEvent) {
			return originalEvent[jQuery.expando] ? originalEvent : new jQuery.Event(originalEvent);
		},

		special: {
			load: {

				// Prevent triggered image.load events from bubbling to window.load
				noBubble: true
			},
			click: {

				// Utilize native event to ensure correct state for checkable inputs
				setup: function setup(data) {

					// For mutual compressibility with _default, replace `this` access with a local var.
					// `|| data` is dead code meant only to preserve the variable through minification.
					var el = this || data;

					// Claim the first handler
					if (rcheckableType.test(el.type) && el.click && nodeName(el, "input")) {

						// dataPriv.set( el, "click", ... )
						leverageNative(el, "click", returnTrue);
					}

					// Return false to allow normal processing in the caller
					return false;
				},
				trigger: function trigger(data) {

					// For mutual compressibility with _default, replace `this` access with a local var.
					// `|| data` is dead code meant only to preserve the variable through minification.
					var el = this || data;

					// Force setup before triggering a click
					if (rcheckableType.test(el.type) && el.click && nodeName(el, "input")) {

						leverageNative(el, "click");
					}

					// Return non-false to allow normal event-path propagation
					return true;
				},

				// For cross-browser consistency, suppress native .click() on links
				// Also prevent it if we're currently inside a leveraged native-event stack
				_default: function _default(event) {
					var target = event.target;
					return rcheckableType.test(target.type) && target.click && nodeName(target, "input") && dataPriv.get(target, "click") || nodeName(target, "a");
				}
			},

			beforeunload: {
				postDispatch: function postDispatch(event) {

					// Support: Firefox 20+
					// Firefox doesn't alert if the returnValue field is not set.
					if (event.result !== undefined && event.originalEvent) {
						event.originalEvent.returnValue = event.result;
					}
				}
			}
		}
	};

	// Ensure the presence of an event listener that handles manually-triggered
	// synthetic events by interrupting progress until reinvoked in response to
	// *native* events that it fires directly, ensuring that state changes have
	// already occurred before other listeners are invoked.
	function leverageNative(el, type, expectSync) {

		// Missing expectSync indicates a trigger call, which must force setup through jQuery.event.add
		if (!expectSync) {
			if (dataPriv.get(el, type) === undefined) {
				jQuery.event.add(el, type, returnTrue);
			}
			return;
		}

		// Register the controller as a special universal handler for all event namespaces
		dataPriv.set(el, type, false);
		jQuery.event.add(el, type, {
			namespace: false,
			handler: function handler(event) {
				var notAsync,
				    result,
				    saved = dataPriv.get(this, type);

				if (event.isTrigger & 1 && this[type]) {

					// Interrupt processing of the outer synthetic .trigger()ed event
					// Saved data should be false in such cases, but might be a leftover capture object
					// from an async native handler (gh-4350)
					if (!saved.length) {

						// Store arguments for use when handling the inner native event
						// There will always be at least one argument (an event object), so this array
						// will not be confused with a leftover capture object.
						saved = _slice.call(arguments);
						dataPriv.set(this, type, saved);

						// Trigger the native event and capture its result
						// Support: IE <=9 - 11+
						// focus() and blur() are asynchronous
						notAsync = expectSync(this, type);
						this[type]();
						result = dataPriv.get(this, type);
						if (saved !== result || notAsync) {
							dataPriv.set(this, type, false);
						} else {
							result = {};
						}
						if (saved !== result) {

							// Cancel the outer synthetic event
							event.stopImmediatePropagation();
							event.preventDefault();

							// Support: Chrome 86+
							// In Chrome, if an element having a focusout handler is blurred by
							// clicking outside of it, it invokes the handler synchronously. If
							// that handler calls `.remove()` on the element, the data is cleared,
							// leaving `result` undefined. We need to guard against this.
							return result && result.value;
						}

						// If this is an inner synthetic event for an event with a bubbling surrogate
						// (focus or blur), assume that the surrogate already propagated from triggering the
						// native event and prevent that from happening again here.
						// This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the
						// bubbling surrogate propagates *after* the non-bubbling base), but that seems
						// less bad than duplication.
					} else if ((jQuery.event.special[type] || {}).delegateType) {
						event.stopPropagation();
					}

					// If this is a native event triggered above, everything is now in order
					// Fire an inner synthetic event with the original arguments
				} else if (saved.length) {

					// ...and capture the result
					dataPriv.set(this, type, {
						value: jQuery.event.trigger(

						// Support: IE <=9 - 11+
						// Extend with the prototype to reset the above stopImmediatePropagation()
						jQuery.extend(saved[0], jQuery.Event.prototype), saved.slice(1), this)
					});

					// Abort handling of the native event
					event.stopImmediatePropagation();
				}
			}
		});
	}

	jQuery.removeEvent = function (elem, type, handle) {

		// This "if" is needed for plain objects
		if (elem.removeEventListener) {
			elem.removeEventListener(type, handle);
		}
	};

	jQuery.Event = function (src, props) {

		// Allow instantiation without the 'new' keyword
		if (!(this instanceof jQuery.Event)) {
			return new jQuery.Event(src, props);
		}

		// Event object
		if (src && src.type) {
			this.originalEvent = src;
			this.type = src.type;

			// Events bubbling up the document may have been marked as prevented
			// by a handler lower down the tree; reflect the correct value.
			this.isDefaultPrevented = src.defaultPrevented || src.defaultPrevented === undefined &&

			// Support: Android <=2.3 only
			src.returnValue === false ? returnTrue : returnFalse;

			// Create target properties
			// Support: Safari <=6 - 7 only
			// Target should not be a text node (trac-504, trac-13143)
			this.target = src.target && src.target.nodeType === 3 ? src.target.parentNode : src.target;

			this.currentTarget = src.currentTarget;
			this.relatedTarget = src.relatedTarget;

			// Event type
		} else {
			this.type = src;
		}

		// Put explicitly provided properties onto the event object
		if (props) {
			jQuery.extend(this, props);
		}

		// Create a timestamp if incoming event doesn't have one
		this.timeStamp = src && src.timeStamp || Date.now();

		// Mark it as fixed
		this[jQuery.expando] = true;
	};

	// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
	// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
	jQuery.Event.prototype = {
		constructor: jQuery.Event,
		isDefaultPrevented: returnFalse,
		isPropagationStopped: returnFalse,
		isImmediatePropagationStopped: returnFalse,
		isSimulated: false,

		preventDefault: function preventDefault() {
			var e = this.originalEvent;

			this.isDefaultPrevented = returnTrue;

			if (e && !this.isSimulated) {
				e.preventDefault();
			}
		},
		stopPropagation: function stopPropagation() {
			var e = this.originalEvent;

			this.isPropagationStopped = returnTrue;

			if (e && !this.isSimulated) {
				e.stopPropagation();
			}
		},
		stopImmediatePropagation: function stopImmediatePropagation() {
			var e = this.originalEvent;

			this.isImmediatePropagationStopped = returnTrue;

			if (e && !this.isSimulated) {
				e.stopImmediatePropagation();
			}

			this.stopPropagation();
		}
	};

	// Includes all common event props including KeyEvent and MouseEvent specific props
	jQuery.each({
		altKey: true,
		bubbles: true,
		cancelable: true,
		changedTouches: true,
		ctrlKey: true,
		detail: true,
		eventPhase: true,
		metaKey: true,
		pageX: true,
		pageY: true,
		shiftKey: true,
		view: true,
		"char": true,
		code: true,
		charCode: true,
		key: true,
		keyCode: true,
		button: true,
		buttons: true,
		clientX: true,
		clientY: true,
		offsetX: true,
		offsetY: true,
		pointerId: true,
		pointerType: true,
		screenX: true,
		screenY: true,
		targetTouches: true,
		toElement: true,
		touches: true,
		which: true
	}, jQuery.event.addProp);

	jQuery.each({ focus: "focusin", blur: "focusout" }, function (type, delegateType) {
		jQuery.event.special[type] = {

			// Utilize native event if possible so blur/focus sequence is correct
			setup: function setup() {

				// Claim the first handler
				// dataPriv.set( this, "focus", ... )
				// dataPriv.set( this, "blur", ... )
				leverageNative(this, type, expectSync);

				// Return false to allow normal processing in the caller
				return false;
			},
			trigger: function trigger() {

				// Force setup before trigger
				leverageNative(this, type);

				// Return non-false to allow normal event-path propagation
				return true;
			},

			// Suppress native focus or blur if we're currently inside
			// a leveraged native-event stack
			_default: function _default(event) {
				return dataPriv.get(event.target, type);
			},

			delegateType: delegateType
		};
	});

	// Create mouseenter/leave events using mouseover/out and event-time checks
	// so that event delegation works in jQuery.
	// Do the same for pointerenter/pointerleave and pointerover/pointerout
	//
	// Support: Safari 7 only
	// Safari sends mouseenter too often; see:
	// https://bugs.chromium.org/p/chromium/issues/detail?id=470258
	// for the description of the bug (it existed in older Chrome versions as well).
	jQuery.each({
		mouseenter: "mouseover",
		mouseleave: "mouseout",
		pointerenter: "pointerover",
		pointerleave: "pointerout"
	}, function (orig, fix) {
		jQuery.event.special[orig] = {
			delegateType: fix,
			bindType: fix,

			handle: function handle(event) {
				var ret,
				    target = this,
				    related = event.relatedTarget,
				    handleObj = event.handleObj;

				// For mouseenter/leave call the handler if related is outside the target.
				// NB: No relatedTarget if the mouse left/entered the browser window
				if (!related || related !== target && !jQuery.contains(target, related)) {
					event.type = handleObj.origType;
					ret = handleObj.handler.apply(this, arguments);
					event.type = fix;
				}
				return ret;
			}
		};
	});

	jQuery.fn.extend({

		on: function on(types, selector, data, fn) {
			return _on(this, types, selector, data, fn);
		},
		one: function one(types, selector, data, fn) {
			return _on(this, types, selector, data, fn, 1);
		},
		off: function off(types, selector, fn) {
			var handleObj, type;
			if (types && types.preventDefault && types.handleObj) {

				// ( event )  dispatched jQuery.Event
				handleObj = types.handleObj;
				jQuery(types.delegateTarget).off(handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType, handleObj.selector, handleObj.handler);
				return this;
			}
			if ((typeof types === "undefined" ? "undefined" : _typeof(types)) === "object") {

				// ( types-object [, selector] )
				for (type in types) {
					this.off(type, selector, types[type]);
				}
				return this;
			}
			if (selector === false || typeof selector === "function") {

				// ( types [, fn] )
				fn = selector;
				selector = undefined;
			}
			if (fn === false) {
				fn = returnFalse;
			}
			return this.each(function () {
				jQuery.event.remove(this, types, fn, selector);
			});
		}
	});

	var

	// Support: IE <=10 - 11, Edge 12 - 13 only
	// In IE/Edge using regex groups here causes severe slowdowns.
	// See https://connect.microsoft.com/IE/feedback/details/1736512/
	rnoInnerhtml = /<script|<style|<link/i,


	// checked="checked" or checked
	rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
	    rcleanScript = /^\s*<!\[CDATA\[|\]\]>\s*$/g;

	// Prefer a tbody over its parent table for containing new rows
	function manipulationTarget(elem, content) {
		if (nodeName(elem, "table") && nodeName(content.nodeType !== 11 ? content : content.firstChild, "tr")) {

			return jQuery(elem).children("tbody")[0] || elem;
		}

		return elem;
	}

	// Replace/restore the type attribute of script elements for safe DOM manipulation
	function disableScript(elem) {
		elem.type = (elem.getAttribute("type") !== null) + "/" + elem.type;
		return elem;
	}
	function restoreScript(elem) {
		if ((elem.type || "").slice(0, 5) === "true/") {
			elem.type = elem.type.slice(5);
		} else {
			elem.removeAttribute("type");
		}

		return elem;
	}

	function cloneCopyEvent(src, dest) {
		var i, l, type, pdataOld, udataOld, udataCur, events;

		if (dest.nodeType !== 1) {
			return;
		}

		// 1. Copy private data: events, handlers, etc.
		if (dataPriv.hasData(src)) {
			pdataOld = dataPriv.get(src);
			events = pdataOld.events;

			if (events) {
				dataPriv.remove(dest, "handle events");

				for (type in events) {
					for (i = 0, l = events[type].length; i < l; i++) {
						jQuery.event.add(dest, type, events[type][i]);
					}
				}
			}
		}

		// 2. Copy user data
		if (dataUser.hasData(src)) {
			udataOld = dataUser.access(src);
			udataCur = jQuery.extend({}, udataOld);

			dataUser.set(dest, udataCur);
		}
	}

	// Fix IE bugs, see support tests
	function fixInput(src, dest) {
		var nodeName = dest.nodeName.toLowerCase();

		// Fails to persist the checked state of a cloned checkbox or radio button.
		if (nodeName === "input" && rcheckableType.test(src.type)) {
			dest.checked = src.checked;

			// Fails to return the selected option to the default selected state when cloning options
		} else if (nodeName === "input" || nodeName === "textarea") {
			dest.defaultValue = src.defaultValue;
		}
	}

	function domManip(collection, args, callback, ignored) {

		// Flatten any nested arrays
		args = flat(args);

		var fragment,
		    first,
		    scripts,
		    hasScripts,
		    node,
		    doc,
		    i = 0,
		    l = collection.length,
		    iNoClone = l - 1,
		    value = args[0],
		    valueIsFunction = isFunction(value);

		// We can't cloneNode fragments that contain checked, in WebKit
		if (valueIsFunction || l > 1 && typeof value === "string" && !support.checkClone && rchecked.test(value)) {
			return collection.each(function (index) {
				var self = collection.eq(index);
				if (valueIsFunction) {
					args[0] = value.call(this, index, self.html());
				}
				domManip(self, args, callback, ignored);
			});
		}

		if (l) {
			fragment = buildFragment(args, collection[0].ownerDocument, false, collection, ignored);
			first = fragment.firstChild;

			if (fragment.childNodes.length === 1) {
				fragment = first;
			}

			// Require either new content or an interest in ignored elements to invoke the callback
			if (first || ignored) {
				scripts = jQuery.map(getAll(fragment, "script"), disableScript);
				hasScripts = scripts.length;

				// Use the original fragment for the last item
				// instead of the first because it can end up
				// being emptied incorrectly in certain situations (trac-8070).
				for (; i < l; i++) {
					node = fragment;

					if (i !== iNoClone) {
						node = jQuery.clone(node, true, true);

						// Keep references to cloned scripts for later restoration
						if (hasScripts) {

							// Support: Android <=4.0 only, PhantomJS 1 only
							// push.apply(_, arraylike) throws on ancient WebKit
							jQuery.merge(scripts, getAll(node, "script"));
						}
					}

					callback.call(collection[i], node, i);
				}

				if (hasScripts) {
					doc = scripts[scripts.length - 1].ownerDocument;

					// Reenable scripts
					jQuery.map(scripts, restoreScript);

					// Evaluate executable scripts on first document insertion
					for (i = 0; i < hasScripts; i++) {
						node = scripts[i];
						if (rscriptType.test(node.type || "") && !dataPriv.access(node, "globalEval") && jQuery.contains(doc, node)) {

							if (node.src && (node.type || "").toLowerCase() !== "module") {

								// Optional AJAX dependency, but won't run scripts if not present
								if (jQuery._evalUrl && !node.noModule) {
									jQuery._evalUrl(node.src, {
										nonce: node.nonce || node.getAttribute("nonce")
									}, doc);
								}
							} else {

								// Unwrap a CDATA section containing script contents. This shouldn't be
								// needed as in XML documents they're already not visible when
								// inspecting element contents and in HTML documents they have no
								// meaning but we're preserving that logic for backwards compatibility.
								// This will be removed completely in 4.0. See gh-4904.
								DOMEval(node.textContent.replace(rcleanScript, ""), node, doc);
							}
						}
					}
				}
			}
		}

		return collection;
	}

	function _remove(elem, selector, keepData) {
		var node,
		    nodes = selector ? jQuery.filter(selector, elem) : elem,
		    i = 0;

		for (; (node = nodes[i]) != null; i++) {
			if (!keepData && node.nodeType === 1) {
				jQuery.cleanData(getAll(node));
			}

			if (node.parentNode) {
				if (keepData && isAttached(node)) {
					setGlobalEval(getAll(node, "script"));
				}
				node.parentNode.removeChild(node);
			}
		}

		return elem;
	}

	jQuery.extend({
		htmlPrefilter: function htmlPrefilter(html) {
			return html;
		},

		clone: function clone(elem, dataAndEvents, deepDataAndEvents) {
			var i,
			    l,
			    srcElements,
			    destElements,
			    clone = elem.cloneNode(true),
			    inPage = isAttached(elem);

			// Fix IE cloning issues
			if (!support.noCloneChecked && (elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem)) {

				// We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2
				destElements = getAll(clone);
				srcElements = getAll(elem);

				for (i = 0, l = srcElements.length; i < l; i++) {
					fixInput(srcElements[i], destElements[i]);
				}
			}

			// Copy the events from the original to the clone
			if (dataAndEvents) {
				if (deepDataAndEvents) {
					srcElements = srcElements || getAll(elem);
					destElements = destElements || getAll(clone);

					for (i = 0, l = srcElements.length; i < l; i++) {
						cloneCopyEvent(srcElements[i], destElements[i]);
					}
				} else {
					cloneCopyEvent(elem, clone);
				}
			}

			// Preserve script evaluation history
			destElements = getAll(clone, "script");
			if (destElements.length > 0) {
				setGlobalEval(destElements, !inPage && getAll(elem, "script"));
			}

			// Return the cloned set
			return clone;
		},

		cleanData: function cleanData(elems) {
			var data,
			    elem,
			    type,
			    special = jQuery.event.special,
			    i = 0;

			for (; (elem = elems[i]) !== undefined; i++) {
				if (acceptData(elem)) {
					if (data = elem[dataPriv.expando]) {
						if (data.events) {
							for (type in data.events) {
								if (special[type]) {
									jQuery.event.remove(elem, type);

									// This is a shortcut to avoid jQuery.event.remove's overhead
								} else {
									jQuery.removeEvent(elem, type, data.handle);
								}
							}
						}

						// Support: Chrome <=35 - 45+
						// Assign undefined instead of using delete, see Data#remove
						elem[dataPriv.expando] = undefined;
					}
					if (elem[dataUser.expando]) {

						// Support: Chrome <=35 - 45+
						// Assign undefined instead of using delete, see Data#remove
						elem[dataUser.expando] = undefined;
					}
				}
			}
		}
	});

	jQuery.fn.extend({
		detach: function detach(selector) {
			return _remove(this, selector, true);
		},

		remove: function remove(selector) {
			return _remove(this, selector);
		},

		text: function text(value) {
			return access(this, function (value) {
				return value === undefined ? jQuery.text(this) : this.empty().each(function () {
					if (this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9) {
						this.textContent = value;
					}
				});
			}, null, value, arguments.length);
		},

		append: function append() {
			return domManip(this, arguments, function (elem) {
				if (this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9) {
					var target = manipulationTarget(this, elem);
					target.appendChild(elem);
				}
			});
		},

		prepend: function prepend() {
			return domManip(this, arguments, function (elem) {
				if (this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9) {
					var target = manipulationTarget(this, elem);
					target.insertBefore(elem, target.firstChild);
				}
			});
		},

		before: function before() {
			return domManip(this, arguments, function (elem) {
				if (this.parentNode) {
					this.parentNode.insertBefore(elem, this);
				}
			});
		},

		after: function after() {
			return domManip(this, arguments, function (elem) {
				if (this.parentNode) {
					this.parentNode.insertBefore(elem, this.nextSibling);
				}
			});
		},

		empty: function empty() {
			var elem,
			    i = 0;

			for (; (elem = this[i]) != null; i++) {
				if (elem.nodeType === 1) {

					// Prevent memory leaks
					jQuery.cleanData(getAll(elem, false));

					// Remove any remaining nodes
					elem.textContent = "";
				}
			}

			return this;
		},

		clone: function clone(dataAndEvents, deepDataAndEvents) {
			dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
			deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;

			return this.map(function () {
				return jQuery.clone(this, dataAndEvents, deepDataAndEvents);
			});
		},

		html: function html(value) {
			return access(this, function (value) {
				var elem = this[0] || {},
				    i = 0,
				    l = this.length;

				if (value === undefined && elem.nodeType === 1) {
					return elem.innerHTML;
				}

				// See if we can take a shortcut and just use innerHTML
				if (typeof value === "string" && !rnoInnerhtml.test(value) && !wrapMap[(rtagName.exec(value) || ["", ""])[1].toLowerCase()]) {

					value = jQuery.htmlPrefilter(value);

					try {
						for (; i < l; i++) {
							elem = this[i] || {};

							// Remove element nodes and prevent memory leaks
							if (elem.nodeType === 1) {
								jQuery.cleanData(getAll(elem, false));
								elem.innerHTML = value;
							}
						}

						elem = 0;

						// If using innerHTML throws an exception, use the fallback method
					} catch (e) {}
				}

				if (elem) {
					this.empty().append(value);
				}
			}, null, value, arguments.length);
		},

		replaceWith: function replaceWith() {
			var ignored = [];

			// Make the changes, replacing each non-ignored context element with the new content
			return domManip(this, arguments, function (elem) {
				var parent = this.parentNode;

				if (jQuery.inArray(this, ignored) < 0) {
					jQuery.cleanData(getAll(this));
					if (parent) {
						parent.replaceChild(elem, this);
					}
				}

				// Force callback invocation
			}, ignored);
		}
	});

	jQuery.each({
		appendTo: "append",
		prependTo: "prepend",
		insertBefore: "before",
		insertAfter: "after",
		replaceAll: "replaceWith"
	}, function (name, original) {
		jQuery.fn[name] = function (selector) {
			var elems,
			    ret = [],
			    insert = jQuery(selector),
			    last = insert.length - 1,
			    i = 0;

			for (; i <= last; i++) {
				elems = i === last ? this : this.clone(true);
				jQuery(insert[i])[original](elems);

				// Support: Android <=4.0 only, PhantomJS 1 only
				// .get() because push.apply(_, arraylike) throws on ancient WebKit
				push.apply(ret, elems.get());
			}

			return this.pushStack(ret);
		};
	});
	var rnumnonpx = new RegExp("^(" + pnum + ")(?!px)[a-z%]+$", "i");

	var rcustomProp = /^--/;

	var getStyles = function getStyles(elem) {

		// Support: IE <=11 only, Firefox <=30 (trac-15098, trac-14150)
		// IE throws on elements created in popups
		// FF meanwhile throws on frame elements through "defaultView.getComputedStyle"
		var view = elem.ownerDocument.defaultView;

		if (!view || !view.opener) {
			view = window;
		}

		return view.getComputedStyle(elem);
	};

	var swap = function swap(elem, options, callback) {
		var ret,
		    name,
		    old = {};

		// Remember the old values, and insert the new ones
		for (name in options) {
			old[name] = elem.style[name];
			elem.style[name] = options[name];
		}

		ret = callback.call(elem);

		// Revert the old values
		for (name in options) {
			elem.style[name] = old[name];
		}

		return ret;
	};

	var rboxStyle = new RegExp(cssExpand.join("|"), "i");

	var whitespace = "[\\x20\\t\\r\\n\\f]";

	var rtrimCSS = new RegExp("^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g");

	(function () {

		// Executing both pixelPosition & boxSizingReliable tests require only one layout
		// so they're executed at the same time to save the second computation.
		function computeStyleTests() {

			// This is a singleton, we need to execute it only once
			if (!div) {
				return;
			}

			container.style.cssText = "position:absolute;left:-11111px;width:60px;" + "margin-top:1px;padding:0;border:0";
			div.style.cssText = "position:relative;display:block;box-sizing:border-box;overflow:scroll;" + "margin:auto;border:1px;padding:1px;" + "width:60%;top:1%";
			documentElement.appendChild(container).appendChild(div);

			var divStyle = window.getComputedStyle(div);
			pixelPositionVal = divStyle.top !== "1%";

			// Support: Android 4.0 - 4.3 only, Firefox <=3 - 44
			reliableMarginLeftVal = roundPixelMeasures(divStyle.marginLeft) === 12;

			// Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3
			// Some styles come back with percentage values, even though they shouldn't
			div.style.right = "60%";
			pixelBoxStylesVal = roundPixelMeasures(divStyle.right) === 36;

			// Support: IE 9 - 11 only
			// Detect misreporting of content dimensions for box-sizing:border-box elements
			boxSizingReliableVal = roundPixelMeasures(divStyle.width) === 36;

			// Support: IE 9 only
			// Detect overflow:scroll screwiness (gh-3699)
			// Support: Chrome <=64
			// Don't get tricked when zoom affects offsetWidth (gh-4029)
			div.style.position = "absolute";
			scrollboxSizeVal = roundPixelMeasures(div.offsetWidth / 3) === 12;

			documentElement.removeChild(container);

			// Nullify the div so it wouldn't be stored in the memory and
			// it will also be a sign that checks already performed
			div = null;
		}

		function roundPixelMeasures(measure) {
			return Math.round(parseFloat(measure));
		}

		var pixelPositionVal,
		    boxSizingReliableVal,
		    scrollboxSizeVal,
		    pixelBoxStylesVal,
		    reliableTrDimensionsVal,
		    reliableMarginLeftVal,
		    container = document.createElement("div"),
		    div = document.createElement("div");

		// Finish early in limited (non-browser) environments
		if (!div.style) {
			return;
		}

		// Support: IE <=9 - 11 only
		// Style of cloned element affects source element cloned (trac-8908)
		div.style.backgroundClip = "content-box";
		div.cloneNode(true).style.backgroundClip = "";
		support.clearCloneStyle = div.style.backgroundClip === "content-box";

		jQuery.extend(support, {
			boxSizingReliable: function boxSizingReliable() {
				computeStyleTests();
				return boxSizingReliableVal;
			},
			pixelBoxStyles: function pixelBoxStyles() {
				computeStyleTests();
				return pixelBoxStylesVal;
			},
			pixelPosition: function pixelPosition() {
				computeStyleTests();
				return pixelPositionVal;
			},
			reliableMarginLeft: function reliableMarginLeft() {
				computeStyleTests();
				return reliableMarginLeftVal;
			},
			scrollboxSize: function scrollboxSize() {
				computeStyleTests();
				return scrollboxSizeVal;
			},

			// Support: IE 9 - 11+, Edge 15 - 18+
			// IE/Edge misreport `getComputedStyle` of table rows with width/height
			// set in CSS while `offset*` properties report correct values.
			// Behavior in IE 9 is more subtle than in newer versions & it passes
			// some versions of this test; make sure not to make it pass there!
			//
			// Support: Firefox 70+
			// Only Firefox includes border widths
			// in computed dimensions. (gh-4529)
			reliableTrDimensions: function reliableTrDimensions() {
				var table, tr, trChild, trStyle;
				if (reliableTrDimensionsVal == null) {
					table = document.createElement("table");
					tr = document.createElement("tr");
					trChild = document.createElement("div");

					table.style.cssText = "position:absolute;left:-11111px;border-collapse:separate";
					tr.style.cssText = "border:1px solid";

					// Support: Chrome 86+
					// Height set through cssText does not get applied.
					// Computed height then comes back as 0.
					tr.style.height = "1px";
					trChild.style.height = "9px";

					// Support: Android 8 Chrome 86+
					// In our bodyBackground.html iframe,
					// display for all div elements is set to "inline",
					// which causes a problem only in Android 8 Chrome 86.
					// Ensuring the div is display: block
					// gets around this issue.
					trChild.style.display = "block";

					documentElement.appendChild(table).appendChild(tr).appendChild(trChild);

					trStyle = window.getComputedStyle(tr);
					reliableTrDimensionsVal = parseInt(trStyle.height, 10) + parseInt(trStyle.borderTopWidth, 10) + parseInt(trStyle.borderBottomWidth, 10) === tr.offsetHeight;

					documentElement.removeChild(table);
				}
				return reliableTrDimensionsVal;
			}
		});
	})();

	function curCSS(elem, name, computed) {
		var width,
		    minWidth,
		    maxWidth,
		    ret,
		    isCustomProp = rcustomProp.test(name),


		// Support: Firefox 51+
		// Retrieving style before computed somehow
		// fixes an issue with getting wrong values
		// on detached elements
		style = elem.style;

		computed = computed || getStyles(elem);

		// getPropertyValue is needed for:
		//   .css('filter') (IE 9 only, trac-12537)
		//   .css('--customProperty) (gh-3144)
		if (computed) {
			ret = computed.getPropertyValue(name) || computed[name];

			// trim whitespace for custom property (issue gh-4926)
			if (isCustomProp) {

				// rtrim treats U+000D CARRIAGE RETURN and U+000C FORM FEED
				// as whitespace while CSS does not, but this is not a problem
				// because CSS preprocessing replaces them with U+000A LINE FEED
				// (which *is* CSS whitespace)
				// https://www.w3.org/TR/css-syntax-3/#input-preprocessing
				ret = ret.replace(rtrimCSS, "$1");
			}

			if (ret === "" && !isAttached(elem)) {
				ret = jQuery.style(elem, name);
			}

			// A tribute to the "awesome hack by Dean Edwards"
			// Android Browser returns percentage for some values,
			// but width seems to be reliably pixels.
			// This is against the CSSOM draft spec:
			// https://drafts.csswg.org/cssom/#resolved-values
			if (!support.pixelBoxStyles() && rnumnonpx.test(ret) && rboxStyle.test(name)) {

				// Remember the original values
				width = style.width;
				minWidth = style.minWidth;
				maxWidth = style.maxWidth;

				// Put in the new values to get a computed value out
				style.minWidth = style.maxWidth = style.width = ret;
				ret = computed.width;

				// Revert the changed values
				style.width = width;
				style.minWidth = minWidth;
				style.maxWidth = maxWidth;
			}
		}

		return ret !== undefined ?

		// Support: IE <=9 - 11 only
		// IE returns zIndex value as an integer.
		ret + "" : ret;
	}

	function addGetHookIf(conditionFn, hookFn) {

		// Define the hook, we'll check on the first run if it's really needed.
		return {
			get: function get() {
				if (conditionFn()) {

					// Hook not needed (or it's not possible to use it due
					// to missing dependency), remove it.
					delete this.get;
					return;
				}

				// Hook needed; redefine it so that the support test is not executed again.
				return (this.get = hookFn).apply(this, arguments);
			}
		};
	}

	var cssPrefixes = ["Webkit", "Moz", "ms"],
	    emptyStyle = document.createElement("div").style,
	    vendorProps = {};

	// Return a vendor-prefixed property or undefined
	function vendorPropName(name) {

		// Check for vendor prefixed names
		var capName = name[0].toUpperCase() + name.slice(1),
		    i = cssPrefixes.length;

		while (i--) {
			name = cssPrefixes[i] + capName;
			if (name in emptyStyle) {
				return name;
			}
		}
	}

	// Return a potentially-mapped jQuery.cssProps or vendor prefixed property
	function finalPropName(name) {
		var final = jQuery.cssProps[name] || vendorProps[name];

		if (final) {
			return final;
		}
		if (name in emptyStyle) {
			return name;
		}
		return vendorProps[name] = vendorPropName(name) || name;
	}

	var

	// Swappable if display is none or starts with table
	// except "table", "table-cell", or "table-caption"
	// See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
	rdisplayswap = /^(none|table(?!-c[ea]).+)/,
	    cssShow = { position: "absolute", visibility: "hidden", display: "block" },
	    cssNormalTransform = {
		letterSpacing: "0",
		fontWeight: "400"
	};

	function setPositiveNumber(_elem, value, subtract) {

		// Any relative (+/-) values have already been
		// normalized at this point
		var matches = rcssNum.exec(value);
		return matches ?

		// Guard against undefined "subtract", e.g., when used as in cssHooks
		Math.max(0, matches[2] - (subtract || 0)) + (matches[3] || "px") : value;
	}

	function boxModelAdjustment(elem, dimension, box, isBorderBox, styles, computedVal) {
		var i = dimension === "width" ? 1 : 0,
		    extra = 0,
		    delta = 0;

		// Adjustment may not be necessary
		if (box === (isBorderBox ? "border" : "content")) {
			return 0;
		}

		for (; i < 4; i += 2) {

			// Both box models exclude margin
			if (box === "margin") {
				delta += jQuery.css(elem, box + cssExpand[i], true, styles);
			}

			// If we get here with a content-box, we're seeking "padding" or "border" or "margin"
			if (!isBorderBox) {

				// Add padding
				delta += jQuery.css(elem, "padding" + cssExpand[i], true, styles);

				// For "border" or "margin", add border
				if (box !== "padding") {
					delta += jQuery.css(elem, "border" + cssExpand[i] + "Width", true, styles);

					// But still keep track of it otherwise
				} else {
					extra += jQuery.css(elem, "border" + cssExpand[i] + "Width", true, styles);
				}

				// If we get here with a border-box (content + padding + border), we're seeking "content" or
				// "padding" or "margin"
			} else {

				// For "content", subtract padding
				if (box === "content") {
					delta -= jQuery.css(elem, "padding" + cssExpand[i], true, styles);
				}

				// For "content" or "padding", subtract border
				if (box !== "margin") {
					delta -= jQuery.css(elem, "border" + cssExpand[i] + "Width", true, styles);
				}
			}
		}

		// Account for positive content-box scroll gutter when requested by providing computedVal
		if (!isBorderBox && computedVal >= 0) {

			// offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border
			// Assuming integer scroll gutter, subtract the rest and round down
			delta += Math.max(0, Math.ceil(elem["offset" + dimension[0].toUpperCase() + dimension.slice(1)] - computedVal - delta - extra - 0.5

			// If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter
			// Use an explicit zero to avoid NaN (gh-3964)
			)) || 0;
		}

		return delta;
	}

	function getWidthOrHeight(elem, dimension, extra) {

		// Start with computed style
		var styles = getStyles(elem),


		// To avoid forcing a reflow, only fetch boxSizing if we need it (gh-4322).
		// Fake content-box until we know it's needed to know the true value.
		boxSizingNeeded = !support.boxSizingReliable() || extra,
		    isBorderBox = boxSizingNeeded && jQuery.css(elem, "boxSizing", false, styles) === "border-box",
		    valueIsBorderBox = isBorderBox,
		    val = curCSS(elem, dimension, styles),
		    offsetProp = "offset" + dimension[0].toUpperCase() + dimension.slice(1);

		// Support: Firefox <=54
		// Return a confounding non-pixel value or feign ignorance, as appropriate.
		if (rnumnonpx.test(val)) {
			if (!extra) {
				return val;
			}
			val = "auto";
		}

		// Support: IE 9 - 11 only
		// Use offsetWidth/offsetHeight for when box sizing is unreliable.
		// In those cases, the computed value can be trusted to be border-box.
		if ((!support.boxSizingReliable() && isBorderBox ||

		// Support: IE 10 - 11+, Edge 15 - 18+
		// IE/Edge misreport `getComputedStyle` of table rows with width/height
		// set in CSS while `offset*` properties report correct values.
		// Interestingly, in some cases IE 9 doesn't suffer from this issue.
		!support.reliableTrDimensions() && nodeName(elem, "tr") ||

		// Fall back to offsetWidth/offsetHeight when value is "auto"
		// This happens for inline elements with no explicit setting (gh-3571)
		val === "auto" ||

		// Support: Android <=4.1 - 4.3 only
		// Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602)
		!parseFloat(val) && jQuery.css(elem, "display", false, styles) === "inline") &&

		// Make sure the element is visible & connected
		elem.getClientRects().length) {

			isBorderBox = jQuery.css(elem, "boxSizing", false, styles) === "border-box";

			// Where available, offsetWidth/offsetHeight approximate border box dimensions.
			// Where not available (e.g., SVG), assume unreliable box-sizing and interpret the
			// retrieved value as a content box dimension.
			valueIsBorderBox = offsetProp in elem;
			if (valueIsBorderBox) {
				val = elem[offsetProp];
			}
		}

		// Normalize "" and auto
		val = parseFloat(val) || 0;

		// Adjust for the element's box model
		return val + boxModelAdjustment(elem, dimension, extra || (isBorderBox ? "border" : "content"), valueIsBorderBox, styles,

		// Provide the current computed size to request scroll gutter calculation (gh-3589)
		val) + "px";
	}

	jQuery.extend({

		// Add in style property hooks for overriding the default
		// behavior of getting and setting a style property
		cssHooks: {
			opacity: {
				get: function get(elem, computed) {
					if (computed) {

						// We should always get a number back from opacity
						var ret = curCSS(elem, "opacity");
						return ret === "" ? "1" : ret;
					}
				}
			}
		},

		// Don't automatically add "px" to these possibly-unitless properties
		cssNumber: {
			"animationIterationCount": true,
			"columnCount": true,
			"fillOpacity": true,
			"flexGrow": true,
			"flexShrink": true,
			"fontWeight": true,
			"gridArea": true,
			"gridColumn": true,
			"gridColumnEnd": true,
			"gridColumnStart": true,
			"gridRow": true,
			"gridRowEnd": true,
			"gridRowStart": true,
			"lineHeight": true,
			"opacity": true,
			"order": true,
			"orphans": true,
			"widows": true,
			"zIndex": true,
			"zoom": true
		},

		// Add in properties whose names you wish to fix before
		// setting or getting the value
		cssProps: {},

		// Get and set the style property on a DOM Node
		style: function style(elem, name, value, extra) {

			// Don't set styles on text and comment nodes
			if (!elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style) {
				return;
			}

			// Make sure that we're working with the right name
			var ret,
			    type,
			    hooks,
			    origName = camelCase(name),
			    isCustomProp = rcustomProp.test(name),
			    style = elem.style;

			// Make sure that we're working with the right name. We don't
			// want to query the value if it is a CSS custom property
			// since they are user-defined.
			if (!isCustomProp) {
				name = finalPropName(origName);
			}

			// Gets hook for the prefixed version, then unprefixed version
			hooks = jQuery.cssHooks[name] || jQuery.cssHooks[origName];

			// Check if we're setting a value
			if (value !== undefined) {
				type = typeof value === "undefined" ? "undefined" : _typeof(value);

				// Convert "+=" or "-=" to relative numbers (trac-7345)
				if (type === "string" && (ret = rcssNum.exec(value)) && ret[1]) {
					value = adjustCSS(elem, name, ret);

					// Fixes bug trac-9237
					type = "number";
				}

				// Make sure that null and NaN values aren't set (trac-7116)
				if (value == null || value !== value) {
					return;
				}

				// If a number was passed in, add the unit (except for certain CSS properties)
				// The isCustomProp check can be removed in jQuery 4.0 when we only auto-append
				// "px" to a few hardcoded values.
				if (type === "number" && !isCustomProp) {
					value += ret && ret[3] || (jQuery.cssNumber[origName] ? "" : "px");
				}

				// background-* props affect original clone's values
				if (!support.clearCloneStyle && value === "" && name.indexOf("background") === 0) {
					style[name] = "inherit";
				}

				// If a hook was provided, use that value, otherwise just set the specified value
				if (!hooks || !("set" in hooks) || (value = hooks.set(elem, value, extra)) !== undefined) {

					if (isCustomProp) {
						style.setProperty(name, value);
					} else {
						style[name] = value;
					}
				}
			} else {

				// If a hook was provided get the non-computed value from there
				if (hooks && "get" in hooks && (ret = hooks.get(elem, false, extra)) !== undefined) {

					return ret;
				}

				// Otherwise just get the value from the style object
				return style[name];
			}
		},

		css: function css(elem, name, extra, styles) {
			var val,
			    num,
			    hooks,
			    origName = camelCase(name),
			    isCustomProp = rcustomProp.test(name);

			// Make sure that we're working with the right name. We don't
			// want to modify the value if it is a CSS custom property
			// since they are user-defined.
			if (!isCustomProp) {
				name = finalPropName(origName);
			}

			// Try prefixed name followed by the unprefixed name
			hooks = jQuery.cssHooks[name] || jQuery.cssHooks[origName];

			// If a hook was provided get the computed value from there
			if (hooks && "get" in hooks) {
				val = hooks.get(elem, true, extra);
			}

			// Otherwise, if a way to get the computed value exists, use that
			if (val === undefined) {
				val = curCSS(elem, name, styles);
			}

			// Convert "normal" to computed value
			if (val === "normal" && name in cssNormalTransform) {
				val = cssNormalTransform[name];
			}

			// Make numeric if forced or a qualifier was provided and val looks numeric
			if (extra === "" || extra) {
				num = parseFloat(val);
				return extra === true || isFinite(num) ? num || 0 : val;
			}

			return val;
		}
	});

	jQuery.each(["height", "width"], function (_i, dimension) {
		jQuery.cssHooks[dimension] = {
			get: function get(elem, computed, extra) {
				if (computed) {

					// Certain elements can have dimension info if we invisibly show them
					// but it must have a current display style that would benefit
					return rdisplayswap.test(jQuery.css(elem, "display")) && (

					// Support: Safari 8+
					// Table columns in Safari have non-zero offsetWidth & zero
					// getBoundingClientRect().width unless display is changed.
					// Support: IE <=11 only
					// Running getBoundingClientRect on a disconnected node
					// in IE throws an error.
					!elem.getClientRects().length || !elem.getBoundingClientRect().width) ? swap(elem, cssShow, function () {
						return getWidthOrHeight(elem, dimension, extra);
					}) : getWidthOrHeight(elem, dimension, extra);
				}
			},

			set: function set(elem, value, extra) {
				var matches,
				    styles = getStyles(elem),


				// Only read styles.position if the test has a chance to fail
				// to avoid forcing a reflow.
				scrollboxSizeBuggy = !support.scrollboxSize() && styles.position === "absolute",


				// To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991)
				boxSizingNeeded = scrollboxSizeBuggy || extra,
				    isBorderBox = boxSizingNeeded && jQuery.css(elem, "boxSizing", false, styles) === "border-box",
				    subtract = extra ? boxModelAdjustment(elem, dimension, extra, isBorderBox, styles) : 0;

				// Account for unreliable border-box dimensions by comparing offset* to computed and
				// faking a content-box to get border and padding (gh-3699)
				if (isBorderBox && scrollboxSizeBuggy) {
					subtract -= Math.ceil(elem["offset" + dimension[0].toUpperCase() + dimension.slice(1)] - parseFloat(styles[dimension]) - boxModelAdjustment(elem, dimension, "border", false, styles) - 0.5);
				}

				// Convert to pixels if value adjustment is needed
				if (subtract && (matches = rcssNum.exec(value)) && (matches[3] || "px") !== "px") {

					elem.style[dimension] = value;
					value = jQuery.css(elem, dimension);
				}

				return setPositiveNumber(elem, value, subtract);
			}
		};
	});

	jQuery.cssHooks.marginLeft = addGetHookIf(support.reliableMarginLeft, function (elem, computed) {
		if (computed) {
			return (parseFloat(curCSS(elem, "marginLeft")) || elem.getBoundingClientRect().left - swap(elem, { marginLeft: 0 }, function () {
				return elem.getBoundingClientRect().left;
			})) + "px";
		}
	});

	// These hooks are used by animate to expand properties
	jQuery.each({
		margin: "",
		padding: "",
		border: "Width"
	}, function (prefix, suffix) {
		jQuery.cssHooks[prefix + suffix] = {
			expand: function expand(value) {
				var i = 0,
				    expanded = {},


				// Assumes a single number if not a string
				parts = typeof value === "string" ? value.split(" ") : [value];

				for (; i < 4; i++) {
					expanded[prefix + cssExpand[i] + suffix] = parts[i] || parts[i - 2] || parts[0];
				}

				return expanded;
			}
		};

		if (prefix !== "margin") {
			jQuery.cssHooks[prefix + suffix].set = setPositiveNumber;
		}
	});

	jQuery.fn.extend({
		css: function css(name, value) {
			return access(this, function (elem, name, value) {
				var styles,
				    len,
				    map = {},
				    i = 0;

				if (Array.isArray(name)) {
					styles = getStyles(elem);
					len = name.length;

					for (; i < len; i++) {
						map[name[i]] = jQuery.css(elem, name[i], false, styles);
					}

					return map;
				}

				return value !== undefined ? jQuery.style(elem, name, value) : jQuery.css(elem, name);
			}, name, value, arguments.length > 1);
		}
	});

	function Tween(elem, options, prop, end, easing) {
		return new Tween.prototype.init(elem, options, prop, end, easing);
	}
	jQuery.Tween = Tween;

	Tween.prototype = {
		constructor: Tween,
		init: function init(elem, options, prop, end, easing, unit) {
			this.elem = elem;
			this.prop = prop;
			this.easing = easing || jQuery.easing._default;
			this.options = options;
			this.start = this.now = this.cur();
			this.end = end;
			this.unit = unit || (jQuery.cssNumber[prop] ? "" : "px");
		},
		cur: function cur() {
			var hooks = Tween.propHooks[this.prop];

			return hooks && hooks.get ? hooks.get(this) : Tween.propHooks._default.get(this);
		},
		run: function run(percent) {
			var eased,
			    hooks = Tween.propHooks[this.prop];

			if (this.options.duration) {
				this.pos = eased = jQuery.easing[this.easing](percent, this.options.duration * percent, 0, 1, this.options.duration);
			} else {
				this.pos = eased = percent;
			}
			this.now = (this.end - this.start) * eased + this.start;

			if (this.options.step) {
				this.options.step.call(this.elem, this.now, this);
			}

			if (hooks && hooks.set) {
				hooks.set(this);
			} else {
				Tween.propHooks._default.set(this);
			}
			return this;
		}
	};

	Tween.prototype.init.prototype = Tween.prototype;

	Tween.propHooks = {
		_default: {
			get: function get(tween) {
				var result;

				// Use a property on the element directly when it is not a DOM element,
				// or when there is no matching style property that exists.
				if (tween.elem.nodeType !== 1 || tween.elem[tween.prop] != null && tween.elem.style[tween.prop] == null) {
					return tween.elem[tween.prop];
				}

				// Passing an empty string as a 3rd parameter to .css will automatically
				// attempt a parseFloat and fallback to a string if the parse fails.
				// Simple values such as "10px" are parsed to Float;
				// complex values such as "rotate(1rad)" are returned as-is.
				result = jQuery.css(tween.elem, tween.prop, "");

				// Empty strings, null, undefined and "auto" are converted to 0.
				return !result || result === "auto" ? 0 : result;
			},
			set: function set(tween) {

				// Use step hook for back compat.
				// Use cssHook if its there.
				// Use .style if available and use plain properties where available.
				if (jQuery.fx.step[tween.prop]) {
					jQuery.fx.step[tween.prop](tween);
				} else if (tween.elem.nodeType === 1 && (jQuery.cssHooks[tween.prop] || tween.elem.style[finalPropName(tween.prop)] != null)) {
					jQuery.style(tween.elem, tween.prop, tween.now + tween.unit);
				} else {
					tween.elem[tween.prop] = tween.now;
				}
			}
		}
	};

	// Support: IE <=9 only
	// Panic based approach to setting things on disconnected nodes
	Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
		set: function set(tween) {
			if (tween.elem.nodeType && tween.elem.parentNode) {
				tween.elem[tween.prop] = tween.now;
			}
		}
	};

	jQuery.easing = {
		linear: function linear(p) {
			return p;
		},
		swing: function swing(p) {
			return 0.5 - Math.cos(p * Math.PI) / 2;
		},
		_default: "swing"
	};

	jQuery.fx = Tween.prototype.init;

	// Back compat <1.8 extension point
	jQuery.fx.step = {};

	var fxNow,
	    inProgress,
	    rfxtypes = /^(?:toggle|show|hide)$/,
	    rrun = /queueHooks$/;

	function schedule() {
		if (inProgress) {
			if (document.hidden === false && window.requestAnimationFrame) {
				window.requestAnimationFrame(schedule);
			} else {
				window.setTimeout(schedule, jQuery.fx.interval);
			}

			jQuery.fx.tick();
		}
	}

	// Animations created synchronously will run synchronously
	function createFxNow() {
		window.setTimeout(function () {
			fxNow = undefined;
		});
		return fxNow = Date.now();
	}

	// Generate parameters to create a standard animation
	function genFx(type, includeWidth) {
		var which,
		    i = 0,
		    attrs = { height: type };

		// If we include width, step value is 1 to do all cssExpand values,
		// otherwise step value is 2 to skip over Left and Right
		includeWidth = includeWidth ? 1 : 0;
		for (; i < 4; i += 2 - includeWidth) {
			which = cssExpand[i];
			attrs["margin" + which] = attrs["padding" + which] = type;
		}

		if (includeWidth) {
			attrs.opacity = attrs.width = type;
		}

		return attrs;
	}

	function createTween(value, prop, animation) {
		var tween,
		    collection = (Animation.tweeners[prop] || []).concat(Animation.tweeners["*"]),
		    index = 0,
		    length = collection.length;
		for (; index < length; index++) {
			if (tween = collection[index].call(animation, prop, value)) {

				// We're done with this property
				return tween;
			}
		}
	}

	function defaultPrefilter(elem, props, opts) {
		var prop,
		    value,
		    toggle,
		    hooks,
		    oldfire,
		    propTween,
		    restoreDisplay,
		    display,
		    isBox = "width" in props || "height" in props,
		    anim = this,
		    orig = {},
		    style = elem.style,
		    hidden = elem.nodeType && isHiddenWithinTree(elem),
		    dataShow = dataPriv.get(elem, "fxshow");

		// Queue-skipping animations hijack the fx hooks
		if (!opts.queue) {
			hooks = jQuery._queueHooks(elem, "fx");
			if (hooks.unqueued == null) {
				hooks.unqueued = 0;
				oldfire = hooks.empty.fire;
				hooks.empty.fire = function () {
					if (!hooks.unqueued) {
						oldfire();
					}
				};
			}
			hooks.unqueued++;

			anim.always(function () {

				// Ensure the complete handler is called before this completes
				anim.always(function () {
					hooks.unqueued--;
					if (!jQuery.queue(elem, "fx").length) {
						hooks.empty.fire();
					}
				});
			});
		}

		// Detect show/hide animations
		for (prop in props) {
			value = props[prop];
			if (rfxtypes.test(value)) {
				delete props[prop];
				toggle = toggle || value === "toggle";
				if (value === (hidden ? "hide" : "show")) {

					// Pretend to be hidden if this is a "show" and
					// there is still data from a stopped show/hide
					if (value === "show" && dataShow && dataShow[prop] !== undefined) {
						hidden = true;

						// Ignore all other no-op show/hide data
					} else {
						continue;
					}
				}
				orig[prop] = dataShow && dataShow[prop] || jQuery.style(elem, prop);
			}
		}

		// Bail out if this is a no-op like .hide().hide()
		propTween = !jQuery.isEmptyObject(props);
		if (!propTween && jQuery.isEmptyObject(orig)) {
			return;
		}

		// Restrict "overflow" and "display" styles during box animations
		if (isBox && elem.nodeType === 1) {

			// Support: IE <=9 - 11, Edge 12 - 15
			// Record all 3 overflow attributes because IE does not infer the shorthand
			// from identically-valued overflowX and overflowY and Edge just mirrors
			// the overflowX value there.
			opts.overflow = [style.overflow, style.overflowX, style.overflowY];

			// Identify a display type, preferring old show/hide data over the CSS cascade
			restoreDisplay = dataShow && dataShow.display;
			if (restoreDisplay == null) {
				restoreDisplay = dataPriv.get(elem, "display");
			}
			display = jQuery.css(elem, "display");
			if (display === "none") {
				if (restoreDisplay) {
					display = restoreDisplay;
				} else {

					// Get nonempty value(s) by temporarily forcing visibility
					showHide([elem], true);
					restoreDisplay = elem.style.display || restoreDisplay;
					display = jQuery.css(elem, "display");
					showHide([elem]);
				}
			}

			// Animate inline elements as inline-block
			if (display === "inline" || display === "inline-block" && restoreDisplay != null) {
				if (jQuery.css(elem, "float") === "none") {

					// Restore the original display value at the end of pure show/hide animations
					if (!propTween) {
						anim.done(function () {
							style.display = restoreDisplay;
						});
						if (restoreDisplay == null) {
							display = style.display;
							restoreDisplay = display === "none" ? "" : display;
						}
					}
					style.display = "inline-block";
				}
			}
		}

		if (opts.overflow) {
			style.overflow = "hidden";
			anim.always(function () {
				style.overflow = opts.overflow[0];
				style.overflowX = opts.overflow[1];
				style.overflowY = opts.overflow[2];
			});
		}

		// Implement show/hide animations
		propTween = false;
		for (prop in orig) {

			// General show/hide setup for this element animation
			if (!propTween) {
				if (dataShow) {
					if ("hidden" in dataShow) {
						hidden = dataShow.hidden;
					}
				} else {
					dataShow = dataPriv.access(elem, "fxshow", { display: restoreDisplay });
				}

				// Store hidden/visible for toggle so `.stop().toggle()` "reverses"
				if (toggle) {
					dataShow.hidden = !hidden;
				}

				// Show elements before animating them
				if (hidden) {
					showHide([elem], true);
				}

				/* eslint-disable no-loop-func */

				anim.done(function () {

					/* eslint-enable no-loop-func */

					// The final step of a "hide" animation is actually hiding the element
					if (!hidden) {
						showHide([elem]);
					}
					dataPriv.remove(elem, "fxshow");
					for (prop in orig) {
						jQuery.style(elem, prop, orig[prop]);
					}
				});
			}

			// Per-property setup
			propTween = createTween(hidden ? dataShow[prop] : 0, prop, anim);
			if (!(prop in dataShow)) {
				dataShow[prop] = propTween.start;
				if (hidden) {
					propTween.end = propTween.start;
					propTween.start = 0;
				}
			}
		}
	}

	function propFilter(props, specialEasing) {
		var index, name, easing, value, hooks;

		// camelCase, specialEasing and expand cssHook pass
		for (index in props) {
			name = camelCase(index);
			easing = specialEasing[name];
			value = props[index];
			if (Array.isArray(value)) {
				easing = value[1];
				value = props[index] = value[0];
			}

			if (index !== name) {
				props[name] = value;
				delete props[index];
			}

			hooks = jQuery.cssHooks[name];
			if (hooks && "expand" in hooks) {
				value = hooks.expand(value);
				delete props[name];

				// Not quite $.extend, this won't overwrite existing keys.
				// Reusing 'index' because we have the correct "name"
				for (index in value) {
					if (!(index in props)) {
						props[index] = value[index];
						specialEasing[index] = easing;
					}
				}
			} else {
				specialEasing[name] = easing;
			}
		}
	}

	function Animation(elem, properties, options) {
		var result,
		    stopped,
		    index = 0,
		    length = Animation.prefilters.length,
		    deferred = jQuery.Deferred().always(function () {

			// Don't match elem in the :animated selector
			delete tick.elem;
		}),
		    tick = function tick() {
			if (stopped) {
				return false;
			}
			var currentTime = fxNow || createFxNow(),
			    remaining = Math.max(0, animation.startTime + animation.duration - currentTime),


			// Support: Android 2.3 only
			// Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (trac-12497)
			temp = remaining / animation.duration || 0,
			    percent = 1 - temp,
			    index = 0,
			    length = animation.tweens.length;

			for (; index < length; index++) {
				animation.tweens[index].run(percent);
			}

			deferred.notifyWith(elem, [animation, percent, remaining]);

			// If there's more to do, yield
			if (percent < 1 && length) {
				return remaining;
			}

			// If this was an empty animation, synthesize a final progress notification
			if (!length) {
				deferred.notifyWith(elem, [animation, 1, 0]);
			}

			// Resolve the animation and report its conclusion
			deferred.resolveWith(elem, [animation]);
			return false;
		},
		    animation = deferred.promise({
			elem: elem,
			props: jQuery.extend({}, properties),
			opts: jQuery.extend(true, {
				specialEasing: {},
				easing: jQuery.easing._default
			}, options),
			originalProperties: properties,
			originalOptions: options,
			startTime: fxNow || createFxNow(),
			duration: options.duration,
			tweens: [],
			createTween: function createTween(prop, end) {
				var tween = jQuery.Tween(elem, animation.opts, prop, end, animation.opts.specialEasing[prop] || animation.opts.easing);
				animation.tweens.push(tween);
				return tween;
			},
			stop: function stop(gotoEnd) {
				var index = 0,


				// If we are going to the end, we want to run all the tweens
				// otherwise we skip this part
				length = gotoEnd ? animation.tweens.length : 0;
				if (stopped) {
					return this;
				}
				stopped = true;
				for (; index < length; index++) {
					animation.tweens[index].run(1);
				}

				// Resolve when we played the last frame; otherwise, reject
				if (gotoEnd) {
					deferred.notifyWith(elem, [animation, 1, 0]);
					deferred.resolveWith(elem, [animation, gotoEnd]);
				} else {
					deferred.rejectWith(elem, [animation, gotoEnd]);
				}
				return this;
			}
		}),
		    props = animation.props;

		propFilter(props, animation.opts.specialEasing);

		for (; index < length; index++) {
			result = Animation.prefilters[index].call(animation, elem, props, animation.opts);
			if (result) {
				if (isFunction(result.stop)) {
					jQuery._queueHooks(animation.elem, animation.opts.queue).stop = result.stop.bind(result);
				}
				return result;
			}
		}

		jQuery.map(props, createTween, animation);

		if (isFunction(animation.opts.start)) {
			animation.opts.start.call(elem, animation);
		}

		// Attach callbacks from options
		animation.progress(animation.opts.progress).done(animation.opts.done, animation.opts.complete).fail(animation.opts.fail).always(animation.opts.always);

		jQuery.fx.timer(jQuery.extend(tick, {
			elem: elem,
			anim: animation,
			queue: animation.opts.queue
		}));

		return animation;
	}

	jQuery.Animation = jQuery.extend(Animation, {

		tweeners: {
			"*": [function (prop, value) {
				var tween = this.createTween(prop, value);
				adjustCSS(tween.elem, prop, rcssNum.exec(value), tween);
				return tween;
			}]
		},

		tweener: function tweener(props, callback) {
			if (isFunction(props)) {
				callback = props;
				props = ["*"];
			} else {
				props = props.match(rnothtmlwhite);
			}

			var prop,
			    index = 0,
			    length = props.length;

			for (; index < length; index++) {
				prop = props[index];
				Animation.tweeners[prop] = Animation.tweeners[prop] || [];
				Animation.tweeners[prop].unshift(callback);
			}
		},

		prefilters: [defaultPrefilter],

		prefilter: function prefilter(callback, prepend) {
			if (prepend) {
				Animation.prefilters.unshift(callback);
			} else {
				Animation.prefilters.push(callback);
			}
		}
	});

	jQuery.speed = function (speed, easing, fn) {
		var opt = speed && (typeof speed === "undefined" ? "undefined" : _typeof(speed)) === "object" ? jQuery.extend({}, speed) : {
			complete: fn || !fn && easing || isFunction(speed) && speed,
			duration: speed,
			easing: fn && easing || easing && !isFunction(easing) && easing
		};

		// Go to the end state if fx are off
		if (jQuery.fx.off) {
			opt.duration = 0;
		} else {
			if (typeof opt.duration !== "number") {
				if (opt.duration in jQuery.fx.speeds) {
					opt.duration = jQuery.fx.speeds[opt.duration];
				} else {
					opt.duration = jQuery.fx.speeds._default;
				}
			}
		}

		// Normalize opt.queue - true/undefined/null -> "fx"
		if (opt.queue == null || opt.queue === true) {
			opt.queue = "fx";
		}

		// Queueing
		opt.old = opt.complete;

		opt.complete = function () {
			if (isFunction(opt.old)) {
				opt.old.call(this);
			}

			if (opt.queue) {
				jQuery.dequeue(this, opt.queue);
			}
		};

		return opt;
	};

	jQuery.fn.extend({
		fadeTo: function fadeTo(speed, to, easing, callback) {

			// Show any hidden elements after setting opacity to 0
			return this.filter(isHiddenWithinTree).css("opacity", 0).show()

			// Animate to the value specified
			.end().animate({ opacity: to }, speed, easing, callback);
		},
		animate: function animate(prop, speed, easing, callback) {
			var empty = jQuery.isEmptyObject(prop),
			    optall = jQuery.speed(speed, easing, callback),
			    doAnimation = function doAnimation() {

				// Operate on a copy of prop so per-property easing won't be lost
				var anim = Animation(this, jQuery.extend({}, prop), optall);

				// Empty animations, or finishing resolves immediately
				if (empty || dataPriv.get(this, "finish")) {
					anim.stop(true);
				}
			};

			doAnimation.finish = doAnimation;

			return empty || optall.queue === false ? this.each(doAnimation) : this.queue(optall.queue, doAnimation);
		},
		stop: function stop(type, clearQueue, gotoEnd) {
			var stopQueue = function stopQueue(hooks) {
				var stop = hooks.stop;
				delete hooks.stop;
				stop(gotoEnd);
			};

			if (typeof type !== "string") {
				gotoEnd = clearQueue;
				clearQueue = type;
				type = undefined;
			}
			if (clearQueue) {
				this.queue(type || "fx", []);
			}

			return this.each(function () {
				var dequeue = true,
				    index = type != null && type + "queueHooks",
				    timers = jQuery.timers,
				    data = dataPriv.get(this);

				if (index) {
					if (data[index] && data[index].stop) {
						stopQueue(data[index]);
					}
				} else {
					for (index in data) {
						if (data[index] && data[index].stop && rrun.test(index)) {
							stopQueue(data[index]);
						}
					}
				}

				for (index = timers.length; index--;) {
					if (timers[index].elem === this && (type == null || timers[index].queue === type)) {

						timers[index].anim.stop(gotoEnd);
						dequeue = false;
						timers.splice(index, 1);
					}
				}

				// Start the next in the queue if the last step wasn't forced.
				// Timers currently will call their complete callbacks, which
				// will dequeue but only if they were gotoEnd.
				if (dequeue || !gotoEnd) {
					jQuery.dequeue(this, type);
				}
			});
		},
		finish: function finish(type) {
			if (type !== false) {
				type = type || "fx";
			}
			return this.each(function () {
				var index,
				    data = dataPriv.get(this),
				    queue = data[type + "queue"],
				    hooks = data[type + "queueHooks"],
				    timers = jQuery.timers,
				    length = queue ? queue.length : 0;

				// Enable finishing flag on private data
				data.finish = true;

				// Empty the queue first
				jQuery.queue(this, type, []);

				if (hooks && hooks.stop) {
					hooks.stop.call(this, true);
				}

				// Look for any active animations, and finish them
				for (index = timers.length; index--;) {
					if (timers[index].elem === this && timers[index].queue === type) {
						timers[index].anim.stop(true);
						timers.splice(index, 1);
					}
				}

				// Look for any animations in the old queue and finish them
				for (index = 0; index < length; index++) {
					if (queue[index] && queue[index].finish) {
						queue[index].finish.call(this);
					}
				}

				// Turn off finishing flag
				delete data.finish;
			});
		}
	});

	jQuery.each(["toggle", "show", "hide"], function (_i, name) {
		var cssFn = jQuery.fn[name];
		jQuery.fn[name] = function (speed, easing, callback) {
			return speed == null || typeof speed === "boolean" ? cssFn.apply(this, arguments) : this.animate(genFx(name, true), speed, easing, callback);
		};
	});

	// Generate shortcuts for custom animations
	jQuery.each({
		slideDown: genFx("show"),
		slideUp: genFx("hide"),
		slideToggle: genFx("toggle"),
		fadeIn: { opacity: "show" },
		fadeOut: { opacity: "hide" },
		fadeToggle: { opacity: "toggle" }
	}, function (name, props) {
		jQuery.fn[name] = function (speed, easing, callback) {
			return this.animate(props, speed, easing, callback);
		};
	});

	jQuery.timers = [];
	jQuery.fx.tick = function () {
		var timer,
		    i = 0,
		    timers = jQuery.timers;

		fxNow = Date.now();

		for (; i < timers.length; i++) {
			timer = timers[i];

			// Run the timer and safely remove it when done (allowing for external removal)
			if (!timer() && timers[i] === timer) {
				timers.splice(i--, 1);
			}
		}

		if (!timers.length) {
			jQuery.fx.stop();
		}
		fxNow = undefined;
	};

	jQuery.fx.timer = function (timer) {
		jQuery.timers.push(timer);
		jQuery.fx.start();
	};

	jQuery.fx.interval = 13;
	jQuery.fx.start = function () {
		if (inProgress) {
			return;
		}

		inProgress = true;
		schedule();
	};

	jQuery.fx.stop = function () {
		inProgress = null;
	};

	jQuery.fx.speeds = {
		slow: 600,
		fast: 200,

		// Default speed
		_default: 400
	};

	// Based off of the plugin by Clint Helfers, with permission.
	jQuery.fn.delay = function (time, type) {
		time = jQuery.fx ? jQuery.fx.speeds[time] || time : time;
		type = type || "fx";

		return this.queue(type, function (next, hooks) {
			var timeout = window.setTimeout(next, time);
			hooks.stop = function () {
				window.clearTimeout(timeout);
			};
		});
	};

	(function () {
		var input = document.createElement("input"),
		    select = document.createElement("select"),
		    opt = select.appendChild(document.createElement("option"));

		input.type = "checkbox";

		// Support: Android <=4.3 only
		// Default value for a checkbox should be "on"
		support.checkOn = input.value !== "";

		// Support: IE <=11 only
		// Must access selectedIndex to make default options select
		support.optSelected = opt.selected;

		// Support: IE <=11 only
		// An input loses its value after becoming a radio
		input = document.createElement("input");
		input.value = "t";
		input.type = "radio";
		support.radioValue = input.value === "t";
	})();

	var boolHook,
	    attrHandle = jQuery.expr.attrHandle;

	jQuery.fn.extend({
		attr: function attr(name, value) {
			return access(this, jQuery.attr, name, value, arguments.length > 1);
		},

		removeAttr: function removeAttr(name) {
			return this.each(function () {
				jQuery.removeAttr(this, name);
			});
		}
	});

	jQuery.extend({
		attr: function attr(elem, name, value) {
			var ret,
			    hooks,
			    nType = elem.nodeType;

			// Don't get/set attributes on text, comment and attribute nodes
			if (nType === 3 || nType === 8 || nType === 2) {
				return;
			}

			// Fallback to prop when attributes are not supported
			if (typeof elem.getAttribute === "undefined") {
				return jQuery.prop(elem, name, value);
			}

			// Attribute hooks are determined by the lowercase version
			// Grab necessary hook if one is defined
			if (nType !== 1 || !jQuery.isXMLDoc(elem)) {
				hooks = jQuery.attrHooks[name.toLowerCase()] || (jQuery.expr.match.bool.test(name) ? boolHook : undefined);
			}

			if (value !== undefined) {
				if (value === null) {
					jQuery.removeAttr(elem, name);
					return;
				}

				if (hooks && "set" in hooks && (ret = hooks.set(elem, value, name)) !== undefined) {
					return ret;
				}

				elem.setAttribute(name, value + "");
				return value;
			}

			if (hooks && "get" in hooks && (ret = hooks.get(elem, name)) !== null) {
				return ret;
			}

			ret = jQuery.find.attr(elem, name);

			// Non-existent attributes return null, we normalize to undefined
			return ret == null ? undefined : ret;
		},

		attrHooks: {
			type: {
				set: function set(elem, value) {
					if (!support.radioValue && value === "radio" && nodeName(elem, "input")) {
						var val = elem.value;
						elem.setAttribute("type", value);
						if (val) {
							elem.value = val;
						}
						return value;
					}
				}
			}
		},

		removeAttr: function removeAttr(elem, value) {
			var name,
			    i = 0,


			// Attribute names can contain non-HTML whitespace characters
			// https://html.spec.whatwg.org/multipage/syntax.html#attributes-2
			attrNames = value && value.match(rnothtmlwhite);

			if (attrNames && elem.nodeType === 1) {
				while (name = attrNames[i++]) {
					elem.removeAttribute(name);
				}
			}
		}
	});

	// Hooks for boolean attributes
	boolHook = {
		set: function set(elem, value, name) {
			if (value === false) {

				// Remove boolean attributes when set to false
				jQuery.removeAttr(elem, name);
			} else {
				elem.setAttribute(name, name);
			}
			return name;
		}
	};

	jQuery.each(jQuery.expr.match.bool.source.match(/\w+/g), function (_i, name) {
		var getter = attrHandle[name] || jQuery.find.attr;

		attrHandle[name] = function (elem, name, isXML) {
			var ret,
			    handle,
			    lowercaseName = name.toLowerCase();

			if (!isXML) {

				// Avoid an infinite loop by temporarily removing this function from the getter
				handle = attrHandle[lowercaseName];
				attrHandle[lowercaseName] = ret;
				ret = getter(elem, name, isXML) != null ? lowercaseName : null;
				attrHandle[lowercaseName] = handle;
			}
			return ret;
		};
	});

	var rfocusable = /^(?:input|select|textarea|button)$/i,
	    rclickable = /^(?:a|area)$/i;

	jQuery.fn.extend({
		prop: function prop(name, value) {
			return access(this, jQuery.prop, name, value, arguments.length > 1);
		},

		removeProp: function removeProp(name) {
			return this.each(function () {
				delete this[jQuery.propFix[name] || name];
			});
		}
	});

	jQuery.extend({
		prop: function prop(elem, name, value) {
			var ret,
			    hooks,
			    nType = elem.nodeType;

			// Don't get/set properties on text, comment and attribute nodes
			if (nType === 3 || nType === 8 || nType === 2) {
				return;
			}

			if (nType !== 1 || !jQuery.isXMLDoc(elem)) {

				// Fix name and attach hooks
				name = jQuery.propFix[name] || name;
				hooks = jQuery.propHooks[name];
			}

			if (value !== undefined) {
				if (hooks && "set" in hooks && (ret = hooks.set(elem, value, name)) !== undefined) {
					return ret;
				}

				return elem[name] = value;
			}

			if (hooks && "get" in hooks && (ret = hooks.get(elem, name)) !== null) {
				return ret;
			}

			return elem[name];
		},

		propHooks: {
			tabIndex: {
				get: function get(elem) {

					// Support: IE <=9 - 11 only
					// elem.tabIndex doesn't always return the
					// correct value when it hasn't been explicitly set
					// Use proper attribute retrieval (trac-12072)
					var tabindex = jQuery.find.attr(elem, "tabindex");

					if (tabindex) {
						return parseInt(tabindex, 10);
					}

					if (rfocusable.test(elem.nodeName) || rclickable.test(elem.nodeName) && elem.href) {
						return 0;
					}

					return -1;
				}
			}
		},

		propFix: {
			"for": "htmlFor",
			"class": "className"
		}
	});

	// Support: IE <=11 only
	// Accessing the selectedIndex property
	// forces the browser to respect setting selected
	// on the option
	// The getter ensures a default option is selected
	// when in an optgroup
	// eslint rule "no-unused-expressions" is disabled for this code
	// since it considers such accessions noop
	if (!support.optSelected) {
		jQuery.propHooks.selected = {
			get: function get(elem) {

				/* eslint no-unused-expressions: "off" */

				var parent = elem.parentNode;
				if (parent && parent.parentNode) {
					parent.parentNode.selectedIndex;
				}
				return null;
			},
			set: function set(elem) {

				/* eslint no-unused-expressions: "off" */

				var parent = elem.parentNode;
				if (parent) {
					parent.selectedIndex;

					if (parent.parentNode) {
						parent.parentNode.selectedIndex;
					}
				}
			}
		};
	}

	jQuery.each(["tabIndex", "readOnly", "maxLength", "cellSpacing", "cellPadding", "rowSpan", "colSpan", "useMap", "frameBorder", "contentEditable"], function () {
		jQuery.propFix[this.toLowerCase()] = this;
	});

	// Strip and collapse whitespace according to HTML spec
	// https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace
	function stripAndCollapse(value) {
		var tokens = value.match(rnothtmlwhite) || [];
		return tokens.join(" ");
	}

	function getClass(elem) {
		return elem.getAttribute && elem.getAttribute("class") || "";
	}

	function classesToArray(value) {
		if (Array.isArray(value)) {
			return value;
		}
		if (typeof value === "string") {
			return value.match(rnothtmlwhite) || [];
		}
		return [];
	}

	jQuery.fn.extend({
		addClass: function addClass(value) {
			var classNames, cur, curValue, className, i, finalValue;

			if (isFunction(value)) {
				return this.each(function (j) {
					jQuery(this).addClass(value.call(this, j, getClass(this)));
				});
			}

			classNames = classesToArray(value);

			if (classNames.length) {
				return this.each(function () {
					curValue = getClass(this);
					cur = this.nodeType === 1 && " " + stripAndCollapse(curValue) + " ";

					if (cur) {
						for (i = 0; i < classNames.length; i++) {
							className = classNames[i];
							if (cur.indexOf(" " + className + " ") < 0) {
								cur += className + " ";
							}
						}

						// Only assign if different to avoid unneeded rendering.
						finalValue = stripAndCollapse(cur);
						if (curValue !== finalValue) {
							this.setAttribute("class", finalValue);
						}
					}
				});
			}

			return this;
		},

		removeClass: function removeClass(value) {
			var classNames, cur, curValue, className, i, finalValue;

			if (isFunction(value)) {
				return this.each(function (j) {
					jQuery(this).removeClass(value.call(this, j, getClass(this)));
				});
			}

			if (!arguments.length) {
				return this.attr("class", "");
			}

			classNames = classesToArray(value);

			if (classNames.length) {
				return this.each(function () {
					curValue = getClass(this);

					// This expression is here for better compressibility (see addClass)
					cur = this.nodeType === 1 && " " + stripAndCollapse(curValue) + " ";

					if (cur) {
						for (i = 0; i < classNames.length; i++) {
							className = classNames[i];

							// Remove *all* instances
							while (cur.indexOf(" " + className + " ") > -1) {
								cur = cur.replace(" " + className + " ", " ");
							}
						}

						// Only assign if different to avoid unneeded rendering.
						finalValue = stripAndCollapse(cur);
						if (curValue !== finalValue) {
							this.setAttribute("class", finalValue);
						}
					}
				});
			}

			return this;
		},

		toggleClass: function toggleClass(value, stateVal) {
			var classNames,
			    className,
			    i,
			    self,
			    type = typeof value === "undefined" ? "undefined" : _typeof(value),
			    isValidValue = type === "string" || Array.isArray(value);

			if (isFunction(value)) {
				return this.each(function (i) {
					jQuery(this).toggleClass(value.call(this, i, getClass(this), stateVal), stateVal);
				});
			}

			if (typeof stateVal === "boolean" && isValidValue) {
				return stateVal ? this.addClass(value) : this.removeClass(value);
			}

			classNames = classesToArray(value);

			return this.each(function () {
				if (isValidValue) {

					// Toggle individual class names
					self = jQuery(this);

					for (i = 0; i < classNames.length; i++) {
						className = classNames[i];

						// Check each className given, space separated list
						if (self.hasClass(className)) {
							self.removeClass(className);
						} else {
							self.addClass(className);
						}
					}

					// Toggle whole class name
				} else if (value === undefined || type === "boolean") {
					className = getClass(this);
					if (className) {

						// Store className if set
						dataPriv.set(this, "__className__", className);
					}

					// If the element has a class name or if we're passed `false`,
					// then remove the whole classname (if there was one, the above saved it).
					// Otherwise bring back whatever was previously saved (if anything),
					// falling back to the empty string if nothing was stored.
					if (this.setAttribute) {
						this.setAttribute("class", className || value === false ? "" : dataPriv.get(this, "__className__") || "");
					}
				}
			});
		},

		hasClass: function hasClass(selector) {
			var className,
			    elem,
			    i = 0;

			className = " " + selector + " ";
			while (elem = this[i++]) {
				if (elem.nodeType === 1 && (" " + stripAndCollapse(getClass(elem)) + " ").indexOf(className) > -1) {
					return true;
				}
			}

			return false;
		}
	});

	var rreturn = /\r/g;

	jQuery.fn.extend({
		val: function val(value) {
			var hooks,
			    ret,
			    valueIsFunction,
			    elem = this[0];

			if (!arguments.length) {
				if (elem) {
					hooks = jQuery.valHooks[elem.type] || jQuery.valHooks[elem.nodeName.toLowerCase()];

					if (hooks && "get" in hooks && (ret = hooks.get(elem, "value")) !== undefined) {
						return ret;
					}

					ret = elem.value;

					// Handle most common string cases
					if (typeof ret === "string") {
						return ret.replace(rreturn, "");
					}

					// Handle cases where value is null/undef or number
					return ret == null ? "" : ret;
				}

				return;
			}

			valueIsFunction = isFunction(value);

			return this.each(function (i) {
				var val;

				if (this.nodeType !== 1) {
					return;
				}

				if (valueIsFunction) {
					val = value.call(this, i, jQuery(this).val());
				} else {
					val = value;
				}

				// Treat null/undefined as ""; convert numbers to string
				if (val == null) {
					val = "";
				} else if (typeof val === "number") {
					val += "";
				} else if (Array.isArray(val)) {
					val = jQuery.map(val, function (value) {
						return value == null ? "" : value + "";
					});
				}

				hooks = jQuery.valHooks[this.type] || jQuery.valHooks[this.nodeName.toLowerCase()];

				// If set returns undefined, fall back to normal setting
				if (!hooks || !("set" in hooks) || hooks.set(this, val, "value") === undefined) {
					this.value = val;
				}
			});
		}
	});

	jQuery.extend({
		valHooks: {
			option: {
				get: function get(elem) {

					var val = jQuery.find.attr(elem, "value");
					return val != null ? val :

					// Support: IE <=10 - 11 only
					// option.text throws exceptions (trac-14686, trac-14858)
					// Strip and collapse whitespace
					// https://html.spec.whatwg.org/#strip-and-collapse-whitespace
					stripAndCollapse(jQuery.text(elem));
				}
			},
			select: {
				get: function get(elem) {
					var value,
					    option,
					    i,
					    options = elem.options,
					    index = elem.selectedIndex,
					    one = elem.type === "select-one",
					    values = one ? null : [],
					    max = one ? index + 1 : options.length;

					if (index < 0) {
						i = max;
					} else {
						i = one ? index : 0;
					}

					// Loop through all the selected options
					for (; i < max; i++) {
						option = options[i];

						// Support: IE <=9 only
						// IE8-9 doesn't update selected after form reset (trac-2551)
						if ((option.selected || i === index) &&

						// Don't return options that are disabled or in a disabled optgroup
						!option.disabled && (!option.parentNode.disabled || !nodeName(option.parentNode, "optgroup"))) {

							// Get the specific value for the option
							value = jQuery(option).val();

							// We don't need an array for one selects
							if (one) {
								return value;
							}

							// Multi-Selects return an array
							values.push(value);
						}
					}

					return values;
				},

				set: function set(elem, value) {
					var optionSet,
					    option,
					    options = elem.options,
					    values = jQuery.makeArray(value),
					    i = options.length;

					while (i--) {
						option = options[i];

						/* eslint-disable no-cond-assign */

						if (option.selected = jQuery.inArray(jQuery.valHooks.option.get(option), values) > -1) {
							optionSet = true;
						}

						/* eslint-enable no-cond-assign */
					}

					// Force browsers to behave consistently when non-matching value is set
					if (!optionSet) {
						elem.selectedIndex = -1;
					}
					return values;
				}
			}
		}
	});

	// Radios and checkboxes getter/setter
	jQuery.each(["radio", "checkbox"], function () {
		jQuery.valHooks[this] = {
			set: function set(elem, value) {
				if (Array.isArray(value)) {
					return elem.checked = jQuery.inArray(jQuery(elem).val(), value) > -1;
				}
			}
		};
		if (!support.checkOn) {
			jQuery.valHooks[this].get = function (elem) {
				return elem.getAttribute("value") === null ? "on" : elem.value;
			};
		}
	});

	// Return jQuery for attributes-only inclusion


	support.focusin = "onfocusin" in window;

	var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
	    stopPropagationCallback = function stopPropagationCallback(e) {
		e.stopPropagation();
	};

	jQuery.extend(jQuery.event, {

		trigger: function trigger(event, data, elem, onlyHandlers) {

			var i,
			    cur,
			    tmp,
			    bubbleType,
			    ontype,
			    handle,
			    special,
			    lastElement,
			    eventPath = [elem || document],
			    type = hasOwn.call(event, "type") ? event.type : event,
			    namespaces = hasOwn.call(event, "namespace") ? event.namespace.split(".") : [];

			cur = lastElement = tmp = elem = elem || document;

			// Don't do events on text and comment nodes
			if (elem.nodeType === 3 || elem.nodeType === 8) {
				return;
			}

			// focus/blur morphs to focusin/out; ensure we're not firing them right now
			if (rfocusMorph.test(type + jQuery.event.triggered)) {
				return;
			}

			if (type.indexOf(".") > -1) {

				// Namespaced trigger; create a regexp to match event type in handle()
				namespaces = type.split(".");
				type = namespaces.shift();
				namespaces.sort();
			}
			ontype = type.indexOf(":") < 0 && "on" + type;

			// Caller can pass in a jQuery.Event object, Object, or just an event type string
			event = event[jQuery.expando] ? event : new jQuery.Event(type, (typeof event === "undefined" ? "undefined" : _typeof(event)) === "object" && event);

			// Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)
			event.isTrigger = onlyHandlers ? 2 : 3;
			event.namespace = namespaces.join(".");
			event.rnamespace = event.namespace ? new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)") : null;

			// Clean up the event in case it is being reused
			event.result = undefined;
			if (!event.target) {
				event.target = elem;
			}

			// Clone any incoming data and prepend the event, creating the handler arg list
			data = data == null ? [event] : jQuery.makeArray(data, [event]);

			// Allow special events to draw outside the lines
			special = jQuery.event.special[type] || {};
			if (!onlyHandlers && special.trigger && special.trigger.apply(elem, data) === false) {
				return;
			}

			// Determine event propagation path in advance, per W3C events spec (trac-9951)
			// Bubble up to document, then to window; watch for a global ownerDocument var (trac-9724)
			if (!onlyHandlers && !special.noBubble && !isWindow(elem)) {

				bubbleType = special.delegateType || type;
				if (!rfocusMorph.test(bubbleType + type)) {
					cur = cur.parentNode;
				}
				for (; cur; cur = cur.parentNode) {
					eventPath.push(cur);
					tmp = cur;
				}

				// Only add window if we got to document (e.g., not plain obj or detached DOM)
				if (tmp === (elem.ownerDocument || document)) {
					eventPath.push(tmp.defaultView || tmp.parentWindow || window);
				}
			}

			// Fire handlers on the event path
			i = 0;
			while ((cur = eventPath[i++]) && !event.isPropagationStopped()) {
				lastElement = cur;
				event.type = i > 1 ? bubbleType : special.bindType || type;

				// jQuery handler
				handle = (dataPriv.get(cur, "events") || Object.create(null))[event.type] && dataPriv.get(cur, "handle");
				if (handle) {
					handle.apply(cur, data);
				}

				// Native handler
				handle = ontype && cur[ontype];
				if (handle && handle.apply && acceptData(cur)) {
					event.result = handle.apply(cur, data);
					if (event.result === false) {
						event.preventDefault();
					}
				}
			}
			event.type = type;

			// If nobody prevented the default action, do it now
			if (!onlyHandlers && !event.isDefaultPrevented()) {

				if ((!special._default || special._default.apply(eventPath.pop(), data) === false) && acceptData(elem)) {

					// Call a native DOM method on the target with the same name as the event.
					// Don't do default actions on window, that's where global variables be (trac-6170)
					if (ontype && isFunction(elem[type]) && !isWindow(elem)) {

						// Don't re-trigger an onFOO event when we call its FOO() method
						tmp = elem[ontype];

						if (tmp) {
							elem[ontype] = null;
						}

						// Prevent re-triggering of the same event, since we already bubbled it above
						jQuery.event.triggered = type;

						if (event.isPropagationStopped()) {
							lastElement.addEventListener(type, stopPropagationCallback);
						}

						elem[type]();

						if (event.isPropagationStopped()) {
							lastElement.removeEventListener(type, stopPropagationCallback);
						}

						jQuery.event.triggered = undefined;

						if (tmp) {
							elem[ontype] = tmp;
						}
					}
				}
			}

			return event.result;
		},

		// Piggyback on a donor event to simulate a different one
		// Used only for `focus(in | out)` events
		simulate: function simulate(type, elem, event) {
			var e = jQuery.extend(new jQuery.Event(), event, {
				type: type,
				isSimulated: true
			});

			jQuery.event.trigger(e, null, elem);
		}

	});

	jQuery.fn.extend({

		trigger: function trigger(type, data) {
			return this.each(function () {
				jQuery.event.trigger(type, data, this);
			});
		},
		triggerHandler: function triggerHandler(type, data) {
			var elem = this[0];
			if (elem) {
				return jQuery.event.trigger(type, data, elem, true);
			}
		}
	});

	// Support: Firefox <=44
	// Firefox doesn't have focus(in | out) events
	// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787
	//
	// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1
	// focus(in | out) events fire after focus & blur events,
	// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order
	// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857
	if (!support.focusin) {
		jQuery.each({ focus: "focusin", blur: "focusout" }, function (orig, fix) {

			// Attach a single capturing handler on the document while someone wants focusin/focusout
			var handler = function handler(event) {
				jQuery.event.simulate(fix, event.target, jQuery.event.fix(event));
			};

			jQuery.event.special[fix] = {
				setup: function setup() {

					// Handle: regular nodes (via `this.ownerDocument`), window
					// (via `this.document`) & document (via `this`).
					var doc = this.ownerDocument || this.document || this,
					    attaches = dataPriv.access(doc, fix);

					if (!attaches) {
						doc.addEventListener(orig, handler, true);
					}
					dataPriv.access(doc, fix, (attaches || 0) + 1);
				},
				teardown: function teardown() {
					var doc = this.ownerDocument || this.document || this,
					    attaches = dataPriv.access(doc, fix) - 1;

					if (!attaches) {
						doc.removeEventListener(orig, handler, true);
						dataPriv.remove(doc, fix);
					} else {
						dataPriv.access(doc, fix, attaches);
					}
				}
			};
		});
	}
	var location = window.location;

	var nonce = { guid: Date.now() };

	var rquery = /\?/;

	// Cross-browser xml parsing
	jQuery.parseXML = function (data) {
		var xml, parserErrorElem;
		if (!data || typeof data !== "string") {
			return null;
		}

		// Support: IE 9 - 11 only
		// IE throws on parseFromString with invalid input.
		try {
			xml = new window.DOMParser().parseFromString(data, "text/xml");
		} catch (e) {}

		parserErrorElem = xml && xml.getElementsByTagName("parsererror")[0];
		if (!xml || parserErrorElem) {
			jQuery.error("Invalid XML: " + (parserErrorElem ? jQuery.map(parserErrorElem.childNodes, function (el) {
				return el.textContent;
			}).join("\n") : data));
		}
		return xml;
	};

	var rbracket = /\[\]$/,
	    rCRLF = /\r?\n/g,
	    rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,
	    rsubmittable = /^(?:input|select|textarea|keygen)/i;

	function buildParams(prefix, obj, traditional, add) {
		var name;

		if (Array.isArray(obj)) {

			// Serialize array item.
			jQuery.each(obj, function (i, v) {
				if (traditional || rbracket.test(prefix)) {

					// Treat each array item as a scalar.
					add(prefix, v);
				} else {

					// Item is non-scalar (array or object), encode its numeric index.
					buildParams(prefix + "[" + ((typeof v === "undefined" ? "undefined" : _typeof(v)) === "object" && v != null ? i : "") + "]", v, traditional, add);
				}
			});
		} else if (!traditional && toType(obj) === "object") {

			// Serialize object item.
			for (name in obj) {
				buildParams(prefix + "[" + name + "]", obj[name], traditional, add);
			}
		} else {

			// Serialize scalar item.
			add(prefix, obj);
		}
	}

	// Serialize an array of form elements or a set of
	// key/values into a query string
	jQuery.param = function (a, traditional) {
		var prefix,
		    s = [],
		    add = function add(key, valueOrFunction) {

			// If value is a function, invoke it and use its return value
			var value = isFunction(valueOrFunction) ? valueOrFunction() : valueOrFunction;

			s[s.length] = encodeURIComponent(key) + "=" + encodeURIComponent(value == null ? "" : value);
		};

		if (a == null) {
			return "";
		}

		// If an array was passed in, assume that it is an array of form elements.
		if (Array.isArray(a) || a.jquery && !jQuery.isPlainObject(a)) {

			// Serialize the form elements
			jQuery.each(a, function () {
				add(this.name, this.value);
			});
		} else {

			// If traditional, encode the "old" way (the way 1.3.2 or older
			// did it), otherwise encode params recursively.
			for (prefix in a) {
				buildParams(prefix, a[prefix], traditional, add);
			}
		}

		// Return the resulting serialization
		return s.join("&");
	};

	jQuery.fn.extend({
		serialize: function serialize() {
			return jQuery.param(this.serializeArray());
		},
		serializeArray: function serializeArray() {
			return this.map(function () {

				// Can add propHook for "elements" to filter or add form elements
				var elements = jQuery.prop(this, "elements");
				return elements ? jQuery.makeArray(elements) : this;
			}).filter(function () {
				var type = this.type;

				// Use .is( ":disabled" ) so that fieldset[disabled] works
				return this.name && !jQuery(this).is(":disabled") && rsubmittable.test(this.nodeName) && !rsubmitterTypes.test(type) && (this.checked || !rcheckableType.test(type));
			}).map(function (_i, elem) {
				var val = jQuery(this).val();

				if (val == null) {
					return null;
				}

				if (Array.isArray(val)) {
					return jQuery.map(val, function (val) {
						return { name: elem.name, value: val.replace(rCRLF, "\r\n") };
					});
				}

				return { name: elem.name, value: val.replace(rCRLF, "\r\n") };
			}).get();
		}
	});

	var r20 = /%20/g,
	    rhash = /#.*$/,
	    rantiCache = /([?&])_=[^&]*/,
	    rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg,


	// trac-7653, trac-8125, trac-8152: local protocol detection
	rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,
	    rnoContent = /^(?:GET|HEAD)$/,
	    rprotocol = /^\/\//,


	/* Prefilters
  * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
  * 2) These are called:
  *    - BEFORE asking for a transport
  *    - AFTER param serialization (s.data is a string if s.processData is true)
  * 3) key is the dataType
  * 4) the catchall symbol "*" can be used
  * 5) execution will start with transport dataType and THEN continue down to "*" if needed
  */
	prefilters = {},


	/* Transports bindings
  * 1) key is the dataType
  * 2) the catchall symbol "*" can be used
  * 3) selection will start with transport dataType and THEN go to "*" if needed
  */
	transports = {},


	// Avoid comment-prolog char sequence (trac-10098); must appease lint and evade compression
	allTypes = "*/".concat("*"),


	// Anchor tag for parsing the document origin
	originAnchor = document.createElement("a");

	originAnchor.href = location.href;

	// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
	function addToPrefiltersOrTransports(structure) {

		// dataTypeExpression is optional and defaults to "*"
		return function (dataTypeExpression, func) {

			if (typeof dataTypeExpression !== "string") {
				func = dataTypeExpression;
				dataTypeExpression = "*";
			}

			var dataType,
			    i = 0,
			    dataTypes = dataTypeExpression.toLowerCase().match(rnothtmlwhite) || [];

			if (isFunction(func)) {

				// For each dataType in the dataTypeExpression
				while (dataType = dataTypes[i++]) {

					// Prepend if requested
					if (dataType[0] === "+") {
						dataType = dataType.slice(1) || "*";
						(structure[dataType] = structure[dataType] || []).unshift(func);

						// Otherwise append
					} else {
						(structure[dataType] = structure[dataType] || []).push(func);
					}
				}
			}
		};
	}

	// Base inspection function for prefilters and transports
	function inspectPrefiltersOrTransports(structure, options, originalOptions, jqXHR) {

		var inspected = {},
		    seekingTransport = structure === transports;

		function inspect(dataType) {
			var selected;
			inspected[dataType] = true;
			jQuery.each(structure[dataType] || [], function (_, prefilterOrFactory) {
				var dataTypeOrTransport = prefilterOrFactory(options, originalOptions, jqXHR);
				if (typeof dataTypeOrTransport === "string" && !seekingTransport && !inspected[dataTypeOrTransport]) {

					options.dataTypes.unshift(dataTypeOrTransport);
					inspect(dataTypeOrTransport);
					return false;
				} else if (seekingTransport) {
					return !(selected = dataTypeOrTransport);
				}
			});
			return selected;
		}

		return inspect(options.dataTypes[0]) || !inspected["*"] && inspect("*");
	}

	// A special extend for ajax options
	// that takes "flat" options (not to be deep extended)
	// Fixes trac-9887
	function ajaxExtend(target, src) {
		var key,
		    deep,
		    flatOptions = jQuery.ajaxSettings.flatOptions || {};

		for (key in src) {
			if (src[key] !== undefined) {
				(flatOptions[key] ? target : deep || (deep = {}))[key] = src[key];
			}
		}
		if (deep) {
			jQuery.extend(true, target, deep);
		}

		return target;
	}

	/* Handles responses to an ajax request:
  * - finds the right dataType (mediates between content-type and expected dataType)
  * - returns the corresponding response
  */
	function ajaxHandleResponses(s, jqXHR, responses) {

		var ct,
		    type,
		    finalDataType,
		    firstDataType,
		    contents = s.contents,
		    dataTypes = s.dataTypes;

		// Remove auto dataType and get content-type in the process
		while (dataTypes[0] === "*") {
			dataTypes.shift();
			if (ct === undefined) {
				ct = s.mimeType || jqXHR.getResponseHeader("Content-Type");
			}
		}

		// Check if we're dealing with a known content-type
		if (ct) {
			for (type in contents) {
				if (contents[type] && contents[type].test(ct)) {
					dataTypes.unshift(type);
					break;
				}
			}
		}

		// Check to see if we have a response for the expected dataType
		if (dataTypes[0] in responses) {
			finalDataType = dataTypes[0];
		} else {

			// Try convertible dataTypes
			for (type in responses) {
				if (!dataTypes[0] || s.converters[type + " " + dataTypes[0]]) {
					finalDataType = type;
					break;
				}
				if (!firstDataType) {
					firstDataType = type;
				}
			}

			// Or just use first one
			finalDataType = finalDataType || firstDataType;
		}

		// If we found a dataType
		// We add the dataType to the list if needed
		// and return the corresponding response
		if (finalDataType) {
			if (finalDataType !== dataTypes[0]) {
				dataTypes.unshift(finalDataType);
			}
			return responses[finalDataType];
		}
	}

	/* Chain conversions given the request and the original response
  * Also sets the responseXXX fields on the jqXHR instance
  */
	function ajaxConvert(s, response, jqXHR, isSuccess) {
		var conv2,
		    current,
		    conv,
		    tmp,
		    prev,
		    converters = {},


		// Work with a copy of dataTypes in case we need to modify it for conversion
		dataTypes = s.dataTypes.slice();

		// Create converters map with lowercased keys
		if (dataTypes[1]) {
			for (conv in s.converters) {
				converters[conv.toLowerCase()] = s.converters[conv];
			}
		}

		current = dataTypes.shift();

		// Convert to each sequential dataType
		while (current) {

			if (s.responseFields[current]) {
				jqXHR[s.responseFields[current]] = response;
			}

			// Apply the dataFilter if provided
			if (!prev && isSuccess && s.dataFilter) {
				response = s.dataFilter(response, s.dataType);
			}

			prev = current;
			current = dataTypes.shift();

			if (current) {

				// There's only work to do if current dataType is non-auto
				if (current === "*") {

					current = prev;

					// Convert response if prev dataType is non-auto and differs from current
				} else if (prev !== "*" && prev !== current) {

					// Seek a direct converter
					conv = converters[prev + " " + current] || converters["* " + current];

					// If none found, seek a pair
					if (!conv) {
						for (conv2 in converters) {

							// If conv2 outputs current
							tmp = conv2.split(" ");
							if (tmp[1] === current) {

								// If prev can be converted to accepted input
								conv = converters[prev + " " + tmp[0]] || converters["* " + tmp[0]];
								if (conv) {

									// Condense equivalence converters
									if (conv === true) {
										conv = converters[conv2];

										// Otherwise, insert the intermediate dataType
									} else if (converters[conv2] !== true) {
										current = tmp[0];
										dataTypes.unshift(tmp[1]);
									}
									break;
								}
							}
						}
					}

					// Apply converter (if not an equivalence)
					if (conv !== true) {

						// Unless errors are allowed to bubble, catch and return them
						if (conv && s.throws) {
							response = conv(response);
						} else {
							try {
								response = conv(response);
							} catch (e) {
								return {
									state: "parsererror",
									error: conv ? e : "No conversion from " + prev + " to " + current
								};
							}
						}
					}
				}
			}
		}

		return { state: "success", data: response };
	}

	jQuery.extend({

		// Counter for holding the number of active queries
		active: 0,

		// Last-Modified header cache for next request
		lastModified: {},
		etag: {},

		ajaxSettings: {
			url: location.href,
			type: "GET",
			isLocal: rlocalProtocol.test(location.protocol),
			global: true,
			processData: true,
			async: true,
			contentType: "application/x-www-form-urlencoded; charset=UTF-8",

			/*
   timeout: 0,
   data: null,
   dataType: null,
   username: null,
   password: null,
   cache: null,
   throws: false,
   traditional: false,
   headers: {},
   */

			accepts: {
				"*": allTypes,
				text: "text/plain",
				html: "text/html",
				xml: "application/xml, text/xml",
				json: "application/json, text/javascript"
			},

			contents: {
				xml: /\bxml\b/,
				html: /\bhtml/,
				json: /\bjson\b/
			},

			responseFields: {
				xml: "responseXML",
				text: "responseText",
				json: "responseJSON"
			},

			// Data converters
			// Keys separate source (or catchall "*") and destination types with a single space
			converters: {

				// Convert anything to text
				"* text": String,

				// Text to html (true = no transformation)
				"text html": true,

				// Evaluate text as a json expression
				"text json": JSON.parse,

				// Parse text as xml
				"text xml": jQuery.parseXML
			},

			// For options that shouldn't be deep extended:
			// you can add your own custom options here if
			// and when you create one that shouldn't be
			// deep extended (see ajaxExtend)
			flatOptions: {
				url: true,
				context: true
			}
		},

		// Creates a full fledged settings object into target
		// with both ajaxSettings and settings fields.
		// If target is omitted, writes into ajaxSettings.
		ajaxSetup: function ajaxSetup(target, settings) {
			return settings ?

			// Building a settings object
			ajaxExtend(ajaxExtend(target, jQuery.ajaxSettings), settings) :

			// Extending ajaxSettings
			ajaxExtend(jQuery.ajaxSettings, target);
		},

		ajaxPrefilter: addToPrefiltersOrTransports(prefilters),
		ajaxTransport: addToPrefiltersOrTransports(transports),

		// Main method
		ajax: function ajax(url, options) {

			// If url is an object, simulate pre-1.5 signature
			if ((typeof url === "undefined" ? "undefined" : _typeof(url)) === "object") {
				options = url;
				url = undefined;
			}

			// Force options to be an object
			options = options || {};

			var transport,


			// URL without anti-cache param
			cacheURL,


			// Response headers
			responseHeadersString,
			    responseHeaders,


			// timeout handle
			timeoutTimer,


			// Url cleanup var
			urlAnchor,


			// Request state (becomes false upon send and true upon completion)
			completed,


			// To know if global events are to be dispatched
			fireGlobals,


			// Loop variable
			i,


			// uncached part of the url
			uncached,


			// Create the final options object
			s = jQuery.ajaxSetup({}, options),


			// Callbacks context
			callbackContext = s.context || s,


			// Context for global events is callbackContext if it is a DOM node or jQuery collection
			globalEventContext = s.context && (callbackContext.nodeType || callbackContext.jquery) ? jQuery(callbackContext) : jQuery.event,


			// Deferreds
			deferred = jQuery.Deferred(),
			    completeDeferred = jQuery.Callbacks("once memory"),


			// Status-dependent callbacks
			_statusCode = s.statusCode || {},


			// Headers (they are sent all at once)
			requestHeaders = {},
			    requestHeadersNames = {},


			// Default abort message
			strAbort = "canceled",


			// Fake xhr
			jqXHR = {
				readyState: 0,

				// Builds headers hashtable if needed
				getResponseHeader: function getResponseHeader(key) {
					var match;
					if (completed) {
						if (!responseHeaders) {
							responseHeaders = {};
							while (match = rheaders.exec(responseHeadersString)) {
								responseHeaders[match[1].toLowerCase() + " "] = (responseHeaders[match[1].toLowerCase() + " "] || []).concat(match[2]);
							}
						}
						match = responseHeaders[key.toLowerCase() + " "];
					}
					return match == null ? null : match.join(", ");
				},

				// Raw string
				getAllResponseHeaders: function getAllResponseHeaders() {
					return completed ? responseHeadersString : null;
				},

				// Caches the header
				setRequestHeader: function setRequestHeader(name, value) {
					if (completed == null) {
						name = requestHeadersNames[name.toLowerCase()] = requestHeadersNames[name.toLowerCase()] || name;
						requestHeaders[name] = value;
					}
					return this;
				},

				// Overrides response content-type header
				overrideMimeType: function overrideMimeType(type) {
					if (completed == null) {
						s.mimeType = type;
					}
					return this;
				},

				// Status-dependent callbacks
				statusCode: function statusCode(map) {
					var code;
					if (map) {
						if (completed) {

							// Execute the appropriate callbacks
							jqXHR.always(map[jqXHR.status]);
						} else {

							// Lazy-add the new callbacks in a way that preserves old ones
							for (code in map) {
								_statusCode[code] = [_statusCode[code], map[code]];
							}
						}
					}
					return this;
				},

				// Cancel the request
				abort: function abort(statusText) {
					var finalText = statusText || strAbort;
					if (transport) {
						transport.abort(finalText);
					}
					done(0, finalText);
					return this;
				}
			};

			// Attach deferreds
			deferred.promise(jqXHR);

			// Add protocol if not provided (prefilters might expect it)
			// Handle falsy url in the settings object (trac-10093: consistency with old signature)
			// We also use the url parameter if available
			s.url = ((url || s.url || location.href) + "").replace(rprotocol, location.protocol + "//");

			// Alias method option to type as per ticket trac-12004
			s.type = options.method || options.type || s.method || s.type;

			// Extract dataTypes list
			s.dataTypes = (s.dataType || "*").toLowerCase().match(rnothtmlwhite) || [""];

			// A cross-domain request is in order when the origin doesn't match the current origin.
			if (s.crossDomain == null) {
				urlAnchor = document.createElement("a");

				// Support: IE <=8 - 11, Edge 12 - 15
				// IE throws exception on accessing the href property if url is malformed,
				// e.g. http://example.com:80x/
				try {
					urlAnchor.href = s.url;

					// Support: IE <=8 - 11 only
					// Anchor's host property isn't correctly set when s.url is relative
					urlAnchor.href = urlAnchor.href;
					s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !== urlAnchor.protocol + "//" + urlAnchor.host;
				} catch (e) {

					// If there is an error parsing the URL, assume it is crossDomain,
					// it can be rejected by the transport if it is invalid
					s.crossDomain = true;
				}
			}

			// Convert data if not already a string
			if (s.data && s.processData && typeof s.data !== "string") {
				s.data = jQuery.param(s.data, s.traditional);
			}

			// Apply prefilters
			inspectPrefiltersOrTransports(prefilters, s, options, jqXHR);

			// If request was aborted inside a prefilter, stop there
			if (completed) {
				return jqXHR;
			}

			// We can fire global events as of now if asked to
			// Don't fire events if jQuery.event is undefined in an AMD-usage scenario (trac-15118)
			fireGlobals = jQuery.event && s.global;

			// Watch for a new set of requests
			if (fireGlobals && jQuery.active++ === 0) {
				jQuery.event.trigger("ajaxStart");
			}

			// Uppercase the type
			s.type = s.type.toUpperCase();

			// Determine if request has content
			s.hasContent = !rnoContent.test(s.type);

			// Save the URL in case we're toying with the If-Modified-Since
			// and/or If-None-Match header later on
			// Remove hash to simplify url manipulation
			cacheURL = s.url.replace(rhash, "");

			// More options handling for requests with no content
			if (!s.hasContent) {

				// Remember the hash so we can put it back
				uncached = s.url.slice(cacheURL.length);

				// If data is available and should be processed, append data to url
				if (s.data && (s.processData || typeof s.data === "string")) {
					cacheURL += (rquery.test(cacheURL) ? "&" : "?") + s.data;

					// trac-9682: remove data so that it's not used in an eventual retry
					delete s.data;
				}

				// Add or update anti-cache param if needed
				if (s.cache === false) {
					cacheURL = cacheURL.replace(rantiCache, "$1");
					uncached = (rquery.test(cacheURL) ? "&" : "?") + "_=" + nonce.guid++ + uncached;
				}

				// Put hash and anti-cache on the URL that will be requested (gh-1732)
				s.url = cacheURL + uncached;

				// Change '%20' to '+' if this is encoded form body content (gh-2658)
			} else if (s.data && s.processData && (s.contentType || "").indexOf("application/x-www-form-urlencoded") === 0) {
				s.data = s.data.replace(r20, "+");
			}

			// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
			if (s.ifModified) {
				if (jQuery.lastModified[cacheURL]) {
					jqXHR.setRequestHeader("If-Modified-Since", jQuery.lastModified[cacheURL]);
				}
				if (jQuery.etag[cacheURL]) {
					jqXHR.setRequestHeader("If-None-Match", jQuery.etag[cacheURL]);
				}
			}

			// Set the correct header, if data is being sent
			if (s.data && s.hasContent && s.contentType !== false || options.contentType) {
				jqXHR.setRequestHeader("Content-Type", s.contentType);
			}

			// Set the Accepts header for the server, depending on the dataType
			jqXHR.setRequestHeader("Accept", s.dataTypes[0] && s.accepts[s.dataTypes[0]] ? s.accepts[s.dataTypes[0]] + (s.dataTypes[0] !== "*" ? ", " + allTypes + "; q=0.01" : "") : s.accepts["*"]);

			// Check for headers option
			for (i in s.headers) {
				jqXHR.setRequestHeader(i, s.headers[i]);
			}

			// Allow custom headers/mimetypes and early abort
			if (s.beforeSend && (s.beforeSend.call(callbackContext, jqXHR, s) === false || completed)) {

				// Abort if not done already and return
				return jqXHR.abort();
			}

			// Aborting is no longer a cancellation
			strAbort = "abort";

			// Install callbacks on deferreds
			completeDeferred.add(s.complete);
			jqXHR.done(s.success);
			jqXHR.fail(s.error);

			// Get transport
			transport = inspectPrefiltersOrTransports(transports, s, options, jqXHR);

			// If no transport, we auto-abort
			if (!transport) {
				done(-1, "No Transport");
			} else {
				jqXHR.readyState = 1;

				// Send global event
				if (fireGlobals) {
					globalEventContext.trigger("ajaxSend", [jqXHR, s]);
				}

				// If request was aborted inside ajaxSend, stop there
				if (completed) {
					return jqXHR;
				}

				// Timeout
				if (s.async && s.timeout > 0) {
					timeoutTimer = window.setTimeout(function () {
						jqXHR.abort("timeout");
					}, s.timeout);
				}

				try {
					completed = false;
					transport.send(requestHeaders, done);
				} catch (e) {

					// Rethrow post-completion exceptions
					if (completed) {
						throw e;
					}

					// Propagate others as results
					done(-1, e);
				}
			}

			// Callback for when everything is done
			function done(status, nativeStatusText, responses, headers) {
				var isSuccess,
				    success,
				    error,
				    response,
				    modified,
				    statusText = nativeStatusText;

				// Ignore repeat invocations
				if (completed) {
					return;
				}

				completed = true;

				// Clear timeout if it exists
				if (timeoutTimer) {
					window.clearTimeout(timeoutTimer);
				}

				// Dereference transport for early garbage collection
				// (no matter how long the jqXHR object will be used)
				transport = undefined;

				// Cache response headers
				responseHeadersString = headers || "";

				// Set readyState
				jqXHR.readyState = status > 0 ? 4 : 0;

				// Determine if successful
				isSuccess = status >= 200 && status < 300 || status === 304;

				// Get response data
				if (responses) {
					response = ajaxHandleResponses(s, jqXHR, responses);
				}

				// Use a noop converter for missing script but not if jsonp
				if (!isSuccess && jQuery.inArray("script", s.dataTypes) > -1 && jQuery.inArray("json", s.dataTypes) < 0) {
					s.converters["text script"] = function () {};
				}

				// Convert no matter what (that way responseXXX fields are always set)
				response = ajaxConvert(s, response, jqXHR, isSuccess);

				// If successful, handle type chaining
				if (isSuccess) {

					// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
					if (s.ifModified) {
						modified = jqXHR.getResponseHeader("Last-Modified");
						if (modified) {
							jQuery.lastModified[cacheURL] = modified;
						}
						modified = jqXHR.getResponseHeader("etag");
						if (modified) {
							jQuery.etag[cacheURL] = modified;
						}
					}

					// if no content
					if (status === 204 || s.type === "HEAD") {
						statusText = "nocontent";

						// if not modified
					} else if (status === 304) {
						statusText = "notmodified";

						// If we have data, let's convert it
					} else {
						statusText = response.state;
						success = response.data;
						error = response.error;
						isSuccess = !error;
					}
				} else {

					// Extract error from statusText and normalize for non-aborts
					error = statusText;
					if (status || !statusText) {
						statusText = "error";
						if (status < 0) {
							status = 0;
						}
					}
				}

				// Set data for the fake xhr object
				jqXHR.status = status;
				jqXHR.statusText = (nativeStatusText || statusText) + "";

				// Success/Error
				if (isSuccess) {
					deferred.resolveWith(callbackContext, [success, statusText, jqXHR]);
				} else {
					deferred.rejectWith(callbackContext, [jqXHR, statusText, error]);
				}

				// Status-dependent callbacks
				jqXHR.statusCode(_statusCode);
				_statusCode = undefined;

				if (fireGlobals) {
					globalEventContext.trigger(isSuccess ? "ajaxSuccess" : "ajaxError", [jqXHR, s, isSuccess ? success : error]);
				}

				// Complete
				completeDeferred.fireWith(callbackContext, [jqXHR, statusText]);

				if (fireGlobals) {
					globalEventContext.trigger("ajaxComplete", [jqXHR, s]);

					// Handle the global AJAX counter
					if (! --jQuery.active) {
						jQuery.event.trigger("ajaxStop");
					}
				}
			}

			return jqXHR;
		},

		getJSON: function getJSON(url, data, callback) {
			return jQuery.get(url, data, callback, "json");
		},

		getScript: function getScript(url, callback) {
			return jQuery.get(url, undefined, callback, "script");
		}
	});

	jQuery.each(["get", "post"], function (_i, method) {
		jQuery[method] = function (url, data, callback, type) {

			// Shift arguments if data argument was omitted
			if (isFunction(data)) {
				type = type || callback;
				callback = data;
				data = undefined;
			}

			// The url can be an options object (which then must have .url)
			return jQuery.ajax(jQuery.extend({
				url: url,
				type: method,
				dataType: type,
				data: data,
				success: callback
			}, jQuery.isPlainObject(url) && url));
		};
	});

	jQuery.ajaxPrefilter(function (s) {
		var i;
		for (i in s.headers) {
			if (i.toLowerCase() === "content-type") {
				s.contentType = s.headers[i] || "";
			}
		}
	});

	jQuery._evalUrl = function (url, options, doc) {
		return jQuery.ajax({
			url: url,

			// Make this explicit, since user can override this through ajaxSetup (trac-11264)
			type: "GET",
			dataType: "script",
			cache: true,
			async: false,
			global: false,

			// Only evaluate the response if it is successful (gh-4126)
			// dataFilter is not invoked for failure responses, so using it instead
			// of the default converter is kludgy but it works.
			converters: {
				"text script": function textScript() {}
			},
			dataFilter: function dataFilter(response) {
				jQuery.globalEval(response, options, doc);
			}
		});
	};

	jQuery.fn.extend({
		wrapAll: function wrapAll(html) {
			var wrap;

			if (this[0]) {
				if (isFunction(html)) {
					html = html.call(this[0]);
				}

				// The elements to wrap the target around
				wrap = jQuery(html, this[0].ownerDocument).eq(0).clone(true);

				if (this[0].parentNode) {
					wrap.insertBefore(this[0]);
				}

				wrap.map(function () {
					var elem = this;

					while (elem.firstElementChild) {
						elem = elem.firstElementChild;
					}

					return elem;
				}).append(this);
			}

			return this;
		},

		wrapInner: function wrapInner(html) {
			if (isFunction(html)) {
				return this.each(function (i) {
					jQuery(this).wrapInner(html.call(this, i));
				});
			}

			return this.each(function () {
				var self = jQuery(this),
				    contents = self.contents();

				if (contents.length) {
					contents.wrapAll(html);
				} else {
					self.append(html);
				}
			});
		},

		wrap: function wrap(html) {
			var htmlIsFunction = isFunction(html);

			return this.each(function (i) {
				jQuery(this).wrapAll(htmlIsFunction ? html.call(this, i) : html);
			});
		},

		unwrap: function unwrap(selector) {
			this.parent(selector).not("body").each(function () {
				jQuery(this).replaceWith(this.childNodes);
			});
			return this;
		}
	});

	jQuery.expr.pseudos.hidden = function (elem) {
		return !jQuery.expr.pseudos.visible(elem);
	};
	jQuery.expr.pseudos.visible = function (elem) {
		return !!(elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length);
	};

	jQuery.ajaxSettings.xhr = function () {
		try {
			return new window.XMLHttpRequest();
		} catch (e) {}
	};

	var xhrSuccessStatus = {

		// File protocol always yields status code 0, assume 200
		0: 200,

		// Support: IE <=9 only
		// trac-1450: sometimes IE returns 1223 when it should be 204
		1223: 204
	},
	    xhrSupported = jQuery.ajaxSettings.xhr();

	support.cors = !!xhrSupported && "withCredentials" in xhrSupported;
	support.ajax = xhrSupported = !!xhrSupported;

	jQuery.ajaxTransport(function (options) {
		var _callback, errorCallback;

		// Cross domain only allowed if supported through XMLHttpRequest
		if (support.cors || xhrSupported && !options.crossDomain) {
			return {
				send: function send(headers, complete) {
					var i,
					    xhr = options.xhr();

					xhr.open(options.type, options.url, options.async, options.username, options.password);

					// Apply custom fields if provided
					if (options.xhrFields) {
						for (i in options.xhrFields) {
							xhr[i] = options.xhrFields[i];
						}
					}

					// Override mime type if needed
					if (options.mimeType && xhr.overrideMimeType) {
						xhr.overrideMimeType(options.mimeType);
					}

					// X-Requested-With header
					// For cross-domain requests, seeing as conditions for a preflight are
					// akin to a jigsaw puzzle, we simply never set it to be sure.
					// (it can always be set on a per-request basis or even using ajaxSetup)
					// For same-domain requests, won't change header if already provided.
					if (!options.crossDomain && !headers["X-Requested-With"]) {
						headers["X-Requested-With"] = "XMLHttpRequest";
					}

					// Set headers
					for (i in headers) {
						xhr.setRequestHeader(i, headers[i]);
					}

					// Callback
					_callback = function callback(type) {
						return function () {
							if (_callback) {
								_callback = errorCallback = xhr.onload = xhr.onerror = xhr.onabort = xhr.ontimeout = xhr.onreadystatechange = null;

								if (type === "abort") {
									xhr.abort();
								} else if (type === "error") {

									// Support: IE <=9 only
									// On a manual native abort, IE9 throws
									// errors on any property access that is not readyState
									if (typeof xhr.status !== "number") {
										complete(0, "error");
									} else {
										complete(

										// File: protocol always yields status 0; see trac-8605, trac-14207
										xhr.status, xhr.statusText);
									}
								} else {
									complete(xhrSuccessStatus[xhr.status] || xhr.status, xhr.statusText,

									// Support: IE <=9 only
									// IE9 has no XHR2 but throws on binary (trac-11426)
									// For XHR2 non-text, let the caller handle it (gh-2498)
									(xhr.responseType || "text") !== "text" || typeof xhr.responseText !== "string" ? { binary: xhr.response } : { text: xhr.responseText }, xhr.getAllResponseHeaders());
								}
							}
						};
					};

					// Listen to events
					xhr.onload = _callback();
					errorCallback = xhr.onerror = xhr.ontimeout = _callback("error");

					// Support: IE 9 only
					// Use onreadystatechange to replace onabort
					// to handle uncaught aborts
					if (xhr.onabort !== undefined) {
						xhr.onabort = errorCallback;
					} else {
						xhr.onreadystatechange = function () {

							// Check readyState before timeout as it changes
							if (xhr.readyState === 4) {

								// Allow onerror to be called first,
								// but that will not handle a native abort
								// Also, save errorCallback to a variable
								// as xhr.onerror cannot be accessed
								window.setTimeout(function () {
									if (_callback) {
										errorCallback();
									}
								});
							}
						};
					}

					// Create the abort callback
					_callback = _callback("abort");

					try {

						// Do send the request (this may raise an exception)
						xhr.send(options.hasContent && options.data || null);
					} catch (e) {

						// trac-14683: Only rethrow if this hasn't been notified as an error yet
						if (_callback) {
							throw e;
						}
					}
				},

				abort: function abort() {
					if (_callback) {
						_callback();
					}
				}
			};
		}
	});

	// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432)
	jQuery.ajaxPrefilter(function (s) {
		if (s.crossDomain) {
			s.contents.script = false;
		}
	});

	// Install script dataType
	jQuery.ajaxSetup({
		accepts: {
			script: "text/javascript, application/javascript, " + "application/ecmascript, application/x-ecmascript"
		},
		contents: {
			script: /\b(?:java|ecma)script\b/
		},
		converters: {
			"text script": function textScript(text) {
				jQuery.globalEval(text);
				return text;
			}
		}
	});

	// Handle cache's special case and crossDomain
	jQuery.ajaxPrefilter("script", function (s) {
		if (s.cache === undefined) {
			s.cache = false;
		}
		if (s.crossDomain) {
			s.type = "GET";
		}
	});

	// Bind script tag hack transport
	jQuery.ajaxTransport("script", function (s) {

		// This transport only deals with cross domain or forced-by-attrs requests
		if (s.crossDomain || s.scriptAttrs) {
			var script, _callback2;
			return {
				send: function send(_, complete) {
					script = jQuery("<script>").attr(s.scriptAttrs || {}).prop({ charset: s.scriptCharset, src: s.url }).on("load error", _callback2 = function callback(evt) {
						script.remove();
						_callback2 = null;
						if (evt) {
							complete(evt.type === "error" ? 404 : 200, evt.type);
						}
					});

					// Use native DOM manipulation to avoid our domManip AJAX trickery
					document.head.appendChild(script[0]);
				},
				abort: function abort() {
					if (_callback2) {
						_callback2();
					}
				}
			};
		}
	});

	var oldCallbacks = [],
	    rjsonp = /(=)\?(?=&|$)|\?\?/;

	// Default jsonp settings
	jQuery.ajaxSetup({
		jsonp: "callback",
		jsonpCallback: function jsonpCallback() {
			var callback = oldCallbacks.pop() || jQuery.expando + "_" + nonce.guid++;
			this[callback] = true;
			return callback;
		}
	});

	// Detect, normalize options and install callbacks for jsonp requests
	jQuery.ajaxPrefilter("json jsonp", function (s, originalSettings, jqXHR) {

		var callbackName,
		    overwritten,
		    responseContainer,
		    jsonProp = s.jsonp !== false && (rjsonp.test(s.url) ? "url" : typeof s.data === "string" && (s.contentType || "").indexOf("application/x-www-form-urlencoded") === 0 && rjsonp.test(s.data) && "data");

		// Handle iff the expected data type is "jsonp" or we have a parameter to set
		if (jsonProp || s.dataTypes[0] === "jsonp") {

			// Get callback name, remembering preexisting value associated with it
			callbackName = s.jsonpCallback = isFunction(s.jsonpCallback) ? s.jsonpCallback() : s.jsonpCallback;

			// Insert callback into url or form data
			if (jsonProp) {
				s[jsonProp] = s[jsonProp].replace(rjsonp, "$1" + callbackName);
			} else if (s.jsonp !== false) {
				s.url += (rquery.test(s.url) ? "&" : "?") + s.jsonp + "=" + callbackName;
			}

			// Use data converter to retrieve json after script execution
			s.converters["script json"] = function () {
				if (!responseContainer) {
					jQuery.error(callbackName + " was not called");
				}
				return responseContainer[0];
			};

			// Force json dataType
			s.dataTypes[0] = "json";

			// Install callback
			overwritten = window[callbackName];
			window[callbackName] = function () {
				responseContainer = arguments;
			};

			// Clean-up function (fires after converters)
			jqXHR.always(function () {

				// If previous value didn't exist - remove it
				if (overwritten === undefined) {
					jQuery(window).removeProp(callbackName);

					// Otherwise restore preexisting value
				} else {
					window[callbackName] = overwritten;
				}

				// Save back as free
				if (s[callbackName]) {

					// Make sure that re-using the options doesn't screw things around
					s.jsonpCallback = originalSettings.jsonpCallback;

					// Save the callback name for future use
					oldCallbacks.push(callbackName);
				}

				// Call if it was a function and we have a response
				if (responseContainer && isFunction(overwritten)) {
					overwritten(responseContainer[0]);
				}

				responseContainer = overwritten = undefined;
			});

			// Delegate to script
			return "script";
		}
	});

	// Support: Safari 8 only
	// In Safari 8 documents created via document.implementation.createHTMLDocument
	// collapse sibling forms: the second one becomes a child of the first one.
	// Because of that, this security measure has to be disabled in Safari 8.
	// https://bugs.webkit.org/show_bug.cgi?id=137337
	support.createHTMLDocument = function () {
		var body = document.implementation.createHTMLDocument("").body;
		body.innerHTML = "<form></form><form></form>";
		return body.childNodes.length === 2;
	}();

	// Argument "data" should be string of html
	// context (optional): If specified, the fragment will be created in this context,
	// defaults to document
	// keepScripts (optional): If true, will include scripts passed in the html string
	jQuery.parseHTML = function (data, context, keepScripts) {
		if (typeof data !== "string") {
			return [];
		}
		if (typeof context === "boolean") {
			keepScripts = context;
			context = false;
		}

		var base, parsed, scripts;

		if (!context) {

			// Stop scripts or inline event handlers from being executed immediately
			// by using document.implementation
			if (support.createHTMLDocument) {
				context = document.implementation.createHTMLDocument("");

				// Set the base href for the created document
				// so any parsed elements with URLs
				// are based on the document's URL (gh-2965)
				base = context.createElement("base");
				base.href = document.location.href;
				context.head.appendChild(base);
			} else {
				context = document;
			}
		}

		parsed = rsingleTag.exec(data);
		scripts = !keepScripts && [];

		// Single tag
		if (parsed) {
			return [context.createElement(parsed[1])];
		}

		parsed = buildFragment([data], context, scripts);

		if (scripts && scripts.length) {
			jQuery(scripts).remove();
		}

		return jQuery.merge([], parsed.childNodes);
	};

	/**
  * Load a url into a page
  */
	jQuery.fn.load = function (url, params, callback) {
		var selector,
		    type,
		    response,
		    self = this,
		    off = url.indexOf(" ");

		if (off > -1) {
			selector = stripAndCollapse(url.slice(off));
			url = url.slice(0, off);
		}

		// If it's a function
		if (isFunction(params)) {

			// We assume that it's the callback
			callback = params;
			params = undefined;

			// Otherwise, build a param string
		} else if (params && (typeof params === "undefined" ? "undefined" : _typeof(params)) === "object") {
			type = "POST";
		}

		// If we have elements to modify, make the request
		if (self.length > 0) {
			jQuery.ajax({
				url: url,

				// If "type" variable is undefined, then "GET" method will be used.
				// Make value of this field explicit since
				// user can override it through ajaxSetup method
				type: type || "GET",
				dataType: "html",
				data: params
			}).done(function (responseText) {

				// Save response for use in complete callback
				response = arguments;

				self.html(selector ?

				// If a selector was specified, locate the right elements in a dummy div
				// Exclude scripts to avoid IE 'Permission Denied' errors
				jQuery("<div>").append(jQuery.parseHTML(responseText)).find(selector) :

				// Otherwise use the full result
				responseText);

				// If the request succeeds, this function gets "data", "status", "jqXHR"
				// but they are ignored because response was set above.
				// If it fails, this function gets "jqXHR", "status", "error"
			}).always(callback && function (jqXHR, status) {
				self.each(function () {
					callback.apply(this, response || [jqXHR.responseText, status, jqXHR]);
				});
			});
		}

		return this;
	};

	jQuery.expr.pseudos.animated = function (elem) {
		return jQuery.grep(jQuery.timers, function (fn) {
			return elem === fn.elem;
		}).length;
	};

	jQuery.offset = {
		setOffset: function setOffset(elem, options, i) {
			var curPosition,
			    curLeft,
			    curCSSTop,
			    curTop,
			    curOffset,
			    curCSSLeft,
			    calculatePosition,
			    position = jQuery.css(elem, "position"),
			    curElem = jQuery(elem),
			    props = {};

			// Set position first, in-case top/left are set even on static elem
			if (position === "static") {
				elem.style.position = "relative";
			}

			curOffset = curElem.offset();
			curCSSTop = jQuery.css(elem, "top");
			curCSSLeft = jQuery.css(elem, "left");
			calculatePosition = (position === "absolute" || position === "fixed") && (curCSSTop + curCSSLeft).indexOf("auto") > -1;

			// Need to be able to calculate position if either
			// top or left is auto and position is either absolute or fixed
			if (calculatePosition) {
				curPosition = curElem.position();
				curTop = curPosition.top;
				curLeft = curPosition.left;
			} else {
				curTop = parseFloat(curCSSTop) || 0;
				curLeft = parseFloat(curCSSLeft) || 0;
			}

			if (isFunction(options)) {

				// Use jQuery.extend here to allow modification of coordinates argument (gh-1848)
				options = options.call(elem, i, jQuery.extend({}, curOffset));
			}

			if (options.top != null) {
				props.top = options.top - curOffset.top + curTop;
			}
			if (options.left != null) {
				props.left = options.left - curOffset.left + curLeft;
			}

			if ("using" in options) {
				options.using.call(elem, props);
			} else {
				curElem.css(props);
			}
		}
	};

	jQuery.fn.extend({

		// offset() relates an element's border box to the document origin
		offset: function offset(options) {

			// Preserve chaining for setter
			if (arguments.length) {
				return options === undefined ? this : this.each(function (i) {
					jQuery.offset.setOffset(this, options, i);
				});
			}

			var rect,
			    win,
			    elem = this[0];

			if (!elem) {
				return;
			}

			// Return zeros for disconnected and hidden (display: none) elements (gh-2310)
			// Support: IE <=11 only
			// Running getBoundingClientRect on a
			// disconnected node in IE throws an error
			if (!elem.getClientRects().length) {
				return { top: 0, left: 0 };
			}

			// Get document-relative position by adding viewport scroll to viewport-relative gBCR
			rect = elem.getBoundingClientRect();
			win = elem.ownerDocument.defaultView;
			return {
				top: rect.top + win.pageYOffset,
				left: rect.left + win.pageXOffset
			};
		},

		// position() relates an element's margin box to its offset parent's padding box
		// This corresponds to the behavior of CSS absolute positioning
		position: function position() {
			if (!this[0]) {
				return;
			}

			var offsetParent,
			    offset,
			    doc,
			    elem = this[0],
			    parentOffset = { top: 0, left: 0 };

			// position:fixed elements are offset from the viewport, which itself always has zero offset
			if (jQuery.css(elem, "position") === "fixed") {

				// Assume position:fixed implies availability of getBoundingClientRect
				offset = elem.getBoundingClientRect();
			} else {
				offset = this.offset();

				// Account for the *real* offset parent, which can be the document or its root element
				// when a statically positioned element is identified
				doc = elem.ownerDocument;
				offsetParent = elem.offsetParent || doc.documentElement;
				while (offsetParent && (offsetParent === doc.body || offsetParent === doc.documentElement) && jQuery.css(offsetParent, "position") === "static") {

					offsetParent = offsetParent.parentNode;
				}
				if (offsetParent && offsetParent !== elem && offsetParent.nodeType === 1) {

					// Incorporate borders into its offset, since they are outside its content origin
					parentOffset = jQuery(offsetParent).offset();
					parentOffset.top += jQuery.css(offsetParent, "borderTopWidth", true);
					parentOffset.left += jQuery.css(offsetParent, "borderLeftWidth", true);
				}
			}

			// Subtract parent offsets and element margins
			return {
				top: offset.top - parentOffset.top - jQuery.css(elem, "marginTop", true),
				left: offset.left - parentOffset.left - jQuery.css(elem, "marginLeft", true)
			};
		},

		// This method will return documentElement in the following cases:
		// 1) For the element inside the iframe without offsetParent, this method will return
		//    documentElement of the parent window
		// 2) For the hidden or detached element
		// 3) For body or html element, i.e. in case of the html node - it will return itself
		//
		// but those exceptions were never presented as a real life use-cases
		// and might be considered as more preferable results.
		//
		// This logic, however, is not guaranteed and can change at any point in the future
		offsetParent: function offsetParent() {
			return this.map(function () {
				var offsetParent = this.offsetParent;

				while (offsetParent && jQuery.css(offsetParent, "position") === "static") {
					offsetParent = offsetParent.offsetParent;
				}

				return offsetParent || documentElement;
			});
		}
	});

	// Create scrollLeft and scrollTop methods
	jQuery.each({ scrollLeft: "pageXOffset", scrollTop: "pageYOffset" }, function (method, prop) {
		var top = "pageYOffset" === prop;

		jQuery.fn[method] = function (val) {
			return access(this, function (elem, method, val) {

				// Coalesce documents and windows
				var win;
				if (isWindow(elem)) {
					win = elem;
				} else if (elem.nodeType === 9) {
					win = elem.defaultView;
				}

				if (val === undefined) {
					return win ? win[prop] : elem[method];
				}

				if (win) {
					win.scrollTo(!top ? val : win.pageXOffset, top ? val : win.pageYOffset);
				} else {
					elem[method] = val;
				}
			}, method, val, arguments.length);
		};
	});

	// Support: Safari <=7 - 9.1, Chrome <=37 - 49
	// Add the top/left cssHooks using jQuery.fn.position
	// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084
	// Blink bug: https://bugs.chromium.org/p/chromium/issues/detail?id=589347
	// getComputedStyle returns percent when specified for top/left/bottom/right;
	// rather than make the css module depend on the offset module, just check for it here
	jQuery.each(["top", "left"], function (_i, prop) {
		jQuery.cssHooks[prop] = addGetHookIf(support.pixelPosition, function (elem, computed) {
			if (computed) {
				computed = curCSS(elem, prop);

				// If curCSS returns percentage, fallback to offset
				return rnumnonpx.test(computed) ? jQuery(elem).position()[prop] + "px" : computed;
			}
		});
	});

	// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
	jQuery.each({ Height: "height", Width: "width" }, function (name, type) {
		jQuery.each({
			padding: "inner" + name,
			content: type,
			"": "outer" + name
		}, function (defaultExtra, funcName) {

			// Margin is only for outerHeight, outerWidth
			jQuery.fn[funcName] = function (margin, value) {
				var chainable = arguments.length && (defaultExtra || typeof margin !== "boolean"),
				    extra = defaultExtra || (margin === true || value === true ? "margin" : "border");

				return access(this, function (elem, type, value) {
					var doc;

					if (isWindow(elem)) {

						// $( window ).outerWidth/Height return w/h including scrollbars (gh-1729)
						return funcName.indexOf("outer") === 0 ? elem["inner" + name] : elem.document.documentElement["client" + name];
					}

					// Get document width or height
					if (elem.nodeType === 9) {
						doc = elem.documentElement;

						// Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],
						// whichever is greatest
						return Math.max(elem.body["scroll" + name], doc["scroll" + name], elem.body["offset" + name], doc["offset" + name], doc["client" + name]);
					}

					return value === undefined ?

					// Get width or height on the element, requesting but not forcing parseFloat
					jQuery.css(elem, type, extra) :

					// Set width or height on the element
					jQuery.style(elem, type, value, extra);
				}, type, chainable ? margin : undefined, chainable);
			};
		});
	});

	jQuery.each(["ajaxStart", "ajaxStop", "ajaxComplete", "ajaxError", "ajaxSuccess", "ajaxSend"], function (_i, type) {
		jQuery.fn[type] = function (fn) {
			return this.on(type, fn);
		};
	});

	jQuery.fn.extend({

		bind: function bind(types, data, fn) {
			return this.on(types, null, data, fn);
		},
		unbind: function unbind(types, fn) {
			return this.off(types, null, fn);
		},

		delegate: function delegate(selector, types, data, fn) {
			return this.on(types, selector, data, fn);
		},
		undelegate: function undelegate(selector, types, fn) {

			// ( namespace ) or ( selector, types [, fn] )
			return arguments.length === 1 ? this.off(selector, "**") : this.off(types, selector || "**", fn);
		},

		hover: function hover(fnOver, fnOut) {
			return this.mouseenter(fnOver).mouseleave(fnOut || fnOver);
		}
	});

	jQuery.each(("blur focus focusin focusout resize scroll click dblclick " + "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " + "change select submit keydown keypress keyup contextmenu").split(" "), function (_i, name) {

		// Handle event binding
		jQuery.fn[name] = function (data, fn) {
			return arguments.length > 0 ? this.on(name, null, data, fn) : this.trigger(name);
		};
	});

	// Support: Android <=4.0 only
	// Make sure we trim BOM and NBSP
	// Require that the "whitespace run" starts from a non-whitespace
	// to avoid O(N^2) behavior when the engine would try matching "\s+$" at each space position.
	var rtrim = /^[\s\uFEFF\xA0]+|([^\s\uFEFF\xA0])[\s\uFEFF\xA0]+$/g;

	// Bind a function to a context, optionally partially applying any
	// arguments.
	// jQuery.proxy is deprecated to promote standards (specifically Function#bind)
	// However, it is not slated for removal any time soon
	jQuery.proxy = function (fn, context) {
		var tmp, args, proxy;

		if (typeof context === "string") {
			tmp = fn[context];
			context = fn;
			fn = tmp;
		}

		// Quick check to determine if target is callable, in the spec
		// this throws a TypeError, but we will just return undefined.
		if (!isFunction(fn)) {
			return undefined;
		}

		// Simulated bind
		args = _slice.call(arguments, 2);
		proxy = function proxy() {
			return fn.apply(context || this, args.concat(_slice.call(arguments)));
		};

		// Set the guid of unique handler to the same of original handler, so it can be removed
		proxy.guid = fn.guid = fn.guid || jQuery.guid++;

		return proxy;
	};

	jQuery.holdReady = function (hold) {
		if (hold) {
			jQuery.readyWait++;
		} else {
			jQuery.ready(true);
		}
	};
	jQuery.isArray = Array.isArray;
	jQuery.parseJSON = JSON.parse;
	jQuery.nodeName = nodeName;
	jQuery.isFunction = isFunction;
	jQuery.isWindow = isWindow;
	jQuery.camelCase = camelCase;
	jQuery.type = toType;

	jQuery.now = Date.now;

	jQuery.isNumeric = function (obj) {

		// As of jQuery 3.0, isNumeric is limited to
		// strings and numbers (primitives or objects)
		// that can be coerced to finite numbers (gh-2662)
		var type = jQuery.type(obj);
		return (type === "number" || type === "string") &&

		// parseFloat NaNs numeric-cast false positives ("")
		// ...but misinterprets leading-number strings, particularly hex literals ("0x...")
		// subtraction forces infinities to NaN
		!isNaN(obj - parseFloat(obj));
	};

	jQuery.trim = function (text) {
		return text == null ? "" : (text + "").replace(rtrim, "$1");
	};

	// Register as a named AMD module, since jQuery can be concatenated with other
	// files that may use define, but not via a proper concatenation script that
	// understands anonymous AMD modules. A named AMD is safest and most robust
	// way to register. Lowercase jquery is used because AMD module names are
	// derived from file names, and jQuery is normally delivered in a lowercase
	// file name. Do this after creating the global so that if an AMD module wants
	// to call noConflict to hide this version of jQuery, it will work.

	// Note that for maximum portability, libraries that are not jQuery should
	// declare themselves as anonymous modules, and avoid setting a global if an
	// AMD loader is present. jQuery is a special case. For more information, see
	// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon

	if (true) {
		!(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_RESULT__ = (function () {
			return jQuery;
		}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),
				__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
	}

	var

	// Map over jQuery in case of overwrite
	_jQuery = window.jQuery,


	// Map over the $ in case of overwrite
	_$ = window.$;

	jQuery.noConflict = function (deep) {
		if (window.$ === jQuery) {
			window.$ = _$;
		}

		if (deep && window.jQuery === jQuery) {
			window.jQuery = _jQuery;
		}

		return jQuery;
	};

	// Expose jQuery and $ identifiers, even in AMD
	// (trac-7102#comment:10, https://github.com/jquery/jquery/pull/557)
	// and CommonJS for browser emulators (trac-13566)
	if (typeof noGlobal === "undefined") {
		window.jQuery = window.$ = jQuery;
	}

	return jQuery;
});
/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../webpack/buildin/module.js */ "./node_modules/webpack/buildin/module.js")(module)))/* WEBPACK VAR INJECTION */(function(global) {module.exports = global["$"] = __webpack_require__(/*! -!./node_modules/babel-loader/lib!./jquery.js */ "./node_modules/babel-loader/lib/index.js!./node_modules/jquery/dist/jquery.js");
/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js")))

/*!
	Zoom 1.7.21
	license: MIT
	http://www.jacklmoore.com/zoom
*/
(function ($) {
	var defaults = {
		url: false,
		callback: false,
		target: false,
		duration: 120,
		on: 'mouseover', // other options: grab, click, toggle
		touch: true, // enables a touch fallback
		onZoomIn: false,
		onZoomOut: false,
		magnify: 1
	};

	// Core Zoom Logic, independent of event listeners.
	$.zoom = function (target, source, img, magnify) {
		var targetHeight,
		    targetWidth,
		    sourceHeight,
		    sourceWidth,
		    xRatio,
		    yRatio,
		    offset,
		    $target = $(target),
		    position = $target.css('position'),
		    $source = $(source);

		// The parent element needs positioning so that the zoomed element can be correctly positioned within.
		target.style.position = /(absolute|fixed)/.test(position) ? position : 'relative';
		target.style.overflow = 'hidden';
		img.style.width = img.style.height = '';

		$(img).addClass('zoomImg').css({
			position: 'absolute',
			top: 0,
			left: 0,
			opacity: 0,
			width: img.width * magnify,
			height: img.height * magnify,
			border: 'none',
			maxWidth: 'none',
			maxHeight: 'none'
		}).appendTo(target);

		return {
			init: function init() {
				targetWidth = $target.outerWidth();
				targetHeight = $target.outerHeight();

				if (source === target) {
					sourceWidth = targetWidth;
					sourceHeight = targetHeight;
				} else {
					sourceWidth = $source.outerWidth();
					sourceHeight = $source.outerHeight();
				}

				xRatio = (img.width - targetWidth) / sourceWidth;
				yRatio = (img.height - targetHeight) / sourceHeight;

				offset = $source.offset();
			},
			move: function move(e) {
				var left = e.pageX - offset.left,
				    top = e.pageY - offset.top;

				top = Math.max(Math.min(top, sourceHeight), 0);
				left = Math.max(Math.min(left, sourceWidth), 0);

				img.style.left = left * -xRatio + 'px';
				img.style.top = top * -yRatio + 'px';
			}
		};
	};

	$.fn.zoom = function (options) {
		return this.each(function () {
			var settings = $.extend({}, defaults, options || {}),

			//target will display the zoomed image
			target = settings.target && $(settings.target)[0] || this,

			//source will provide zoom location info (thumbnail)
			source = this,
			    $source = $(source),
			    img = document.createElement('img'),
			    $img = $(img),
			    mousemove = 'mousemove.zoom',
			    clicked = false,
			    touched = false;

			// If a url wasn't specified, look for an image element.
			if (!settings.url) {
				var srcElement = source.querySelector('img');
				if (srcElement) {
					settings.url = srcElement.getAttribute('data-src') || srcElement.currentSrc || srcElement.src;
				}
				if (!settings.url) {
					return;
				}
			}

			$source.one('zoom.destroy', function (position, overflow) {
				$source.off(".zoom");
				target.style.position = position;
				target.style.overflow = overflow;
				img.onload = null;
				$img.remove();
			}.bind(this, target.style.position, target.style.overflow));

			img.onload = function () {
				var zoom = $.zoom(target, source, img, settings.magnify);

				function start(e) {
					zoom.init();
					zoom.move(e);

					// Skip the fade-in for IE8 and lower since it chokes on fading-in
					// and changing position based on mousemovement at the same time.
					$img.stop().fadeTo($.support.opacity ? settings.duration : 0, 1, $.isFunction(settings.onZoomIn) ? settings.onZoomIn.call(img) : false);
				}

				function stop() {
					$img.stop().fadeTo(settings.duration, 0, $.isFunction(settings.onZoomOut) ? settings.onZoomOut.call(img) : false);
				}

				// Mouse events
				if (settings.on === 'grab') {
					$source.on('mousedown.zoom', function (e) {
						if (e.which === 1) {
							$(document).one('mouseup.zoom', function () {
								stop();

								$(document).off(mousemove, zoom.move);
							});

							start(e);

							$(document).on(mousemove, zoom.move);

							e.preventDefault();
						}
					});
				} else if (settings.on === 'click') {
					$source.on('click.zoom', function (e) {
						if (clicked) {
							// bubble the event up to the document to trigger the unbind.
							return;
						} else {
							clicked = true;
							start(e);
							$(document).on(mousemove, zoom.move);
							$(document).one('click.zoom', function () {
								stop();
								clicked = false;
								$(document).off(mousemove, zoom.move);
							});
							return false;
						}
					});
				} else if (settings.on === 'toggle') {
					$source.on('click.zoom', function (e) {
						if (clicked) {
							stop();
						} else {
							start(e);
						}
						clicked = !clicked;
					});
				} else if (settings.on === 'mouseover') {
					zoom.init(); // Preemptively call init because IE7 will fire the mousemove handler before the hover handler.

					$source.on('mouseenter.zoom', start).on('mouseleave.zoom', stop).on(mousemove, zoom.move);
				}

				// Touch fallback
				if (settings.touch) {
					$source.on('touchstart.zoom', function (e) {
						e.preventDefault();
						if (touched) {
							touched = false;
							stop();
						} else {
							touched = true;
							start(e.originalEvent.touches[0] || e.originalEvent.changedTouches[0]);
						}
					}).on('touchmove.zoom', function (e) {
						e.preventDefault();
						zoom.move(e.originalEvent.touches[0] || e.originalEvent.changedTouches[0]);
					}).on('touchend.zoom', function (e) {
						e.preventDefault();
						if (touched) {
							touched = false;
							stop();
						}
					});
				}

				if ($.isFunction(settings.callback)) {
					settings.callback.call(img);
				}
			};

			img.setAttribute('role', 'presentation');
			img.alt = '';
			img.src = settings.url;
		});
	};

	$.fn.zoom.defaults = defaults;
})(window.jQuery);var __WEBPACK_AMD_DEFINE_RESULT__;

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; };

/*! Hammer.JS - v2.0.7 - 2016-04-22
 * http://hammerjs.github.io/
 *
 * Copyright (c) 2016 Jorik Tangelder;
 * Licensed under the MIT license */
(function (window, document, exportName, undefined) {
    'use strict';

    var VENDOR_PREFIXES = ['', 'webkit', 'Moz', 'MS', 'ms', 'o'];
    var TEST_ELEMENT = document.createElement('div');

    var TYPE_FUNCTION = 'function';

    var round = Math.round;
    var abs = Math.abs;
    var now = Date.now;

    /**
     * set a timeout with a given scope
     * @param {Function} fn
     * @param {Number} timeout
     * @param {Object} context
     * @returns {number}
     */
    function setTimeoutContext(fn, timeout, context) {
        return setTimeout(bindFn(fn, context), timeout);
    }

    /**
     * if the argument is an array, we want to execute the fn on each entry
     * if it aint an array we don't want to do a thing.
     * this is used by all the methods that accept a single and array argument.
     * @param {*|Array} arg
     * @param {String} fn
     * @param {Object} [context]
     * @returns {Boolean}
     */
    function invokeArrayArg(arg, fn, context) {
        if (Array.isArray(arg)) {
            each(arg, context[fn], context);
            return true;
        }
        return false;
    }

    /**
     * walk objects and arrays
     * @param {Object} obj
     * @param {Function} iterator
     * @param {Object} context
     */
    function each(obj, iterator, context) {
        var i;

        if (!obj) {
            return;
        }

        if (obj.forEach) {
            obj.forEach(iterator, context);
        } else if (obj.length !== undefined) {
            i = 0;
            while (i < obj.length) {
                iterator.call(context, obj[i], i, obj);
                i++;
            }
        } else {
            for (i in obj) {
                obj.hasOwnProperty(i) && iterator.call(context, obj[i], i, obj);
            }
        }
    }

    /**
     * wrap a method with a deprecation warning and stack trace
     * @param {Function} method
     * @param {String} name
     * @param {String} message
     * @returns {Function} A new function wrapping the supplied method.
     */
    function deprecate(method, name, message) {
        var deprecationMessage = 'DEPRECATED METHOD: ' + name + '\n' + message + ' AT \n';
        return function () {
            var e = new Error('get-stack-trace');
            var stack = e && e.stack ? e.stack.replace(/^[^\(]+?[\n$]/gm, '').replace(/^\s+at\s+/gm, '').replace(/^Object.<anonymous>\s*\(/gm, '{anonymous}()@') : 'Unknown Stack Trace';

            var log = window.console && (window.console.warn || window.console.log);
            if (log) {
                log.call(window.console, deprecationMessage, stack);
            }
            return method.apply(this, arguments);
        };
    }

    /**
     * extend object.
     * means that properties in dest will be overwritten by the ones in src.
     * @param {Object} target
     * @param {...Object} objects_to_assign
     * @returns {Object} target
     */
    var assign;
    if (typeof Object.assign !== 'function') {
        assign = function assign(target) {
            if (target === undefined || target === null) {
                throw new TypeError('Cannot convert undefined or null to object');
            }

            var output = Object(target);
            for (var index = 1; index < arguments.length; index++) {
                var source = arguments[index];
                if (source !== undefined && source !== null) {
                    for (var nextKey in source) {
                        if (source.hasOwnProperty(nextKey)) {
                            output[nextKey] = source[nextKey];
                        }
                    }
                }
            }
            return output;
        };
    } else {
        assign = Object.assign;
    }

    /**
     * extend object.
     * means that properties in dest will be overwritten by the ones in src.
     * @param {Object} dest
     * @param {Object} src
     * @param {Boolean} [merge=false]
     * @returns {Object} dest
     */
    var extend = deprecate(function extend(dest, src, merge) {
        var keys = Object.keys(src);
        var i = 0;
        while (i < keys.length) {
            if (!merge || merge && dest[keys[i]] === undefined) {
                dest[keys[i]] = src[keys[i]];
            }
            i++;
        }
        return dest;
    }, 'extend', 'Use `assign`.');

    /**
     * merge the values from src in the dest.
     * means that properties that exist in dest will not be overwritten by src
     * @param {Object} dest
     * @param {Object} src
     * @returns {Object} dest
     */
    var merge = deprecate(function merge(dest, src) {
        return extend(dest, src, true);
    }, 'merge', 'Use `assign`.');

    /**
     * simple class inheritance
     * @param {Function} child
     * @param {Function} base
     * @param {Object} [properties]
     */
    function inherit(child, base, properties) {
        var baseP = base.prototype,
            childP;

        childP = child.prototype = Object.create(baseP);
        childP.constructor = child;
        childP._super = baseP;

        if (properties) {
            assign(childP, properties);
        }
    }

    /**
     * simple function bind
     * @param {Function} fn
     * @param {Object} context
     * @returns {Function}
     */
    function bindFn(fn, context) {
        return function boundFn() {
            return fn.apply(context, arguments);
        };
    }

    /**
     * let a boolean value also be a function that must return a boolean
     * this first item in args will be used as the context
     * @param {Boolean|Function} val
     * @param {Array} [args]
     * @returns {Boolean}
     */
    function boolOrFn(val, args) {
        if ((typeof val === 'undefined' ? 'undefined' : _typeof(val)) == TYPE_FUNCTION) {
            return val.apply(args ? args[0] || undefined : undefined, args);
        }
        return val;
    }

    /**
     * use the val2 when val1 is undefined
     * @param {*} val1
     * @param {*} val2
     * @returns {*}
     */
    function ifUndefined(val1, val2) {
        return val1 === undefined ? val2 : val1;
    }

    /**
     * addEventListener with multiple events at once
     * @param {EventTarget} target
     * @param {String} types
     * @param {Function} handler
     */
    function addEventListeners(target, types, handler) {
        each(splitStr(types), function (type) {
            target.addEventListener(type, handler, false);
        });
    }

    /**
     * removeEventListener with multiple events at once
     * @param {EventTarget} target
     * @param {String} types
     * @param {Function} handler
     */
    function removeEventListeners(target, types, handler) {
        each(splitStr(types), function (type) {
            target.removeEventListener(type, handler, false);
        });
    }

    /**
     * find if a node is in the given parent
     * @method hasParent
     * @param {HTMLElement} node
     * @param {HTMLElement} parent
     * @return {Boolean} found
     */
    function hasParent(node, parent) {
        while (node) {
            if (node == parent) {
                return true;
            }
            node = node.parentNode;
        }
        return false;
    }

    /**
     * small indexOf wrapper
     * @param {String} str
     * @param {String} find
     * @returns {Boolean} found
     */
    function inStr(str, find) {
        return str.indexOf(find) > -1;
    }

    /**
     * split string on whitespace
     * @param {String} str
     * @returns {Array} words
     */
    function splitStr(str) {
        return str.trim().split(/\s+/g);
    }

    /**
     * find if a array contains the object using indexOf or a simple polyFill
     * @param {Array} src
     * @param {String} find
     * @param {String} [findByKey]
     * @return {Boolean|Number} false when not found, or the index
     */
    function inArray(src, find, findByKey) {
        if (src.indexOf && !findByKey) {
            return src.indexOf(find);
        } else {
            var i = 0;
            while (i < src.length) {
                if (findByKey && src[i][findByKey] == find || !findByKey && src[i] === find) {
                    return i;
                }
                i++;
            }
            return -1;
        }
    }

    /**
     * convert array-like objects to real arrays
     * @param {Object} obj
     * @returns {Array}
     */
    function toArray(obj) {
        return Array.prototype.slice.call(obj, 0);
    }

    /**
     * unique array with objects based on a key (like 'id') or just by the array's value
     * @param {Array} src [{id:1},{id:2},{id:1}]
     * @param {String} [key]
     * @param {Boolean} [sort=False]
     * @returns {Array} [{id:1},{id:2}]
     */
    function uniqueArray(src, key, sort) {
        var results = [];
        var values = [];
        var i = 0;

        while (i < src.length) {
            var val = key ? src[i][key] : src[i];
            if (inArray(values, val) < 0) {
                results.push(src[i]);
            }
            values[i] = val;
            i++;
        }

        if (sort) {
            if (!key) {
                results = results.sort();
            } else {
                results = results.sort(function sortUniqueArray(a, b) {
                    return a[key] > b[key];
                });
            }
        }

        return results;
    }

    /**
     * get the prefixed property
     * @param {Object} obj
     * @param {String} property
     * @returns {String|Undefined} prefixed
     */
    function prefixed(obj, property) {
        var prefix, prop;
        var camelProp = property[0].toUpperCase() + property.slice(1);

        var i = 0;
        while (i < VENDOR_PREFIXES.length) {
            prefix = VENDOR_PREFIXES[i];
            prop = prefix ? prefix + camelProp : property;

            if (prop in obj) {
                return prop;
            }
            i++;
        }
        return undefined;
    }

    /**
     * get a unique id
     * @returns {number} uniqueId
     */
    var _uniqueId = 1;
    function uniqueId() {
        return _uniqueId++;
    }

    /**
     * get the window object of an element
     * @param {HTMLElement} element
     * @returns {DocumentView|Window}
     */
    function getWindowForElement(element) {
        var doc = element.ownerDocument || element;
        return doc.defaultView || doc.parentWindow || window;
    }

    var MOBILE_REGEX = /mobile|tablet|ip(ad|hone|od)|android/i;

    var SUPPORT_TOUCH = 'ontouchstart' in window;
    var SUPPORT_POINTER_EVENTS = prefixed(window, 'PointerEvent') !== undefined;
    var SUPPORT_ONLY_TOUCH = SUPPORT_TOUCH && MOBILE_REGEX.test(navigator.userAgent);

    var INPUT_TYPE_TOUCH = 'touch';
    var INPUT_TYPE_PEN = 'pen';
    var INPUT_TYPE_MOUSE = 'mouse';
    var INPUT_TYPE_KINECT = 'kinect';

    var COMPUTE_INTERVAL = 25;

    var INPUT_START = 1;
    var INPUT_MOVE = 2;
    var INPUT_END = 4;
    var INPUT_CANCEL = 8;

    var DIRECTION_NONE = 1;
    var DIRECTION_LEFT = 2;
    var DIRECTION_RIGHT = 4;
    var DIRECTION_UP = 8;
    var DIRECTION_DOWN = 16;

    var DIRECTION_HORIZONTAL = DIRECTION_LEFT | DIRECTION_RIGHT;
    var DIRECTION_VERTICAL = DIRECTION_UP | DIRECTION_DOWN;
    var DIRECTION_ALL = DIRECTION_HORIZONTAL | DIRECTION_VERTICAL;

    var PROPS_XY = ['x', 'y'];
    var PROPS_CLIENT_XY = ['clientX', 'clientY'];

    /**
     * create new input type manager
     * @param {Manager} manager
     * @param {Function} callback
     * @returns {Input}
     * @constructor
     */
    function Input(manager, callback) {
        var self = this;
        this.manager = manager;
        this.callback = callback;
        this.element = manager.element;
        this.target = manager.options.inputTarget;

        // smaller wrapper around the handler, for the scope and the enabled state of the manager,
        // so when disabled the input events are completely bypassed.
        this.domHandler = function (ev) {
            if (boolOrFn(manager.options.enable, [manager])) {
                self.handler(ev);
            }
        };

        this.init();
    }

    Input.prototype = {
        /**
         * should handle the inputEvent data and trigger the callback
         * @virtual
         */
        handler: function handler() {},

        /**
         * bind the events
         */
        init: function init() {
            this.evEl && addEventListeners(this.element, this.evEl, this.domHandler);
            this.evTarget && addEventListeners(this.target, this.evTarget, this.domHandler);
            this.evWin && addEventListeners(getWindowForElement(this.element), this.evWin, this.domHandler);
        },

        /**
         * unbind the events
         */
        destroy: function destroy() {
            this.evEl && removeEventListeners(this.element, this.evEl, this.domHandler);
            this.evTarget && removeEventListeners(this.target, this.evTarget, this.domHandler);
            this.evWin && removeEventListeners(getWindowForElement(this.element), this.evWin, this.domHandler);
        }
    };

    /**
     * create new input type manager
     * called by the Manager constructor
     * @param {Hammer} manager
     * @returns {Input}
     */
    function createInputInstance(manager) {
        var Type;
        var inputClass = manager.options.inputClass;

        if (inputClass) {
            Type = inputClass;
        } else if (SUPPORT_POINTER_EVENTS) {
            Type = PointerEventInput;
        } else if (SUPPORT_ONLY_TOUCH) {
            Type = TouchInput;
        } else if (!SUPPORT_TOUCH) {
            Type = MouseInput;
        } else {
            Type = TouchMouseInput;
        }
        return new Type(manager, inputHandler);
    }

    /**
     * handle input events
     * @param {Manager} manager
     * @param {String} eventType
     * @param {Object} input
     */
    function inputHandler(manager, eventType, input) {
        var pointersLen = input.pointers.length;
        var changedPointersLen = input.changedPointers.length;
        var isFirst = eventType & INPUT_START && pointersLen - changedPointersLen === 0;
        var isFinal = eventType & (INPUT_END | INPUT_CANCEL) && pointersLen - changedPointersLen === 0;

        input.isFirst = !!isFirst;
        input.isFinal = !!isFinal;

        if (isFirst) {
            manager.session = {};
        }

        // source event is the normalized value of the domEvents
        // like 'touchstart, mouseup, pointerdown'
        input.eventType = eventType;

        // compute scale, rotation etc
        computeInputData(manager, input);

        // emit secret event
        manager.emit('hammer.input', input);

        manager.recognize(input);
        manager.session.prevInput = input;
    }

    /**
     * extend the data with some usable properties like scale, rotate, velocity etc
     * @param {Object} manager
     * @param {Object} input
     */
    function computeInputData(manager, input) {
        var session = manager.session;
        var pointers = input.pointers;
        var pointersLength = pointers.length;

        // store the first input to calculate the distance and direction
        if (!session.firstInput) {
            session.firstInput = simpleCloneInputData(input);
        }

        // to compute scale and rotation we need to store the multiple touches
        if (pointersLength > 1 && !session.firstMultiple) {
            session.firstMultiple = simpleCloneInputData(input);
        } else if (pointersLength === 1) {
            session.firstMultiple = false;
        }

        var firstInput = session.firstInput;
        var firstMultiple = session.firstMultiple;
        var offsetCenter = firstMultiple ? firstMultiple.center : firstInput.center;

        var center = input.center = getCenter(pointers);
        input.timeStamp = now();
        input.deltaTime = input.timeStamp - firstInput.timeStamp;

        input.angle = getAngle(offsetCenter, center);
        input.distance = getDistance(offsetCenter, center);

        computeDeltaXY(session, input);
        input.offsetDirection = getDirection(input.deltaX, input.deltaY);

        var overallVelocity = getVelocity(input.deltaTime, input.deltaX, input.deltaY);
        input.overallVelocityX = overallVelocity.x;
        input.overallVelocityY = overallVelocity.y;
        input.overallVelocity = abs(overallVelocity.x) > abs(overallVelocity.y) ? overallVelocity.x : overallVelocity.y;

        input.scale = firstMultiple ? getScale(firstMultiple.pointers, pointers) : 1;
        input.rotation = firstMultiple ? getRotation(firstMultiple.pointers, pointers) : 0;

        input.maxPointers = !session.prevInput ? input.pointers.length : input.pointers.length > session.prevInput.maxPointers ? input.pointers.length : session.prevInput.maxPointers;

        computeIntervalInputData(session, input);

        // find the correct target
        var target = manager.element;
        if (hasParent(input.srcEvent.target, target)) {
            target = input.srcEvent.target;
        }
        input.target = target;
    }

    function computeDeltaXY(session, input) {
        var center = input.center;
        var offset = session.offsetDelta || {};
        var prevDelta = session.prevDelta || {};
        var prevInput = session.prevInput || {};

        if (input.eventType === INPUT_START || prevInput.eventType === INPUT_END) {
            prevDelta = session.prevDelta = {
                x: prevInput.deltaX || 0,
                y: prevInput.deltaY || 0
            };

            offset = session.offsetDelta = {
                x: center.x,
                y: center.y
            };
        }

        input.deltaX = prevDelta.x + (center.x - offset.x);
        input.deltaY = prevDelta.y + (center.y - offset.y);
    }

    /**
     * velocity is calculated every x ms
     * @param {Object} session
     * @param {Object} input
     */
    function computeIntervalInputData(session, input) {
        var last = session.lastInterval || input,
            deltaTime = input.timeStamp - last.timeStamp,
            velocity,
            velocityX,
            velocityY,
            direction;

        if (input.eventType != INPUT_CANCEL && (deltaTime > COMPUTE_INTERVAL || last.velocity === undefined)) {
            var deltaX = input.deltaX - last.deltaX;
            var deltaY = input.deltaY - last.deltaY;

            var v = getVelocity(deltaTime, deltaX, deltaY);
            velocityX = v.x;
            velocityY = v.y;
            velocity = abs(v.x) > abs(v.y) ? v.x : v.y;
            direction = getDirection(deltaX, deltaY);

            session.lastInterval = input;
        } else {
            // use latest velocity info if it doesn't overtake a minimum period
            velocity = last.velocity;
            velocityX = last.velocityX;
            velocityY = last.velocityY;
            direction = last.direction;
        }

        input.velocity = velocity;
        input.velocityX = velocityX;
        input.velocityY = velocityY;
        input.direction = direction;
    }

    /**
     * create a simple clone from the input used for storage of firstInput and firstMultiple
     * @param {Object} input
     * @returns {Object} clonedInputData
     */
    function simpleCloneInputData(input) {
        // make a simple copy of the pointers because we will get a reference if we don't
        // we only need clientXY for the calculations
        var pointers = [];
        var i = 0;
        while (i < input.pointers.length) {
            pointers[i] = {
                clientX: round(input.pointers[i].clientX),
                clientY: round(input.pointers[i].clientY)
            };
            i++;
        }

        return {
            timeStamp: now(),
            pointers: pointers,
            center: getCenter(pointers),
            deltaX: input.deltaX,
            deltaY: input.deltaY
        };
    }

    /**
     * get the center of all the pointers
     * @param {Array} pointers
     * @return {Object} center contains `x` and `y` properties
     */
    function getCenter(pointers) {
        var pointersLength = pointers.length;

        // no need to loop when only one touch
        if (pointersLength === 1) {
            return {
                x: round(pointers[0].clientX),
                y: round(pointers[0].clientY)
            };
        }

        var x = 0,
            y = 0,
            i = 0;
        while (i < pointersLength) {
            x += pointers[i].clientX;
            y += pointers[i].clientY;
            i++;
        }

        return {
            x: round(x / pointersLength),
            y: round(y / pointersLength)
        };
    }

    /**
     * calculate the velocity between two points. unit is in px per ms.
     * @param {Number} deltaTime
     * @param {Number} x
     * @param {Number} y
     * @return {Object} velocity `x` and `y`
     */
    function getVelocity(deltaTime, x, y) {
        return {
            x: x / deltaTime || 0,
            y: y / deltaTime || 0
        };
    }

    /**
     * get the direction between two points
     * @param {Number} x
     * @param {Number} y
     * @return {Number} direction
     */
    function getDirection(x, y) {
        if (x === y) {
            return DIRECTION_NONE;
        }

        if (abs(x) >= abs(y)) {
            return x < 0 ? DIRECTION_LEFT : DIRECTION_RIGHT;
        }
        return y < 0 ? DIRECTION_UP : DIRECTION_DOWN;
    }

    /**
     * calculate the absolute distance between two points
     * @param {Object} p1 {x, y}
     * @param {Object} p2 {x, y}
     * @param {Array} [props] containing x and y keys
     * @return {Number} distance
     */
    function getDistance(p1, p2, props) {
        if (!props) {
            props = PROPS_XY;
        }
        var x = p2[props[0]] - p1[props[0]],
            y = p2[props[1]] - p1[props[1]];

        return Math.sqrt(x * x + y * y);
    }

    /**
     * calculate the angle between two coordinates
     * @param {Object} p1
     * @param {Object} p2
     * @param {Array} [props] containing x and y keys
     * @return {Number} angle
     */
    function getAngle(p1, p2, props) {
        if (!props) {
            props = PROPS_XY;
        }
        var x = p2[props[0]] - p1[props[0]],
            y = p2[props[1]] - p1[props[1]];
        return Math.atan2(y, x) * 180 / Math.PI;
    }

    /**
     * calculate the rotation degrees between two pointersets
     * @param {Array} start array of pointers
     * @param {Array} end array of pointers
     * @return {Number} rotation
     */
    function getRotation(start, end) {
        return getAngle(end[1], end[0], PROPS_CLIENT_XY) + getAngle(start[1], start[0], PROPS_CLIENT_XY);
    }

    /**
     * calculate the scale factor between two pointersets
     * no scale is 1, and goes down to 0 when pinched together, and bigger when pinched out
     * @param {Array} start array of pointers
     * @param {Array} end array of pointers
     * @return {Number} scale
     */
    function getScale(start, end) {
        return getDistance(end[0], end[1], PROPS_CLIENT_XY) / getDistance(start[0], start[1], PROPS_CLIENT_XY);
    }

    var MOUSE_INPUT_MAP = {
        mousedown: INPUT_START,
        mousemove: INPUT_MOVE,
        mouseup: INPUT_END
    };

    var MOUSE_ELEMENT_EVENTS = 'mousedown';
    var MOUSE_WINDOW_EVENTS = 'mousemove mouseup';

    /**
     * Mouse events input
     * @constructor
     * @extends Input
     */
    function MouseInput() {
        this.evEl = MOUSE_ELEMENT_EVENTS;
        this.evWin = MOUSE_WINDOW_EVENTS;

        this.pressed = false; // mousedown state

        Input.apply(this, arguments);
    }

    inherit(MouseInput, Input, {
        /**
         * handle mouse events
         * @param {Object} ev
         */
        handler: function MEhandler(ev) {
            var eventType = MOUSE_INPUT_MAP[ev.type];

            // on start we want to have the left mouse button down
            if (eventType & INPUT_START && ev.button === 0) {
                this.pressed = true;
            }

            if (eventType & INPUT_MOVE && ev.which !== 1) {
                eventType = INPUT_END;
            }

            // mouse must be down
            if (!this.pressed) {
                return;
            }

            if (eventType & INPUT_END) {
                this.pressed = false;
            }

            this.callback(this.manager, eventType, {
                pointers: [ev],
                changedPointers: [ev],
                pointerType: INPUT_TYPE_MOUSE,
                srcEvent: ev
            });
        }
    });

    var POINTER_INPUT_MAP = {
        pointerdown: INPUT_START,
        pointermove: INPUT_MOVE,
        pointerup: INPUT_END,
        pointercancel: INPUT_CANCEL,
        pointerout: INPUT_CANCEL
    };

    // in IE10 the pointer types is defined as an enum
    var IE10_POINTER_TYPE_ENUM = {
        2: INPUT_TYPE_TOUCH,
        3: INPUT_TYPE_PEN,
        4: INPUT_TYPE_MOUSE,
        5: INPUT_TYPE_KINECT // see https://twitter.com/jacobrossi/status/480596438489890816
    };

    var POINTER_ELEMENT_EVENTS = 'pointerdown';
    var POINTER_WINDOW_EVENTS = 'pointermove pointerup pointercancel';

    // IE10 has prefixed support, and case-sensitive
    if (window.MSPointerEvent && !window.PointerEvent) {
        POINTER_ELEMENT_EVENTS = 'MSPointerDown';
        POINTER_WINDOW_EVENTS = 'MSPointerMove MSPointerUp MSPointerCancel';
    }

    /**
     * Pointer events input
     * @constructor
     * @extends Input
     */
    function PointerEventInput() {
        this.evEl = POINTER_ELEMENT_EVENTS;
        this.evWin = POINTER_WINDOW_EVENTS;

        Input.apply(this, arguments);

        this.store = this.manager.session.pointerEvents = [];
    }

    inherit(PointerEventInput, Input, {
        /**
         * handle mouse events
         * @param {Object} ev
         */
        handler: function PEhandler(ev) {
            var store = this.store;
            var removePointer = false;

            var eventTypeNormalized = ev.type.toLowerCase().replace('ms', '');
            var eventType = POINTER_INPUT_MAP[eventTypeNormalized];
            var pointerType = IE10_POINTER_TYPE_ENUM[ev.pointerType] || ev.pointerType;

            var isTouch = pointerType == INPUT_TYPE_TOUCH;

            // get index of the event in the store
            var storeIndex = inArray(store, ev.pointerId, 'pointerId');

            // start and mouse must be down
            if (eventType & INPUT_START && (ev.button === 0 || isTouch)) {
                if (storeIndex < 0) {
                    store.push(ev);
                    storeIndex = store.length - 1;
                }
            } else if (eventType & (INPUT_END | INPUT_CANCEL)) {
                removePointer = true;
            }

            // it not found, so the pointer hasn't been down (so it's probably a hover)
            if (storeIndex < 0) {
                return;
            }

            // update the event in the store
            store[storeIndex] = ev;

            this.callback(this.manager, eventType, {
                pointers: store,
                changedPointers: [ev],
                pointerType: pointerType,
                srcEvent: ev
            });

            if (removePointer) {
                // remove from the store
                store.splice(storeIndex, 1);
            }
        }
    });

    var SINGLE_TOUCH_INPUT_MAP = {
        touchstart: INPUT_START,
        touchmove: INPUT_MOVE,
        touchend: INPUT_END,
        touchcancel: INPUT_CANCEL
    };

    var SINGLE_TOUCH_TARGET_EVENTS = 'touchstart';
    var SINGLE_TOUCH_WINDOW_EVENTS = 'touchstart touchmove touchend touchcancel';

    /**
     * Touch events input
     * @constructor
     * @extends Input
     */
    function SingleTouchInput() {
        this.evTarget = SINGLE_TOUCH_TARGET_EVENTS;
        this.evWin = SINGLE_TOUCH_WINDOW_EVENTS;
        this.started = false;

        Input.apply(this, arguments);
    }

    inherit(SingleTouchInput, Input, {
        handler: function TEhandler(ev) {
            var type = SINGLE_TOUCH_INPUT_MAP[ev.type];

            // should we handle the touch events?
            if (type === INPUT_START) {
                this.started = true;
            }

            if (!this.started) {
                return;
            }

            var touches = normalizeSingleTouches.call(this, ev, type);

            // when done, reset the started state
            if (type & (INPUT_END | INPUT_CANCEL) && touches[0].length - touches[1].length === 0) {
                this.started = false;
            }

            this.callback(this.manager, type, {
                pointers: touches[0],
                changedPointers: touches[1],
                pointerType: INPUT_TYPE_TOUCH,
                srcEvent: ev
            });
        }
    });

    /**
     * @this {TouchInput}
     * @param {Object} ev
     * @param {Number} type flag
     * @returns {undefined|Array} [all, changed]
     */
    function normalizeSingleTouches(ev, type) {
        var all = toArray(ev.touches);
        var changed = toArray(ev.changedTouches);

        if (type & (INPUT_END | INPUT_CANCEL)) {
            all = uniqueArray(all.concat(changed), 'identifier', true);
        }

        return [all, changed];
    }

    var TOUCH_INPUT_MAP = {
        touchstart: INPUT_START,
        touchmove: INPUT_MOVE,
        touchend: INPUT_END,
        touchcancel: INPUT_CANCEL
    };

    var TOUCH_TARGET_EVENTS = 'touchstart touchmove touchend touchcancel';

    /**
     * Multi-user touch events input
     * @constructor
     * @extends Input
     */
    function TouchInput() {
        this.evTarget = TOUCH_TARGET_EVENTS;
        this.targetIds = {};

        Input.apply(this, arguments);
    }

    inherit(TouchInput, Input, {
        handler: function MTEhandler(ev) {
            var type = TOUCH_INPUT_MAP[ev.type];
            var touches = getTouches.call(this, ev, type);
            if (!touches) {
                return;
            }

            this.callback(this.manager, type, {
                pointers: touches[0],
                changedPointers: touches[1],
                pointerType: INPUT_TYPE_TOUCH,
                srcEvent: ev
            });
        }
    });

    /**
     * @this {TouchInput}
     * @param {Object} ev
     * @param {Number} type flag
     * @returns {undefined|Array} [all, changed]
     */
    function getTouches(ev, type) {
        var allTouches = toArray(ev.touches);
        var targetIds = this.targetIds;

        // when there is only one touch, the process can be simplified
        if (type & (INPUT_START | INPUT_MOVE) && allTouches.length === 1) {
            targetIds[allTouches[0].identifier] = true;
            return [allTouches, allTouches];
        }

        var i,
            targetTouches,
            changedTouches = toArray(ev.changedTouches),
            changedTargetTouches = [],
            target = this.target;

        // get target touches from touches
        targetTouches = allTouches.filter(function (touch) {
            return hasParent(touch.target, target);
        });

        // collect touches
        if (type === INPUT_START) {
            i = 0;
            while (i < targetTouches.length) {
                targetIds[targetTouches[i].identifier] = true;
                i++;
            }
        }

        // filter changed touches to only contain touches that exist in the collected target ids
        i = 0;
        while (i < changedTouches.length) {
            if (targetIds[changedTouches[i].identifier]) {
                changedTargetTouches.push(changedTouches[i]);
            }

            // cleanup removed touches
            if (type & (INPUT_END | INPUT_CANCEL)) {
                delete targetIds[changedTouches[i].identifier];
            }
            i++;
        }

        if (!changedTargetTouches.length) {
            return;
        }

        return [
        // merge targetTouches with changedTargetTouches so it contains ALL touches, including 'end' and 'cancel'
        uniqueArray(targetTouches.concat(changedTargetTouches), 'identifier', true), changedTargetTouches];
    }

    /**
     * Combined touch and mouse input
     *
     * Touch has a higher priority then mouse, and while touching no mouse events are allowed.
     * This because touch devices also emit mouse events while doing a touch.
     *
     * @constructor
     * @extends Input
     */

    var DEDUP_TIMEOUT = 2500;
    var DEDUP_DISTANCE = 25;

    function TouchMouseInput() {
        Input.apply(this, arguments);

        var handler = bindFn(this.handler, this);
        this.touch = new TouchInput(this.manager, handler);
        this.mouse = new MouseInput(this.manager, handler);

        this.primaryTouch = null;
        this.lastTouches = [];
    }

    inherit(TouchMouseInput, Input, {
        /**
         * handle mouse and touch events
         * @param {Hammer} manager
         * @param {String} inputEvent
         * @param {Object} inputData
         */
        handler: function TMEhandler(manager, inputEvent, inputData) {
            var isTouch = inputData.pointerType == INPUT_TYPE_TOUCH,
                isMouse = inputData.pointerType == INPUT_TYPE_MOUSE;

            if (isMouse && inputData.sourceCapabilities && inputData.sourceCapabilities.firesTouchEvents) {
                return;
            }

            // when we're in a touch event, record touches to  de-dupe synthetic mouse event
            if (isTouch) {
                recordTouches.call(this, inputEvent, inputData);
            } else if (isMouse && isSyntheticEvent.call(this, inputData)) {
                return;
            }

            this.callback(manager, inputEvent, inputData);
        },

        /**
         * remove the event listeners
         */
        destroy: function destroy() {
            this.touch.destroy();
            this.mouse.destroy();
        }
    });

    function recordTouches(eventType, eventData) {
        if (eventType & INPUT_START) {
            this.primaryTouch = eventData.changedPointers[0].identifier;
            setLastTouch.call(this, eventData);
        } else if (eventType & (INPUT_END | INPUT_CANCEL)) {
            setLastTouch.call(this, eventData);
        }
    }

    function setLastTouch(eventData) {
        var touch = eventData.changedPointers[0];

        if (touch.identifier === this.primaryTouch) {
            var lastTouch = { x: touch.clientX, y: touch.clientY };
            this.lastTouches.push(lastTouch);
            var lts = this.lastTouches;
            var removeLastTouch = function removeLastTouch() {
                var i = lts.indexOf(lastTouch);
                if (i > -1) {
                    lts.splice(i, 1);
                }
            };
            setTimeout(removeLastTouch, DEDUP_TIMEOUT);
        }
    }

    function isSyntheticEvent(eventData) {
        var x = eventData.srcEvent.clientX,
            y = eventData.srcEvent.clientY;
        for (var i = 0; i < this.lastTouches.length; i++) {
            var t = this.lastTouches[i];
            var dx = Math.abs(x - t.x),
                dy = Math.abs(y - t.y);
            if (dx <= DEDUP_DISTANCE && dy <= DEDUP_DISTANCE) {
                return true;
            }
        }
        return false;
    }

    var PREFIXED_TOUCH_ACTION = prefixed(TEST_ELEMENT.style, 'touchAction');
    var NATIVE_TOUCH_ACTION = PREFIXED_TOUCH_ACTION !== undefined;

    // magical touchAction value
    var TOUCH_ACTION_COMPUTE = 'compute';
    var TOUCH_ACTION_AUTO = 'auto';
    var TOUCH_ACTION_MANIPULATION = 'manipulation'; // not implemented
    var TOUCH_ACTION_NONE = 'none';
    var TOUCH_ACTION_PAN_X = 'pan-x';
    var TOUCH_ACTION_PAN_Y = 'pan-y';
    var TOUCH_ACTION_MAP = getTouchActionProps();

    /**
     * Touch Action
     * sets the touchAction property or uses the js alternative
     * @param {Manager} manager
     * @param {String} value
     * @constructor
     */
    function TouchAction(manager, value) {
        this.manager = manager;
        this.set(value);
    }

    TouchAction.prototype = {
        /**
         * set the touchAction value on the element or enable the polyfill
         * @param {String} value
         */
        set: function set(value) {
            // find out the touch-action by the event handlers
            if (value == TOUCH_ACTION_COMPUTE) {
                value = this.compute();
            }

            if (NATIVE_TOUCH_ACTION && this.manager.element.style && TOUCH_ACTION_MAP[value]) {
                this.manager.element.style[PREFIXED_TOUCH_ACTION] = value;
            }
            this.actions = value.toLowerCase().trim();
        },

        /**
         * just re-set the touchAction value
         */
        update: function update() {
            this.set(this.manager.options.touchAction);
        },

        /**
         * compute the value for the touchAction property based on the recognizer's settings
         * @returns {String} value
         */
        compute: function compute() {
            var actions = [];
            each(this.manager.recognizers, function (recognizer) {
                if (boolOrFn(recognizer.options.enable, [recognizer])) {
                    actions = actions.concat(recognizer.getTouchAction());
                }
            });
            return cleanTouchActions(actions.join(' '));
        },

        /**
         * this method is called on each input cycle and provides the preventing of the browser behavior
         * @param {Object} input
         */
        preventDefaults: function preventDefaults(input) {
            var srcEvent = input.srcEvent;
            var direction = input.offsetDirection;

            // if the touch action did prevented once this session
            if (this.manager.session.prevented) {
                srcEvent.preventDefault();
                return;
            }

            var actions = this.actions;
            var hasNone = inStr(actions, TOUCH_ACTION_NONE) && !TOUCH_ACTION_MAP[TOUCH_ACTION_NONE];
            var hasPanY = inStr(actions, TOUCH_ACTION_PAN_Y) && !TOUCH_ACTION_MAP[TOUCH_ACTION_PAN_Y];
            var hasPanX = inStr(actions, TOUCH_ACTION_PAN_X) && !TOUCH_ACTION_MAP[TOUCH_ACTION_PAN_X];

            if (hasNone) {
                //do not prevent defaults if this is a tap gesture

                var isTapPointer = input.pointers.length === 1;
                var isTapMovement = input.distance < 2;
                var isTapTouchTime = input.deltaTime < 250;

                if (isTapPointer && isTapMovement && isTapTouchTime) {
                    return;
                }
            }

            if (hasPanX && hasPanY) {
                // `pan-x pan-y` means browser handles all scrolling/panning, do not prevent
                return;
            }

            if (hasNone || hasPanY && direction & DIRECTION_HORIZONTAL || hasPanX && direction & DIRECTION_VERTICAL) {
                return this.preventSrc(srcEvent);
            }
        },

        /**
         * call preventDefault to prevent the browser's default behavior (scrolling in most cases)
         * @param {Object} srcEvent
         */
        preventSrc: function preventSrc(srcEvent) {
            this.manager.session.prevented = true;
            srcEvent.preventDefault();
        }
    };

    /**
     * when the touchActions are collected they are not a valid value, so we need to clean things up. *
     * @param {String} actions
     * @returns {*}
     */
    function cleanTouchActions(actions) {
        // none
        if (inStr(actions, TOUCH_ACTION_NONE)) {
            return TOUCH_ACTION_NONE;
        }

        var hasPanX = inStr(actions, TOUCH_ACTION_PAN_X);
        var hasPanY = inStr(actions, TOUCH_ACTION_PAN_Y);

        // if both pan-x and pan-y are set (different recognizers
        // for different directions, e.g. horizontal pan but vertical swipe?)
        // we need none (as otherwise with pan-x pan-y combined none of these
        // recognizers will work, since the browser would handle all panning
        if (hasPanX && hasPanY) {
            return TOUCH_ACTION_NONE;
        }

        // pan-x OR pan-y
        if (hasPanX || hasPanY) {
            return hasPanX ? TOUCH_ACTION_PAN_X : TOUCH_ACTION_PAN_Y;
        }

        // manipulation
        if (inStr(actions, TOUCH_ACTION_MANIPULATION)) {
            return TOUCH_ACTION_MANIPULATION;
        }

        return TOUCH_ACTION_AUTO;
    }

    function getTouchActionProps() {
        if (!NATIVE_TOUCH_ACTION) {
            return false;
        }
        var touchMap = {};
        var cssSupports = window.CSS && window.CSS.supports;
        ['auto', 'manipulation', 'pan-y', 'pan-x', 'pan-x pan-y', 'none'].forEach(function (val) {

            // If css.supports is not supported but there is native touch-action assume it supports
            // all values. This is the case for IE 10 and 11.
            touchMap[val] = cssSupports ? window.CSS.supports('touch-action', val) : true;
        });
        return touchMap;
    }

    /**
     * Recognizer flow explained; *
     * All recognizers have the initial state of POSSIBLE when a input session starts.
     * The definition of a input session is from the first input until the last input, with all it's movement in it. *
     * Example session for mouse-input: mousedown -> mousemove -> mouseup
     *
     * On each recognizing cycle (see Manager.recognize) the .recognize() method is executed
     * which determines with state it should be.
     *
     * If the recognizer has the state FAILED, CANCELLED or RECOGNIZED (equals ENDED), it is reset to
     * POSSIBLE to give it another change on the next cycle.
     *
     *               Possible
     *                  |
     *            +-----+---------------+
     *            |                     |
     *      +-----+-----+               |
     *      |           |               |
     *   Failed      Cancelled          |
     *                          +-------+------+
     *                          |              |
     *                      Recognized       Began
     *                                         |
     *                                      Changed
     *                                         |
     *                                  Ended/Recognized
     */
    var STATE_POSSIBLE = 1;
    var STATE_BEGAN = 2;
    var STATE_CHANGED = 4;
    var STATE_ENDED = 8;
    var STATE_RECOGNIZED = STATE_ENDED;
    var STATE_CANCELLED = 16;
    var STATE_FAILED = 32;

    /**
     * Recognizer
     * Every recognizer needs to extend from this class.
     * @constructor
     * @param {Object} options
     */
    function Recognizer(options) {
        this.options = assign({}, this.defaults, options || {});

        this.id = uniqueId();

        this.manager = null;

        // default is enable true
        this.options.enable = ifUndefined(this.options.enable, true);

        this.state = STATE_POSSIBLE;

        this.simultaneous = {};
        this.requireFail = [];
    }

    Recognizer.prototype = {
        /**
         * @virtual
         * @type {Object}
         */
        defaults: {},

        /**
         * set options
         * @param {Object} options
         * @return {Recognizer}
         */
        set: function set(options) {
            assign(this.options, options);

            // also update the touchAction, in case something changed about the directions/enabled state
            this.manager && this.manager.touchAction.update();
            return this;
        },

        /**
         * recognize simultaneous with an other recognizer.
         * @param {Recognizer} otherRecognizer
         * @returns {Recognizer} this
         */
        recognizeWith: function recognizeWith(otherRecognizer) {
            if (invokeArrayArg(otherRecognizer, 'recognizeWith', this)) {
                return this;
            }

            var simultaneous = this.simultaneous;
            otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);
            if (!simultaneous[otherRecognizer.id]) {
                simultaneous[otherRecognizer.id] = otherRecognizer;
                otherRecognizer.recognizeWith(this);
            }
            return this;
        },

        /**
         * drop the simultaneous link. it doesnt remove the link on the other recognizer.
         * @param {Recognizer} otherRecognizer
         * @returns {Recognizer} this
         */
        dropRecognizeWith: function dropRecognizeWith(otherRecognizer) {
            if (invokeArrayArg(otherRecognizer, 'dropRecognizeWith', this)) {
                return this;
            }

            otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);
            delete this.simultaneous[otherRecognizer.id];
            return this;
        },

        /**
         * recognizer can only run when an other is failing
         * @param {Recognizer} otherRecognizer
         * @returns {Recognizer} this
         */
        requireFailure: function requireFailure(otherRecognizer) {
            if (invokeArrayArg(otherRecognizer, 'requireFailure', this)) {
                return this;
            }

            var requireFail = this.requireFail;
            otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);
            if (inArray(requireFail, otherRecognizer) === -1) {
                requireFail.push(otherRecognizer);
                otherRecognizer.requireFailure(this);
            }
            return this;
        },

        /**
         * drop the requireFailure link. it does not remove the link on the other recognizer.
         * @param {Recognizer} otherRecognizer
         * @returns {Recognizer} this
         */
        dropRequireFailure: function dropRequireFailure(otherRecognizer) {
            if (invokeArrayArg(otherRecognizer, 'dropRequireFailure', this)) {
                return this;
            }

            otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);
            var index = inArray(this.requireFail, otherRecognizer);
            if (index > -1) {
                this.requireFail.splice(index, 1);
            }
            return this;
        },

        /**
         * has require failures boolean
         * @returns {boolean}
         */
        hasRequireFailures: function hasRequireFailures() {
            return this.requireFail.length > 0;
        },

        /**
         * if the recognizer can recognize simultaneous with an other recognizer
         * @param {Recognizer} otherRecognizer
         * @returns {Boolean}
         */
        canRecognizeWith: function canRecognizeWith(otherRecognizer) {
            return !!this.simultaneous[otherRecognizer.id];
        },

        /**
         * You should use `tryEmit` instead of `emit` directly to check
         * that all the needed recognizers has failed before emitting.
         * @param {Object} input
         */
        emit: function emit(input) {
            var self = this;
            var state = this.state;

            function emit(event) {
                self.manager.emit(event, input);
            }

            // 'panstart' and 'panmove'
            if (state < STATE_ENDED) {
                emit(self.options.event + stateStr(state));
            }

            emit(self.options.event); // simple 'eventName' events

            if (input.additionalEvent) {
                // additional event(panleft, panright, pinchin, pinchout...)
                emit(input.additionalEvent);
            }

            // panend and pancancel
            if (state >= STATE_ENDED) {
                emit(self.options.event + stateStr(state));
            }
        },

        /**
         * Check that all the require failure recognizers has failed,
         * if true, it emits a gesture event,
         * otherwise, setup the state to FAILED.
         * @param {Object} input
         */
        tryEmit: function tryEmit(input) {
            if (this.canEmit()) {
                return this.emit(input);
            }
            // it's failing anyway
            this.state = STATE_FAILED;
        },

        /**
         * can we emit?
         * @returns {boolean}
         */
        canEmit: function canEmit() {
            var i = 0;
            while (i < this.requireFail.length) {
                if (!(this.requireFail[i].state & (STATE_FAILED | STATE_POSSIBLE))) {
                    return false;
                }
                i++;
            }
            return true;
        },

        /**
         * update the recognizer
         * @param {Object} inputData
         */
        recognize: function recognize(inputData) {
            // make a new copy of the inputData
            // so we can change the inputData without messing up the other recognizers
            var inputDataClone = assign({}, inputData);

            // is is enabled and allow recognizing?
            if (!boolOrFn(this.options.enable, [this, inputDataClone])) {
                this.reset();
                this.state = STATE_FAILED;
                return;
            }

            // reset when we've reached the end
            if (this.state & (STATE_RECOGNIZED | STATE_CANCELLED | STATE_FAILED)) {
                this.state = STATE_POSSIBLE;
            }

            this.state = this.process(inputDataClone);

            // the recognizer has recognized a gesture
            // so trigger an event
            if (this.state & (STATE_BEGAN | STATE_CHANGED | STATE_ENDED | STATE_CANCELLED)) {
                this.tryEmit(inputDataClone);
            }
        },

        /**
         * return the state of the recognizer
         * the actual recognizing happens in this method
         * @virtual
         * @param {Object} inputData
         * @returns {Const} STATE
         */
        process: function process(inputData) {}, // jshint ignore:line

        /**
         * return the preferred touch-action
         * @virtual
         * @returns {Array}
         */
        getTouchAction: function getTouchAction() {},

        /**
         * called when the gesture isn't allowed to recognize
         * like when another is being recognized or it is disabled
         * @virtual
         */
        reset: function reset() {}
    };

    /**
     * get a usable string, used as event postfix
     * @param {Const} state
     * @returns {String} state
     */
    function stateStr(state) {
        if (state & STATE_CANCELLED) {
            return 'cancel';
        } else if (state & STATE_ENDED) {
            return 'end';
        } else if (state & STATE_CHANGED) {
            return 'move';
        } else if (state & STATE_BEGAN) {
            return 'start';
        }
        return '';
    }

    /**
     * direction cons to string
     * @param {Const} direction
     * @returns {String}
     */
    function directionStr(direction) {
        if (direction == DIRECTION_DOWN) {
            return 'down';
        } else if (direction == DIRECTION_UP) {
            return 'up';
        } else if (direction == DIRECTION_LEFT) {
            return 'left';
        } else if (direction == DIRECTION_RIGHT) {
            return 'right';
        }
        return '';
    }

    /**
     * get a recognizer by name if it is bound to a manager
     * @param {Recognizer|String} otherRecognizer
     * @param {Recognizer} recognizer
     * @returns {Recognizer}
     */
    function getRecognizerByNameIfManager(otherRecognizer, recognizer) {
        var manager = recognizer.manager;
        if (manager) {
            return manager.get(otherRecognizer);
        }
        return otherRecognizer;
    }

    /**
     * This recognizer is just used as a base for the simple attribute recognizers.
     * @constructor
     * @extends Recognizer
     */
    function AttrRecognizer() {
        Recognizer.apply(this, arguments);
    }

    inherit(AttrRecognizer, Recognizer, {
        /**
         * @namespace
         * @memberof AttrRecognizer
         */
        defaults: {
            /**
             * @type {Number}
             * @default 1
             */
            pointers: 1
        },

        /**
         * Used to check if it the recognizer receives valid input, like input.distance > 10.
         * @memberof AttrRecognizer
         * @param {Object} input
         * @returns {Boolean} recognized
         */
        attrTest: function attrTest(input) {
            var optionPointers = this.options.pointers;
            return optionPointers === 0 || input.pointers.length === optionPointers;
        },

        /**
         * Process the input and return the state for the recognizer
         * @memberof AttrRecognizer
         * @param {Object} input
         * @returns {*} State
         */
        process: function process(input) {
            var state = this.state;
            var eventType = input.eventType;

            var isRecognized = state & (STATE_BEGAN | STATE_CHANGED);
            var isValid = this.attrTest(input);

            // on cancel input and we've recognized before, return STATE_CANCELLED
            if (isRecognized && (eventType & INPUT_CANCEL || !isValid)) {
                return state | STATE_CANCELLED;
            } else if (isRecognized || isValid) {
                if (eventType & INPUT_END) {
                    return state | STATE_ENDED;
                } else if (!(state & STATE_BEGAN)) {
                    return STATE_BEGAN;
                }
                return state | STATE_CHANGED;
            }
            return STATE_FAILED;
        }
    });

    /**
     * Pan
     * Recognized when the pointer is down and moved in the allowed direction.
     * @constructor
     * @extends AttrRecognizer
     */
    function PanRecognizer() {
        AttrRecognizer.apply(this, arguments);

        this.pX = null;
        this.pY = null;
    }

    inherit(PanRecognizer, AttrRecognizer, {
        /**
         * @namespace
         * @memberof PanRecognizer
         */
        defaults: {
            event: 'pan',
            threshold: 10,
            pointers: 1,
            direction: DIRECTION_ALL
        },

        getTouchAction: function getTouchAction() {
            var direction = this.options.direction;
            var actions = [];
            if (direction & DIRECTION_HORIZONTAL) {
                actions.push(TOUCH_ACTION_PAN_Y);
            }
            if (direction & DIRECTION_VERTICAL) {
                actions.push(TOUCH_ACTION_PAN_X);
            }
            return actions;
        },

        directionTest: function directionTest(input) {
            var options = this.options;
            var hasMoved = true;
            var distance = input.distance;
            var direction = input.direction;
            var x = input.deltaX;
            var y = input.deltaY;

            // lock to axis?
            if (!(direction & options.direction)) {
                if (options.direction & DIRECTION_HORIZONTAL) {
                    direction = x === 0 ? DIRECTION_NONE : x < 0 ? DIRECTION_LEFT : DIRECTION_RIGHT;
                    hasMoved = x != this.pX;
                    distance = Math.abs(input.deltaX);
                } else {
                    direction = y === 0 ? DIRECTION_NONE : y < 0 ? DIRECTION_UP : DIRECTION_DOWN;
                    hasMoved = y != this.pY;
                    distance = Math.abs(input.deltaY);
                }
            }
            input.direction = direction;
            return hasMoved && distance > options.threshold && direction & options.direction;
        },

        attrTest: function attrTest(input) {
            return AttrRecognizer.prototype.attrTest.call(this, input) && (this.state & STATE_BEGAN || !(this.state & STATE_BEGAN) && this.directionTest(input));
        },

        emit: function emit(input) {

            this.pX = input.deltaX;
            this.pY = input.deltaY;

            var direction = directionStr(input.direction);

            if (direction) {
                input.additionalEvent = this.options.event + direction;
            }
            this._super.emit.call(this, input);
        }
    });

    /**
     * Pinch
     * Recognized when two or more pointers are moving toward (zoom-in) or away from each other (zoom-out).
     * @constructor
     * @extends AttrRecognizer
     */
    function PinchRecognizer() {
        AttrRecognizer.apply(this, arguments);
    }

    inherit(PinchRecognizer, AttrRecognizer, {
        /**
         * @namespace
         * @memberof PinchRecognizer
         */
        defaults: {
            event: 'pinch',
            threshold: 0,
            pointers: 2
        },

        getTouchAction: function getTouchAction() {
            return [TOUCH_ACTION_NONE];
        },

        attrTest: function attrTest(input) {
            return this._super.attrTest.call(this, input) && (Math.abs(input.scale - 1) > this.options.threshold || this.state & STATE_BEGAN);
        },

        emit: function emit(input) {
            if (input.scale !== 1) {
                var inOut = input.scale < 1 ? 'in' : 'out';
                input.additionalEvent = this.options.event + inOut;
            }
            this._super.emit.call(this, input);
        }
    });

    /**
     * Press
     * Recognized when the pointer is down for x ms without any movement.
     * @constructor
     * @extends Recognizer
     */
    function PressRecognizer() {
        Recognizer.apply(this, arguments);

        this._timer = null;
        this._input = null;
    }

    inherit(PressRecognizer, Recognizer, {
        /**
         * @namespace
         * @memberof PressRecognizer
         */
        defaults: {
            event: 'press',
            pointers: 1,
            time: 251, // minimal time of the pointer to be pressed
            threshold: 9 // a minimal movement is ok, but keep it low
        },

        getTouchAction: function getTouchAction() {
            return [TOUCH_ACTION_AUTO];
        },

        process: function process(input) {
            var options = this.options;
            var validPointers = input.pointers.length === options.pointers;
            var validMovement = input.distance < options.threshold;
            var validTime = input.deltaTime > options.time;

            this._input = input;

            // we only allow little movement
            // and we've reached an end event, so a tap is possible
            if (!validMovement || !validPointers || input.eventType & (INPUT_END | INPUT_CANCEL) && !validTime) {
                this.reset();
            } else if (input.eventType & INPUT_START) {
                this.reset();
                this._timer = setTimeoutContext(function () {
                    this.state = STATE_RECOGNIZED;
                    this.tryEmit();
                }, options.time, this);
            } else if (input.eventType & INPUT_END) {
                return STATE_RECOGNIZED;
            }
            return STATE_FAILED;
        },

        reset: function reset() {
            clearTimeout(this._timer);
        },

        emit: function emit(input) {
            if (this.state !== STATE_RECOGNIZED) {
                return;
            }

            if (input && input.eventType & INPUT_END) {
                this.manager.emit(this.options.event + 'up', input);
            } else {
                this._input.timeStamp = now();
                this.manager.emit(this.options.event, this._input);
            }
        }
    });

    /**
     * Rotate
     * Recognized when two or more pointer are moving in a circular motion.
     * @constructor
     * @extends AttrRecognizer
     */
    function RotateRecognizer() {
        AttrRecognizer.apply(this, arguments);
    }

    inherit(RotateRecognizer, AttrRecognizer, {
        /**
         * @namespace
         * @memberof RotateRecognizer
         */
        defaults: {
            event: 'rotate',
            threshold: 0,
            pointers: 2
        },

        getTouchAction: function getTouchAction() {
            return [TOUCH_ACTION_NONE];
        },

        attrTest: function attrTest(input) {
            return this._super.attrTest.call(this, input) && (Math.abs(input.rotation) > this.options.threshold || this.state & STATE_BEGAN);
        }
    });

    /**
     * Swipe
     * Recognized when the pointer is moving fast (velocity), with enough distance in the allowed direction.
     * @constructor
     * @extends AttrRecognizer
     */
    function SwipeRecognizer() {
        AttrRecognizer.apply(this, arguments);
    }

    inherit(SwipeRecognizer, AttrRecognizer, {
        /**
         * @namespace
         * @memberof SwipeRecognizer
         */
        defaults: {
            event: 'swipe',
            threshold: 10,
            velocity: 0.3,
            direction: DIRECTION_HORIZONTAL | DIRECTION_VERTICAL,
            pointers: 1
        },

        getTouchAction: function getTouchAction() {
            return PanRecognizer.prototype.getTouchAction.call(this);
        },

        attrTest: function attrTest(input) {
            var direction = this.options.direction;
            var velocity;

            if (direction & (DIRECTION_HORIZONTAL | DIRECTION_VERTICAL)) {
                velocity = input.overallVelocity;
            } else if (direction & DIRECTION_HORIZONTAL) {
                velocity = input.overallVelocityX;
            } else if (direction & DIRECTION_VERTICAL) {
                velocity = input.overallVelocityY;
            }

            return this._super.attrTest.call(this, input) && direction & input.offsetDirection && input.distance > this.options.threshold && input.maxPointers == this.options.pointers && abs(velocity) > this.options.velocity && input.eventType & INPUT_END;
        },

        emit: function emit(input) {
            var direction = directionStr(input.offsetDirection);
            if (direction) {
                this.manager.emit(this.options.event + direction, input);
            }

            this.manager.emit(this.options.event, input);
        }
    });

    /**
     * A tap is ecognized when the pointer is doing a small tap/click. Multiple taps are recognized if they occur
     * between the given interval and position. The delay option can be used to recognize multi-taps without firing
     * a single tap.
     *
     * The eventData from the emitted event contains the property `tapCount`, which contains the amount of
     * multi-taps being recognized.
     * @constructor
     * @extends Recognizer
     */
    function TapRecognizer() {
        Recognizer.apply(this, arguments);

        // previous time and center,
        // used for tap counting
        this.pTime = false;
        this.pCenter = false;

        this._timer = null;
        this._input = null;
        this.count = 0;
    }

    inherit(TapRecognizer, Recognizer, {
        /**
         * @namespace
         * @memberof PinchRecognizer
         */
        defaults: {
            event: 'tap',
            pointers: 1,
            taps: 1,
            interval: 300, // max time between the multi-tap taps
            time: 250, // max time of the pointer to be down (like finger on the screen)
            threshold: 9, // a minimal movement is ok, but keep it low
            posThreshold: 10 // a multi-tap can be a bit off the initial position
        },

        getTouchAction: function getTouchAction() {
            return [TOUCH_ACTION_MANIPULATION];
        },

        process: function process(input) {
            var options = this.options;

            var validPointers = input.pointers.length === options.pointers;
            var validMovement = input.distance < options.threshold;
            var validTouchTime = input.deltaTime < options.time;

            this.reset();

            if (input.eventType & INPUT_START && this.count === 0) {
                return this.failTimeout();
            }

            // we only allow little movement
            // and we've reached an end event, so a tap is possible
            if (validMovement && validTouchTime && validPointers) {
                if (input.eventType != INPUT_END) {
                    return this.failTimeout();
                }

                var validInterval = this.pTime ? input.timeStamp - this.pTime < options.interval : true;
                var validMultiTap = !this.pCenter || getDistance(this.pCenter, input.center) < options.posThreshold;

                this.pTime = input.timeStamp;
                this.pCenter = input.center;

                if (!validMultiTap || !validInterval) {
                    this.count = 1;
                } else {
                    this.count += 1;
                }

                this._input = input;

                // if tap count matches we have recognized it,
                // else it has began recognizing...
                var tapCount = this.count % options.taps;
                if (tapCount === 0) {
                    // no failing requirements, immediately trigger the tap event
                    // or wait as long as the multitap interval to trigger
                    if (!this.hasRequireFailures()) {
                        return STATE_RECOGNIZED;
                    } else {
                        this._timer = setTimeoutContext(function () {
                            this.state = STATE_RECOGNIZED;
                            this.tryEmit();
                        }, options.interval, this);
                        return STATE_BEGAN;
                    }
                }
            }
            return STATE_FAILED;
        },

        failTimeout: function failTimeout() {
            this._timer = setTimeoutContext(function () {
                this.state = STATE_FAILED;
            }, this.options.interval, this);
            return STATE_FAILED;
        },

        reset: function reset() {
            clearTimeout(this._timer);
        },

        emit: function emit() {
            if (this.state == STATE_RECOGNIZED) {
                this._input.tapCount = this.count;
                this.manager.emit(this.options.event, this._input);
            }
        }
    });

    /**
     * Simple way to create a manager with a default set of recognizers.
     * @param {HTMLElement} element
     * @param {Object} [options]
     * @constructor
     */
    function Hammer(element, options) {
        options = options || {};
        options.recognizers = ifUndefined(options.recognizers, Hammer.defaults.preset);
        return new Manager(element, options);
    }

    /**
     * @const {string}
     */
    Hammer.VERSION = '2.0.7';

    /**
     * default settings
     * @namespace
     */
    Hammer.defaults = {
        /**
         * set if DOM events are being triggered.
         * But this is slower and unused by simple implementations, so disabled by default.
         * @type {Boolean}
         * @default false
         */
        domEvents: false,

        /**
         * The value for the touchAction property/fallback.
         * When set to `compute` it will magically set the correct value based on the added recognizers.
         * @type {String}
         * @default compute
         */
        touchAction: TOUCH_ACTION_COMPUTE,

        /**
         * @type {Boolean}
         * @default true
         */
        enable: true,

        /**
         * EXPERIMENTAL FEATURE -- can be removed/changed
         * Change the parent input target element.
         * If Null, then it is being set the to main element.
         * @type {Null|EventTarget}
         * @default null
         */
        inputTarget: null,

        /**
         * force an input class
         * @type {Null|Function}
         * @default null
         */
        inputClass: null,

        /**
         * Default recognizer setup when calling `Hammer()`
         * When creating a new Manager these will be skipped.
         * @type {Array}
         */
        preset: [
        // RecognizerClass, options, [recognizeWith, ...], [requireFailure, ...]
        [RotateRecognizer, { enable: false }], [PinchRecognizer, { enable: false }, ['rotate']], [SwipeRecognizer, { direction: DIRECTION_HORIZONTAL }], [PanRecognizer, { direction: DIRECTION_HORIZONTAL }, ['swipe']], [TapRecognizer], [TapRecognizer, { event: 'doubletap', taps: 2 }, ['tap']], [PressRecognizer]],

        /**
         * Some CSS properties can be used to improve the working of Hammer.
         * Add them to this method and they will be set when creating a new Manager.
         * @namespace
         */
        cssProps: {
            /**
             * Disables text selection to improve the dragging gesture. Mainly for desktop browsers.
             * @type {String}
             * @default 'none'
             */
            userSelect: 'none',

            /**
             * Disable the Windows Phone grippers when pressing an element.
             * @type {String}
             * @default 'none'
             */
            touchSelect: 'none',

            /**
             * Disables the default callout shown when you touch and hold a touch target.
             * On iOS, when you touch and hold a touch target such as a link, Safari displays
             * a callout containing information about the link. This property allows you to disable that callout.
             * @type {String}
             * @default 'none'
             */
            touchCallout: 'none',

            /**
             * Specifies whether zooming is enabled. Used by IE10>
             * @type {String}
             * @default 'none'
             */
            contentZooming: 'none',

            /**
             * Specifies that an entire element should be draggable instead of its contents. Mainly for desktop browsers.
             * @type {String}
             * @default 'none'
             */
            userDrag: 'none',

            /**
             * Overrides the highlight color shown when the user taps a link or a JavaScript
             * clickable element in iOS. This property obeys the alpha value, if specified.
             * @type {String}
             * @default 'rgba(0,0,0,0)'
             */
            tapHighlightColor: 'rgba(0,0,0,0)'
        }
    };

    var STOP = 1;
    var FORCED_STOP = 2;

    /**
     * Manager
     * @param {HTMLElement} element
     * @param {Object} [options]
     * @constructor
     */
    function Manager(element, options) {
        this.options = assign({}, Hammer.defaults, options || {});

        this.options.inputTarget = this.options.inputTarget || element;

        this.handlers = {};
        this.session = {};
        this.recognizers = [];
        this.oldCssProps = {};

        this.element = element;
        this.input = createInputInstance(this);
        this.touchAction = new TouchAction(this, this.options.touchAction);

        toggleCssProps(this, true);

        each(this.options.recognizers, function (item) {
            var recognizer = this.add(new item[0](item[1]));
            item[2] && recognizer.recognizeWith(item[2]);
            item[3] && recognizer.requireFailure(item[3]);
        }, this);
    }

    Manager.prototype = {
        /**
         * set options
         * @param {Object} options
         * @returns {Manager}
         */
        set: function set(options) {
            assign(this.options, options);

            // Options that need a little more setup
            if (options.touchAction) {
                this.touchAction.update();
            }
            if (options.inputTarget) {
                // Clean up existing event listeners and reinitialize
                this.input.destroy();
                this.input.target = options.inputTarget;
                this.input.init();
            }
            return this;
        },

        /**
         * stop recognizing for this session.
         * This session will be discarded, when a new [input]start event is fired.
         * When forced, the recognizer cycle is stopped immediately.
         * @param {Boolean} [force]
         */
        stop: function stop(force) {
            this.session.stopped = force ? FORCED_STOP : STOP;
        },

        /**
         * run the recognizers!
         * called by the inputHandler function on every movement of the pointers (touches)
         * it walks through all the recognizers and tries to detect the gesture that is being made
         * @param {Object} inputData
         */
        recognize: function recognize(inputData) {
            var session = this.session;
            if (session.stopped) {
                return;
            }

            // run the touch-action polyfill
            this.touchAction.preventDefaults(inputData);

            var recognizer;
            var recognizers = this.recognizers;

            // this holds the recognizer that is being recognized.
            // so the recognizer's state needs to be BEGAN, CHANGED, ENDED or RECOGNIZED
            // if no recognizer is detecting a thing, it is set to `null`
            var curRecognizer = session.curRecognizer;

            // reset when the last recognizer is recognized
            // or when we're in a new session
            if (!curRecognizer || curRecognizer && curRecognizer.state & STATE_RECOGNIZED) {
                curRecognizer = session.curRecognizer = null;
            }

            var i = 0;
            while (i < recognizers.length) {
                recognizer = recognizers[i];

                // find out if we are allowed try to recognize the input for this one.
                // 1.   allow if the session is NOT forced stopped (see the .stop() method)
                // 2.   allow if we still haven't recognized a gesture in this session, or the this recognizer is the one
                //      that is being recognized.
                // 3.   allow if the recognizer is allowed to run simultaneous with the current recognized recognizer.
                //      this can be setup with the `recognizeWith()` method on the recognizer.
                if (session.stopped !== FORCED_STOP && ( // 1
                !curRecognizer || recognizer == curRecognizer || // 2
                recognizer.canRecognizeWith(curRecognizer))) {
                    // 3
                    recognizer.recognize(inputData);
                } else {
                    recognizer.reset();
                }

                // if the recognizer has been recognizing the input as a valid gesture, we want to store this one as the
                // current active recognizer. but only if we don't already have an active recognizer
                if (!curRecognizer && recognizer.state & (STATE_BEGAN | STATE_CHANGED | STATE_ENDED)) {
                    curRecognizer = session.curRecognizer = recognizer;
                }
                i++;
            }
        },

        /**
         * get a recognizer by its event name.
         * @param {Recognizer|String} recognizer
         * @returns {Recognizer|Null}
         */
        get: function get(recognizer) {
            if (recognizer instanceof Recognizer) {
                return recognizer;
            }

            var recognizers = this.recognizers;
            for (var i = 0; i < recognizers.length; i++) {
                if (recognizers[i].options.event == recognizer) {
                    return recognizers[i];
                }
            }
            return null;
        },

        /**
         * add a recognizer to the manager
         * existing recognizers with the same event name will be removed
         * @param {Recognizer} recognizer
         * @returns {Recognizer|Manager}
         */
        add: function add(recognizer) {
            if (invokeArrayArg(recognizer, 'add', this)) {
                return this;
            }

            // remove existing
            var existing = this.get(recognizer.options.event);
            if (existing) {
                this.remove(existing);
            }

            this.recognizers.push(recognizer);
            recognizer.manager = this;

            this.touchAction.update();
            return recognizer;
        },

        /**
         * remove a recognizer by name or instance
         * @param {Recognizer|String} recognizer
         * @returns {Manager}
         */
        remove: function remove(recognizer) {
            if (invokeArrayArg(recognizer, 'remove', this)) {
                return this;
            }

            recognizer = this.get(recognizer);

            // let's make sure this recognizer exists
            if (recognizer) {
                var recognizers = this.recognizers;
                var index = inArray(recognizers, recognizer);

                if (index !== -1) {
                    recognizers.splice(index, 1);
                    this.touchAction.update();
                }
            }

            return this;
        },

        /**
         * bind event
         * @param {String} events
         * @param {Function} handler
         * @returns {EventEmitter} this
         */
        on: function on(events, handler) {
            if (events === undefined) {
                return;
            }
            if (handler === undefined) {
                return;
            }

            var handlers = this.handlers;
            each(splitStr(events), function (event) {
                handlers[event] = handlers[event] || [];
                handlers[event].push(handler);
            });
            return this;
        },

        /**
         * unbind event, leave emit blank to remove all handlers
         * @param {String} events
         * @param {Function} [handler]
         * @returns {EventEmitter} this
         */
        off: function off(events, handler) {
            if (events === undefined) {
                return;
            }

            var handlers = this.handlers;
            each(splitStr(events), function (event) {
                if (!handler) {
                    delete handlers[event];
                } else {
                    handlers[event] && handlers[event].splice(inArray(handlers[event], handler), 1);
                }
            });
            return this;
        },

        /**
         * emit event to the listeners
         * @param {String} event
         * @param {Object} data
         */
        emit: function emit(event, data) {
            // we also want to trigger dom events
            if (this.options.domEvents) {
                triggerDomEvent(event, data);
            }

            // no handlers, so skip it all
            var handlers = this.handlers[event] && this.handlers[event].slice();
            if (!handlers || !handlers.length) {
                return;
            }

            data.type = event;
            data.preventDefault = function () {
                data.srcEvent.preventDefault();
            };

            var i = 0;
            while (i < handlers.length) {
                handlers[i](data);
                i++;
            }
        },

        /**
         * destroy the manager and unbinds all events
         * it doesn't unbind dom events, that is the user own responsibility
         */
        destroy: function destroy() {
            this.element && toggleCssProps(this, false);

            this.handlers = {};
            this.session = {};
            this.input.destroy();
            this.element = null;
        }
    };

    /**
     * add/remove the css properties as defined in manager.options.cssProps
     * @param {Manager} manager
     * @param {Boolean} add
     */
    function toggleCssProps(manager, add) {
        var element = manager.element;
        if (!element.style) {
            return;
        }
        var prop;
        each(manager.options.cssProps, function (value, name) {
            prop = prefixed(element.style, name);
            if (add) {
                manager.oldCssProps[prop] = element.style[prop];
                element.style[prop] = value;
            } else {
                element.style[prop] = manager.oldCssProps[prop] || '';
            }
        });
        if (!add) {
            manager.oldCssProps = {};
        }
    }

    /**
     * trigger dom event
     * @param {String} event
     * @param {Object} data
     */
    function triggerDomEvent(event, data) {
        var gestureEvent = document.createEvent('Event');
        gestureEvent.initEvent(event, true, true);
        gestureEvent.gesture = data;
        data.target.dispatchEvent(gestureEvent);
    }

    assign(Hammer, {
        INPUT_START: INPUT_START,
        INPUT_MOVE: INPUT_MOVE,
        INPUT_END: INPUT_END,
        INPUT_CANCEL: INPUT_CANCEL,

        STATE_POSSIBLE: STATE_POSSIBLE,
        STATE_BEGAN: STATE_BEGAN,
        STATE_CHANGED: STATE_CHANGED,
        STATE_ENDED: STATE_ENDED,
        STATE_RECOGNIZED: STATE_RECOGNIZED,
        STATE_CANCELLED: STATE_CANCELLED,
        STATE_FAILED: STATE_FAILED,

        DIRECTION_NONE: DIRECTION_NONE,
        DIRECTION_LEFT: DIRECTION_LEFT,
        DIRECTION_RIGHT: DIRECTION_RIGHT,
        DIRECTION_UP: DIRECTION_UP,
        DIRECTION_DOWN: DIRECTION_DOWN,
        DIRECTION_HORIZONTAL: DIRECTION_HORIZONTAL,
        DIRECTION_VERTICAL: DIRECTION_VERTICAL,
        DIRECTION_ALL: DIRECTION_ALL,

        Manager: Manager,
        Input: Input,
        TouchAction: TouchAction,

        TouchInput: TouchInput,
        MouseInput: MouseInput,
        PointerEventInput: PointerEventInput,
        TouchMouseInput: TouchMouseInput,
        SingleTouchInput: SingleTouchInput,

        Recognizer: Recognizer,
        AttrRecognizer: AttrRecognizer,
        Tap: TapRecognizer,
        Pan: PanRecognizer,
        Swipe: SwipeRecognizer,
        Pinch: PinchRecognizer,
        Rotate: RotateRecognizer,
        Press: PressRecognizer,

        on: addEventListeners,
        off: removeEventListeners,
        each: each,
        merge: merge,
        extend: extend,
        assign: assign,
        inherit: inherit,
        bindFn: bindFn,
        prefixed: prefixed
    });

    // this prevents errors when Hammer is loaded in the presence of an AMD
    //  style loader but by script tag, not by the loader.
    var freeGlobal = typeof window !== 'undefined' ? window : typeof self !== 'undefined' ? self : {}; // jshint ignore:line
    freeGlobal.Hammer = Hammer;

    if (true) {
        !(__WEBPACK_AMD_DEFINE_RESULT__ = (function () {
            return Hammer;
        }).call(exports, __webpack_require__, exports, module),
				__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
    } else {}
})(window, document, 'Hammer');