2025-02-11 17:24:34
function _toConsumableArray(a) {
  if (Array.isArray(a)) {
    for (var b = 0, c = Array(a.length); b < a.length; b++) c[b] = a[b];
    return c
  }
  return Array.from(a)
}
function _classCallCheck(a, b) {
  if (!(a instanceof b)) throw new TypeError('Cannot call a class as a function')
}
function _classCallCheck(a, b) {
  if (!(a instanceof b)) throw new TypeError('Cannot call a class as a function')
}
function _toConsumableArray(a) {
  if (Array.isArray(a)) {
    for (var b = 0, c = Array(a.length); b < a.length; b++) c[b] = a[b];
    return c
  }
  return Array.from(a)
}
function _objectWithoutProperties(a, b) {
  var c = {
  };
  for (var d in a) b.indexOf(d) >= 0 || Object.prototype.hasOwnProperty.call(a, d) && (c[d] = a[d]);
  return c
}
define('core/utils/getEmbeddedData', [
], function () {
  'use strict';
  return function (a) {
    var b = window.document.getElementById('disqus-' + a);
    try {
      return b && JSON.parse(b.textContent || b.innerHTML)
    } catch (c) {
      return null
    }
  }
}),
define('core/utils/cookies', [
], function () {
  'use strict';
  var a = {
    _doc: window.document,
    create: function (b, c, d) {
      d || (d = {
      });
      var e = b + '=' + c + '; path=' + (d.path || '/'),
      f = d.domain,
      g = d.expiresIn;
      if (f && (e += '; domain=.' + f), '[object Number]' === Object.prototype.toString.call(g)) {
        var h = new Date((new Date).getTime() + g);
        e += '; expires=' + h.toGMTString()
      }
      'https:' === a._doc.location.protocol && (e += '; secure'),
      e += '; SameSite=None',
      a._doc.cookie = e
    },
    read: function (b) {
      for (var c, d = b + '=', e = a._doc.cookie.split(';'), f = 0; f < e.length; f++) if (c = e[f].replace(/^\s+/, ''), 0 === c.indexOf(d)) return c.substring(d.length);
      return null
    },
    erase: function (b, c) {
      var d = {
      };
      for (var e in c) c.hasOwnProperty(e) && (d[e] = c[e]);
      return d.expiresIn = - 1,
      a.create(b, '', d)
    },
    supported: function () {
      return a.create('cookie_support', '1'),
      '1' === a.read('cookie_support') && (a.erase('cookie_support'), !0)
    }
  };
  return a
}),
define('core/utils/fingerprint', [
], function () {
  'use strict';
  function a(a) {
    a = a || {
    };
    var b = a.Math || window.Math,
    c = a.Date || window.Date;
    try {
      var d = (new c).getTimezoneOffset(),
      e = 1,
      f = window.screen;
      f && f.availWidth ? e = f.availWidth * f.availHeight + f.colorDepth : f && f.width && (e = f.width * f.height);
      var g = window.document.documentElement,
      h = g.clientWidth * g.clientHeight;
      return b.abs(17 * d + 25 * e - h)
    } catch (i) {
      return 1
    }
  }
  return {
    get: a
  }
}),
define('core/utils/guid', [
  'core/utils/fingerprint'
], function (a) {
  'use strict';
  function b(a) {
    a = a || {
    };
    var b = a.Uint32Array || window.Uint32Array,
    c = a.crypto || window.crypto,
    d = a.Math || window.Math;
    try {
      var e = new b(1);
      return c.getRandomValues(e),
      e[0]
    } catch (f) {
      return d.floor(1000000000 * d.random())
    }
  }
  function c() {
    var a = window.performance,
    b = a && a.timing;
    if (!b) return 100000;
    var c = b.domainLookupEnd - b.domainLookupStart,
    d = b.connectEnd - b.connectStart,
    e = b.responseStart - b.navigationStart;
    return 11 * c + 13 * d + 17 * e
  }
  function d(d) {
    d = d || {
    };
    var e = d.Math || window.Math,
    f = Number((new Date).getTime().toString().substring(3)),
    g = e.abs(f + c() - a.get()).toString(32);
    return g += b(d).toString(32)
  }
  return {
    generate: d
  }
}),
define('core/utils/hash', [
], function () {
  'use strict';
  var a = function (a) {
    var b,
    c,
    d,
    e = 0;
    if (0 === a.length) return e;
    for (b = 0, c = a.length; b < c; b++) d = a.charCodeAt(b),
    e = (e << 5) - e + d,
    e |= 0;
    return e
  };
  return {
    calculate: a
  }
}),
define('core/analytics/identity', [
  'exports',
  'core/utils/cookies',
  'core/utils/guid',
  'core/utils/hash',
  'core/utils/fingerprint'
], function (a, b, c, d, e) {
  'use strict';
  a.SSP_USER_ID_COOKIE_NAME = 'zeta-ssp-user-id';
  var f = !1,
  g = a.ImpressionManager = function () {
    this.isPrivate = !0,
    this.impId = c.generate()
  };
  g.prototype.COOKIE_NAME = '__jid',
  g.prototype.TTL = 1800000,
  g.prototype.init = function (a) {
    this.isPrivate = a && a.isPrivate,
    this.isPrivate || (this.prevImp = b.read(this.COOKIE_NAME)),
    this.persist()
  },
  g.prototype.setImpressionId = function (a) {
    this.impId = a,
    this.persist()
  },
  g.prototype.persist = function () {
    return this.isPrivate ? void b.erase(this.COOKIE_NAME) : void b.create(this.COOKIE_NAME, this.impId, {
      expiresIn: this.TTL
    })
  };
  var h = a.UniqueManager = function () {
    this.isPrivate = !0
  };
  h.prototype.COOKIE_NAME = 'disqus_unique',
  h.prototype.TTL = 31536000000,
  h.prototype.init = function (a) {
    return this.isPrivate = a && a.isPrivate,
    this.isPrivate ? void b.erase(this.COOKIE_NAME, {
      domain: window.location.host.split(':') [0]
    }) : (this.value = b.read(this.COOKIE_NAME) || c.generate(), void b.create(this.COOKIE_NAME, this.value, {
      domain: window.location.host.split(':') [0],
      expiresIn: this.TTL
    }))
  },
  h.prototype.isPersistent = function () {
    return !this.isPrivate && b.read(this.COOKIE_NAME) === this.value
  },
  a.init = function (b, c) {
    f && !c || (a.impression.init(b), a.unique.init(b), f = !0)
  },
  a.reset = function () {
    f = !1,
    a.impression = new g,
    a.unique = new h
  },
  a.reset(),
  a.clientId = function () {
    var b,
    c = a.unique;
    return c.isPersistent() && (b = c.value),
    b || e.get().toString()
  },
  a.getPercentBucketForString = function (a, b) {
    var c = 100,
    e = Math.abs(d.calculate(a));
    if (b) {
      var f = Math.pow(10, b);
      return e % (c * f) / f
    }
    return e % c
  },
  a.clientPercent = function () {
    return a.getPercentBucketForString(a.clientId())
  }
}),
define('core/config/urls', [
  'common/urls'
], function (a) {
  'use strict';
  return a
}),
define('core/analytics/jester', [
  'jquery',
  'underscore',
  'backbone',
  'core/analytics/identity',
  'core/config/urls'
], function (a, b, c, d, e) {
  'use strict';
  var f = c.Model.extend({
    url: e.jester + '/event.js',
    defaults: {
      experiment: 'default',
      variant: 'control'
    },
    setHostReferrer: function (a) {
      a ? a.indexOf('http') === - 1 || this.set('page_referrer', a) : this.set('page_referrer', 'direct')
    },
    decoratePayload: function (c) {
      c.event || (c.event = 'activity'),
      c = b.extend(this.toJSON(), c),
      b.extend(c, {
        imp: d.impression.impId,
        prev_imp: d.impression.prevImp
      }),
      c.section || (c.section = 'default'),
      c.area || (c.area = 'n/a');
      var e = a.param(c).length;
      if (e > 2048 && this.has('page_referrer')) {
        var f = window.document.createElement('a');
        f.href = this.get('page_referrer');
        var g = f.hostname;
        g && (c.page_referrer_domain = g),
        delete c.page_referrer
      }
      return c
    },
    emit: function (c) {
      return a.ajax({
        url: b.result(this, 'url'),
        data: this.decoratePayload(c),
        dataType: 'script',
        cache: !0
      })
    }
  }),
  g = function (b) {
    var c = new window.Image;
    return c.src = e.jester + '/stat.gif?' + a.param({
      event: b
    }),
    c
  },
  h = function (c, d) {
    if (!b.any(d, function (a) {
      return a < 0
    })) {
      b.each(d, function (a, b) {
        d[b] = Math.round(a)
      });
      var f = new window.Image;
      return f.src = e.jester + '/telemetry/' + c + '.gif?' + a.param(d),
      f
    }
  },
  i = new f;
  return i.setHostReferrer(window.document.referrer),
  {
    ActivityClient: f,
    client: i,
    logStat: g,
    telemetry: h
  }
}),
define('core/utils/urls', [
], function () {
  'use strict';
  var a = {
  },
  b = window.document.createElement('a');
  return a.getOrigin = function (a) {
    b.href = a;
    var c = b.href.split('/');
    return c[0] + '//' + c[2]
  },
  a.getHostName = function (a) {
    return b.href = a,
    b.hostname
  },
  a.getDomainPart = function (b, c) {
    'undefined' == typeof c && (c = 0);
    var d = a.getHostName(b),
    e = d.split('.').reverse();
    return e[c]
  },
  a.getQuery = function (a) {
    return b.href = a,
    b.search
  },
  a.getPathname = function (a) {
    return b.href = a,
    b.pathname
  },
  a
}),
define('core/frameBus', [
  'jquery',
  'underscore',
  'backbone',
  'core/utils/urls'
], function (a, b, c, d) {
  'use strict';
  var e = window.opener || window.parent,
  f = window.name,
  g = window.document.referrer,
  h = {
  };
  h.client = d.getOrigin(window.document.location.href),
  h.secureClient = h.client.replace(/^\w+:\/\//, 'https://'),
  h.host = g ? d.getOrigin(g) : h.client;
  var i = {
    origins: h,
    messageHandler: function (a) {
      a = a.originalEvent;
      var b;
      try {
        b = JSON.parse(a.data)
      } catch (c) {
        return
      }
      b.name && '!' === b.name[0] && a.origin !== h.client && a.origin !== h.secureClient || 'client' === b.scope && i.trigger(b.name, b.data)
    },
    postMessage: function (a) {
      a = JSON.stringify(a),
      e.postMessage(a, '*')
    },
    sendHostMessage: function (a, b) {
      b = b || [
      ],
      i.postMessage({
        scope: 'host',
        sender: f,
        name: a,
        data: b
      })
    }
  };
  return b.extend(i, c.Events),
  a(window).on('message', i.messageHandler),
  a(window).on('unload', function () {
    i.sendHostMessage('die')
  }),
  window.DISQUS = window.DISQUS || {
  },
  window.DISQUS.Bus = i,
  i
}),
define('core/bus', [
  'backbone',
  'underscore',
  'core/frameBus'
], function (a, b, c) {
  'use strict';
  var d = b.extend({
  }, a.Events);
  return d.frame = c,
  d
}),
define('core/utils/storage', [
], function () {
  'use strict';
  var a = function (a) {
    var b = '_dsqstorage_';
    try {
      return a.localStorage.setItem(b, b),
      a.localStorage.getItem(b),
      a.localStorage.removeItem(b),
      !0
    } catch (c) {
      return !1
    }
  }(window),
  b = function () {
    var a = {
    };
    return {
      getItem: function (b) {
        return a.hasOwnProperty(b) ? a[b] : null
      },
      setItem: function (b, c) {
        a[b] = String(c)
      },
      removeItem: function (b) {
        delete a[b]
      },
      clear: function () {
        a = {
        }
      }
    }
  }();
  return {
    get: function (a) {
      var b = null;
      try {
        return b = this.backend.getItem(a),
        JSON.parse(b)
      } catch (c) {
        return b
      }
    },
    set: function (a, b) {
      try {
        this.backend.setItem(a, JSON.stringify(b))
      } catch (c) {
      }
    },
    remove: function (a) {
      try {
        this.backend.removeItem(a)
      } catch (b) {
      }
    },
    clear: function () {
      try {
        this.backend.clear()
      } catch (a) {
      }
    },
    backend: a ? window.localStorage : b,
    isPersistent: a
  }
}),
define('core/utils/auth', [
  'core/utils/cookies'
], function (a) {
  'use strict';
  var b = {
  },
  c = 'disqusauth';
  return b.getFromCookie = function () {
    var b = (a.read(c) || '').replace(/"/g, '').split('|');
    !b || b[1] && b[6] || (b = [
    ], a.erase(c, {
    }));
    var d = parseInt(b[6] || '0', 10);
    return {
      avatarUrl: b[7] ? decodeURIComponent(b[7]) : void 0,
      datetimeFormatting: parseInt(b[4], 10) ? 'absolute' : 'relative',
      id: d,
      isModerator: parseInt(b[8], 10) > 0,
      staff: Boolean(parseInt(b[2], 10)),
      tzOffset: b[5],
      username: b[1],
      isAuthenticated: Boolean(d && '0' !== d)
    }
  },
  b
}),
define('core/switches', [
  'underscore',
  'remote/config',
  'core/analytics/identity',
  'core/utils/storage',
  'core/utils/auth'
], function (a, b, c, d, e) {
  'use strict';
  var f = 'switch:',
  g = {
  },
  h = {
  };
  return h._getKey = function (a) {
    return f + a
  },
  h.disableFeature = function (a) {
    g[a] = !1
  },
  h.resetFeature = function (a) {
    g[a] = null
  },
  h.forceFeature = function (a) {
    g[a] = !0
  },
  h.getSwitchContext = function (a) {
    var c = d.get(this._getKey(a));
    if (null !== c) return c;
    var e = g[a];
    return null != e ? e : (b.lounge && b.lounge.switches || {
    }) [a]
  },
  h.isFeatureActive = function (b, d) {
    var f = h.getSwitchContext(b);
    if (a.isBoolean(f)) return f;
    if (!f) return !1;
    var g = e.getFromCookie(),
    i = {
      percent: c.clientPercent(),
      user_id: g.id,
      username: g.username,
      is_staff: g.staff,
      is_moderator: g.isModerator
    },
    j = a.defaults(d || {
    }, i);
    return a.any(f, function (b, d) {
      var e = j[d];
      if (/percent$/.test(d) && a.isNumber(b)) {
        if (a.isNumber(e)) return b > e;
        if (a.isString(e)) {
          var f = 0;
          return b !== Math.round(b) && (f = b.toString().split('.').pop().length),
          b > c.getPercentBucketForString(e, f)
        }
        return !1
      }
      return a.isArray(b) ? a.contains(b, e) : b === e
    })
  },
  h
}),
define('core/utils/url/serializeArgs', [
  'require',
  'exports',
  'module',
  'core/utils/collection/each'
], function (a, b, c) {
  'use strict';
  var d = a('core/utils/collection/each');
  c.exports = function (a) {
    var b = [
    ];
    return d(a, function (a, c) {
      void 0 !== a && b.push(encodeURIComponent(c) + (null === a ? '' : '=' + encodeURIComponent(a)))
    }),
    b.join('&')
  }
}),
define('core/utils/url/serialize', [
  'require',
  'exports',
  'module',
  'core/utils/url/serializeArgs'
], function (a, b, c) {
  'use strict';
  var d = a('core/utils/url/serializeArgs');
  c.exports = function e(a, b, c) {
    if (b && (a.indexOf('?') === - 1 ? a += '?' : '&' !== a.charAt(a.length - 1) && (a += '&'), a += d(b)), c) {
      var f = {
      };
      return f[(new Date).getTime()] = null,
      e(a, f)
    }
    var g = a.length;
    return '&' === a.charAt(g - 1) ? a.slice(0, g - 1) : a
  }
}),
define('core/utils/isAdBlockEnabled', [
], function () {
  'use strict';
  function a() {
    var a = d.createElement('div');
    return a.setAttribute('class', 'pub_300x250 pub_300x250m pub_728x90 text-ad textAd text_ad text_ads text-ads text-ad-links ad-text adSense adBlock adContent adBanner'),
    a.setAttribute('style', 'width: 1px !important; height: 1px !important; position: absolute !important; left: -10000px !important; top: -1000px !important;'),
    a
  }
  function b(a) {
    if (null === a.offsetParent || 0 === a.offsetHeight || 0 === a.offsetLeft || 0 === a.offsetTop || 0 === a.offsetWidth || 0 === a.clientHeight || 0 === a.clientWidth) return !0;
    if (void 0 !== window.getComputedStyle) {
      var b = window.getComputedStyle(a, null);
      if (b && ('none' === b.getPropertyValue('display') || 'hidden' === b.getPropertyValue('visibility'))) return !0
    }
    return !1
  }
  var c = 100,
  d = window.document;
  return function (e) {
    var f = a();
    d.body.appendChild(f),
    setTimeout(function () {
      var a = b(f);
      d.body.removeChild(f),
      e(a)
    }, c)
  }
}),
define('core/utils/html/toRGBColorString', [
], function () {
  'use strict';
  var a = 'Color components should be numbers.';
  return function (b) {
    var c = Number(b.red),
    d = Number(b.green),
    e = Number(b.blue);
    if (isNaN(c) || isNaN(d) || isNaN(e)) throw new Error(a);
    var f = 'rgb',
    g = [
      c,
      d,
      e
    ],
    h = b.alpha;
    if (h) {
      if (h = Number(h), isNaN(h)) throw new Error(a);
      f += 'a',
      g.push(h)
    }
    return f + '(' + g + ')'
  }
}),
define('core/utils/lang/isString', [
], function () {
  'use strict';
  return function (a) {
    return '[object String]' === Object.prototype.toString.call(a)
  }
}),
define('core/utils/html/setInlineStyle', [
  'require',
  'core/utils/collection/each',
  'core/utils/lang/isString',
  'core/utils/object/extend'
], function (a) {
  'use strict';
  function b(a) {
    return a.replace(/\s+/g, '').toLowerCase()
  }
  var c = a('core/utils/collection/each'),
  d = a('core/utils/lang/isString'),
  e = a('core/utils/object/extend');
  return function (a, f, g) {
    var h = {
    };
    d(f) ? h[f] = g : h = f;
    var i = e({
    }, h);
    c(i, function (a, c) {
      var d = b(c);
      d !== c && (delete i[c], i[d] = a),
      null === a && (i[d] = ''),
      void 0 === a && delete i[d]
    });
    var j = a.style;
    c(i, function (a, b) {
      j.setProperty(b, String(a), 'important')
    })
  }
}),
define('core/utils/html/parseColor', [
  'require',
  'core/utils/html/setInlineStyle'
], function (a) {
  'use strict';
  function b(a) {
    return a.replace(/\s+/g, '').toLowerCase()
  }
  function c(a) {
    return a = a.replace(/^#([a-f0-9])([a-f0-9])([a-f0-9])$/, '#$1$1$2$2$3$3'),
    a = a.slice(1),
    {
      red: parseInt(a.slice(0, 2), 16),
      green: parseInt(a.slice(2, 4), 16),
      blue: parseInt(a.slice(4, 6), 16)
    }
  }
  function d(a) {
    var b = a.match(/^rgb\((\d+),(\d+),(\d+)\)$/);
    return {
      red: parseInt(b[1], 10),
      green: parseInt(b[2], 10),
      blue: parseInt(b[3], 10)
    }
  }
  function e(a) {
    var b = a.match(/^rgba\((\d+),(\d+),(\d+),([\d.]+)\)$/);
    return {
      red: parseInt(b[1], 10),
      green: parseInt(b[2], 10),
      blue: parseInt(b[3], 10),
      alpha: parseFloat(b[4])
    }
  }
  function f(a, b, c, d) {
    return b = window.document.createElement(b),
    h(b, {
      visibility: 'hidden',
      color: c
    }),
    a.appendChild(b),
    c = d(b),
    a.removeChild(b),
    c
  }
  function g(a, c) {
    c = c || {
    };
    var e = c.container || window.document.body;
    return window.getComputedStyle ? (a = f(e, 'span', a, function (a) {
      return window.getComputedStyle(a, null).getPropertyValue('color')
    }), d(b(a))) : (a = f(e, 'textarea', a, function (a) {
      return a.createTextRange().queryCommandValue('ForeColor')
    }), {
      red: 255 & a,
      blue: a >>> 16,
      green: (65280 & a) >>> 8
    })
  }
  var h = a('core/utils/html/setInlineStyle');
  return function (a, f) {
    a = b(a);
    var h;
    if ('transparent' === a) return {
      red: 0,
      green: 0,
      blue: 0,
      alpha: 0
    };
    if ('#' === a.charAt(0)) h = c;
     else if ('rgba(' === a.slice(0, 5)) h = e;
     else if ('rgb(' === a.slice(0, 4)) h = d;
     else {
      if (!/^[a-z]+$/.test(a)) throw new Error('parseColor received unparseable color: ' + a);
      h = g
    }
    return h(a, f)
  }
}),
define('core/host/globalFromSandbox', [
  'require'
], function (a) {
  'use strict';
  var b = window.document,
  c = b.createElement('iframe');
  return c.style.display = 'none',
  function (a, d) {
    var e = d && d[a] || null;
    try {
      return c.parentNode !== b.body && b.body.appendChild(c),
      c.contentWindow[a] || e
    } catch (f) {
      return e
    }
  }
}),
define('core/host/utils', [
  'require',
  'core/utils/browser',
  'core/utils/lang/isString',
  'core/utils/html/getCurrentStyle',
  'core/utils/html/parseColor',
  'core/host/globalFromSandbox'
], function (a) {
  'use strict';
  function b(a) {
    for (var b = [
      /(https?:)?\/\/(www\.)?disqus\.com\/forums\/([\w_-]+)/i,
      /(https?:)?\/\/(www\.)?([\w_-]+)\.disqus\.com/i,
      /(https?:)?\/\/(www\.)?dev\.disqus\.org\/forums\/([\w_-]+)/i,
      /(https?:)?\/\/(www\.)?([\w_-]+)\.dev\.disqus\.org/i
    ], c = 0; c < b.length; c++) {
      var d = a.match(b[c]);
      if (d && d.length && 4 === d.length) return d[3]
    }
    return null
  }
  function c(a, c, d) {
    var e = a.querySelector('script[src*="disqus"][src$="' + c + '"]');
    if (e) {
      var f = e.getAttribute ? e.getAttribute('src') : e.src;
      d = d || b;
      var g = d(f);
      return g ? g.toLowerCase() : null
    }
    return null
  }
  function d(a, b) {
    var c,
    d,
    e = 0,
    f = new Array(a.length);
    for (c = 0; c <= a.length; c++) for (f[c] = new Array(b.length), d = 0; d <= b.length; d++) f[c][d] = 0;
    for (c = 0; c < a.length; c++) for (d = 0; d < b.length; d++) a[c] === b[d] && (f[c + 1][d + 1] = f[c][d] + 1, f[c + 1][d + 1] > e && (e = f[c + 1][d + 1]));
    return e
  }
  function e() {
    for (var a = t.getElementsByTagName('h1'), b = t.title, c = b.length, e = b, f = 0.6, g = function (a) {
      var g,
      h = a.textContent || a.innerText;
      null !== h && void 0 !== h && (g = d(b, h) / c, g > f && (f = g, e = h))
    }, h = 0; h < a.length; h++) g(a[h]);
    return e
  }
  function f(a) {
    return a.toLowerCase().replace(/^\s+|\s+$/g, '').replace(/['"]/g, '')
  }
  function g(a) {
    var b = 0,
    c = 1,
    d = 2;
    if (!s('atob') || !s('requestAnimationFrame')) return c;
    try {
      a.postMessage('ping', '*')
    } catch (e) {
      return d
    }
    return b
  }
  function h(a, b, c) {
    c = c || b;
    var d = q(a, b, c);
    return !d || /color/i.test(b) && 0 === r(d).alpha ? a && h(a.parentNode, b, c) || d : d || null
  }
  function i(a, b, c, d) {
    p(b) && (b = t.createElement(b));
    var e = null;
    return b.style.visibility = 'hidden',
    a.appendChild(b),
    e = h(b, c, d),
    a.removeChild(b),
    e
  }
  function j(a) {
    for (var b, c = i(a, 'span', 'font-family', 'fontFamily'), d = c.split(','), e = {
      courier: 1,
      times: 1,
      'times new roman': 1,
      georgia: 1,
      palatino: 1,
      serif: 1
    }, g = 0; g < d.length; g++) if (b = f(d[g]), e.hasOwnProperty(b)) return !0;
    return !1
  }
  function k(a) {
    var b = t.createElement('a');
    return b.href = Number(new Date),
    r(i(a, b, 'color'), {
      container: a
    })
  }
  function l(a) {
    var b = a.red,
    c = a.green,
    d = a.blue;
    if (a.hasOwnProperty('alpha')) {
      var e = a.alpha,
      f = function (a) {
        return Math.round(a * e + 255 * (1 - e))
      };
      b = f(b),
      c = f(c),
      d = f(d)
    }
    return (299 * b + 587 * c + 114 * d) / 1000
  }
  function m(a) {
    var b = i(a, 'span', 'background-color', 'backgroundColor'),
    c = r(b, {
      container: a
    });
    return 0 === c.alpha ? 'light' : l(c) < 128 ? 'dark' : 'light'
  }
  function n(a) {
    var b = k(a);
    return 0 === b.alpha ? 'light' : l(b) < 128 ? 'dark' : 'light'
  }
  var o = a('core/utils/browser'),
  p = a('core/utils/lang/isString'),
  q = a('core/utils/html/getCurrentStyle'),
  r = a('core/utils/html/parseColor'),
  s = a('core/host/globalFromSandbox'),
  t = window.document,
  u = function () {
    var a,
    b,
    c = function () {
      return !1
    };
    if ('hidden' in t) a = 'hidden',
    b = 'visibilitychange';
     else {
      if (!('webkitHidden' in t)) return {
        isHidden: c,
        listen: c,
        stopListening: c
      };
      a = 'webkitHidden',
      b = 'webkitvisibilitychange'
    }
    return {
      isHidden: function () {
        return t[a]
      },
      listen: function (a) {
        return t.addEventListener(b, a)
      },
      stopListening: function (a) {
        return t.removeEventListener(b, a)
      }
    }
  }(),
  v = function () {
    var a = t.createElement('div');
    a.style.visibility = 'hidden',
    a.style.width = '100px',
    a.style.msOverflowStyle = 'scrollbar',
    t.body.appendChild(a);
    var b = a.offsetWidth;
    a.style.overflow = 'scroll';
    var c = t.createElement('div');
    c.style.width = '100%',
    a.appendChild(c);
    var d = c.offsetWidth;
    return a.parentNode.removeChild(a),
    b - d
  },
  w = {
    getItem: function (a) {
      try {
        return window.localStorage.getItem(a)
      } catch (b) {
      }
    },
    setItem: function (a, b) {
      try {
        return window.localStorage.setItem(a, b)
      } catch (c) {
      }
    }
  },
  x = 1,
  y = function (a) {
    if (a.nodeType === x) {
      var b = q(a, 'max-height', 'maxHeight'),
      c = q(a, 'overflow-y', 'overflowY');
      return b && 'none' !== b && c && 'visible' !== c
    }
  },
  z = 4,
  A = function (a) {
    if (a.nodeType === x) return a.scrollHeight - a.clientHeight > z
  },
  B = function () {
    if (t.querySelector) {
      var a = t.querySelector('link[rel=canonical]');
      if (a) return a.href
    }
  };
  return {
    MAX_Z_INDEX: 2147483647,
    getShortnameFromUrl: b,
    getForum: c,
    guessThreadTitle: e,
    getContrastYIQ: l,
    getColorScheme: m,
    getElementStyle: i,
    getAnchorColor: k,
    getAnchorColorScheme: n,
    normalizeFontValue: f,
    isSerif: j,
    getBrowserSupport: g,
    pageVisibility: u,
    getScrollbarWidth: v,
    browser: o,
    storage: w,
    appearsToHideContent: y,
    hasOverflow: A,
    getCanonicalUrl: B
  }
}),
define('common/utils', [
  'jquery',
  'underscore',
  'loglevel',
  'common/main',
  'common/urls',
  'core/host/utils',
  'core/utils/cookies',
  'core/utils/html/parseColor'
], function (a, b, c, d, e, f, g, h) {
  'use strict';
  var i = window.document,
  j = {
  };
  j.globalUniqueId = function (a) {
    return b.uniqueId(a) + '_' + Number(new Date)
  },
  j.setPublisherColor = function (a) {
    i.documentElement.style.setProperty('--publisher-color', a);
    var b = f.getContrastYIQ(h(a));
    b > 5 && b < 250 && i.documentElement.style.setProperty('--publisher-color-safe', a)
  },
  j.addStylesheetRules = function (a) {
    function c() {
      var e = b.find(i.styleSheets, function (a) {
        var b = a.ownerNode || a.owningElement;
        return b.id === d
      });
      if (!e) return void setTimeout(c, 50);
      for (var f = 0, g = a.length; f < g; f++) {
        var h = 1,
        j = a[f],
        k = j[0],
        l = '';
        '[object Array]' === Object.prototype.toString.call(j[1][0]) && (j = j[1], h = 0);
        for (var m = j.length; h < m; h++) {
          var n = j[h];
          l += n[0] + ':' + n[1] + (n[2] ? ' !important' : '') + ';\n'
        }
        e.insertRule ? e.insertRule(k + '{' + l + '}', e.cssRules.length) : e.addRule(k, l, - 1)
      }
    }
    var d = 'css_' + (new Date).getTime(),
    e = i.createElement('style');
    e.id = d,
    i.getElementsByTagName('head') [0].appendChild(e),
    window.createPopup || e.appendChild(i.createTextNode('')),
    c()
  };
  var k = j.CORS = {
    handler: function (a, b, c) {
      a && c >= 200 && c < 300 ? a() : b && (c < 200 || c >= 300) && b()
    },
    XHR2: function (a, b, c, d) {
      var e = k.handler,
      f = new window.XMLHttpRequest;
      return f.open(a, b, !0),
      f.onreadystatechange = function () {
        f.readyState === window.XMLHttpRequest.DONE && e(c, d, f.status)
      },
      f
    }
  };
  k.request = function () {
    return 'withCredentials' in new window.XMLHttpRequest ? k.XHR2 : function () {
      return null
    }
  }(),
  j.isWindowClosed = function (a) {
    if (!a) return !0;
    try {
      return a.closed || void 0 === a.closed
    } catch (b) {
      return !0
    }
  },
  j.truncate = function (a, b, c) {
    return c = c || '...',
    a.length > b ? a.slice(0, b) + c : a
  },
  j.extractDomainForCookies = function (a) {
    return a.split('/') [2].replace(/:[0-9]+/, '')
  },
  j.cookies = {
    domain: j.extractDomainForCookies(e.root),
    create: function (a, b) {
      var c = 31536000000;
      g.create(a, b, {
        domain: j.cookies.domain,
        expiresIn: c
      })
    },
    read: g.read,
    erase: function (a) {
      g.erase(a, {
        domain: j.cookies.domain
      })
    }
  },
  j.updateURL = function (a, c) {
    var d,
    e = i.createElement('a');
    return c = c || {
    },
    e.href = a,
    c.hostname && c.hostname.match(/\.$/) && (c.hostname += e.hostname),
    d = b.extend({
      protocol: e.protocol,
      hostname: e.hostname,
      pathname: e.pathname,
      search: e.search
    }, c),
    d.pathname.match(/^\//) || (d.pathname = '/' + d.pathname),
    d.protocol + '//' + d.hostname + d.pathname + d.search
  },
  j.injectBaseElement = function (a, b) {
    b = b || i;
    var c = b.getElementsByTagName('base') [0] || b.createElement('base');
    c.target = '_parent',
    a ? c.href = a : c.removeAttribute('href'),
    c.parentNode || (b.head || b.getElementsByTagName('head') [0]).appendChild(c)
  },
  j.syntaxHighlighter = function () {
    var c = 1,
    e = 2,
    f = null,
    g = null,
    h = [
    ],
    i = {
      highlight: function (a) {
        null === g && i._load(),
        h.push(a),
        g === e && i.scheduleHighlight()
      },
      _highlight: function (b) {
        var c = a(b).html();
        a(b).html(c.replace(/^<br>/, '')),
        f.highlightBlock(b),
        i.scheduleHighlight()
      },
      scheduleHighlight: function () {
        var a = h.shift();
        a && window.requestAnimationFrame(b.bind(i._highlight, i, a))
      },
      _load: function () {
        g = c,
        d.loadCss('https://c.disquscdn.com/next/embed/styles/highlight.3128dd90ecaebd8542ac3442033f3f00.css'),
        require(['common/vendor_extensions/highlight'], function (a) {
          g = e,
          f = a,
          i.scheduleHighlight()
        })
      }
    };
    return i
  }();
  var l = a('html');
  j.getPageHeight = function () {
    var b = a('#tos__message'),
    c = b.outerHeight();
    return c && (c += b.offset().top),
    Math.max(c, l.height())
  },
  j.calculatePositionFullscreen = function () {
    return {
      pageOffset: a(window).scrollTop(),
      height: i.documentElement.clientHeight,
      frameOffset: {
        left: 0,
        top: 0
      }
    }
  },
  j.triggerClick = function (a, b) {
    var c,
    d,
    e = a[0],
    f = {
      altKey: !1,
      button: 0,
      ctrlKey: !1,
      metaKey: !1,
      shiftKey: !1
    };
    if (i.createEvent) {
      if (c = i.createEvent('MouseEvents'), b) for (d in f) f.hasOwnProperty(d) && b.hasOwnProperty(d) && (f[d] = b[d]);
      c.initMouseEvent('click', !0, !0, window, 0, 0, 0, 0, 0, f.ctrlKey, f.altKey, f.shiftKey, f.metaKey, 0, null),
      e.dispatchEvent && e.dispatchEvent(c)
    } else if (i.createEventObject) {
      if (c = i.createEventObject(), c.eventType = 'click', b) for (d in f) f.hasOwnProperty(d) && b.hasOwnProperty(d) && (c[d] = b[d]);
      e.fireEvent('onclick', c)
    }
  },
  j.delayLinkClick = function (a, c) {
    a.preventDefault(),
    b.delay(b.bind(j.triggerClick, this, c, a.originalEvent), 100)
  },
  j.mixin = function (a, c, d) {
    var e = a.prototype,
    f = b.extend({
    }, c, d);
    if (b.defaults(e, f), b.defaults(e.events, f.events), void 0 !== e.initialize && void 0 !== f.initialize) {
      var g = e.initialize;
      e.initialize = function () {
        var a = g.apply(this, arguments);
        return f.initialize.apply(this, arguments),
        a
      }
    }
    return a
  },
  j.extractService = function (b, c) {
    var d = '[data-action^=' + c + ']',
    e = a(b);
    e = e.is(d) && e || e.closest(d);
    var f = e.attr('data-action') || ':',
    g = f.split(':') [1];
    return g
  },
  j.getConfigFromHash = function (a) {
    var d,
    e = a.location.hash;
    try {
      d = JSON.parse(decodeURIComponent(String(e).substr(1)))
    } catch (f) {
      c.debug('Failed to parse config from URL hash', f)
    }
    return b.isObject(d) ? d : {
    }
  };
  var m = /[<>]|:\/\//;
  return j.isPlainText = function (a) {
    return !a.match(m)
  },
  j.isDNTEnabled = function (a) {
    return a || (a = window),
    '1' === a.navigator.doNotTrack || 'yes' === a.navigator.doNotTrack || '1' === a.navigator.msDoNotTrack
  },
  j.shouldSample = function (a) {
    var b = parseInt(a, 10);
    return !!b && (!(b > 100) && Math.random() < b / 100)
  },
  j.decorate = function () {
    var a,
    c = b.toArray(arguments),
    d = c.pop();
    return b.isFunction(d) || (a = d, d = c.pop()),
    b.reduceRight(c, function (b, c) {
      return c.call(a || this, b)
    }, function () {
      return d.apply(a || this, arguments)
    })
  },
  j
}),
define('lounge/common', [
], function () {
  'use strict';
  var a,
  b = function (b) {
    a = b
  },
  c = function () {
    return a
  };
  return {
    setLounge: b,
    getLounge: c
  }
});
var _extends = Object.assign || function (a) {
  for (var b = 1; b < arguments.length; b++) {
    var c = arguments[b];
    for (var d in c) Object.prototype.hasOwnProperty.call(c, d) && (a[d] = c[d])
  }
  return a
};
define('lounge/tracking', [
  'jquery',
  'underscore',
  'raven',
  'core/analytics/identity',
  'core/analytics/jester',
  'core/bus',
  'common/urls',
  'core/switches',
  'core/utils',
  'core/utils/hash',
  'core/utils/url/serialize',
  'core/utils/isAdBlockEnabled',
  'core/utils/html/toRGBColorString',
  'remote/config',
  'common/utils',
  'common/main',
  'lounge/common'
], function (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q) {
  'use strict';
  function r(n, q) {
    function r(a, c, f) {
      var i = {
        abe: f ? '1' : '0',
        embed_hidden: q.config.isBehindClick ? '1' : '0',
        integration: q.config.integration,
        load_time: Number(new Date) - p.timings.initStart - (p.timings.renderStart && p.timings.bootstrapStart ? p.timings.renderStart - p.timings.bootstrapStart : 0)
      };
      if (h.isFeatureActive('init_embed_activity')) b.extend(i, {
        verb: 'load',
        object_type: 'product',
        object_id: 'embed'
      }),
      e.client.emit(i);
       else {
        var j = a.user.id,
        l = o.isDNTEnabled();
        b.extend(i, {
          event: 'init_embed',
          thread: C,
          forum: z,
          forum_id: A,
          imp: d.impression.impId,
          prev_imp: d.impression.prevImp,
          thread_slug: B.get('slug'),
          user_type: a.user.get('user_type') || 'anon',
          referrer: n.document.referrer,
          theme: 'next',
          dnt: l ? '1' : '0',
          tracking_enabled: c ? '1' : '0'
        }, q.config.experiment),
        j && '0' !== j && (i.user_id = j);
        var m = y.get('settings');
        m && b.has(m, 'adsProductLinksEnabled') && b.extend(i, {
          promoted_enabled: m.adsProductLinksEnabled,
          max_enabled: m.adsPositionTopEnabled
        }),
        (new n.Image).src = k(g.jester + '/event.gif', i, !1)
      }
      if (B.isModerator(a.user)) {
        var r = n.document.createElement('iframe');
        r.src = 'https://disqusads.com/enable-logging',
        r.style.display = 'none',
        n.document.body.appendChild(r)
      }
    }
    function t(a) {
      w = !0,
      x = a,
      s.shouldTrack(y, q.session.user) && (d.init({
      }, !0), s.load3rdParties(B, q))
    }
    var y = q.forum,
    z = y.id,
    A = y.get('pk'),
    B = q.thread,
    C = B.id;
    q.session.on('change:id', function (a) {
      e.client.set('user_id', a.id)
    }),
    q.session.once('change:id', function () {
      var b = this,
      c = s.shouldTrack(y, this.user),
      e = y.get('settings').adsEnabled && s.shouldTrack(y, this.user, !0),
      j = s.shouldLoadLc(y, this.user);
      if (q.config.isPrivate && this.user && this.user.get('hasAcceptedGdprTerms') && d.init({
        isPrivate: !1
      }, !0), c && s.load3rdParties(B, q), !v && h.isFeatureActive('zyncOnly') && e) {
        var k = (new Date).getTime();
        a('body').append(a('<img>').hide().attr('src', g.zyncPixelImage + '&cid=c' + d.unique.value + '&cache_buster=' + k)),
        v = !0
      }
      l(function (a) {
        r(b, c, a)
      }),
      f.frame.sendHostMessage('tracking:init', {
        shouldTrack: c,
        isMobile: i.isMobileUserAgent(n),
        hostIdentityActive: h.isFeatureActive('hostIdentityActive', {
          forum: y.id,
          forum_percent: y.id
        }),
        liveConnectActive: j && h.isFeatureActive('liveConnectActive', {
          forum: y.id,
          forum_percent: y.id
        }),
        unique: d.unique.value,
        sspId: o.cookies.read(d.SSP_USER_ID_COOKIE_NAME)
      })
    }),
    e.client.set({
      product: 'embed',
      thread: C,
      thread_id: C,
      forum: z,
      forum_id: A,
      zone: 'thread',
      version: p.version
    }),
    q.once('bootstrap:complete', function () {
      e.client.set({
        page_url: q.config.referrer
      });
      var a = q.config.experiment;
      a && e.client.set({
        experiment: a.experiment,
        variant: a.variant,
        service: a.service
      }),
      e.client.setHostReferrer(q.config.hostReferrer)
    });
    var D = {
      inViewport: function () {
        var c = q.config,
        d = {
          color_scheme: c.colorScheme,
          anchor_color: m(c.anchorColor),
          typeface: c.typeface,
          width: a(n.document).width()
        },
        f = {
          gpc: window.navigator.globalPrivacyControl ? 1 : 0
        };
        q.meta.topics && (f.topics = q.meta.topics.map(function (a) {
          return a.topic.toString()
        }).join(',')),
        d = b.pick(d, function (a, c) {
          switch (c) {
            case 'width':
              return b.isNumber(a);
            default:
              return b.isString(a) && '' !== a
          }
        }),
        e.client.emit({
          verb: 'view',
          object_type: 'product',
          object_id: 'embed',
          extra_data: JSON.stringify(_extends({
          }, d, f))
        }),
        q.off('inViewport')
      },
      'uiCallback:postCreated': function (a, c) {
        c = c || {
        },
        b.extend(c, {
          object_type: 'post',
          object_id: a.id,
          verb: 'post'
        }),
        a.has('parent') && (c.target_type = 'post', c.target_id = a.get('parent')),
        e.client.emit(c)
      },
      'uiCallback:postUpdated': function (a, c) {
        c = c || {
        },
        b.extend(c, {
          object_type: 'post',
          object_id: a.id,
          verb: 'update'
        }),
        e.client.emit(c)
      },
      'uiAction:postStartUpdate': function (a, c) {
        c = c || {
        },
        b.extend(c, {
          verb: 'click',
          adjective: 'edit',
          object_type: 'link',
          object_id: a.id
        }),
        e.client.emit(c)
      },
      'uiAction:seeMore': function (a) {
        e.client.emit({
          verb: 'open',
          object_type: 'section',
          object_id: 'thread/page-' + a
        })
      },
      'uiAction:seeMoreChildren': function (a) {
        e.client.emit({
          verb: 'click',
          object_type: 'link',
          object_id: 'show_more_comments',
          area: s.getEventTrackingArea(a)
        })
      },
      'uiAction:postUpvote': function (a, b) {
        e.client.emit({
          verb: 'like',
          object_type: 'post',
          object_id: a.id,
          area: s.getEventTrackingArea(b)
        })
      },
      'uiAction:postUnvote': function (a, b) {
        e.client.emit({
          verb: 'unlike',
          object_type: 'post',
          object_id: a.id,
          area: s.getEventTrackingArea(b)
        })
      },
      'uiAction:postDownvote': function (a, b) {
        e.client.emit({
          verb: 'dislike',
          object_type: 'post',
          object_id: a.id,
          area: s.getEventTrackingArea(b)
        })
      },
      'uiAction:threadUnlike': function () {
        e.client.emit({
          verb: 'unlike',
          object_type: 'thread',
          zone: 'thread'
        })
      },
      'uiAction:threadLike': function () {
        e.client.emit({
          verb: 'like',
          object_type: 'thread'
        })
      },
      'uiAction:postShare': function (a, b) {
        e.client.emit({
          verb: 'share',
          object_type: 'post',
          object_id: a.id,
          target_type: 'service',
          target_id: b
        })
      },
      'uiAction:threadShare': function (a) {
        e.client.emit({
          verb: 'share',
          object_type: 'thread',
          target_type: 'service',
          target_id: a
        })
      },
      'uiAction:clickLink': function (a, b) {
        e.client.emit({
          verb: 'click',
          object_type: 'link',
          object_id: a[0].href,
          area: s.getEventTrackingArea(b)
        })
      },
      'uiAction:followUser': function (a) {
        e.client.emit({
          verb: 'follow',
          object_type: 'user',
          object_id: a.id
        })
      },
      'uiAction:unfollowUser': function (a) {
        e.client.emit({
          verb: 'stop-following',
          object_type: 'user',
          object_id: a.id
        })
      },
      'uiAction:openLogin': function (a) {
        e.client.emit({
          verb: 'open',
          object_type: 'login',
          object_id: a
        })
      },
      'uiAction:onboardAlertShow': function () {
        e.client.emit({
          verb: 'view',
          object_type: 'area',
          object_id: 'onboard_alert'
        })
      },
      'uiAction:onboardAlertDismiss': function () {
        e.client.emit({
          verb: 'close',
          object_type: 'area',
          object_id: 'onboard_alert'
        })
      },
      'uiAction:openHome': function (a, b) {
        e.client.emit({
          verb: 'open',
          object_type: 'product',
          object_id: b ? 'bridge' : 'home',
          section: a
        })
      },
      'uiAction:viewBanUser': function () {
        e.client.emit({
          verb: 'view',
          object_type: 'area',
          object_id: 'ban_user'
        })
      },
      'uiAction:clickBanUser': function (a) {
        e.client.emit({
          verb: 'click',
          object_type: 'button',
          object_id: 'ban_user',
          extra_data: a
        })
      },
      'uiAction:viewFlagPost': function () {
        e.client.emit({
          verb: 'view',
          object_type: 'area',
          object_id: 'flag_post'
        })
      },
      'uiAction:clickFlagPost': function () {
        e.client.emit({
          verb: 'click',
          object_type: 'button',
          object_id: 'flag_post'
        })
      },
      'uiAction:viewBlockUser': function () {
        e.client.emit({
          verb: 'view',
          object_type: 'area',
          object_id: 'block_user'
        })
      },
      'uiAction:clickBlockUser': function () {
        e.client.emit({
          verb: 'click',
          object_type: 'button',
          object_id: 'block_user'
        })
      },
      'uiAction:viewUpgradeCard': function () {
        e.client.emit({
          verb: 'hover',
          object_type: 'icon',
          object_id: 'disqus_pro',
          organization_id: y.get('organizationId')
        })
      },
      'uiAction:clickUpgrade': function () {
        e.client.emit({
          verb: 'click',
          object_type: 'button',
          object_id: 'subscriptions',
          organization_id: y.get('organizationId')
        })
      },
      'uiAction:clickCommentPolicy': function (a) {
        e.client.emit({
          verb: 'click',
          object_type: 'link',
          section: 'comment_policy',
          object_id: a
        })
      },
      'uiAction:clickThreadPremoderate': function () {
        e.client.emit({
          verb: 'click',
          object_type: 'button',
          object_id: 'premoderate_thread'
        })
      },
      viewActivity: function (a, b) {
        var c = {
          verb: 'view',
          object_type: a,
          object_id: b
        };
        e.client.emit(c)
      },
      'uiAction:loadEmailSubscriptionPrompt': function (a) {
        e.client.emit({
          verb: 'load',
          object_type: 'section',
          object_id: 'email_subscriptions',
          section: 'email_subscriptions',
          extra_data: JSON.stringify({
            user_verified: Boolean(q.session.user && q.session.user.get('isVerified')),
            email_subscription_prompt: a
          })
        })
      },
      'uiAction:viewEmailSubscriptionPrompt': function (a) {
        e.client.emit({
          verb: 'view',
          object_type: 'section',
          object_id: 'email_subscriptions',
          section: 'email_subscriptions',
          extra_data: JSON.stringify({
            user_verified: Boolean(q.session.user && q.session.user.get('isVerified')),
            email_subscription_prompt: a
          })
        })
      },
      'uiAction:clickEmailSubscriptionPromptSubscribe': function (a) {
        e.client.emit({
          verb: 'click',
          object_type: 'button',
          object_id: 'subscribe',
          section: 'email_subscriptions',
          extra_data: JSON.stringify({
            user_verified: Boolean(q.session.user && q.session.user.get('isVerified')),
            email_subscription_prompt: a
          })
        })
      },
      'uiAction:clickEmailSubscriptionPromptDismiss': function (a) {
        e.client.emit({
          verb: 'click',
          object_type: 'button',
          object_id: 'hide_this_message',
          section: 'email_subscriptions',
          extra_data: JSON.stringify({
            user_verified: Boolean(q.session.user && q.session.user.get('isVerified')),
            email_subscription_prompt: a
          })
        })
      },
      'uiAction:viewReactionsPromotion': function () {
        e.client.emit({
          verb: 'view',
          object_type: 'section',
          object_id: 'reactions_onboarding',
          zone: 'thread',
          section: 'reactions_onboarding'
        })
      },
      'uiAction:reactionsEnable': function () {
        e.client.emit({
          verb: 'click',
          object_type: 'button',
          object_id: 'enable_reactions',
          zone: 'thread',
          section: 'reactions_onboarding'
        })
      },
      'uiAction:reactionsDefer': function () {
        e.client.emit({
          verb: 'click',
          object_type: 'button',
          object_id: 'maybe_later',
          zone: 'thread',
          section: 'reactions_onboarding'
        })
      },
      'uiAction:reactionsVote': function (a) {
        e.client.emit({
          verb: 'vote',
          object_type: 'thread',
          adjective: a.get('text'),
          zone: 'thread',
          section: 'reactions',
          extra_data: JSON.stringify({
            reaction_id: a.id
          })
        })
      },
      'uiAction:gifsClickButton': function () {
        e.client.emit({
          verb: 'click',
          object_type: 'button',
          adjective: 'gif_picker',
          object_id: 'thread',
          zone: 'thread'
        })
      },
      'uiAction:gifsScrollToBottom': function () {
        e.client.emit({
          verb: 'view',
          adverb: 'results',
          object_type: 'zone',
          adjective: 'end',
          object_id: 'thread',
          zone: 'thread'
        })
      },
      'uiAction:loadLiveComments': function () {
        e.client.emit({
          verb: 'click',
          adverb: 'comments',
          object_type: 'notification',
          adjective: 'realtime',
          object_id: 'thread',
          zone: 'thread'
        })
      },
      'uiAction:loadLiveReplies': function () {
        e.client.emit({
          verb: 'click',
          adverb: 'replies',
          object_type: 'notification',
          adjective: 'realtime',
          object_id: 'thread',
          zone: 'thread'
        })
      },
      'uiAction:clickBadge': function (a, b) {
        e.client.emit({
          verb: 'click',
          object_type: 'badge',
          object_id: b,
          section: 'profile/badges',
          zone: 'thread',
          area: s.getEventTrackingArea(a)
        })
      },
      'uiAction:viewBadgeModal': function () {
        e.client.emit({
          verb: 'view',
          object_type: 'modal',
          object_id: 'badge',
          section: 'manage_badges',
          zone: 'thread'
        })
      },
      'uiAction:awardBadge': function (a) {
        e.client.emit({
          verb: 'award',
          object_type: 'badge',
          object_id: a,
          section: 'manage_badges',
          zone: 'thread'
        })
      },
      'uiAction:removeBadge': function (a) {
        e.client.emit({
          verb: 'remove',
          object_type: 'badge',
          object_id: a,
          section: 'manage_badges',
          zone: 'thread'
        })
      },
      'uiAction:behindClickButton': function () {
        e.client.emit({
          verb: 'click',
          object_type: 'button',
          adjective: 'behind_click',
          object_id: 'thread',
          zone: 'thread'
        })
      },
      'uiAction:toggleClassicDisqus': function (a) {
        e.client.emit({
          verb: 'click',
          object_type: 'button',
          adjective: a,
          object_id: 'toggle_classic_disqus',
          zone: 'thread'
        })
      }
    };
    q.on(D),
    f.on(D),
    f.frame.once('cmp.consent', t),
    f.frame.once('tracking.hostIdentity', function (b) {
      if (!u) {
        var e = [
          j.calculate(b.domain),
          b.id,
          d.unique.value
        ],
        f = a('body'),
        h = g.logger + '/1/' + n.btoa(JSON.stringify(e));
        try {
          f.append(a('<img>').hide().attr('src', h))
        } catch (i) {
          c.captureException(i)
        }
        u = !0
      }
    })
  }
  var s = {
  },
  t = !1,
  u = !1,
  v = !1,
  w = !1,
  x = {
  };
  return s.init = function (a) {
    r(window, a)
  },
  s.getEventTrackingArea = function (b) {
    return a(b.currentTarget).closest('[data-tracking-area]').attr('data-tracking-area')
  },
  s.load3rdParties = function (d, f) {
    if (g.glitter && !t) {
      var h = n.lounge.tracking || {
      },
      i = h.iframe_limit || 0,
      j = {
        postCount: d.get('posts') || 0,
        likeCount: d.get('likes') || 0,
        postVoteCount: b.reduce(d.posts.pluck('likes'), function (a, b) {
          return a + b
        }, 0),
        referrer: encodeURIComponent(f.config.referrer),
        tcString: x.tcString || ''
      };
      a.ajax({
        dataType: 'jsonp',
        cache: !0,
        url: g.glitter,
        data: {
          forum_shortname: d.forum.id,
          thread_id: d.id,
          referer: f.config.hostReferrer,
          tc: x.tcString || ''
        },
        jsonpCallback: 'dsqGlitterResponseHandler',
        success: function (d) {
          var f = a('body');
          b.each(d, function (d) {
            if (!('img' !== d.type && 'iframe' !== d.type || 'iframe' === d.type && (i -= 1, i < 0))) {
              var g;
              try {
                g = d.url.replace(/\{\{(.+?)\}\}/g, function (a, c) {
                  var d = c.trim();
                  if (!j.hasOwnProperty(d)) throw new Error('Unknown template variable in tracker URL: ' + d);
                  return b.escape(j[d])
                });
                var h = a('<' + d.type + '>').hide().attr('src', g);
                d.logging && h.on('load', function () {
                  e.logStat('glitter.loaded.' + d.logging)
                }),
                f.append(h)
              } catch (k) {
                c.captureException(k)
              }
            }
          })
        },
        error: function () {
          e.logStat('glitter.error')
        }
      }),
      t = !0
    }
  },
  s.shouldTrack = function (a, b) {
    var c = arguments.length > 2 && void 0 !== arguments[2] && arguments[2];
    return !(Boolean(a && a.get('settings').disable3rdPartyTrackers ^ c) || s.shouldNotTrackUser(b))
  },
  s.shouldNotTrackUser = function (a) {
    return a && a.get('disable3rdPartyTrackers') || '1' === o.cookies.read('disqus_tracking_optout') || o.isDNTEnabled() || s.isPrivate(a)
  },
  s.shouldLoadLc = function (a, b) {
    return (a.get('settings').adsEnabled || !a.get('settings').disable3rdPartyTrackers) && !s.shouldNotTrackUser(b)
  },
  s.isPrivate = function (a) {
    return q.getLounge().config.isPrivate && (!a || !a.get('hasAcceptedGdprTerms')) && !w
  },
  s.reset = function () {
    t = !1,
    u = !1,
    v = !1,
    w = !1,
    x = {
    }
  },
  s
}),
define('common/jsxUtils', [
  'underscore'
], function (a) {
  'use strict';
  return {
    append: function (b, c) {
      var d = function e(c) {
        if (null !== c) return a.isArray(c) ? void c.forEach(e) : a.isElement(c) || c && c.nodeType === window.Node.DOCUMENT_FRAGMENT_NODE ? void b.appendChild(c) : void b.appendChild(window.document.createTextNode(c))
      };
      d(c)
    }
  }
});
var _extends = Object.assign || function (a) {
  for (var b = 1; b < arguments.length; b++) {
    var c = arguments[b];
    for (var d in c) Object.prototype.hasOwnProperty.call(c, d) && (a[d] = c[d])
  }
  return a
};
define('react', [
  'jquery',
  'underscore',
  'common/jsxUtils'
], function (a, b, c) {
  'use strict';
  var d = window.document;
  return {
    createElement: function (e, f) {
      for (var g = arguments.length, h = Array(g > 2 ? g - 2 : 0), i = 2; i < g; i++) h[i - 2] = arguments[i];
      if ('function' == typeof e) {
        h.length > 0 && (f = _extends({
          children: 1 === h.length ? h[0] : h
        }, f));
        var j = e(f);
        if (b.isArray(j)) {
          var k = d.createDocumentFragment();
          return c.append(k, j),
          k
        }
        return j
      }
      if ('string' != typeof e) throw new Error('Unknown type');
      var l = d.createElement(e),
      m = !1;
      return f && Object.keys(f).forEach(function (b) {
        var c = f[b];
        if (/^(?:data-|aria-|role$)/.test(b)) null !== c && l.setAttribute(b, c);
         else if ('dangerouslySetInnerHTML' === b) m = !0,
        l.innerHTML = c && c.__html || '';
         else if ('style' === b) Object.keys(c).forEach(function (a) {
          l.style[a] = c[a]
        });
         else if (/^on[A-Z]/.test(b)) c && a(l).on(b.slice(2).toLowerCase(), c);
         else if ('key' === b);
         else try {
          l[b] = c
        } catch (d) {
        }
      }),
      m || c.append(l, h),
      l
    }
  }
}),
define('react-dom', [
  'common/jsxUtils'
], function (a) {
  'use strict';
  return {
    render: function (b, c, d) {
      return c && (c.innerHTML = '', a.append(c, b)),
      d && d(),
      null
    }
  }
}),
define('core/shared/urls', [
  'require',
  'core/utils/object/extend',
  'core/utils/url/serialize',
  'core/utils/url/serializeArgs'
], function (a) {
  'use strict';
  var b = a('core/utils/object/extend'),
  c = a('core/utils/url/serialize'),
  d = a('core/utils/url/serializeArgs'),
  e = 'default',
  f = {
    lounge: 'http://disqus.com/embed/comments/',
    home: 'https://disqus.com/home/'.replace('home/', ''),
    recommendations: 'http://disqus.com/recommendations/'
  },
  g = function (a) {
    return 'https://' + a.replace(/^\s*(\w+:)?\/\//, '')
  },
  h = function (a, h, i, j) {
    var k = f[a];
    if (!k) throw new Error('Unknown app: ' + a);
    'preview' === e && j && (e += '-' + j);
    var l = g(k),
    m = b({
      base: e
    }, h || {
    }),
    n = i ? '#' + d(i) : '';
    return c(l, m) + n
  };
  return {
    BASE: e,
    apps: f,
    get: h,
    ensureHTTPSProtocol: g
  }
}),
define('core/apps/BaseApp', [
  'require',
  'core/Events',
  'core/utils/object/extend',
  'core/utils/object/has',
  'core/utils/uniqueId'
], function (a) {
  'use strict';
  var b = a('core/Events'),
  c = a('core/utils/object/extend'),
  d = a('core/utils/object/has'),
  e = a('core/utils/uniqueId'),
  f = function (a) {
    this.uid = e('dsq-app'),
    this.settings = a || {
    };
    var b = [
    ],
    c = this.constructor.prototype;
    do b.unshift(c),
    c = c.constructor.__super__;
    while (c);
    for (var f = 0, g = b.length; f < g; f++) c = b[f],
    d(c, 'events') && this.on(c.events, this),
    d(c, 'onceEvents') && this.once(c.onceEvents, this)
  };
  return c(f.prototype, b),
  f.prototype.destroy = function () {
    this.off(),
    this.stopListening()
  },
  f.extend = function (a, b) {
    var e,
    f = this;
    e = a && d(a, 'constructor') ? a.constructor : function () {
      return f.apply(this, arguments)
    },
    c(e, f, b);
    var g = function () {
      this.constructor = e
    };
    return g.prototype = f.prototype,
    e.prototype = new g,
    a && c(e.prototype, a),
    e.__super__ = f.prototype,
    e
  },
  f
}),
define('core/common/kernel/utils', [
  'require'
], function (a) {
  'use strict';
  function b(a) {
    return e.getElementById(a) || e.body || e.documentElement
  }
  function c(a) {
    return f.href = a,
    f.hostname
  }
  function d(a, b) {
    b = b || e.documentElement;
    for (var c = a, d = 0, f = 0; c && c !== b; ) d += c.offsetLeft,
    f += c.offsetTop,
    c = c.offsetParent;
    return {
      top: f,
      left: d,
      height: a.offsetHeight,
      width: a.offsetWidth
    }
  }
  var e = window.document,
  f = e.createElement('a');
  return {
    getContainer: b,
    getHost: c,
    getOffset: d
  }
}),
define('core/host/json', [
  'require',
  'core/host/globalFromSandbox'
], function (a) {
  'use strict';
  var b,
  c = window,
  d = a('core/host/globalFromSandbox');
  return b = '[object JSON]' === c.Object.prototype.toString.call(c.JSON) ? c.JSON : d('JSON', c),
  b ? b : {
  }
}),
define('core/common/kernel/WindowBase', [
  'require',
  'core/Events',
  'core/utils/object/extend',
  'core/utils/uniqueId',
  'core/common/kernel/utils',
  'core/host/json'
], function (a) {
  'use strict';
  var b = a('core/Events'),
  c = a('core/utils/object/extend'),
  d = a('core/utils/uniqueId'),
  e = a('core/common/kernel/utils'),
  f = a('core/host/json'),
  g = function (a) {
    a = a || {
    },
    this.state = g.INIT,
    this.uid = a.uid || d('dsq-frame'),
    this.origin = a.origin,
    a.useSourcelessFrame ? this.host = e.getHost(window.location.href) : this.host = e.getHost(this.origin),
    this.target = a.target,
    this.sandbox = a.sandbox,
    this.window = null,
    g.windows[this.uid] = this,
    this.on('ready', function () {
      this.state = g.READY
    }, this),
    this.on('die', function () {
      this.state = g.KILLED
    }, this)
  };
  return c(g, {
    INIT: 0,
    READY: 1,
    KILLED: 2,
    windows: {
    },
    postMessage: function (a, b, c) {
      return a.postMessage(b, c)
    }
  }),
  c(g.prototype, b),
  g.prototype.requiresWindow = function (a) {
    var b = this;
    return function () {
      var c = Array.prototype.slice.call(arguments),
      d = function () {
        var e = b.window;
        e ? a.apply(b, c) : setTimeout(d, 500)
      };
      b.isReady() ? d() : b.on('ready', d)
    }
  },
  g.prototype.sendMessage = function (a, b) {
    var c = f.stringify({
      scope: 'client',
      name: a,
      data: b
    });
    this.requiresWindow(function (a) {
      g.postMessage(this.window, a, this.origin)
    }) (c)
  },
  g.prototype.hide = function () {
  },
  g.prototype.show = function () {
  },
  g.prototype.url = function () {
    return this.target
  },
  g.prototype.destroy = function () {
    this.state = g.KILLED,
    this.off()
  },
  g.prototype.isReady = function () {
    return this.state === g.READY
  },
  g.prototype.isKilled = function () {
    return this.state === g.KILLED
  },
  g
}),
define('core/common/kernel/Iframe', [
  'require',
  'core/utils/html/setInlineStyle',
  'core/utils/object/extend',
  'core/common/kernel/WindowBase',
  'core/common/kernel/utils'
], function (a) {
  'use strict';
  var b = a('core/utils/html/setInlineStyle'),
  c = a('core/utils/object/extend'),
  d = a('core/common/kernel/WindowBase'),
  e = a('core/common/kernel/utils'),
  f = window.document,
  g = function (a) {
    d.call(this, a),
    this.styles = a.styles || {
    },
    this.tabIndex = a.tabIndex || 0,
    this.title = a.title || 'Disqus',
    this.sandbox = a.sandbox,
    this.container = a.container,
    this.elem = null
  };
  return c(g.prototype, d.prototype),
  g.prototype.load = function () {
    var a = this.elem = f.createElement('iframe');
    a.setAttribute('id', this.uid),
    a.setAttribute('name', this.uid),
    a.setAttribute('allowTransparency', 'true'),
    a.setAttribute('frameBorder', '0'),
    a.setAttribute('scrolling', 'no'),
    this.role && a.setAttribute('role', this.role),
    a.setAttribute('tabindex', this.tabIndex),
    a.setAttribute('title', this.title),
    'string' == typeof this.sandbox && a.setAttribute('sandbox', this.sandbox),
    this.setInlineStyle(this.styles)
  },
  g.prototype.getOffset = function (a) {
    return e.getOffset(this.elem, a)
  },
  g.prototype.setInlineStyle = function (a, c) {
    return b(this.elem, a, c)
  },
  g.prototype.removeInlineStyle = function (a) {
    var b = this.elem.style;
    return 'removeProperty' in b ? void b.removeProperty(a) : void (b[a] = '')
  },
  g.prototype.hide = function () {
    this.setInlineStyle('display', 'none')
  },
  g.prototype.show = function () {
    this.removeInlineStyle('display')
  },
  g.prototype.destroy = function () {
    return this.elem && this.elem.parentNode && (this.elem.parentNode.removeChild(this.elem), this.elem = null),
    d.prototype.destroy.call(this)
  },
  g
}),
define('core/host/kernel', [
  'require',
  'exports',
  'module',
  'core/Events',
  'core/utils/lang/isString',
  'core/utils/object/has',
  'core/utils/object/extend',
  'core/common/kernel/Iframe',
  'core/common/kernel/utils',
  'core/common/kernel/WindowBase',
  'core/host/json',
  'core/utils/function/throttle'
], function (a, b) {
  'use strict';
  var c = a('core/Events'),
  d = a('core/utils/lang/isString'),
  e = a('core/utils/object/has'),
  f = a('core/utils/object/extend'),
  g = a('core/common/kernel/Iframe'),
  h = a('core/common/kernel/utils'),
  i = a('core/common/kernel/WindowBase'),
  j = a('core/host/json'),
  k = window.document;
  b.throttle = a('core/utils/function/throttle'),
  window.addEventListener('message', function (a) {
    var c;
    try {
      c = j.parse(a.data)
    } catch (d) {
      return
    }
    var f = c.sender,
    g = e(i.windows, f) && i.windows[f];
    g && h.getHost(a.origin) === g.host && (a.origin !== g.origin && (g.origin = a.origin), 'host' === c.scope && g.trigger(c.name, c.data), 'error' === c.name && b.trigger('error', c.data))
  }),
  window.addEventListener('hashchange', function () {
    b.trigger('window.hashchange', {
      hash: window.location.hash
    })
  }),
  window.addEventListener('resize', b.throttle(function () {
    b.trigger('window.resize')
  }, 250, 50)),
  k.addEventListener('mousemove', b.throttle(function () {
    b.trigger('window.mousemove')
  }, 250, 50));
  var l = function () {
    b.trigger('window.scroll')
  };
  window.addEventListener('scroll', b.throttle(l, 250, 50), !1),
  k.addEventListener('click', function () {
    b.trigger('window.click')
  });
  var m = b.Popup = function (a) {
    a.uid = a.windowName,
    i.call(this, a)
  };
  f(m.prototype, i.prototype),
  m.prototype.load = function () {
    var a = this.window = window.open('', this.uid || '_blank');
    a.location = this.url()
  },
  m.prototype.isKilled = function () {
    return i.prototype.isKilled() || this.window.closed
  };
  var n = b.Channel = function (a) {
    var b = this;
    b.window = null,
    g.call(b, a),
    this.insertBeforeEl = a.insertBeforeEl,
    this.insertAfterEl = a.insertAfterEl,
    b.useSourcelessFrame = a.useSourcelessFrame,
    b.styles = f({
      width: '1px',
      'min-width': '100%',
      border: 'none',
      overflow: 'hidden',
      height: '0'
    }, a.styles || {
    })
  };
  f(n.prototype, g.prototype),
  n.prototype.load = function (a) {
    var b = this;
    g.prototype.load.call(b);
    var c = b.elem;
    if (c.setAttribute('width', '100%'), b.useSourcelessFrame) {
      var e = function () {
        var a = new window.XMLHttpRequest;
        a.open('GET', b.url()),
        a.onreadystatechange = function () {
          c.contentWindow && a.readyState === c.contentWindow.XMLHttpRequest.DONE && 200 === a.status && (c.contentWindow.document.open(), c.contentWindow.document.write(a.responseText), c.contentWindow.document.close())
        },
        a.send()
      };
      b.on('redirect', function (a) {
        b.target = a,
        e()
      }),
      e()
    } else c.setAttribute('src', b.url());
    c.addEventListener('load', function () {
      b.window = c.contentWindow,
      a && a()
    });
    var f = d(b.container) ? h.getContainer(b.container) : b.container,
    i = (b.insertAfterEl ? b.insertAfterEl.nextSibling : b.insertBeforeEl) || null;
    f.insertBefore(c, i)
  },
  n.prototype.destroy = function () {
    return this.window = null,
    g.prototype.destroy.call(this)
  },
  b.on = c.on,
  b.off = c.off,
  b.trigger = c.trigger
}),
define('core/apps/WindowedApp', [
  'require',
  'core/utils/object/extend',
  'core/shared/urls',
  'core/apps/BaseApp',
  'core/host/kernel'
], function (a) {
  'use strict';
  var b = a('core/utils/object/extend'),
  c = a('core/shared/urls'),
  d = a('core/apps/BaseApp'),
  e = a('core/host/kernel'),
  f = window.document,
  g = d.extend({
    name: null,
    loaderVersion: null,
    frame: null,
    origin: c.ensureHTTPSProtocol('https://disqus.com'),
    state: null,
    getUrl: function (a, d) {
      return this.loaderVersion && (d = b({
        version: this.loaderVersion
      }, d)),
      c.ensureHTTPSProtocol(c.get(this.name, a, d, this.settings.previewVersion))
    },
    getFrameSettings: function () {
      var a = {
        target: this.getUrl(),
        origin: this.origin,
        uid: this.uid,
        sandbox: this.sandbox
      },
      b = this.settings;
      return b.windowName ? a.windowName = b.windowName : a.container = b.container || f.body,
      b.styles && (a.styles = b.styles),
      a.useSourcelessFrame = b.useSourcelessFrame,
      a
    },
    getFrame: function () {
      var a = this.getFrameSettings(),
      b = a.windowName ? e.Popup : e.Channel;
      return new b(a)
    },
    setState: function (a) {
      var b = this.constructor;
      return a in b.states && (this.state = b.states[a], void this.trigger('state:' + a))
    },
    init: function () {
      var a,
      b = this;
      b.frame = a = this.getFrame(),
      b.listenTo(a, 'all', function (c, d) {
        b.trigger('frame:' + c, d, a)
      }),
      b.listenTo(a, 'resize', function (a) {
        b.lastResizedHeight = a.height
      }),
      b.trigger('change:frame', a),
      b.frame.load(function () {
        b.setState('LOADED')
      }),
      b.setState('INIT')
    },
    destroy: function () {
      var a = this.frame;
      a && (this.stopListening(a), a.destroy()),
      this.setState('KILLED'),
      this.frame = null,
      d.prototype.destroy.call(this)
    },
    events: {
      'frame:ready': function () {
        this.setState('READY')
      }
    }
  }, {
    states: {
      INIT: 0,
      LOADED: 1,
      READY: 2,
      RUNNING: 3,
      KILLED: 4
    }
  });
  return g
}),
define('core/utils/OnceTimer', [
  'require',
  'exports',
  'module'
], function (a, b, c) {
  'use strict';
  c.exports = function (a, b) {
    var c = null,
    d = !1;
    this.start = function () {
      d || (c = setTimeout(function () {
        d = !0,
        a()
      }, b))
    },
    this.clear = function () {
      clearTimeout(c)
    }
  }
}),
define('core/utils/html/toHexColorString', [
], function () {
  'use strict';
  function a(a) {
    if (a = Number(a), isNaN(a) || a > 255) throw new Error('Color components should be numbers less than 256');
    return a = a.toString(16),
    1 === a.length ? '0' + a : String(a)
  }
  return function (b) {
    return '#' + a(b.red) + a(b.green) + a(b.blue)
  }
}),
define('core/utils/sandbox', [
], function () {
  'use strict';
  var a = [
    'allow-forms',
    'allow-pointer-lock',
    'allow-popups',
    'allow-same-origin',
    'allow-scripts',
    'allow-top-navigation'
  ],
  b = function (b) {
    return b ? a.reduce(function (a, c) {
      return b[c] && (a += c + ' '),
      a
    }, '').trim() : ''
  };
  return {
    getAttribute: b
  }
}),
define('core/utils/url/parseQueryString', [
  'core/utils/collection/each'
], function (a) {
  'use strict';
  return function (b) {
    'undefined' == typeof b && (b = window.location.search);
    var c = {
    };
    return a(b.substr(1).split('&'), function (a) {
      var b = a.split('=').map(function (a) {
        return decodeURIComponent(a.replace(/\+/g, '%20'))
      });
      b[0] && (c[b[0]] = b[1])
    }),
    c
  }
}),
define('core/analytics/reporting', [
  'require',
  'core/utils/collection/each',
  'core/utils/url/serialize',
  'core/config/urls'
], function (a) {
  'use strict';
  function b(a) {
    var b = a.split('.'),
    c = b.length > 2 ? b[b.length - 2] : '';
    return c.match(/^[0-9a-f]{32}$/i) && c
  }
  function c(a) {
    (new window.Image).src = g(i + '/stat.gif', {
      event: a
    })
  }
  function d(a) {
    (new window.Image).src = g(i + '/event.gif', a)
  }
  function e(a) {
    var b = new window.URLSearchParams;
    f(a, function (a, c) {
      void 0 !== a && b.append(c, a)
    });
    var c = new window.XMLHttpRequest;
    c.open('POST', i + '/event.json', !0),
    c.withCredentials = !0,
    c.send(b)
  }
  var f = a('core/utils/collection/each'),
  g = a('core/utils/url/serialize'),
  h = a('core/config/urls'),
  i = h.jester;
  return {
    getLoaderVersionFromUrl: b,
    logStat: c,
    reportJester: d,
    reportJesterPOST: e
  }
}),
define('core/ads/safeFrameUtils', [
], function () {
  'use strict';
  var a = function (a) {
    return null !== a && !isNaN(Number(a)) && isFinite(a)
  },
  b = function (a) {
    return Math.min.apply(Math, _toConsumableArray(a)) || 0
  },
  c = function (a) {
    return Math.max.apply(Math, _toConsumableArray(a)) || 0
  };
  return {
    min: b,
    max: c,
    isNumeric: a
  }
});
var _createClass = function () {
  function a(a, b) {
    for (var c = 0; c < b.length; c++) {
      var d = b[c];
      d.enumerable = d.enumerable || !1,
      d.configurable = !0,
      'value' in d && (d.writable = !0),
      Object.defineProperty(a, d.key, d)
    }
  }
  return function (b, c, d) {
    return c && a(b.prototype, c),
    d && a(b, d),
    b
  }
}();
define('core/ads/NodeRect', [
  'core/ads/safeFrameUtils'
], function (a) {
  'use strict';
  var b = function () {
    function b() {
      return _classCallCheck(this, b),
      1 !== arguments.length || a.isNumeric(arguments[0]) ? void this.fromArray(arguments) : Array.isArray(arguments[0]) ? this.fromArray(arguments[0]) : this.fromObject(arguments[0])
    }
    return _createClass(b, [
      {
        key: 'fromArray',
        value: function (a) {
          this.reset(),
          a.length >= 6 ? (this.top = a[0], this.right = a[1], this.bottom = a[2], this.left = a[3], this.width = a[4], this.height = a[5]) : a.length >= 4 ? (this.top = a[0], this.right = a[1], this.bottom = a[2], this.left = a[3]) : 3 === a.length ? (this.top = a[0], this.right = a[1], this.bottom = a[2], this.left = 0) : 2 === a.length ? (this.top = a[0], this.right = a[1], this.bottom = a[0], this.left = a[1]) : (this.top = a[0], this.right = a[0], this.bottom = a[0], this.left = a[0]),
          this.update()
        }
      },
      {
        key: 'fromObject',
        value: function (a) {
          return this.fromArray([a.top,
          a.right,
          a.bottom,
          a.left,
          a.width,
          a.height])
        }
      },
      {
        key: 'update',
        value: function () {
          this.width || (this.width = this.right - this.left),
          this.height || (this.height = this.bottom - this.top)
        }
      },
      {
        key: 'reset',
        value: function (a) {
          a = a || 0,
          this.top = a,
          this.right = a,
          this.bottom = a,
          this.left = a,
          this.width = a,
          this.height = a
        }
      },
      {
        key: 'getArea',
        value: function () {
          return (this.right - this.left) * (this.bottom - this.top)
        }
      }
    ]),
    b
  }();
  return b.getOverlapRect = function (c, d) {
    var e = a.max([c.left,
    d.left]),
    f = a.min([c.left + c.width,
    d.left + d.width]),
    g = a.max([c.top,
    d.top]),
    h = a.min([c.top + c.height,
    d.top + d.height]);
    return f >= e && h >= g && new b(g, f, h, e, f - e, h - g)
  },
  b.getOverlapArea = function (b, c) {
    var d = a.max([0,
    a.min([b.right,
    c.right]) - a.max([b.left,
    c.left])]),
    e = a.max([0,
    a.min([b.bottom,
    c.bottom]) - a.max([b.top,
    c.top])]);
    return d * e
  },
  b
}),
define('core/ads/domUtils', [
  'core/ads/NodeRect'
], function (a) {
  'use strict';
  var b = 9,
  c = function (a) {
    return a && a.parentNode
  },
  d = function (a, b) {
    if (!a) return null;
    var c = window.document.defaultView.getComputedStyle(a);
    return b && c.hasOwnProperty(b) ? c[b] : c
  },
  e = function () {
    return {
      x: window.pageXOffset,
      y: window.pageYOffset
    }
  },
  f = function (b) {
    var c = void 0;
    if (b && b.style) {
      var d = b.style.display;
      b.style.display = 'block',
      c = b.getBoundingClientRect(),
      b.style.display = d,
      c = new a(c);
      var f = e();
      c.left += f.x,
      c.right += f.x,
      c.top += f.y,
      c.bottom += f.y
    } else c = new a(0);
    return c
  },
  g = function (a, b) {
    var c = f(a);
    if (b) {
      var d = f(b);
      c.top = d.top - d.top + b.scrollTop,
      c.bottom = c.top + c.height + b.scrollTop,
      c.left = c.left - d.left + b.scrollLeft,
      c.right = c.left + c.width + b.scrollLeft
    }
    return c
  },
  h = function () {
    var b = e(),
    c = b.y,
    d = b.x + window.innerWidth,
    f = b.y + window.innerHeight,
    g = b.x,
    h = window.innerWidth,
    i = window.innerHeight;
    return new a(c, d, f, g, h, i)
  },
  i = function (a) {
    try {
      return a.nodeType === b ? a : a.ownerDocument
    } catch (c) {
      return null
    }
  },
  j = function (a) {
    var b = i(a),
    c = void 0;
    try {
      b && (c = b.parentWindow || b.defaultView || window)
    } catch (d) {
      c = window
    }
    return c
  },
  k = function (b) {
    var c = j(b),
    d = new a(0, c.innerWidth, c.innerHeight, 0, c.innerWidth, c.innerHeight),
    f = e();
    return d.left += f.x,
    d.right += f.x,
    d.top += f.y,
    d.bottom += f.y,
    d
  },
  l = function (a) {
    var b = i(a);
    if (b) return b.documentElement || b.body
  },
  m = function (b) {
    var c = l(b) || {
    },
    d = new a;
    return d.right = d.width = c.scrollWidth || 0,
    d.bottom = d.height = c.scrollHeight || 0,
    d
  },
  n = function (a, b) {
    for (; b; ) {
      if (b === a) return !0;
      b = b.parentNode
    }
    return !1
  },
  o = function (a) {
    var b = d(a);
    return 'inline-block' === b.display || 'none' !== b['float'] || 'absolute' === b.position || 'fixed' === b.position || 'auto' !== b.width || 'auto' !== b.height
  },
  p = function (a) {
    var b = d(a),
    c = {
    };
    return 'scroll' === b.overflowX || 'auto' === b.overflowX ? c.xscroll = a.offsetWidth - a.clientWidth : c.xscroll = 0,
    'scroll' === b.overflowY || 'auto' === b.overflowY ? c.yscroll = a.offsetHeight - a.clientHeight : c.yscroll = 0,
    c.xhidden = 'hidden' === b.overflowX,
    c.yhidden = 'hidden' === b.overflowY,
    c
  },
  q = function (a) {
    var b = d(a);
    return !!(b.clip && 'auto' !== b.clip || b.clipPath && 'none' !== b.clipPath)
  };
  return {
    getParentNode: c,
    getWindow: j,
    getScroll: e,
    getRect: f,
    getRectRelativeTo: g,
    getViewportRect: h,
    getDocument: i,
    getWindowRect: k,
    getRootNode: l,
    getRootRect: m,
    getNodeStyle: d,
    isParentOf: n,
    hasLayout: o,
    getNodeOverflow: p,
    isNodeClipped: q
  }
});
var _createClass = function () {
  function a(a, b) {
    for (var c = 0; c < b.length; c++) {
      var d = b[c];
      d.enumerable = d.enumerable || !1,
      d.configurable = !0,
      'value' in d && (d.writable = !0),
      Object.defineProperty(a, d.key, d)
    }
  }
  return function (b, c, d) {
    return c && a(b.prototype, c),
    d && a(b, d),
    b
  }
}();
define('core/ads/Geom', [
  'core/ads/domUtils',
  'core/ads/safeFrameUtils'
], function (a, b) {
  'use strict';
  var c = 1,
  d = function () {
    function d(b) {
      _classCallCheck(this, d),
      this.node = b,
      this.document = a.getDocument(b),
      this.window = a.getWindow(b),
      this.root = a.getRootNode(b),
      this.ref = this.getRefNode(b.parentNode)
    }
    return _createClass(d, [
      {
        key: 'getRefNode',
        value: function (b) {
          for (; b && b.nodeType === c; ) {
            var d = a.getNodeStyle(b);
            if (a.hasLayout(b) || 'block' === d.display || 'none' !== d.clear) {
              var e = a.getNodeOverflow(b);
              if (e.xscroll || e.yscroll || e.xhidden || e.yhidden) return b;
              if (a.isNodeClipped(b)) return b
            }
            b = b.parentNode
          }
          return this.root
        }
      },
      {
        key: 'getNodesOver',
        value: function (d, e) {
          e = e || 1;
          var f = [
          ],
          g = a.getRect(d),
          h = a.getRect(this.ref),
          i = a.getViewportRect(d);
          if (!window.document.elementFromPoint) return f;
          for (var j = {
            top: b.max([g.top,
            h.top]) - i.top,
            right: b.min([g.right,
            h.right]) - i.left,
            bottom: b.min([g.bottom,
            h.bottom]) - i.top,
            left: b.max([g.left,
            h.left]) - i.left
          }, k = (j.right - j.left) / 10, l = (j.bottom - j.top) / 10, m = j.left; m < j.right; m += k) for (var n = j.top; n < j.bottom; n += l) {
            for (var o = window.document.elementFromPoint(m, n); o && o.nodeType === c; ) {
              var p = a.getNodeStyle(o);
              if (a.hasLayout(o) || 'block' === p.display || 'none' !== p.clear) break;
              o = o.parentNode
            }
            o && o.nodeType === c && o !== this.node && o !== this.root && !a.isParentOf(o, this.node) && (f.push(o), f.length >= e && (m = j.right, n = j.bottom))
          }
          return f
        }
      },
      {
        key: 'getWindowGeom',
        value: function () {
          var a = this.window.innerHeight || 0,
          b = this.window.innerWidth || 0,
          c = this.window.screenY || this.window.screenTop || 0,
          d = c + a,
          e = this.window.screenX || this.window.screenLeft || 0,
          f = e + b;
          return {
            t: c,
            r: f,
            b: d,
            l: e,
            w: b,
            h: a
          }
        }
      },
      {
        key: 'getSelfGeom',
        value: function () {
          var c = a.getRect(this.node),
          d = a.getRect(this.ref),
          e = a.getNodeStyle(this.node),
          f = a.getWindowRect(this.node),
          g = c.width,
          h = c.height;
          this.ref !== this.root && (g = b.max([0,
          b.min([c.right,
          d.right]) - b.max([c.left,
          d.left])]), h = b.max([0,
          b.min([c.bottom,
          d.bottom]) - b.max([c.top,
          d.top])]));
          var i = b.max([0,
          b.min(c.right, f.right) - b.max([c.left,
          f.left])]),
          j = b.max([0,
          b.min([c.bottom,
          f.bottom]) - b.max([c.top,
          f.top])]),
          k = b.min([g,
          i]),
          l = b.min([h,
          j]),
          m = c.width ? k / c.width : 0,
          n = c.height ? l / c.height : 0,
          o = k * l / (c.width * c.height),
          p = 1,
          q = this.getNodesOver(this.node, p);
          if (q.length) {
            var r = a.getRect(q[0]),
            s = b.max([0,
            b.min([r.right,
            c.right]) - b.max([r.left,
            c.left])]),
            t = b.max([0,
            b.min([r.bottom,
            c.bottom]) - b.max([r.top,
            c.top])]);
            o = b.max([0,
            (k * l - s * t) / (c.width * c.height)])
          }
          var u = a.getScroll();
          return {
            t: c.top - u.y,
            r: c.right - u.x,
            b: c.bottom - u.y,
            l: c.left - u.x,
            z: e.zIndex,
            w: c.width,
            h: c.height,
            xiv: 1 === m ? '1' : Number(m).toFixed(2),
            yiv: 1 === n ? '1' : Number(n).toFixed(2),
            iv: 1 === o ? '1' : Number(o).toFixed(2)
          }
        }
      },
      {
        key: 'getExpandGeom',
        value: function () {
          var c = a.getRect(this.ref),
          d = a.getRect(this.node),
          e = a.getWindowRect(this.node),
          f = {
            top: b.max([c.top,
            e.top]),
            right: b.min([c.right,
            e.right]),
            bottom: b.min([c.bottom,
            e.bottom]),
            left: b.max([c.left,
            e.left])
          },
          g = a.getNodeOverflow(this.ref);
          return {
            t: b.max([0,
            d.top - f.top]),
            r: b.max([0,
            f.right - d.right]),
            b: b.max([0,
            f.bottom - d.bottom]),
            l: b.max([0,
            d.left - f.left]),
            xs: Boolean(g.yscroll),
            yx: Boolean(g.xscroll)
          }
        }
      },
      {
        key: 'getGeom',
        value: function () {
          return {
            win: this.getWindowGeom(),
            self: this.getSelfGeom(),
            exp: this.getExpandGeom()
          }
        }
      }
    ]),
    d
  }(),
  e = {
    get: function (a) {
      var b = new d(a);
      return b.getGeom()
    }
  };
  return e
}),
define('core/ads/ads', [
  'require',
  'core/shared/urls',
  'core/apps/WindowedApp',
  'core/host/json',
  'stance/main',
  'stance/utils',
  'core/common/kernel/WindowBase',
  'core/utils/OnceTimer',
  'core/utils/html/toHexColorString',
  'core/utils/object/extend',
  'core/utils/sandbox',
  'core/utils/url/parseQueryString',
  'core/utils/url/serialize',
  'core/utils/urls',
  'core/utils/urls',
  'core/analytics/reporting',
  'core/ads/Geom'
], function (a) {
  'use strict';
  var b = a('core/shared/urls'),
  c = a('core/apps/WindowedApp'),
  d = a('core/host/json'),
  e = a('stance/main'),
  f = a('stance/utils'),
  g = a('core/common/kernel/WindowBase'),
  h = a('core/utils/OnceTimer'),
  i = a('core/utils/html/toHexColorString'),
  j = a('core/utils/object/extend'),
  k = a('core/utils/sandbox'),
  l = a('core/utils/url/parseQueryString'),
  m = a('core/utils/url/serialize'),
  n = a('core/utils/urls').getOrigin,
  o = a('core/utils/urls').getQuery,
  p = a('core/analytics/reporting'),
  q = a('core/ads/Geom'),
  r = c.extend({
    name: 'ads',
    origin: void 0,
    onceEvents: {
      'view:enter': function () {
        this._reportLegacy({
          verb: 'view',
          adverb: '0ms-no50perc'
        })
      },
      'view:iab': function () {
        this._reportLegacy({
          verb: 'view',
          adverb: 'iab-scroll'
        })
      }
    },
    events: {
      'frame:ready': function (a) {
        this.forumId = a.forumId,
        this._reportLegacy({
          verb: 'load',
          extra_data: a.extraData,
          advertisement_id: a.advertisement_id,
          provider: a.provider
        }),
        this.bindViewEvents(),
        this.triggerGeomUpdate()
      },
      'frame:resize': function (a) {
        this.frame.setInlineStyle('height', a.height + 'px'),
        0 === a.height ? this.trigger('ad-placement-empty') : (a.adWidth && this.frame.setInlineStyle('width', a.adWidth + 'px'), this.trigger('ad-placement-filled')),
        this.triggerGeomUpdate()
      },
      'frame:click': function () {
        this._reportOnce({
          verb: 'click'
        }, 'click')
      },
      'frame:hover': function () {
        this._reportOnce({
          verb: 'hover'
        }, 'hover')
      },
      'frame:error-provider-not-ready': function (a) {
        this._reportLegacy({
          verb: 'fail',
          object_type: 'provider',
          object_id: a.provider || this.getProvider(),
          adverb: 'provider_not_ready'
        })
      },
      'frame:error-no-height': function (a) {
        this._reportLegacy({
          verb: 'fail',
          object_type: 'provider',
          object_id: a.provider || this.getProvider(),
          adverb: 'no_height'
        })
      },
      'frame:clearSandbox': function () {
        this.frame.elem.hasAttribute('sandbox') && this.frame.elem.removeAttribute('sandbox')
      },
      'frame:$sf-init': function () {
        this.settings.isOnHostPage && (this.isSafeframe = !0)
      },
      'frame:error': function (a) {
        this.settings.isOnHostPage && this.postMessageDirect({
          event: 'error',
          data: {
            error: a
          }
        })
      }
    },
    constructor: function () {
      c.apply(this, arguments),
      this.origin = n(this.settings.adUrl),
      this._reportOnceHistory = {
      },
      this.settings.isOnHostPage && (this.detectLazyload = this.detectLazyload.bind(this), window.addEventListener('scroll', this.detectLazyload));
      var a = this.settings.adUrl.indexOf('/ads-iframe/taboola/') >= 0;
      this.settings.useSourcelessFrame = this.settings.sourcelessIframe && this.settings.isOnHostPage && (!this.settings.defaultPlacementUrl || !this.settings.adBlockEnabled) && !a
    },
    init: function () {
      if (this.settings.forum = l(o(this.settings.adUrl)).shortname, this.settings.forum) {
        var a = window.navigator && window.navigator.userAgent || window.navigator && window.navigator.vendor || window.opera,
        d = this.settings.disableAdsIos && /iP(hone|od|ad)/.test(a) || this.settings.disableAdsAndroid && /Android/.test(a),
        e = this.settings.disableAds,
        f = this.settings.isInHome || this.settings.isOnHostPage && 0 === window.location.href.indexOf(b.apps.home);
        if (!f && e && this.settings.canDisableAds || d) return void this.trigger('prevented-ad-load');
        this._reportOnce({
          verb: 'call',
          object_type: 'provider',
          object_id: this.getProvider(),
          adjective: 1
        }, 'call'),
        this.settings.sandboxAds && (this.sandbox = k.getAttribute({
          'allow-scripts': !0,
          'allow-same-origin': !0,
          'allow-forms': !0,
          'allow-popups': !0
        })),
        c.prototype.init.call(this)
      }
    },
    detectLazyload: function () {
      if (this.frame && this.settings.isOnHostPage) {
        var a = this.frame.elem.getBoundingClientRect().top,
        b = a - window.innerHeight,
        c = window.innerHeight * this.settings.lazyloadViewports;
        b < c && (this.postMessageDirect({
          event: 'lazyload'
        }), window.removeEventListener('scroll', this.detectLazyload))
      }
    },
    getProvider: function () {
      if (this._provider) return this._provider;
      var a = this.settings.adUrl.match(/provider=(\w+)/);
      return a && (this._provider = a[1]),
      this._provider
    },
    getUrl: function () {
      var a,
      b = this.settings;
      return a = 'inthreaddisqusadstxt' === b.experiment.experiment && 'active' === b.experiment.variant && 'inthread' === b.placement ? window.document.location.href : b.isOnHostPage ? b.url || window.document.location.href : b.url || b.referrer,
      m(b.adUrl, {
        anchorColor: i(b.anchorColor),
        colorScheme: b.colorScheme,
        sourceUrl: a,
        typeface: b.typeface,
        canonicalUrl: b.canonicalUrl,
        disqus_version: b.version,
        deviceWidth: b.deviceWidth,
        maxWidth: b.maxWidth
      })
    },
    triggerGeomUpdate: function () {
      if (this.frame.elem && this.isSafeframe && this.settings.isOnHostPage) {
        var a = q.get(this.frame.elem);
        this.postMessageDirect({
          event: 'geom-update',
          data: {
            geom: a
          }
        })
      }
    },
    bindViewEvents: function () {
      if (!this._viewEventsBound) {
        this._viewEventsBound = !0,
        e.bindWindowEvents(!0);
        var a = this,
        b = function (b, c) {
          a.postMessageDirect({
            event: b,
            percentViewable: c
          })
        },
        c = 1000,
        d = new h(function () {
          a.trigger('view:iab'),
          b('view:iab')
        }, c),
        g = !1;
        this.listenTo(e({
          el: this.frame.elem
        }), {
          enter: function () {
            a.trigger('view:enter'),
            b('view:enter'),
            a.triggerGeomUpdate()
          },
          exit: function () {
            b('view:exit'),
            g && (g = !1, b('view:50out'), d.clear()),
            a.triggerGeomUpdate()
          },
          visible: function (c, e) {
            var h = f.visiblePercent(e, c.offset()),
            i = 50;
            h >= i && !g ? (g = !0, b('view:50in'), d.start()) : h < i && g && (g = !1, b('view:50out'), d.clear()),
            b('view', h),
            a.triggerGeomUpdate()
          }
        })
      }
    },
    postMessageDirect: function (a) {
      this.frame.requiresWindow(function (a) {
        var b = d.stringify(j({
        }, a, {
          space: 'disqus'
        }));
        g.postMessage(this.window, b, this.origin),
        g.postMessage(this.window, 'disqus.' + a.event, this.origin)
      }) (a)
    },
    _report: function (a) {
      var b = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {
      },
      c = this.settings,
      d = b.provider || this.getProvider();
      a.forum_id = c.forumId || this.forumId;
      var e;
      e = c.placement && c.placement.indexOf('timeline') > - 1 ? 'home' : 'recommendations' === c.placement ? 'recommendations' : 'embed';
      var f = b.usePOST ? 'reportJesterPOST' : 'reportJester';
      p[f](j({
        imp: c.impressionId,
        experiment: c.experiment.experiment,
        variant: c.experiment.variant,
        service: c.experiment.service,
        area: c.placement,
        product: e,
        forum: c.forum,
        zone: 'thread',
        version: c.loaderVersion,
        page_url: c.referrer || window.document.location.href,
        page_referrer: c.hostReferrer || window.document.referrer,
        object_type: 'advertisement',
        provider: d,
        event: 'activity'
      }, a))
    },
    _reportLegacy: function (a) {
      var b = this.settings;
      this._report(j({
        ad_product_name: 'iab_display',
        ad_product_layout: 'iab_display',
        bin: 'embed:promoted_discovery:' + b.experiment.service + ':' + b.experiment.experiment + ':' + b.experiment.variant,
        object_id: a.advertisement_id ? '[' + a.advertisement_id + ']' : '',
        section: 'default'
      }, a))
    },
    _reportOnce: function (a, b) {
      this._reportOnceHistory[b] || (this._reportLegacy(a), this._reportOnceHistory[b] = !0)
    },
    getFrameSettings: function () {
      var a = c.prototype.getFrameSettings.call(this);
      return a.insertBeforeEl = this.settings.insertBeforeEl,
      a.insertAfterEl = this.settings.insertAfterEl,
      a
    }
  }),
  s = function (a) {
    return a = a || {
    },
    a.experiment || (a.experiment = {
      experiment: a.experimentName,
      variant: a.experimentVariant,
      service: a.experimentService
    }),
    new r(a)
  };
  return {
    Ads: s
  }
}),
define('core/api', [
  'jquery',
  'underscore',
  'backbone',
  'core/config',
  'core/utils'
], function (a, b, c, d, e) {
  'use strict';
  function f(a) {
    return l.href = a,
    l.origin || l.protocol + '//' + l.hostname + (l.port ? ':' + l.port : '')
  }
  function g(a) {
    return a.replace(/^(http:)?\/\//, 'https://')
  }
  function h(c) {
    c = b.defaults(c, m),
    c.traditional = !0,
    f(window.location.href) !== f(c.url) && (c.xhrFields = {
      withCredentials: !0
    }),
    c.omitDisqusApiKey || (c.data = c.data || {
    }, window.FormData && c.data instanceof window.FormData ? c.url = e.serialize(c.url, {
      api_key: d.keys.api
    }) : c.data.api_key = d.keys.api);
    var g = c.error;
    return c.error = function (a) {
      n.trigger('error', a),
      b.isFunction(g) && g(a)
    },
    a.ajax(c)
  }
  function i(a) {
    return /(https?:)?\/\//.test(a) ? g(a) : d.urls.api + a
  }
  function j(a, c) {
    return c = c || {
    },
    c.url = i(a),
    c.omitDisqusApiKey || (c.data = b.extend(c.data || {
    }, {
      api_key: d.keys.api
    })),
    n.trigger('call', c),
    h(c).always(b.bind(this.trigger, this, 'complete', c))
  }
  var k = window.document,
  l = k.createElement('a'),
  m = {
  },
  n = {
    ERROR_CODES: {
      OBJ_NOT_FOUND: 8,
      MAX_ITEMS_REACHED: 24
    },
    ajax: h,
    call: j,
    getURL: i,
    defaults: function (a) {
      Object.keys(a).forEach(function (c) {
        var d = a[c],
        e = m[c];
        b.isObject(d) && b.isObject(e) ? b.extend(e, d) : m[c] = d
      })
    },
    headers: function (a) {
      var c = b.extend({
      }, m.headers, a);
      return m.headers = b.pick(c, Boolean),
      m.headers
    },
    makeHttps: g
  };
  return b.extend(n, c.Events),
  n
}),
define('core/mediaConfig', [
  'underscore',
  'backbone'
], function (a, b) {
  'use strict';
  function c() {
    var b = window.document.body.offsetWidth,
    c = d,
    e = c.length;
    return a.find(c, function (a, d) {
      return d + 1 === e || Math.abs(c[d + 1] - b) > Math.abs(c[d] - b)
    })
  }
  var d = [
    320,
    480,
    600,
    800
  ],
  e = new b.Model({
    collapsed: !1,
    defaultIframeHeight: 300,
    mediaPersistedWidths: d,
    loadedThumbnailWidth: c()
  });
  return e.findClosestThumbnailSize = c,
  e
}),
define('core/mixins/appliesPublisherClasses', [
  'jquery',
  'underscore',
  'core/switches',
  'remote/config'
], function (a, b, c, d) {
  'use strict';
  function e() {
    this._getStyleProperty = function (a) {
      var b = this.forum.get(a);
      return this.config.forceAutoStyles || 'auto' === b ? this.config[a] : b
    },
    this.getTypeface = function () {
      return this._getStyleProperty('typeface')
    },
    this.getColorScheme = function () {
      return this._getStyleProperty('colorScheme')
    },
    this.getAnchorColorScheme = function () {
      return this.config.anchorColorScheme
    },
    this.getFont = function () {
      return this.forum.get('customFont')
    },
    this.convertFontToClass = function (a) {
      return a ? a.toLowerCase().replace(/\+/g, '-') : ''
    },
    this.convertFontToStyle = function (a) {
      return a ? a.replace(/\+/g, ' ') : ''
    },
    this.isFontAllowed = function (a) {
      return !(!a || !d.lounge.font_options) && d.lounge.font_options.some(function (b) {
        return a === b.name
      })
    },
    this.downloadFont = function (a) {
      var b = window.document,
      c = b.createElement('style');
      c.type = 'text/css';
      var d = this.convertFontToClass(a.name),
      e = this.convertFontToStyle(a.name),
      f = a.category,
      g = '@import url("https://fonts.googleapis.com/css2?family=' + a.name + ':ital,wght@0,400;0,500;0,600;0,700;1,400;1,700&display=swap"); ',
      h = [
        '',
        'input',
        'select',
        'textarea'
      ].map(function (a) {
        return 'body.' + d + ' ' + a
      }).join(', ');
      g += h + ' { font-family: ' + e + ', ' + f + '; }',
      c.styleSheet ? c.styleSheet.cssText = g : c.appendChild(b.createTextNode(g));
      var i = b.head || b.getElementsByTagName('head') [0] || b.body;
      i.appendChild(c)
    },
    this.applyPublisherClasses = function () {
      var e = a('body'),
      f = this.getFont();
      !f && c.isFeatureActive('embed_refresh', {
        forum: this.forum.id
      }) && 'sans-serif' === this.getTypeface() && (f = 'Roboto');
      var g = f && b.find(d.lounge.font_options, function (a) {
        return a.name === f
      });
      g ? (this.downloadFont(g), e.addClass(this.convertFontToClass(g.name))) : 'serif' === this.getTypeface() ? e.addClass('serif') : e.addClass('sans-serif'),
      'dark' === this.getColorScheme() && e.addClass('dark'),
      c.isFeatureActive('embed_refresh', {
        forum: this.forum.id
      }) && ('dark' === this.getAnchorColorScheme() ? e.addClass('dark-anchor') : e.addClass('light-anchor'))
    }
  }
  return e
}),
define('core/templates/handlebars.partials', [
  'handlebars'
], function (a) {
  a.registerPartial('cardGuestUser', a.template({
    1: function (a, b, c, d, e) {
      var f,
      g = null != b ? b : a.nullContext || {
      },
      h = a.lambda,
      i = a.escapeExpression;
      return '<li class="user ' + (null != (f = c['if'].call(g, null != b ? b.highlight : b, {
        name: 'if',
        hash: {
        },
        fn: a.program(2, e, 0),
        inverse: a.noop,
        data: e,
        loc: {
          start: {
            line: 2,
            column: 16
          },
          end: {
            line: 2,
            column: 49
          }
        }
      })) ? f : '') + '" data-role="guest">\n<span class="avatar ' + (null != (f = c['if'].call(g, null != b ? b.isRefreshEnabled : b, {
        name: 'if',
        hash: {
        },
        fn: a.program(4, e, 0),
        inverse: a.noop,
        data: e,
        loc: {
          start: {
            line: 3,
            column: 20
          },
          end: {
            line: 3,
            column: 66
          }
        }
      })) ? f : '') + '" title="' + i(h(null != b ? b.guestText : b, b)) + '">\n' + (null != (f = c['if'].call(g, null != b ? b.isRefreshEnabled : b, {
        name: 'if',
        hash: {
        },
        fn: a.program(6, e, 0),
        inverse: a.program(8, e, 0),
        data: e,
        loc: {
          start: {
            line: 4,
            column: 0
          },
          end: {
            line: 8,
            column: 7
          }
        }
      })) ? f : '') + '</span>\n<span class="username ' + (null != (f = c['if'].call(g, null != b ? b.isRefreshEnabled : b, {
        name: 'if',
        hash: {
        },
        fn: a.program(10, e, 0),
        inverse: a.noop,
        data: e,
        loc: {
          start: {
            line: 10,
            column: 22
          },
          end: {
            line: 10,
            column: 70
          }
        }
      })) ? f : '') + '" title="' + i(h(null != b ? b.guestText : b, b)) + '">\n' + i(h(null != b ? b.guestText : b, b)) + '\n</span>\n</li>\n'
    },
    2: function (a, b, c, d, e) {
      return 'highlight'
    },
    4: function (a, b, c, d, e) {
      return 'avatar--refresh'
    },
    6: function (a, b, c, d, e) {
      return '<div class="initials initials--small">G</div>\n'
    },
    8: function (a, b, c, d, e) {
      var f = a.escapeExpression;
      return '<img src="' + f(a.lambda(null != b ? b.guestAvatarUrl : b, b)) + '" alt="' + f(c.gettext.call(null != b ? b : a.nullContext || {
      }, 'Avatar', {
        name: 'gettext',
        hash: {
        },
        data: e,
        loc: {
          start: {
            line: 7,
            column: 35
          },
          end: {
            line: 7,
            column: 55
          }
        }
      })) + '" />\n'
    },
    10: function (a, b, c, d, e) {
      return 'username--refresh'
    },
    compiler: [
      8,
      '>= 4.3.0'
    ],
    main: function (a, b, c, d, e) {
      var f;
      return null != (f = c['if'].call(null != b ? b : a.nullContext || {
      }, null != b ? b.guestCount : b, {
        name: 'if',
        hash: {
        },
        fn: a.program(1, e, 0),
        inverse: a.noop,
        data: e,
        loc: {
          start: {
            line: 1,
            column: 0
          },
          end: {
            line: 14,
            column: 7
          }
        }
      })) ? f : ''
    },
    useData: !0
  })),
  a.registerPartial('cardGuestVoterText', a.template({
    1: function (a, b, c, d, e) {
      return ' ' + a.escapeExpression(c.gettext.call(null != b ? b : a.nullContext || {
      }, '%(guestCount)s Guest Votes', {
        name: 'gettext',
        hash: {
          guestCount: null != b ? b.guestCount : b
        },
        data: e,
        loc: {
          start: {
            line: 1,
            column: 26
          },
          end: {
            line: 1,
            column: 90
          }
        }
      })) + ' '
    },
    3: function (a, b, c, d, e) {
      return ' ' + a.escapeExpression(c.gettext.call(null != b ? b : a.nullContext || {
      }, '1 Guest Vote', {
        name: 'gettext',
        hash: {
        },
        data: e,
        loc: {
          start: {
            line: 1,
            column: 100
          },
          end: {
            line: 1,
            column: 126
          }
        }
      })) + ' '
    },
    compiler: [
      8,
      '>= 4.3.0'
    ],
    main: function (a, b, c, d, e) {
      var f,
      g = null != b ? b : a.nullContext || {
      };
      return (null != (f = c['if'].call(g, c.gt.call(g, null != b ? b.guestCount : b, 1, {
        name: 'gt',
        hash: {
        },
        data: e,
        loc: {
          start: {
            line: 1,
            column: 6
          },
          end: {
            line: 1,
            column: 23
          }
        }
      }), {
        name: 'if',
        hash: {
        },
        fn: a.program(1, e, 0),
        inverse: a.program(3, e, 0),
        data: e,
        loc: {
          start: {
            line: 1,
            column: 0
          },
          end: {
            line: 1,
            column: 134
          }
        }
      })) ? f : '') + '\n'
    },
    useData: !0
  })),
  a.registerPartial('cardOtherUserText', a.template({
    1: function (a, b, c, d, e) {
      return ' ' + a.escapeExpression(c.gettext.call(null != b ? b : a.nullContext || {
      }, '%(guestCount)s Others', {
        name: 'gettext',
        hash: {
          guestCount: null != b ? b.guestCount : b
        },
        data: e,
        loc: {
          start: {
            line: 1,
            column: 26
          },
          end: {
            line: 1,
            column: 85
          }
        }
      })) + ' '
    },
    3: function (a, b, c, d, e) {
      return ' ' + a.escapeExpression(c.gettext.call(null != b ? b : a.nullContext || {
      }, '1 Other', {
        name: 'gettext',
        hash: {
        },
        data: e,
        loc: {
          start: {
            line: 1,
            column: 95
          },
          end: {
            line: 1,
            column: 116
          }
        }
      })) + ' '
    },
    compiler: [
      8,
      '>= 4.3.0'
    ],
    main: function (a, b, c, d, e) {
      var f,
      g = null != b ? b : a.nullContext || {
      };
      return (null != (f = c['if'].call(g, c.gt.call(g, null != b ? b.guestCount : b, 1, {
        name: 'gt',
        hash: {
        },
        data: e,
        loc: {
          start: {
            line: 1,
            column: 6
          },
          end: {
            line: 1,
            column: 23
          }
        }
      }), {
        name: 'if',
        hash: {
        },
        fn: a.program(1, e, 0),
        inverse: a.program(3, e, 0),
        data: e,
        loc: {
          start: {
            line: 1,
            column: 0
          },
          end: {
            line: 1,
            column: 124
          }
        }
      })) ? f : '') + '\n'
    },
    useData: !0
  })),
  a.registerPartial('cardUser', a.template({
    1: function (a, b, c, d, e) {
      return 'highlight'
    },
    3: function (a, b, c, d, e) {
      return 'data-action="profile"'
    },
    5: function (a, b, c, d, e) {
      var f,
      g = null != b ? b : a.nullContext || {
      };
      return '<span class="avatar ' + (null != (f = c['if'].call(g, null != b ? b.isRefreshEnabled : b, {
        name: 'if',
        hash: {
        },
        fn: a.program(6, e, 0),
        inverse: a.noop,
        data: e,
        loc: {
          start: {
            line: 4,
            column: 20
          },
          end: {
            line: 4,
            column: 66
          }
        }
      })) ? f : '') + '">\n' + (null != (f = c['if'].call(g, null != b ? b.isRefreshEnabled : b, {
        name: 'if',
        hash: {
        },
        fn: a.program(8, e, 0),
        inverse: a.program(9, e, 0),
        data: e,
        loc: {
          start: {
            line: 5,
            column: 0
          },
          end: {
            line: 13,
            column: 7
          }
        }
      })) ? f : '') + '</span>\n<span class="username ' + (null != (f = c['if'].call(g, null != b ? b.isRefreshEnabled : b, {
        name: 'if',
        hash: {
        },
        fn: a.program(13, e, 0),
        inverse: a.noop,
        data: e,
        loc: {
          start: {
            line: 15,
            column: 22
          },
          end: {
            line: 15,
            column: 70
          }
        }
      })) ? f : '') + '">\n' + a.escapeExpression(a.lambda(null != b ? b.name : b, b)) + '\n</span>\n'
    },
    6: function (a, b, c, d, e) {
      return 'avatar--refresh'
    },
    8: function (a, b, c, d, e) {
      var f;
      return null != (f = c['if'].call(null != b ? b : a.nullContext || {
      }, null != (f = null != b ? b.avatar : b) ? f.isCustom : f, {
        name: 'if',
        hash: {
        },
        fn: a.program(9, e, 0),
        inverse: a.program(11, e, 0),
        data: e,
        loc: {
          start: {
            line: 6,
            column: 0
          },
          end: {
            line: 10,
            column: 7
          }
        }
      })) ? f : ''
    },
    9: function (a, b, c, d, e) {
      var f,
      g = a.escapeExpression;
      return '<img src="' + g(a.lambda(null != (f = null != b ? b.avatar : b) ? f.cache : f, b)) + '" alt="' + g(c.gettext.call(null != b ? b : a.nullContext || {
      }, 'Avatar', {
        name: 'gettext',
        hash: {
        },
        data: e,
        loc: {
          start: {
            line: 7,
            column: 33
          },
          end: {
            line: 7,
            column: 53
          }
        }
      })) + '" />\n'
    },
    11: function (a, b, c, d, e) {
      return '<div class="initials initials--small">' + a.escapeExpression(a.lambda(null != b ? b.initials : b, b)) + '</div>\n'
    },
    13: function (a, b, c, d, e) {
      return 'username--refresh'
    },
    15: function (a, b, c, d, e) {
      var f,
      g = null != b ? b : a.nullContext || {
      },
      h = a.lambda,
      i = a.escapeExpression;
      return '<a class="avatar ' + (null != (f = c['if'].call(g, null != b ? b.isRefreshEnabled : b, {
        name: 'if',
        hash: {
        },
        fn: a.program(6, e, 0),
        inverse: a.noop,
        data: e,
        loc: {
          start: {
            line: 19,
            column: 17
          },
          end: {
            line: 19,
            column: 63
          }
        }
      })) ? f : '') + '" href="' + i(h(null != b ? b.profileUrl : b, b)) + '" title="' + i(h(null != b ? b.name : b, b)) + '" target="_blank" rel="noopener noreferrer">\n' + (null != (f = c['if'].call(g, null != b ? b.isRefreshEnabled : b, {
        name: 'if',
        hash: {
        },
        fn: a.program(8, e, 0),
        inverse: a.program(9, e, 0),
        data: e,
        loc: {
          start: {
            line: 20,
            column: 0
          },
          end: {
            line: 28,
            column: 7
          }
        }
      })) ? f : '') + '</a>\n<a class="username ' + (null != (f = c['if'].call(g, null != b ? b.isRefreshEnabled : b, {
        name: 'if',
        hash: {
        },
        fn: a.program(13, e, 0),
        inverse: a.noop,
        data: e,
        loc: {
          start: {
            line: 30,
            column: 19
          },
          end: {
            line: 30,
            column: 67
          }
        }
      })) ? f : '') + '" href="' + i(h(null != b ? b.profileUrl : b, b)) + '" title="' + i(h(null != b ? b.name : b, b)) + '" target="_blank" rel="noopener noreferrer">\n' + i(h(null != b ? b.name : b, b)) + '\n</a>\n'
    },
    compiler: [
      8,
      '>= 4.3.0'
    ],
    main: function (a, b, c, d, e) {
      var f,
      g = null != b ? b : a.nullContext || {
      };
      return '<li class="user ' + (null != (f = c['if'].call(g, null != b ? b.highlight : b, {
        name: 'if',
        hash: {
        },
        fn: a.program(1, e, 0),
        inverse: a.noop,
        data: e,
        loc: {
          start: {
            line: 1,
            column: 16
          },
          end: {
            line: 1,
            column: 49
          }
        }
      })) ? f : '') + '" ' + (null != (f = c.unless.call(g, c['switch'].call(g, 'sso_less_branding', {
        name: 'switch',
        hash: {
          forum: null != b ? b.forumId : b
        },
        data: e,
        loc: {
          start: {
            line: 1,
            column: 61
          },
          end: {
            line: 1,
            column: 103
          }
        }
      }), {
        name: 'unless',
        hash: {
        },
        fn: a.program(3, e, 0),
        inverse: a.noop,
        data: e,
        loc: {
          start: {
            line: 1,
            column: 51
          },
          end: {
            line: 1,
            column: 137
          }
        }
      })) ? f : '') + ' data-username="' + a.escapeExpression(a.lambda(null != b ? b.username : b, b)) + '">\n' + (null != (f = c.if_all.call(g, c['switch'].call(g, 'sso_less_branding', {
        name: 'switch',
        hash: {
          forum: null != b ? b.forumId : b
        },
        data: e,
        loc: {
          start: {
            line: 3,
            column: 10
          },
          end: {
            line: 3,
            column: 52
          }
        }
      }), c.ne.call(g, null != b ? b.isSSOProfileUrl : b, !0, {
        name: 'ne',
        hash: {
        },
        data: e,
        loc: {
          start: {
            line: 3,
            column: 53
          },
          end: {
            line: 3,
            column: 78
          }
        }
      }), {
        name: 'if_all',
        hash: {
        },
        fn: a.program(5, e, 0),
        inverse: a.program(15, e, 0),
        data: e,
        loc: {
          start: {
            line: 3,
            column: 0
          },
          end: {
            line: 33,
            column: 11
          }
        }
      })) ? f : '') + '</li>\n'
    },
    useData: !0
  })),
  a.registerPartial('carouselArrowLeft', a.template({
    compiler: [
      8,
      '>= 4.3.0'
    ],
    main: function (a, b, c, d, e) {
      return '<button class="carousel-control carousel-control__previous"><span class="icon icon-right-bracket icon-flipped"></span></button>\n'
    },
    useData: !0
  })),
  a.registerPartial('carouselArrowRight', a.template({
    compiler: [
      8,
      '>= 4.3.0'
    ],
    main: function (a, b, c, d, e) {
      return '<button class="carousel-control carousel-control__next"><span class="icon icon-right-bracket"></span></button>\n'
    },
    useData: !0
  })),
  a.registerPartial('channelsHeader', a.template({
    compiler: [
      8,
      '>= 4.3.0'
    ],
    main: function (a, b, c, d, e) {
      var f = null != b ? b : a.nullContext || {
      },
      g = a.escapeExpression;
      return '<div class="channel-homepage-cover">\n<div class="channel-homepage-cover--header">\n<div class="align-inline spacing-top">\n<div class="module-header__icon icon-colorful spacing-right">\n<svg class="icon-discover" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" x="0px" y="0px" viewBox="0 0 18 18" enable-background="new 0 0 18 18" xml:space="preserve" width="26" height="26"><rect x="14" width="4" height="4" class="dot"/><rect x="14" y="7" width="4" height="4" class="dot"/><rect x="14" y="14" width="4" height="4" class="dot"/><rect x="7" width="4" height="4" class="dot"/><rect x="7" y="7" width="4" height="4" class="dot"/><rect x="7" y="14" width="4" height="4" class="dot"/><rect width="4" height="4" class="dot"/><rect y="7" width="4" height="4" class="dot"/><rect y="14" width="4" height="4" class="dot"/></g></svg>\n</div>\n<div class="module-header__title">\n<h1 class="text-larger text-darker">' + g(c.gettext.call(f, 'Channels', {
        name: 'gettext',
        hash: {
        },
        data: e,
        loc: {
          start: {
            line: 8,
            column: 36
          },
          end: {
            line: 8,
            column: 58
          }
        }
      })) + '</h1>\n</div>\n</div>\n<p class="text-medium text-gray spacing-bottom-narrow">' + g(c.gettext.call(f, 'Places to start your own discussions.', {
        name: 'gettext',
        hash: {
        },
        data: e,
        loc: {
          start: {
            line: 11,
            column: 55
          },
          end: {
            line: 11,
            column: 106
          }
        }
      })) + '</p>\n</div>\n<div class="metadata-hidden visible-lg spacing-left-small">\n<button\nclass="button button-fill--brand"\ntitle=' + g(c.gettext.call(f, 'Info', {
        name: 'gettext',
        hash: {
        },
        data: e,
        loc: {
          start: {
            line: 16,
            column: 6
          },
          end: {
            line: 16,
            column: 24
          }
        }
      })) + '\ndata-action="show-metadata">\n' + g(c.gettext.call(f, 'About', {
        name: 'gettext',
        hash: {
        },
        data: e,
        loc: {
          start: {
            line: 18,
            column: 0
          },
          end: {
            line: 18,
            column: 19
          }
        }
      })) + '\n</button>\n</div>\n</div>\n<div class="metadata-visible channels-metadata-visible">\n<button\nclass="spacing-top-small link-gray-darker pull-left channels-hide-metadata"\ntitle=' + g(c.gettext.call(f, 'Feed', {
        name: 'gettext',
        hash: {
        },
        data: e,
        loc: {
          start: {
            line: 25,
            column: 6
          },
          end: {
            line: 25,
            column: 24
          }
        }
      })) + '\ndata-action="hide-metadata">\n<span class="icon icon-left-bracket text-large icon__position"></span>\n</button>\n<h1 class="text-largest text-center">' + g(c.gettext.call(f, 'About Channels', {
        name: 'gettext',
        hash: {
        },
        data: e,
        loc: {
          start: {
            line: 29,
            column: 37
          },
          end: {
            line: 29,
            column: 65
          }
        }
      })) + '</h1>\n</div>\n'
    },
    useData: !0
  })),
  a.registerPartial('genericFollowButton', a.template({
    1: function (a, b, c, d, e) {
      return ' active'
    },
    3: function (a, b, c, d, e) {
      var f;
      return null != (f = c.unless.call(null != b ? b : a.nullContext || {
      }, null != b ? b.isFollowing : b, {
        name: 'unless',
        hash: {
        },
        fn: a.program(4, e, 0),
        inverse: a.noop,
        data: e,
        loc: {
          start: {
            line: 1,
            column: 85
          },
          end: {
            line: 1,
            column: 127
          }
        }
      })) ? f : ''
    },
    4: function (a, b, c, d, e) {
      return 'disabled'
    },
    compiler: [
      8,
      '>= 4.3.0'
    ],
    main: function (a, b, c, d, e) {
      var f,
      g = null != b ? b : a.nullContext || {
      },
      h = a.escapeExpression;
      return '<button class="button btn-follow' + (null != (f = c['if'].call(g, null != b ? b.isFollowing : b, {
        name: 'if',
        hash: {
        },
        fn: a.program(1, e, 0),
        inverse: a.noop,
        data: e,
        loc: {
          start: {
            line: 1,
            column: 32
          },
          end: {
            line: 1,
            column: 65
          }
        }
      })) ? f : '') + '" ' + (null != (f = c['if'].call(g, null != b ? b.isBlocking : b, {
        name: 'if',
        hash: {
        },
        fn: a.program(3, e, 0),
        inverse: a.noop,
        data: e,
        loc: {
          start: {
            line: 1,
            column: 67
          },
          end: {
            line: 1,
            column: 134
          }
        }
      })) ? f : '') + ' data-action="toggle-follow">\n<span class="symbol-default"><span class="icon-plus"></span></span><span class="text-default">' + h(c.gettext.call(g, 'Follow', {
        name: 'gettext',
        hash: {
        },
        data: e,
        loc: {
          start: {
            line: 3,
            column: 94
          },
          end: {
            line: 3,
            column: 114
          }
        }
      })) + '</span><span class="symbol-following"><span class="icon-checkmark"></span></span><span class="text-following">' + h(c.gettext.call(g, 'Following', {
        name: 'gettext',
        hash: {
        },
        data: e,
        loc: {
          start: {
            line: 3,
            column: 224
          },
          end: {
            line: 3,
            column: 247
          }
        }
      })) + '</span>\n</button>\n'
    },
    useData: !0
  }))
}),
define('core/extensions/helpers/eq', [
], function () {
  'use strict';
  return function (a, b) {
    return a === b
  }
}),
define('core/extensions/helpers/ne', [
], function () {
  'use strict';
  return function (a, b) {
    return a !== b
  }
}),
define('core/extensions/helpers/gt', [
], function () {
  'use strict';
  return function (a, b) {
    return a > b
  }
}),
define('core/extensions/helpers/lt', [
], function () {
  'use strict';
  return function (a, b) {
    return a < b
  }
}),
define('core/extensions/helpers/ge', [
], function () {
  'use strict';
  return function (a, b) {
    return a >= b
  }
}),
define('core/extensions/helpers/le', [
], function () {
  'use strict';
  return function (a, b) {
    return a <= b
  }
}),
define('core/extensions/helpers/typeof', [
], function () {
  'use strict';
  return function (a, b) {
    return typeof a === b
  }
}),
define('core/extensions/helpers/notNull', [
], function () {
  'use strict';
  return function (a) {
    return null !== a
  }
}),
define('core/extensions/helpers/any', [
], function () {
  'use strict';
  return function () {
    for (var a = arguments.length, b = 0; b < a - 1; b++) if (arguments[b]) return arguments[b]
  }
}),
define('core/extensions/helpers/if_any', [
], function () {
  'use strict';
  return function () {
    for (var a = arguments.length, b = arguments[a - 1], c = 0; c < a - 1; c++) if (arguments[c]) return b.fn(this);
    return b.inverse(this)
  }
}),
define('core/extensions/helpers/if_all', [
], function () {
  'use strict';
  return function () {
    for (var a = arguments.length, b = arguments[a - 1], c = 0; c < a - 1; c++) if (!arguments[c]) return b.inverse(this);
    return b.fn(this)
  }
}),
define('core/extensions/helpers/switch', [
  'core/switches',
  'core/utils/object/extend'
], function (a, b) {
  'use strict';
  return function (c, d) {
    return a.isFeatureActive(c, b({
    }, d.hash))
  }
}),
define('core/extensions/helpers/partial', [
  'handlebars'
], function (a) {
  'use strict';
  return function (b, c) {
    a.registerPartial(b, c.fn)
  }
}),
define('core/extensions/helpers/getPartial', [
  'handlebars'
], function (a) {
  'use strict';
  return function (b, c, d) {
    return 'undefined' == typeof d && (d = c, c = this, a.Utils.extend(c, d.hash)),
    new a.SafeString(a.partials[b](c, d))
  }
}),
define('core/extensions/helpers/gettext', [
  'handlebars',
  'core/strings'
], function (a, b) {
  'use strict';
  return function () {
    var c,
    d,
    e,
    f,
    g = arguments.length,
    h = arguments[g - 1],
    i = h.hash,
    j = arguments[0],
    k = a.partials;
    j = a.Utils.escapeExpression(b.get(j));
    for (e in i) i.hasOwnProperty(e) && (d = new RegExp('%\\((' + e + ')\\)s', 'gm'), c = i[e], f = c && c.executePartial, f && (c = k[c.partial].call(this, c.context, h)), void 0 === c || null === c || 'number' == typeof c && isNaN(c) ? c = '' : f || (c = a.Utils.escapeExpression(c)), j = j.replace(d, c.toString()));
    return new a.SafeString(j)
  }
}),
define('core/utils/object/get', [
], function () {
  'use strict';
  return function (a, b, c) {
    for (var d = 0, e = b.length; a && d < e; ) a = a[b[d]],
    d += 1;
    return d < e || void 0 === a ? c : a
  }
}),
define('core/extensions/helpers/urlfor', [
  'core/config/urls',
  'core/utils/object/get'
], function (a, b) {
  'use strict';
  return function (c) {
    return b(a, c.split('.'))
  }
}),
define('core/extensions/helpers/html', [
  'handlebars'
], function (a) {
  'use strict';
  return function (b) {
    return new a.SafeString(b || '')
  }
}),
define('core/extensions/helpers/with', [
], function () {
  'use strict';
  return function () {
    var a = arguments.length,
    b = arguments[a - 1],
    c = arguments[0];
    return 3 === a ? (c = {
    }, c[arguments[0]] = arguments[1]) : '_window_' === c && (c = window),
    b.fn(c)
  }
}),
define('core/extensions/helpers/each', [
  'handlebars'
], function (a) {
  'use strict';
  return function (b, c) {
    var d,
    e,
    f,
    g = c.fn,
    h = c.inverse,
    i = 0,
    j = '';
    if (c.data && (d = a.createFrame(c.data)), b && 'object' == typeof b) if ('[object Array]' === Object.prototype.toString.call(b)) for (f = b.length; i < f; i++) d && (d.index = i, d.length = b.length),
    j += g(b[i], {
      data: d
    });
     else for (e in b) b.hasOwnProperty(e) && (d && (d.key = e), j += g(b[e], {
      data: d
    }), i += 1);
    return 0 === i && (j = h(this)),
    j
  }
}),
define('core/extensions/helpers/log', [
], function () {
  'use strict';
  return function (a) {
    console.log(a, this)
  }
}),
define('core/extensions/helpers/debug', [
], function () {
  'use strict';
  return function () {
  }
}),
define('core/extensions/helpers/geturl', [
], function () {
  'use strict';
  return window.geturl || function (a) {
    return a
  }
}),
define('core/extensions/helpers/tag', [
  'handlebars'
], function (a) {
  'use strict';
  return function (b, c) {
    var d = [
      '<' + b
    ],
    e = c.hash.text;
    delete c.hash.text;
    for (var f in c.hash) c.hash.hasOwnProperty(f) && d.push(' ' + f + '="' + a.escapeExpression(c.hash[f]) + '"');
    return d.push('>' + a.escapeExpression(e) + '</' + b + '>'),
    new a.SafeString(d.join(''))
  }
}),
define('core/extensions/helpers/now', [
  'moment'
], function (a) {
  'use strict';
  return function (b) {
    return a().format(b)
  }
}),
define('core/extensions/helpers/ternary', [
], function () {
  'use strict';
  return function (a, b, c) {
    return a ? b : c
  }
}),
define('core/extensions/handlebars.helpers', [
  'require',
  'handlebars',
  './helpers/eq',
  './helpers/ne',
  './helpers/gt',
  './helpers/lt',
  './helpers/ge',
  './helpers/le',
  './helpers/typeof',
  './helpers/notNull',
  './helpers/any',
  './helpers/if_any',
  './helpers/if_all',
  './helpers/switch',
  './helpers/partial',
  './helpers/getPartial',
  './helpers/gettext',
  './helpers/urlfor',
  './helpers/html',
  './helpers/with',
  './helpers/each',
  './helpers/log',
  './helpers/debug',
  './helpers/geturl',
  './helpers/tag',
  './helpers/now',
  './helpers/ternary'
], function (a) {
  'use strict';
  var b = a('handlebars');
  return b.registerHelper('eq', a('./helpers/eq')),
  b.registerHelper('ne', a('./helpers/ne')),
  b.registerHelper('gt', a('./helpers/gt')),
  b.registerHelper('lt', a('./helpers/lt')),
  b.registerHelper('ge', a('./helpers/ge')),
  b.registerHelper('le', a('./helpers/le')),
  b.registerHelper('typeof', a('./helpers/typeof')),
  b.registerHelper('notNull', a('./helpers/notNull')),
  b.registerHelper('any', a('./helpers/any')),
  b.registerHelper('if_any', a('./helpers/if_any')),
  b.registerHelper('if_all', a('./helpers/if_all')),
  b.registerHelper('switch', a('./helpers/switch')),
  b.registerHelper('partial', a('./helpers/partial')),
  b.registerHelper('getPartial', a('./helpers/getPartial')),
  b.registerHelper('gettext', a('./helpers/gettext')),
  b.registerHelper('urlfor', a('./helpers/urlfor')),
  b.registerHelper('html', a('./helpers/html')),
  b.registerHelper('with', a('./helpers/with')),
  b.registerHelper('each', a('./helpers/each')),
  b.registerHelper('log', a('./helpers/log')),
  b.registerHelper('debug', a('./helpers/debug')),
  b.registerHelper('geturl', a('./helpers/geturl')),
  b.registerHelper('tag', a('./helpers/tag')),
  b.registerHelper('now', a('./helpers/now')),
  b.registerHelper('ternary', a('./helpers/ternary')),
  b
}),
define('core/templates/alert', [
  'handlebars',
  'core/templates/handlebars.partials',
  'core/extensions/handlebars.helpers'
], function (a) {
  return a.template({
    1: function (a, b, c, d, e) {
      return '<span class="icon icon-' + a.escapeExpression(a.lambda(null != b ? b.iconType : b, b)) + '"></span>\n'
    },
    3: function (a, b, c, d, e) {
      var f;
      return (null != (f = a.lambda(null != b ? b.message : b, b)) ? f : '') + '\n'
    },
    5: function (a, b, c, d, e) {
      return a.escapeExpression(a.lambda(null != b ? b.message : b, b)) + '\n'
    },
    compiler: [
      8,
      '>= 4.3.0'
    ],
    main: function (a, b, c, d, e) {
      var f,
      g = null != b ? b : a.nullContext || {
      };
      return '<a class="close" data-action="dismiss" title="' + a.escapeExpression(c.gettext.call(g, 'Dismiss', {
        name: 'gettext',
        hash: {
        },
        data: e,
        loc: {
          start: {
            line: 1,
            column: 46
          },
          end: {
            line: 1,
            column: 67
          }
        }
      })) + '">×</a>\n<span>\n' + (null != (f = c['if'].call(g, null != b ? b.icon : b, {
        name: 'if',
        hash: {
        },
        fn: a.program(1, e, 0),
        inverse: a.noop,
        data: e,
        loc: {
          start: {
            line: 3,
            column: 0
          },
          end: {
            line: 5,
            column: 7
          }
        }
      })) ? f : '') + (null != (f = c['if'].call(g, null != b ? b.safe : b, {
        name: 'if',
        hash: {
        },
        fn: a.program(3, e, 0),
        inverse: a.program(5, e, 0),
        data: e,
        loc: {
          start: {
            line: 6,
            column: 0
          },
          end: {
            line: 10,
            column: 7
          }
        }
      })) ? f : '') + '</span>\n'
    },
    useData: !0
  })
}),
define('core/views/AlertView', [
  'backbone',
  'core/templates/alert'
], function (a, b) {
  'use strict';
  var c = a.View.extend({
    defaultClassName: 'alert',
    events: {
      'click [data-action=dismiss]': 'dismiss'
    },
    initialize: function (a) {
      this.options = a,
      this.message = a.message,
      this.safe = a.safe,
      this.type = a.type,
      this.className = a.className || this.defaultClassName
    },
    render: function () {
      var a = this.$el;
      return a.html(b({
        message: this.message,
        safe: this.safe,
        icon: Boolean(this.type),
        iconType: 'error' === this.type || 'warn' === this.type ? 'warning' : this.type
      })),
      a.attr('class', this.className),
      this.type && a.addClass(this.type),
      this
    },
    dismiss: function (a) {
      a && a.preventDefault && a.preventDefault(),
      this.remove(),
      this.trigger('dismiss')
    }
  });
  return c
}),
define('core/mixins/withAlert', [
  'underscore',
  'core/views/AlertView'
], function (a, b) {
  'use strict';
  var c = {
    alert: function (c, d) {
      a.isObject(d) || (d = {
      });
      var e = d.target || this._alertSelector;
      this.dismissAlert();
      var f = this._alert = new b(a.extend({
        message: c
      }, d));
      if (this.listenToOnce(this._alert, 'dismiss', function () {
        this._alert = null
      }), f.render(), e) {
        var g = this.$el.find(e);
        g.length ? g.prepend(f.el) : this.listenToOnce(this, 'threadView:render', function () {
          return this.alert(c, d)
        })
      } else this.el.parentNode && this.el.parentNode.insertBefore(f.el, this.el);
      return f
    },
    dismissAlert: function (a) {
      this._alert && (a && !a(this._alert) || (this.stopListening(this._alert), this._alert.dismiss(), this._alert = null))
    },
    getAlert: function () {
      return this._alert || null
    },
    setAlertSelector: function (a) {
      this._alertSelector = a
    }
  },
  d = function () {
    return a.extend(this, c)
  };
  return d
}),
define('core/models/ThreadVote', [
  'backbone'
], function (a) {
  'use strict';
  var b = a.Model.extend({
    defaults: {
      score: 0
    }
  });
  return b
}),
define('core/models/Vote', [
  'backbone'
], function (a) {
  'use strict';
  var b = a.Model.extend({
    defaults: {
      score: 0
    }
  });
  return b
}),
define('core/constants/voteConstants', [
  'exports'
], function (a) {
  'use strict';
  a.VOTING_TYPES = {
    DETAILED: 0,
    DOWNVOTE_LIMITED: 1,
    DOWNVOTE_DISABLED: 2,
    DISABLED: 3
  },
  a.DEFAULT_VOTING_TYPE = a.VOTING_TYPES.DETAILED
}),
define('core/time', [
], function () {
  'use strict';
  function a(a) {
    return a.indexOf('+') >= 0 ? a : a + '+00:00'
  }
  var b = 'YYYY-MM-DDTHH:mm:ssZ';
  return {
    ISO_8601: b,
    assureTzOffset: a
  }
}),
define('core/models/BaseUser', [
  'backbone',
  'core/config'
], function (a, b) {
  'use strict';
  var c = a.Model.extend({
    defaults: {
      about: null,
      avatar: {
        cache: b.urls.avatar.generic,
        permalink: b.urls.avatar.generic
      },
      connections: {
      },
      badges: [
      ],
      email: null,
      isAnonymous: !0,
      isFollowedBy: null,
      isFollowing: null,
      joinedAt: null,
      name: null,
      profileUrl: null,
      url: null,
      username: null,
      numPosts: null,
      numFollowing: null,
      numForumsFollowing: null,
      numFollowers: null,
      numLikesReceived: null,
      isFlagged: null
    },
    hasValidAvatar: function (a) {
      var b = a ? a.avatar : this.get('avatar');
      return b && b.cache
    },
    isAnonymous: function () {
      return !this.get('id')
    },
    isRegistered: function () {
      return !this.isAnonymous()
    },
    validate: function (a) {
      if (!this.hasValidAvatar(a)) return 'None of the avatar related properties can be null, undefined or empty on User models.'
    },
    toJSON: function () {
      var b = a.Model.prototype.toJSON.apply(this, arguments);
      return b.thread = {
      },
      this.hasValidAvatar() || (b.avatar = this.defaults.avatar),
      b.isRegistered = this.isRegistered(),
      b
    }
  });
  return c
}),
define('core/models/User', [
  'jquery',
  'underscore',
  'moment',
  'core/config',
  'core/time',
  'core/utils',
  'core/strings',
  'core/switches',
  'core/api',
  'core/models/BaseUser'
], function (a, b, c, d, e, f, g, h, i, j) {
  'use strict';
  function k(a, b, c) {
    a[b] = a[b] || [
    ],
    a[b].push(c)
  }
  var l = g.get,
  m = j.extend({
    url: i.getURL('users/details'),
    validate: function (c) {
      var d = {
      };
      if (c.display_name && (c.display_name = a.trim(c.display_name)), c.display_name || k(d, 'display_name', l('Please enter your name.')), c.email || k(d, 'email', l('Please enter your email address.')), f.validateEmail(c.email) || k(d, 'email', l('Invalid email address.')), this.isNew() && (c.password ? c.password.length < m.MIN_PASSWORD_LEN && k(d, 'password', l('Password must have at least 6 characters.')) : k(d, 'password', l('Please enter a password.'))), c.name && (c.name.length < m.MIN_NAME_LEN && k(d, 'name', g.interpolate(l('Name must have at least %(minLength)s characters.'), {
        minLength: m.MIN_NAME_LEN
      })), c.name.length > m.MAX_NAME_LEN && k(d, 'name', g.interpolate(l('Name must have less than %(maxLength)s characters.'), {
        maxLength: m.MAX_NAME_LEN
      }))), c.location && c.location.length > m.MAX_LOCATION_LEN && k(d, 'location', g.interpolate(l('Location must have less than %(maxLength)s characters.'), {
        maxLength: m.MAX_LOCATION_LEN
      })), c.url && (c.url.length > m.MAX_URL_LEN && k(d, 'url', g.interpolate(l('Site must have less than %(maxLength)s characters.'), {
        maxLength: m.MAX_URL_LEN
      })), f.isUrl(c.url) || k(d, 'url', l('Please enter a valid site.'))), !b.isEmpty(d)) return d
    },
    prepareFetchOptions: function (a) {
      a = a ? b.clone(a) : {
      };
      var c = {
      };
      return this.get('id') ? c.user = this.get('id') : this.get('username') && (c.user = 'username:' + this.get('username')),
      b.extend(c, a.data),
      a.data = c,
      a
    },
    fetch: function (a) {
      return a = this.prepareFetchOptions(a),
      j.prototype.fetch.call(this, a)
    },
    parse: function (a) {
      var b = a.response || a;
      return b = this.handleBadgesUpdate(b)
    },
    register: function (a) {
      var c = this;
      return a = a || {
      },
      i.call('internal/users/register.json', {
        data: b.extend(this.toRegisterJSON(), {
          gRecaptchaResponse: a.gRecaptchaResponse
        }),
        method: 'POST',
        success: function (d) {
          i.call('users/acceptTerms', {
            method: 'POST'
          }),
          c.set(b.extend({
          }, d.response, {
            hasAcceptedGdprTerms: !0
          })),
          a.success && a.success(d)
        },
        error: a.error
      })
    },
    saveAvatar: function (a) {
      var b = new window.FormData;
      return b.append('avatar_file', a),
      b.append('api_key', d.keys.api),
      i.call('internal/users/updateAvatar.json', {
        method: 'post',
        data: b,
        cache: !1,
        contentType: !1,
        processData: !1
      })
    },
    saveProfile: function () {
      return i.call('users/updateProfile.json', {
        method: 'POST',
        data: {
          name: this.get('name'),
          about: this.get('about'),
          location: this.get('location'),
          url: this.get('url')
        }
      })
    },
    toRegisterJSON: function () {
      return b.pick(this.toJSON(), 'display_name', 'email', 'password')
    },
    isSession: function (a) {
      return a.user.id && a.user.id === this.id
    },
    isEditable: function (a) {
      return this.isSession(a) && !this.get('remote')
    },
    toJSON: function (a) {
      a = a || {
      };
      var b = j.prototype.toJSON.call(this),
      c = this.collection && this.collection.thread;
      return b.thread.canModerate = Boolean(c && c.isModerator(this)),
      b.thread.isOP = Boolean(c && c.isOP(this)),
      a.session && (b.isSession = this.isSession(a.session), b.isEditable = this.isEditable(a.session)),
      b
    },
    _changeFollowState: function (a) {
      this.set({
        isFollowing: a,
        numFollowers: Math.max(0, this.get('numFollowers') + (a ? 1 : - 1))
      });
      var b = 'users/' + (a ? 'follow' : 'unfollow'),
      c = this;
      return i.call(b + '.json', {
        data: {
          target: this.get('id')
        },
        method: 'POST',
        success: function (a) {
          c.trigger('sync', c, a, {
          })
        }
      })
    },
    follow: function () {
      return this._changeFollowState(!0)
    },
    unfollow: function () {
      return this._changeFollowState(!1)
    },
    _changeBlockState: function (a) {
      var b = 'users/block/' + (a ? 'create' : 'delete'),
      c = this;
      return i.call(b + '.json', {
        data: {
          user: this.get('id')
        },
        method: 'POST',
        success: function (a) {
          c.set(a.response)
        }
      })
    },
    block: function () {
      return this._changeBlockState(!0)
    },
    unblock: function () {
      return this._changeBlockState(!1)
    },
    report: function (a) {
      var b = this;
      return i.call('users/report.json', {
        data: {
          reason: a,
          user: this.get('id')
        },
        method: 'POST',
        success: function () {
          b.set('isFlagged', !0)
        }
      })
    },
    toggleFollowState: function () {
      return this._changeFollowState(!this.get('isFollowing'))
    },
    registeredLessThan: function (a, b) {
      var d = e.assureTzOffset(this.get('joinedAt')),
      f = c().subtract(a, b);
      return c(d).isAfter(f)
    },
    registeredToday: function () {
      return this.registeredLessThan(1, 'day')
    },
    registeredThisWeek: function () {
      return this.registeredLessThan(1, 'week')
    },
    shouldHomeOnboard: function () {
      return !this.get('homeOnboardingComplete') && !h.isFeatureActive('onboarding_without_channels')
    },
    setHomeOnboardComplete: function (a) {
      this.updateFlags({
        homeOnboardingComplete: a
      }),
      a && this.listenTo(this, 'change:homeOnboardingComplete', b.bind(this.set, this, 'homeOnboardingComplete', a, {
        silent: !0
      }))
    },
    handleBadgesUpdate: function (a) {
      if (this.collection && this.collection.thread && this.collection.thread.forum && this.collection.thread.forum.get('badges')) {
        var b = this.collection.thread.forum.get('badges');
        a.badges = a.badges ? a.badges.filter(function (a) {
          return b[a.id]
        }) : [
        ]
      }
      return a
    },
    updateFlags: function (a) {
      return this.set(a),
      i.call('internal/users/updateFlags.json', {
        data: b.mapObject(a, function (a) {
          return a ? 1 : 0
        }),
        method: 'POST'
      })
    }
  }, {
    MIN_PASSWORD_LEN: 6,
    MIN_NAME_LEN: 2,
    MAX_NAME_LEN: 30,
    MAX_LOCATION_LEN: 255,
    MAX_URL_LEN: 200
  });
  return m
}),
define('core/utils/html', [
], function () {
  'use strict';
  var a = '...',
  b = a.length,
  c = function (a) {
    var b;
    try {
      b = (new window.DOMParser).parseFromString('<!doctype html><meta charset=utf-8><title> </title>', 'text/html')
    } catch (c) {
    }
    return b || (b = window.document.implementation.createHTMLDocument('')),
    b.body && (b.body.innerHTML = a),
    b;
  };
  return {
    stripTags: function (a) {
      var b = c(a).body;
      return (b.textContent || b.innerText).replace(/\r?\n/g, ' ')
    },
    replaceAnchors: function (a, d) {
      var e = c(a);
      return [].forEach.call(e.querySelectorAll('a'), function (a) {
        var c = a.getAttribute('href') || '',
        e = a.innerHTML,
        f = d(a);
        0 === c.indexOf(e.slice(0, - b)) ? e = f : c.length && e.indexOf(c) !== - 1 ? e = e.replace(c, f) : e += ' ' + f,
        a.insertAdjacentHTML('afterend', e),
        a.parentNode.removeChild(a)
      }),
      e.body.innerHTML.trim()
    }
  }
}),
define('core/advice', [
  'underscore'
], function (a) {
  'use strict';
  function b() {
    a.each(['before',
    'after',
    'around'], function (a) {
      this[a] = function (b, d) {
        return 'function' == typeof this[b] ? this[b] = c[a](this[b], d) : this[b] = d,
        this[b]
      }
    }, this)
  }
  var c = {
    around: function (b, c) {
      return function () {
        var d = a.toArray(arguments);
        return c.apply(this, [
          a.bind(b, this)
        ].concat(d))
      }
    },
    before: function (b, d) {
      return c.around(b, function () {
        var b = a.toArray(arguments),
        c = b.shift();
        return d.apply(this, b),
        c.apply(this, b)
      })
    },
    after: function (b, d) {
      return c.around(b, function () {
        var b = a.toArray(arguments),
        c = b.shift(),
        e = c.apply(this, b);
        return d.apply(this, b),
        e
      })
    }
  };
  return {
    withAdvice: b
  }
}),
define('core/models/mixins', [
  'underscore',
  'moment',
  'core/time'
], function (a, b, c) {
  'use strict';
  function d() {
    b.locale('en', {
      relativeTime: {
        future: '%s from now',
        past: '%s ago',
        s: 'a few seconds',
        ss: '%d seconds',
        m: 'a minute',
        mm: '%d minutes',
        h: 'an hour',
        hh: '%d hours',
        d: 'a day',
        dd: '%d days',
        M: 'a month',
        MM: '%d months',
        y: 'a year',
        yy: '%d years'
      }
    }),
    this._getCreatedMoment = a.memoize(function (a) {
      var d = this.get(a || 'createdAt');
      if (d) return b(c.assureTzOffset(d), c.ISO_8601)
    }, function (a) {
      return this.get(a || 'createdAt')
    }),
    this.getRelativeCreatedAt = function (a) {
      var b = this._getCreatedMoment(a);
      return b && b.from(Number(new Date))
    },
    this.getFormattedCreatedAt = a.memoize(function (a) {
      var b = this._getCreatedMoment(a);
      return b && b.format('LLLL')
    }, function (a) {
      return this.get(a || 'createdAt')
    })
  }
  return {
    withCreatedAt: d
  }
}),
define('core/collections/UserCollection', [
  'jquery',
  'backbone',
  'core/models/User'
], function (a, b, c) {
  'use strict';
  var d = b.Collection.extend({
    model: c,
    initialize: function (a, c) {
      b.Collection.prototype.initialize.apply(this, arguments),
      this.thread = c && c.thread
    },
    fetch: function () {
      return a.when(!0)
    }
  });
  return d
}),
define('core/collections/VotersUserCollection', [
  'underscore',
  'backbone',
  'core/api',
  'core/collections/UserCollection'
], function (a, b, c, d) {
  'use strict';
  var e = d.extend({
    LIMIT: 50,
    url: function () {
      return c.getURL('posts/listUsersVotedPost')
    },
    initialize: function (a, b) {
      this.postId = b.postId,
      this.threadId = b.threadId
    },
    fetch: function (c) {
      return b.Collection.prototype.fetch.call(this, a.extend({
        data: {
          post: this.postId,
          thread: this.threadId,
          vote: c.vote,
          limit: this.LIMIT
        }
      }, c))
    }
  });
  return e
}),
define('core/collections/VoteCollection', [
  'backbone',
  'core/models/Vote'
], function (a, b) {
  'use strict';
  var c = a.Collection.extend({
    model: b
  });
  return c
}),
define('core/models/Post', [
  'jquery',
  'underscore',
  'backbone',
  'moment',
  'core/config/urls',
  'core/api',
  'core/strings',
  'core/time',
  'core/utils',
  'core/utils/html',
  'core/advice',
  'remote/config',
  'core/models/mixins',
  'core/collections/VotersUserCollection',
  'core/collections/VoteCollection'
], function (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o) {
  'use strict';
  var p = 1000,
  q = 0,
  r = 25000,
  s = function () {
    var b = a.now();
    return !(b - q < p) && (q = b, !0)
  },
  t = g.get,
  u = c.Model.extend({
    votersCollectionClass: n,
    defaults: function () {
      return {
        createdAt: d().format(h.ISO_8601),
        editableUntil: d().add(l.max_post_edit_days, 'days').format(h.ISO_8601),
        dislikes: 0,
        isApproved: !0,
        isDeleted: !1,
        isEdited: !1,
        isFlagged: !1,
        isFlaggedByUser: !1,
        isHighlighted: !1,
        isRealtime: !1,
        isImmediateReply: !1,
        isMinimized: null,
        hasMedia: !1,
        message: null,
        raw_message: null,
        likes: 0,
        media: [
        ],
        parent: null,
        points: 0,
        depth: 0,
        userScore: 0,
        rating: null
      }
    },
    initialize: function () {
      this.votes = new o
    },
    messageText: function () {
      var a = this.get('message');
      return a && j.stripTags(a)
    },
    permalink: function (a, b) {
      var c = this.id;
      if (!c || !a) return '';
      var d = b !== !1 && a.currentUrl || a.permalink(),
      e = window.document.createElement('a');
      return e.href = d,
      e.hash = '#comment-' + c,
      e.href
    },
    shortLink: function () {
      return e.shortener + '/p/' + Number(this.id).toString(36)
    },
    twitterText: function (a) {
      var b = 140,
      c = this.author.get('name') || this.author.get('username');
      b -= c.length + 3,
      b -= a.length + 1,
      b -= 2;
      var d = i.niceTruncate(this.messageText(), b);
      return '"' + d + '" — ' + c
    },
    toJSON: function (a) {
      var b = c.Model.prototype.toJSON.call(this);
      if (a) {
        var d = a.session,
        e = a.thread;
        b.canBeEdited = this.canBeEdited(d, e),
        b.canBeRepliedTo = this.canBeRepliedTo(d, e),
        b.canBeShared = this.canBeShared(),
        b.permalink = this.permalink(e)
      }
      return b.shortLink = this.shortLink(),
      b.isMinimized = this.isMinimized(),
      b.plaintext = this.messageText(),
      b.relativeCreatedAt = this.getRelativeCreatedAt(),
      b.formattedCreatedAt = this.getFormattedCreatedAt(),
      b.cid = this.cid,
      b
    },
    isPublic: function () {
      return !(!this.get('isHighlighted') && !this.get('isSponsored')) || !this.get('isDeleted') && this.get('isApproved')
    },
    isMinimized: function () {
      return !this.get('isHighlighted') && (this.get('isMinimized') !== !1 && !this.get('isApproved'))
    },
    isAuthorSessionUser: function () {
      return !1
    },
    canBeEdited: function () {
      return !1
    },
    canBeRepliedTo: function () {
      return !1
    },
    canBeShared: function () {
      return !1
    },
    validateMessage: function (a) {
      if (b.isString(a.raw_message)) {
        if ('' === a.raw_message) return t('Comments can\'t be blank.');
        if (a.raw_message.length < 2) return t('Comments must have at least 2 characters.');
        if (a.raw_message.length > r) return g.interpolate(t('Comments can\'t be longer than %(maxLength)s characters (currently %(currentLength)s characters).'), {
          maxLength: r,
          currentLength: a.raw_message.length
        })
      }
    },
    validate: function (c) {
      if (!this.id && !c.id) {
        var d = this.validateMessage(c);
        return d ? d : (c.author_email && (c.author_email = a.trim(c.author_email)), c.author_name && (c.author_name = a.trim(c.author_name)), '' === c.author_email && '' === c.author_name ? t('Please sign in or enter a name and email address.') : '' === c.author_email || '' === c.author_name ? t('Please enter both a name and email address.') : b.isString(c.author_email) && !this.validateEmail(c.author_email) ? t('Invalid email address format.') : void 0)
      }
    },
    validateEmail: function (a) {
      return i.validateEmail(a)
    },
    report: function (a) {
      this.set('isFlagged', !0);
      var b = {
        post: this.id
      };
      a && (b.reason = a),
      f.call('posts/report.json', {
        data: b,
        method: 'POST'
      })
    },
    _highlight: function (a) {
      this.set('isHighlighted', a),
      f.call('posts/' + (a ? 'highlight' : 'unhighlight') + '.json', {
        data: {
          post: this.id
        },
        method: 'POST'
      })
    },
    highlight: function () {
      this._highlight(!0)
    },
    unhighlight: function () {
      this._highlight(!1)
    },
    getThreadId: function () {
      return this.get('thread')
    },
    getUpvotersUserCollection: b.memoize(function () {
      var a = this.votersCollectionClass;
      return new a((void 0), {
        postId: this.id,
        threadId: this.getThreadId()
      })
    }, function () {
      return [this.id,
      '1'].join('')
    }),
    getDownvotersUserCollection: b.memoize(function () {
      var a = this.votersCollectionClass;
      return new a((void 0), {
        postId: this.id,
        threadId: this.getThreadId()
      })
    }, function () {
      return [this.id,
      '-1'].join('')
    }),
    _vote: function (a, b, c) {
      var d = a - b,
      e = {
        likes: this.get('likes'),
        dislikes: this.get('dislikes'),
        points: this.get('points')
      };
      return 0 === d ? d : (a > 0 ? (e.likes += a, e.dislikes += b) : a < 0 ? (e.dislikes -= a, e.likes -= b) : b > 0 ? e.likes -= b : e.dislikes += b, e.points += d, c && (1 === a ? (this.getUpvotersUserCollection().add(c), this.getDownvotersUserCollection().remove(c)) : (this.getDownvotersUserCollection().add(c), this.getUpvotersUserCollection().remove(c))), this.set(e), d)
    },
    vote: function (a) {
      if (!s()) return 0;
      var b = this,
      c = b._vote(a, b.get('userScore'));
      if (0 !== c) {
        var d = b.author ? b.author.get('numLikesReceived') : 0;
        1 === b.get('userScore') ? d -= 1 : 1 === a && (d += 1),
        b.set('userScore', a),
        f.call('posts/vote.json', {
          data: {
            post: b.id,
            vote: a
          },
          method: 'POST',
          success: function (c) {
            b.votes.add({
              id: c.response.id,
              score: a
            }, {
              merge: !0
            }),
            b.author && b.author.set('numLikesReceived', d)
          }
        })
      }
    },
    _delete: function () {
      return this.set({
        isApproved: !1,
        isDeleted: !0
      }),
      f.call('posts/remove.json', {
        data: {
          post: this.id
        },
        method: 'POST'
      })
    },
    spam: function () {
      this.set({
        isApproved: !1,
        isDeleted: !0,
        isSpam: !0
      }),
      this.trigger('spam'),
      f.call('posts/spam.json', {
        data: {
          post: this.id
        },
        method: 'POST'
      })
    },
    _create: function (a, b) {
      var c = this,
      d = a.attributes,
      e = {
        thread: d.thread,
        message: d.raw_message,
        rating: d.rating
      };
      return d.parent && (e.parent = d.parent),
      d.author_name && (e.author_name = d.author_name, e.author_email = d.author_email),
      f.call('posts/create.json', {
        data: e,
        method: 'POST',
        success: function (a) {
          c.set(a.response),
          b.success && b.success()
        },
        error: b.error
      })
    },
    _update: function (a, b) {
      var c = this,
      d = a.attributes,
      e = {
        post: d.id,
        message: d.raw_message,
        rating: d.rating
      };
      return f.call('posts/update.json', {
        data: e,
        method: 'POST',
        success: function (a) {
          c.set(a.response),
          b.success && b.success()
        },
        error: b.error
      })
    },
    _read: function (a, b) {
      var c = this;
      return b = b || {
      },
      f.call('posts/details.json', {
        data: {
          post: c.id
        },
        method: 'GET',
        success: function (a) {
          b.isHighlighted && !a.response.isHighlighted && (a.response.isHighlighted = !0),
          c.set(a.response),
          b.success && b.success()
        },
        error: b.error
      })
    },
    sync: function (a, b, c) {
      c = c || {
      };
      var d = c.error;
      switch (d && (c.error = function (a) {
          var b = {
          };
          try {
            b = JSON.parse(a.responseText)
          } catch (c) {
          }
          d(b)
        }), a) {
        case 'create':
          return this._create(b, c);
        case 'update':
          return this._update(b, c);
        case 'delete':
          return this._delete();
        case 'read':
          return this._read(b, c);
        default:
          return null
      }
    },
    storageKey: function () {
      if (this.isNew() && this.getThreadId()) return ['drafts',
      'thread',
      this.getThreadId(),
      'parent',
      this.get('parent') || 0].join(':')
    }
  }, {
    formatMessage: function () {
      var a = /(?:\r\n|\r|\n){2,}/,
      c = /\r\n|\r|\n/;
      return function (d) {
        var e = b.chain(d.split(a)).compact().value(),
        f = b.map(e, function (a) {
          return b.chain(a.split(c)).compact().map(b.escape).join('<br>').value()
        }).join('</p><p>');
        return '<p>' + f + '</p>'
      }
    }()
  });
  return m.withCreatedAt.call(u.prototype),
  k.withAdvice.call(u.prototype),
  u.withAuthor = function (a) {
    this.around('set', function (c, d, e, f) {
      var g;
      if (null == d) return this;
      'object' == typeof d ? (g = d, f = e) : (g = {
      }, g[d] = e);
      var h = g.author;
      if (h) {
        if (b.isString(h) || b.isNumber(h)) {
          var i = h;
          h = {
          },
          h[a.prototype.idAttribute || 'id'] = i
        }
        var j = this.collection || this.author && this.author.collection,
        k = j && j.thread && j.thread.forum;
        if (this.author && this.author.get('badges').length && this.author.get('badges') [0].id) h.badges = this.author.get('badges');
         else if (k && k.get('badges') && h.badges) {
          var l = [
          ],
          m = h.badges || [
          ],
          n = k.get('badges');
          m.forEach(function (a) {
            n[a] && l.push(n[a])
          }),
          h.badges = l
        }
        this.author = new a(h),
        this.trigger('changeRelated:author'),
        delete g.author
      }
      return c.call(this, g, f)
    }),
    this.around('toJSON', function (a) {
      var c = a.apply(this, b.rest(arguments));
      return this.author && (c.author = this.author.toJSON()),
      c
    })
  },
  u.withMediaCollection = function (a) {
    this.after('set', function (c) {
      c && 'string' != typeof c && (b.isUndefined(c.media) || (this.media ? this.media.reset(c.media) : this.media = new a(c.media), delete c.media))
    }),
    this.around('toJSON', function (a) {
      var c = a.apply(this, b.rest(arguments));
      return this.media && (c.media = this.media.toJSON()),
      c
    })
  },
  u
}),
define('core/utils/threadRatingsHelpers', [
  'core/utils/object/get'
], function (a) {
  'use strict';
  var b = {
  };
  return b.isThreadRatingsEnabled = function (b, c) {
    return !!(b && b.forum && c && c.id === b.forum) && Boolean(a(b, [
      'ratingsEnabled'
    ]) && a(c, [
      'settings',
      'threadRatingsEnabled'
    ]) && a(c, [
      'features',
      'threadRatings'
    ]))
  },
  b.isThreadModelRatingsEnabled = function (a) {
    if (!a || !a.forum) return !1;
    var b = a.forum.get('settings'),
    c = a.forum.get('features');
    return Boolean(a.get('ratingsEnabled') && b && b.threadRatingsEnabled && c && c.threadRatings)
  },
  b.isForumRatingsEnabled = function (b) {
    return !!b && Boolean(a(b, [
      'settings',
      'threadRatingsEnabled'
    ]) && a(b, [
      'features',
      'threadRatings'
    ]))
  },
  b.isForumModelRatingsEnabled = function (a) {
    if (!a) return !1;
    var b = a.get('settings'),
    c = a.get('features');
    return Boolean(b && b.threadRatingsEnabled && c && c.threadRatings)
  },
  b
}),
define('core/models/Thread', [
  'underscore',
  'backbone',
  'loglevel',
  'core/config/urls',
  'core/utils',
  'core/api',
  'core/config',
  'core/advice',
  'core/UniqueModel',
  'core/utils/threadRatingsHelpers',
  'core/models/User'
], function (a, b, c, d, e, f, g, h, i, j, k) {
  'use strict';
  var l = b.Model,
  m = l.prototype,
  n = l.extend({
    defaults: {
      author: null,
      category: null,
      createdAt: null,
      forum: null,
      identifiers: [
      ],
      ipAddress: null,
      isClosed: !1,
      isDeleted: !1,
      hasStreaming: !1,
      link: null,
      message: null,
      slug: null,
      title: null,
      userSubscription: !1,
      posts: 0,
      likes: 0,
      dislikes: 0,
      userScore: 0
    },
    initialize: function (a, b) {
      b = b || {
      },
      this.moderators = b.moderators,
      this.forum = b.forum,
      this.on('change:userScore', function () {
        var a = this.get('userScore');
        a > 0 && 0 === this.get('likes') && this.set('likes', a)
      }, this)
    },
    _vote: function (a, b) {
      var c = a - b;
      return 0 === c ? c : (this.set('likes', this.get('likes') + c), c)
    },
    vote: function (a) {
      var b = this,
      c = b._vote(a, b.get('userScore'));
      0 !== c && (this.set('userScore', a), f.call('threads/vote.json', {
        data: {
          thread: this.id,
          vote: a
        },
        method: 'POST',
        success: function (a) {
          a.response.id && b.trigger('vote:success', a)
        }
      }))
    },
    fetch: function (a) {
      var b,
      d = this,
      e = d.attributes;
      a = a || {
      },
      b = e.identifier ? 'ident:' + e.identifier : 'link:' + e.url,
      f.call('threads/details.json', {
        data: {
          thread: b,
          forum: e.forum
        },
        success: function (b) {
          d.set(b.response),
          a.success && a.success()
        },
        error: function () {
          g.debug ? d.save({
          }, {
            success: a.success
          }) : c.info('Couldn\'t find thread; not creating in production.')
        }
      })
    },
    _toggleState: function (a, b) {
      b || (b = {
      });
      var c = a ? 'open.json' : 'close.json';
      return this.set('isClosed', !a),
      f.call('threads/' + c, {
        method: 'POST',
        data: {
          thread: this.id
        },
        success: b.success,
        error: b.error
      })
    },
    open: function (a) {
      return this._toggleState(!0, a)
    },
    close: function (a) {
      return this._toggleState(!1, a)
    },
    premoderate: function (b, c) {
      return this.set('validateAllPosts', b),
      f.call('threads/update', a.extend({
      }, c, {
        method: 'POST',
        data: a.extend({
          thread: this.id,
          validateAllPosts: b ? 1 : 0
        }, c && c.data)
      }))
    },
    sync: function () {
      var a = this,
      b = a.attributes;
      f.call('threads/create.json', {
        data: {
          title: b.title,
          forum: b.forum,
          identifier: b.identifier,
          url: b.url
        },
        method: 'POST',
        success: function (b) {
          a.set(b.response)
        }
      })
    },
    fetchRatings: function () {
      var a = this,
      b = {
        thread: a.id
      };
      return f.call('threads/ratingsSummary.json', {
        data: b,
        method: 'GET',
        success: function (b) {
          a.set('ratings', b.response)
        }
      })
    },
    toggleRatingsEnabled: function () {
      var a = this;
      if (j.isForumModelRatingsEnabled(a.forum)) {
        var b = a.get('ratingsEnabled'),
        c = {
          thread: a.id,
          ratingsEnabled: b ? 0 : 1
        };
        return a.set('ratingsEnabled', !b),
        f.call('threads/update.json', {
          data: c,
          method: 'POST'
        })
      }
    },
    incrementPostCount: function (a) {
      var b = this.get('posts') + a;
      this.set('posts', b > 0 ? b : 0)
    },
    isModerator: function (b) {
      var c;
      if (this.moderators) return c = b instanceof k || a.isObject(b) ? b.id : b,
      c = parseInt(c, 10),
      a(this.moderators).contains(c)
    },
    isOP: function (b) {
      var c = b instanceof k || a.isObject(b) ? b.id : b;
      return this.get('author') === c
    },
    subscribe: function (a) {
      a = a !== !1;
      var b = this.get('userSubscription');
      if (b !== a) {
        this.set('userSubscription', a);
        var c = a ? 'subscribe.json' : 'unsubscribe.json',
        d = {
          thread: this.id
        };
        return f.call('threads/' + c, {
          data: d,
          method: 'POST'
        })
      }
    },
    twitterText: function (a) {
      var b = 140 - (a.length + 1),
      c = this.get('clean_title');
      return c = e.niceTruncate(c, b)
    },
    permalink: function () {
      return this.get('url') || this.get('link') || this.currentUrl
    },
    shortLink: function () {
      return d.shortener + '/t/' + Number(this.id).toString(36)
    },
    toJSON: function () {
      var a = m.toJSON.call(this);
      return a.permalink = this.permalink(),
      a.shortLink = this.shortLink(),
      a
    },
    getDiscussionRoute: function (a) {
      var b = [
        '',
        'home',
        'discussion',
        this.forum.id,
        this.get('slug'),
        ''
      ];
      return a = a || this.forum.channel,
      a && (a = a.attributes || a, b.splice(2, 0, 'channel', a.slug), b.splice(1, 1)),
      b.join('/')
    }
  });
  return h.withAdvice.call(n.prototype),
  n.withThreadVoteCollection = function (a) {
    this.after('initialize', function () {
      this.votes = new a,
      this.on('vote:success', function (a) {
        this.votes.get(a.response.id) || this.votes.add({
          id: a.response.id,
          score: a.response.vote,
          currentUser: !0
        })
      }, this)
    })
  },
  n.withPostCollection = function (b) {
    this.after('initialize', function (c) {
      c = c || {
      },
      this.posts = new b(c.posts, {
        thread: this,
        cursor: c.postCursor,
        order: c.order,
        perPage: this.postsPerPage
      }),
      this.listenTo(this.posts, 'add reset', function (b) {
        b = b.models ? b.models : [
          b
        ],
        this.users && a.each(b, function (a) {
          this.users.get(a.author.id) || this.users.add(a.author)
        }),
        this.recalculatePostCount()
      }),
      this.listenTo(this.posts, 'change:isDeleted change:isFlagged', function (a, b) {
        b && this.incrementPostCount( - 1)
      })
    }),
    this.recalculatePostCount = function () {
      var a = this.get('posts');
      a > 50 || (a = this.posts.reduce(function (a, b) {
        return b.isPublic() ? a + 1 : a
      }, 0), this.set('posts', a))
    }
  },
  i.addType('Thread', n),
  n
}),
define('core/models/Forum', [
  'backbone',
  'core/UniqueModel',
  'core/api'
], function (a, b, c) {
  'use strict';
  var d = a.Model.extend({
    defaults: {
      settings: {
      },
      badges: [
      ],
      followUrl: 'forums/follow',
      unfollowUrl: 'forums/unfollow',
      isFollowing: !1
    },
    initialize: function (a, b) {
      b && b.channel && (this.channel = b.channel),
      this.getFeatures(),
      this.on('change:id', this.getFeatures),
      this.on('change:id', this.getBadges)
    },
    _changeFollowingState: function (a) {
      return c.call(a, {
        method: 'POST',
        data: {
          target: this.get('id')
        }
      })
    },
    follow: function () {
      return this.set('isFollowing', !0),
      this._changeFollowingState(this.get('followUrl'))
    },
    unfollow: function () {
      return this.set('isFollowing', !1),
      this._changeFollowingState(this.get('unfollowUrl'))
    },
    toggleFollowed: function () {
      if (this.channel && this.channel.get('options').isCurationOnlyChannel) return this.channel.toggleFollowed();
      var a = this.get('isFollowing') ? this.unfollow() : this.follow();
      return this.trigger('toggled:isFollowing'),
      a
    },
    getFeatures: function () {
      var a = this;
      a.id && c.call('forums/details', {
        data: {
          forum: this.id,
          attach: 'forumFeatures'
        },
        success: function (b) {
          b && b.response && a.set('features', b.response.features)
        }
      })
    },
    getBadges: function () {
      if (this.id && this.get('badges')) {
        var a = {
        },
        b = {
        };
        b.id = this.get('pk'),
        b.url = this.get('id'),
        this.get('badges').forEach(function (c) {
          c.forum = b,
          a[c.id] = c
        }),
        this.set('badges', a)
      }
    }
  });
  return b.addType('Forum', d),
  d
}),
define('core/models/Media', [
  'underscore',
  'backbone',
  'core/api',
  'core/UniqueModel'
], function (a, b, c, d) {
  'use strict';
  var e = b.Model.extend({
    idAttribute: 'url',
    defaults: {
      mediaType: null,
      html: '',
      htmlWidth: null,
      htmlHeight: null,
      thumbnailUrl: '',
      thumbnailWidth: null,
      thumbnailHeight: null,
      url: '',
      urlRedirect: '',
      resolvedUrl: '',
      resolvedUrlRedirect: '',
      title: '',
      description: '',
      providerName: ''
    },
    parse: function (a) {
      return a.response
    },
    sync: function (b, d, e) {
      if ('read' !== b) throw new Error('Media models do not support methods other than "read".');
      return c.call('media/details.json', a.extend({
        method: 'POST',
        data: {
          url: this.get('url'),
          forum: e.forum
        }
      }, e))
    }
  }, {
    MEDIA_TYPES: {
      IMAGE: '1',
      IMAGE_UPLOAD: '2',
      YOUTUBE_VIDEO: '3',
      WEBPAGE: '4',
      TWITTER_STATUS: '5',
      FACEBOOK_PAGE: '6',
      FACEBOOK_POST: '7',
      FACEBOOK_PHOTO: '8',
      FACEBOOK_VIDEO: '9',
      SOUNDCLOUD_SOUND: '10',
      GOOGLE_MAP: '11',
      VIMEO_VIDEO: '12',
      VINE_VIDEO: '14',
      GIF_VIDEO: '15',
      MP4_VIDEO: '16'
    },
    WEBPAGE_TYPES: [
      '4',
      '6',
      '7'
    ]
  });
  return d.addType('Media', e),
  e
}),
define('core/collections/MediaCollection', [
  'backbone',
  'core/models/Media'
], function (a, b) {
  'use strict';
  var c = a.Collection.extend({
    model: b
  });
  return c
}),
define('core/utils/sso', [
], function () {
  'use strict';
  var a = function (a) {
    var b = a;
    return b && (b = String(b), 0 === b.indexOf('//') && (b = 'https:' + b), /https?:\/\//.test(b) || (b = null), /\{username\}/.test(b) || (b = null)),
    b
  },
  b = function (a, b) {
    return a.replace(/\{username\}/gi, encodeURIComponent(b))
  };
  return {
    getProfileUrlTemplate: a,
    getProfileUrl: b
  }
}),
define('common/collections/VotersUserCollection', [
  'core/collections/VotersUserCollection'
], function (a) {
  'use strict';
  var b = a.extend({
    initialize: function (b, c) {
      a.prototype.initialize.call(this, b, c);
      var d = require('common/Session');
      this.session = d.get()
    },
    parse: function (a) {
      return this.session.get('canModerate') && a.response && a.response.forEach(function (a) {
        a.isBlocking = !1
      }),
      a.response
    }
  });
  return b
}),
define('common/models', [
  'require',
  'jquery',
  'underscore',
  'backbone',
  'modernizr',
  'core/api',
  'core/UniqueModel',
  'core/models/User',
  'core/models/Post',
  'core/models/Thread',
  'core/models/Forum',
  'core/collections/MediaCollection',
  'core/utils/object/get',
  'core/utils/sso',
  'core/utils/url/serialize',
  'core/utils/guid',
  'common/utils',
  'core/utils',
  'common/urls',
  'core/shared/urls',
  'common/collections/VotersUserCollection',
  'backbone.uniquemodel'
], function (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u) {
  'use strict';
  var v = k.extend({
    defaults: {
      settings: {
      }
    },
    toJSON: function () {
      return c.extend(d.Model.prototype.toJSON.apply(this, arguments), {
        homeUrl: t.apps.home + 'home/forums/' + this.id + '/'
      })
    }
  }),
  w = j.extend({
    initialize: function (b, d) {
      j.prototype.initialize.apply(this, arguments),
      d = d || {
      };
      var e = this,
      f = a('common/collections');
      e.users = new f.UserCollection(d.users, {
        thread: e
      }),
      e.forum && (e.moderatorList = new f.ModeratorCollection(null, {
        forum: e.forum.get('id')
      })),
      e.posts = new f.SubpaginatedPostCollection(d.posts, {
        thread: e,
        cursor: d.postCursor,
        order: d.order,
        perPage: r.isMobileUserAgent() ? 20 : 50
      }),
      e.votes = new f.ThreadVoteCollection,
      e.posts.on('add reset', function (a) {
        a = a.models ? a.models : [
          a
        ],
        c.each(a, function (a) {
          e.users.get(a.author.id) || e.users.add(a.author)
        }),
        e.recalculatePostCount()
      }),
      e.listenTo(e.posts, 'change:isDeleted change:isFlagged', function (a, b) {
        b && e.incrementPostCount( - 1)
      }),
      e.queue = new f.QueuedPostCollection(null, {
        thread: e
      })
    },
    recalculatePostCount: function () {
      var a = this.get('posts');
      a > 50 || (a = this.posts.buffer.reduce(function (a, b) {
        var c = b.isPublic() && (!b.get('sb') || b.isAuthorSessionUser());
        return c ? a + 1 : a
      }, 0), this.set('posts', a))
    },
    toJSON: function () {
      var a = this.get('forum'),
      b = c.isObject(a) ? a.id : a;
      return c.extend(j.prototype.toJSON.apply(this, arguments), {
        homeUrl: t.apps.home + 'home/discussions/' + b + '/' + this.get('slug') + '/'
      })
    }
  });
  j.withThreadVoteCollection.call(w.prototype, d.Collection);
  var x = i.extend({
    votersCollectionClass: u,
    initialize: function () {
      i.prototype.initialize.apply(this, arguments);
      var b = a('common/collections');
      this.usersTyping = new b.TypingUserCollection
    },
    isAuthorSessionUser: function (b) {
      var c = a('common/Session'),
      d = m(b, [
        'user',
        'id'
      ]) || c.fromCookie().id;
      return !!(d && this.author && this.author.id) && this.author.id.toString() === d.toString()
    },
    canBeEdited: function (a, b) {
      var c = this.get('editableUntil'),
      d = (new Date).toISOString();
      return !b.get('isClosed') && !this.get('isDeleted') && a.isLoggedIn() && this.isAuthorSessionUser(a) && this.get('raw_message') && !this.get('isHighlighted') && !this.get('isSponsored') && d < c
    },
    canBeRepliedTo: function (a, b) {
      return !b.get('isClosed') && a.get('canReply') && !this.get('isDeleted') && (this.get('isApproved') || b.isModerator(a.user))
    },
    canBeShared: function () {
      return !this.get('isDeleted') && !this.get('isSponsored')
    },
    getParent: function () {
      var a = this.get('parent');
      if (a) return new g(x, {
        id: String(a)
      })
    }
  }, {
    fetchContext: function (a, d, e) {
      e = e || {
      };
      var h = b.Deferred();
      return f.call('posts/getContext.json', {
        method: 'GET',
        data: {
          post: a,
          order: d.posts.buffer.order
        },
        success: function (a) {
          var b = c.filter(a.response, function (a) {
            return a.thread === d.get('id')
          });
          return b ? (c.each(b, function (a) {
            d.posts.get(a.id) && delete a.hasMore,
            a = new g(x, a),
            e.requestedByPermalink && (a.requestedByPermalink = !0),
            d.posts.add(a)
          }), void h.resolve(b)) : void h.reject()
        }
      }),
      h.promise()
    }
  });
  i.withAuthor.call(x.prototype, g.wrap(h)),
  i.withMediaCollection.call(x.prototype, l),
  g.addType('Post', x);
  var y = d.Model.extend({
    defaults: {
      user: null,
      message: null,
      parentId: null,
      immedReply: !1,
      createdAt: void 0
    },
    getVisibleParent: function (a) {
      for (var b, c = this; c.get('parentId'); ) {
        if (b = a.posts.get(c.get('parentId'))) return b;
        if (c = a.queue.get(c.get('parentId')), !c) return null
      }
      return null
    },
    toPost: function (a) {
      var b = this,
      c = a.posts.get(b.get('parentId')),
      d = c ? c.get('depth') + 1 : 0,
      e = new g(x, {
        id: b.id,
        forum: a.get('forum'),
        thread: a.id,
        message: b.get('message'),
        parent: b.get('parentId'),
        depth: d,
        createdAt: b.get('createdAt'),
        isRealtime: !0,
        media: b.get('media'),
        isImmediateReply: b.get('immedReply')
      });
      return e.author = b.get('user'),
      e
    }
  }),
  z = d.Model.extend({
    defaults: {
      user: null,
      post: null,
      thread: null,
      client_context: null,
      typing: !0
    },
    idAttribute: 'client_context',
    set: function () {
      return this.lastModified = new Date,
      d.Model.prototype.set.apply(this, arguments)
    },
    sync: function () {
      var a = this.toJSON(),
      b = o(s.realertime + '/api/typing', a);
      try {
        q.CORS.request('GET', b).send()
      } catch (c) {
      }
    }
  }, {
    make: function (a) {
      return a.client_context || (a.client_context = p.generate()),
      new g(z, a)
    }
  });
  g.addType('TypingUser', z);
  var A = h.prototype.toJSON;
  c.extend(h.prototype, {
    getFollowing: function () {
      var b = a('common/collections/profile');
      return this.following || (this.following = new b.FollowingCollection(null, {
        user: this
      }))
    },
    hasDisqusProfileUrl: function () {
      var a = A.apply(this, arguments);
      if (!a.profileUrl) return !1;
      var b = a.profileUrl.match(/^https?:\/\/([^/?#]+)(?:[/?#]|$)/i);
      return b && b.length >= 2 && ('disqus.com' === b[1] || 'dev.disqus.org:8000' === b[1])
    },
    toJSON: function () {
      var b = A.apply(this, arguments),
      c = a('common/Session'),
      d = c.get(),
      e = n.getProfileUrlTemplate(d && d.get('sso') && d.get('sso').profile_url),
      f = this.hasDisqusProfileUrl();
      return b.isSSOProfileUrl = !f || Boolean(e),
      f && e && (b.profileUrl = n.getProfileUrl(e, b.name)),
      b
    }
  }),
  g.addType('User', h);
  var B = h.extend({
    defaults: c.extend({
      numPosts: 0
    }, h.prototype.defaults)
  }),
  C = e.sessionstorage ? 'sessionStorage' : null,
  D = d.UniqueModel(h, 'User', C),
  E = d.UniqueModel(B, 'User', C),
  F = d.Model.extend({
  }),
  G = d.Model.extend({
    defaults: {
      id: '',
      title: '',
      rating: 'g',
      'default': {
        url: '',
        height: '',
        width: ''
      },
      fixedWidth200: {
        url: '',
        height: '',
        width: ''
      },
      fixedWidth100: {
        url: '',
        height: '',
        width: ''
      }
    }
  });
  return {
    Forum: v,
    Thread: w,
    Post: x,
    QueuedPost: y,
    TypingUser: z,
    User: h,
    TopUser: B,
    Switch: F,
    SyncedUser: D,
    SyncedTopUser: E,
    GifObject: G
  }
}),
define('core/models/Channel', [
  'underscore',
  'backbone',
  'core/UniqueModel',
  'core/api',
  'core/models/Forum',
  'core/strings'
], function (a, b, c, d, e, f) {
  'use strict';
  var g = f.get,
  h = b.Model.extend({
    defaults: {
      primaryForum: {
      },
      slug: null,
      name: null,
      options: {
      },
      followUrl: 'channels/follow',
      unfollowUrl: 'channels/unfollow'
    },
    idAttribute: 'slug',
    initialize: function (a, b) {
      this.buildPrimaryForum(b),
      this.listenTo(this, 'change:primaryForum', this.updatePrimaryForum),
      this.listenTo(this, 'change:primaryCategory', this.updatePrimaryCategory)
    },
    buildPrimaryForum: function () {
      if (!this.primaryForum) {
        var a = this.get('primaryForum');
        a && (this.primaryForum = new c(e, a, {
          channel: this
        }), this.unset('primaryForum'))
      }
    },
    updatePrimaryForum: function () {
      var a = this.get('primaryForum');
      a && (this.primaryForum || this.buildPrimaryForum(), this.primaryForum.set(a), this.unset('primaryForum'))
    },
    updatePrimaryCategory: function () {
      var a = this.get('primaryCategory'),
      b = this.primaryCategory;
      null === a ? this.primaryCategory = void 0 : b ? b.set(a) : this.primaryCategory = new c(h, a),
      this.unset('primaryCategory'),
      this.trigger('changeRelated:primaryCategory')
    },
    fetch: function (c) {
      return c = c ? a.clone(c) : {
      },
      c.data = this.buildFetchData(c.data),
      b.Model.prototype.fetch.call(this, c)
    },
    buildFetchData: function (b) {
      var c = b ? a.clone(b) : {
      };
      return this.id && (c.channel = this.id),
      c
    },
    url: function (a) {
      return d.getURL(this.constructor.URLS[a] || this.constructor.URLS.read)
    },
    sync: function (c, d, e) {
      var f = d.attributes;
      e = a.extend({
        url: this.url(c),
        emulateHTTP: !0
      }, e);
      var g = {
        bannerColor: f.bannerColor,
        description: f.description,
        primaryCategory: d.primaryCategory && d.primaryCategory.get('slug') || ''
      };
      switch ('default' === e.avatarType ? g.avatar = '' : f.avatar && !a.isString(f.avatar) && (g.avatar = f.avatar), 'file' !== e.bannerType ? g.banner = '' : f.banner && !a.isString(f.banner) && (g.banner = f.banner), c) {
        case 'create':
          e.processData = !1,
          e.contentType = !1,
          g.name = f.name,
          e.data = this.toFormData(a.extend({
          }, g, e.data));
          break;
        case 'update':
          e.processData = !1,
          e.contentType = !1,
          g.channel = f.slug,
          e.data = this.toFormData(a.extend({
          }, g, e.data))
      }
      return b.sync(c, d, e)
    },
    toFormData: function (b) {
      return a.reduce(b, function (b, c, d) {
        return b.append(d, a.isString(c) ? c.trim() : c),
        b
      }, new window.FormData)
    },
    parse: function (a) {
      return a.response || a
    },
    shouldFetch: function () {
      return !this.get('name') || !this.get('dateAdded')
    },
    ensureFetched: function () {
      this.shouldFetch() && this.fetch()
    },
    validate: function (b) {
      var c = [
      ],
      d = b.name.trim();
      d.length < this.constructor.MIN_NAME_LENGTH ? c.push({
        attrName: 'name',
        message: f.interpolate(g('Name must have at least %(minLength)s characters.'), {
          minLength: this.constructor.MIN_NAME_LENGTH
        })
      }) : d.length > this.constructor.MAX_NAME_LENGTH && c.push({
        attrName: 'name',
        message: f.interpolate(g('Name must have less than %(maxLength)s characters.'), {
          maxLength: this.constructor.MAX_NAME_LENGTH
        })
      });
      var e = b.description.trim();
      if (e.length < this.constructor.MIN_DESCRIPTION_LENGTH ? c.push({
        attrName: 'description',
        message: f.interpolate(g('Description must have at least %(minLength)s characters.'), {
          minLength: this.constructor.MIN_DESCRIPTION_LENGTH
        })
      }) : e.length > this.constructor.MAX_DESCRIPTION_LENGTH && c.push({
        attrName: 'description',
        message: f.interpolate(g('Description must have less than %(maxLength)s characters.'), {
          maxLength: this.constructor.MAX_DESCRIPTION_LENGTH
        })
      }), this.constructor.BANNER_COLORS[b.bannerColor] || c.push({
        attrName: 'bannerColor',
        message: f.interpolate(g('Banner color must be one of ' + a.invoke(a.values(this.constructor.BANNER_COLORS), 'toLowerCase').join(', ')) + '.')
      }), !a.isEmpty(c)) return c
    },
    _changeFollowingState: function (b, c) {
      return c = c || {
      },
      c.type = 'POST',
      c.data = a.extend({
        target: this.get('slug')
      }, c.data),
      d.call(b, c)
    },
    follow: function (a) {
      return this.primaryForum.set('isFollowing', !0),
      this._changeFollowingState(this.get('followUrl'), a)
    },
    unfollow: function (a) {
      return this.primaryForum.set('isFollowing', !1),
      this._changeFollowingState(this.get('unfollowUrl'), a)
    },
    toggleFollowed: function () {
      if (this.get('options').isCurationOnlyChannel && this.primaryForum) {
        var a = this.primaryForum.get('isFollowing') ? this.unfollow() : this.follow();
        return this.primaryForum.trigger('toggled:isFollowing'),
        a
      }
    },
    toJSON: function () {
      var c = b.Model.prototype.toJSON.call(this);
      return a.defaults({
        primaryCategory: this.primaryCategory ? this.primaryCategory.toJSON() : {
        }
      }, c)
    }
  }, {
    URLS: {
      read: 'channels/details',
      create: 'channels/create',
      update: 'channels/update'
    },
    BANNER_COLORS: {
      gray: g('Gray'),
      blue: g('Blue'),
      green: g('Green'),
      yellow: g('Yellow'),
      orange: g('Orange'),
      red: g('Red'),
      purple: g('Purple')
    },
    MIN_NAME_LENGTH: 3,
    MAX_NAME_LENGTH: 100,
    MIN_DESCRIPTION_LENGTH: 5,
    MAX_DESCRIPTION_LENGTH: 200
  });
  return c.addType('Channel', h),
  h
}),
define('core/utils/objectExpander', [
  'underscore',
  'core/UniqueModel',
  'core/models/Channel',
  'core/models/Thread'
], function (a, b, c, d) {
  'use strict';
  return {
    Channel: c,
    Thread: d,
    parseObject: function (b, c) {
      return a.isString(c) ? b[c] : c
    },
    buildThread: function (c, d) {
      if (d instanceof this.Thread) return d;
      if (d = this.parseObject(c, d), a.isString(d.author)) {
        var e = d.author.replace('auth.User?id=', '');
        d.author = c['auth.User?id=' + e] || e
      }
      return new b(this.Thread, d, {
        forum: this.parseObject(c, d.forum),
        author: d.author
      })
    },
    buildChannel: function (a, c) {
      return c instanceof this.Channel ? c : (c = this.parseObject(a, c), new b(this.Channel, c))
    }
  }
}),
define('core/collections/PaginatedCollection', [
  'underscore',
  'backbone'
], function (a, b) {
  'use strict';
  var c = b.Collection.extend({
    PER_PAGE: 30,
    initialize: function (b, c) {
      this.cid = a.uniqueId('collection'),
      c = c || {
      },
      this.cursor = c.cursor || {
      }
    },
    ensureFetched: a.memoize(function () {
      return this.fetch()
    }, function () {
      return this.cid
    }),
    fetch: function (c) {
      return c = c || {
      },
      c.data = a.defaults(c.data || {
      }, {
        cursor: c.cursor || '',
        limit: c.limit || this.PER_PAGE
      }),
      b.Collection.prototype.fetch.call(this, c)
    },
    hasPrev: function () {
      return this.cursor.hasPrev
    },
    hasNext: function () {
      return this.cursor.hasNext
    },
    next: function (b) {
      return this.cursor.hasNext ? this.fetch(a.extend({
      }, b, {
        add: !0,
        remove: !0,
        cursor: this.cursor.next
      })) : void this.trigger('nodata')
    },
    prev: function (b) {
      return this.cursor.hasPrev ? this.fetch(a.extend({
      }, b, {
        add: !0,
        remove: !0,
        cursor: this.cursor.prev
      })) : void this.trigger('nodata')
    },
    more: function (b) {
      function c(a) {
        f.push(a)
      }
      var d = this;
      if (b = b || {
      }, b.post ? !b.post.attributes.hasMore : !this.cursor.hasNext) return void d.trigger('nodata');
      var e,
      f = [
      ];
      if (b.post) {
        var g = this.postCursors[b.post.id];
        e = g && g.cursor ? g.cursor.next : ''
      } else e = this.cursor.next;
      return this.on('add', c),
      this.fetch(a.extend({
      }, b, {
        add: !0,
        remove: !1,
        cursor: e,
        limit: this.PER_PAGE || this.perPage,
        success: function () {
          d.trigger('add:many', f, d, b),
          d.off('add', c),
          b.success && b.success.apply(this, arguments)
        }
      }))
    },
    parse: function (c) {
      return Array.isArray(c) && a.every(c, function (a) {
        return a instanceof b.Model
      }) ? c : (this.cursor = c.cursor || {
        hasNext: !1
      }, c.response)
    },
    getLength: function () {
      return this.length
    }
  });
  return c
}),
define('core/collections/ChannelCollection', [
  'underscore',
  'core/collections/PaginatedCollection',
  'core/UniqueModel',
  'core/api',
  'core/models/Channel',
  'core/utils/objectExpander'
], function (a, b, c, d, e, f) {
  'use strict';
  var g = b.extend({
    url: d.getURL('channels/list'),
    model: c.boundModel(e),
    initialize: function (a, c) {
      b.prototype.initialize.call(this, a, c),
      c = c || {
      },
      this.listName = c.listName
    },
    fetch: function (c) {
      return c = c || {
      },
      this.listName && (c.data = a.extend({
        listName: this.listName
      }, c.data)),
      b.prototype.fetch.call(this, c)
    },
    parse: function (c) {
      return c = b.prototype.parse.call(this, c),
      c.items ? a.map(c.items, function (a) {
        return f.buildChannel(c.objects, a.reference)
      }) : c
    }
  });
  return g
}),
define('core/common/cached-storage', [
  'underscore',
  'core/utils/storage'
], function (a, b) {
  'use strict';
  var c = function (a, b) {
    this.namespace = a,
    this.ttl = b || 300,
    this.cache = this.getFromStorage()
  };
  return a.extend(c.prototype, {
    getItem: function (a) {
      var b = this.cache[a];
      if (b) {
        if (!this.isExpired(b)) return b.value;
        delete this.cache[a]
      }
    },
    getCurrentTime: function () {
      return Math.floor((new Date).getTime() / 1000)
    },
    persist: function () {
      b.set(this.namespace, this.cache)
    },
    getFromStorage: function () {
      var c = b.get(this.namespace);
      return a.isObject(c) ? c : {
      }
    },
    isExpired: function (a) {
      return this.getCurrentTime() > a.expiry
    },
    setItem: function (a, b) {
      this.cache[a] = {
        value: b,
        expiry: this.getCurrentTime() + this.ttl
      },
      this.persist()
    },
    removeItem: function (a) {
      delete this.cache[a],
      this.persist()
    },
    getAll: function () {
      var b = a.chain(this.cache).map(function (a, b) {
        return this.getItem(b)
      }, this).compact().value();
      return this.persist(),
      b
    }
  }),
  c
}),
define('common/collections', [
  'underscore',
  'backbone',
  'moment',
  'core/api',
  'core/utils/objectExpander',
  'core/utils/storage',
  'core/collections/UserCollection',
  'core/collections/PaginatedCollection',
  'core/collections/ChannelCollection',
  'core/models/ThreadVote',
  'core/UniqueModel',
  'common/models',
  'core/common/cached-storage',
  'core/constants/voteConstants',
  'lounge/common'
], function (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o) {
  'use strict';
  var p = b.Collection.extend({
    model: j
  }),
  q = h.extend({
    PER_PAGE: 50,
    model: k.wrap(l.Post),
    url: d.getURL('threads/listPostsThreaded'),
    initialize: function (a, b) {
      h.prototype.initialize.apply(this, arguments),
      b = b || {
      },
      this.thread = b.thread,
      this.setOrder(b.order)
    },
    fetch: function (b) {
      return b = b || {
      },
      a.extend(b, {
        data: {
          limit: this.PER_PAGE,
          thread: this.thread.id,
          forum: this.thread.get('forum'),
          order: this.getOrder()
        }
      }),
      h.prototype.fetch.call(this, b)
    },
    getOrder: function () {
      return this.order
    },
    setOrder: function (a) {
      'popular' === a && this.thread.forum.get('votingType') === n.VOTING_TYPES.DISABLED ? this.order = 'desc' : this.order = a
    }
  }),
  r = b.Collection.extend({
    collection: b.Collection,
    initialize: function (a, b) {
      this.lounge = o.getLounge(),
      this.thread = b.thread,
      this.perPage = b.perPage || 20,
      this.buffer = new this.collection(a, b),
      this.resetPage(),
      this.listenTo(this.buffer, 'reset', this.resetPage)
    },
    resetPage: function (c, d) {
      d = d || {
      };
      var e = a.isUndefined(d.customThreadLength) ? this.perPage : Math.min(d.customThreadLength, this.perPage),
      f = this.buffer.slice(0, e);
      return this.postCursors = {
      },
      this.fetchedReplies = 0,
      this.trigger('set:done', f),
      b.Collection.prototype.reset.call(this, f, d)
    },
    currentPage: function () {
      var a = Math.floor((this.length - this.fetchedReplies) / this.perPage);
      return (this.length - this.fetchedReplies) % this.perPage && (a += 1),
      a
    },
    setPageFor: function (a, b) {
      var c = this.buffer.get(a),
      d = this.perPage;
      c && (d = this.perPage * Math.floor(this.buffer.indexOf(c) / this.perPage + 1)),
      this.add(this.buffer.slice(0, d), b)
    },
    hasNext: function () {
      return this.buffer.length > this.length || this.buffer.hasNext()
    },
    more: function (a) {
      a = a || {
      };
      var b = this,
      c = b.length + b.perPage,
      d = a.success;
      a.success = function () {
        a.post || b.add(b.buffer.slice(0, c)),
        b.trigger('set:done', b.models),
        d && d()
      };
      var e = a.post ? b.get(a.post.id) : null;
      e && e.attributes.hasMore ? b.collection.prototype.more.call(b, a) : !e && b.buffer.length < b.length + b.perPage && b.buffer.hasNext() ? (b.add(b.buffer.slice(0, c)), b.buffer.more(a)) : a.success()
    }
  });
  a.each(['setOrder',
  'getOrder',
  'reset'], function (a) {
    r.prototype[a] = function () {
      return this.buffer[a].apply(this.buffer, arguments)
    }
  }),
  a.each(['add',
  'remove'], function (a) {
    r.prototype[a] = function () {
      return this.buffer[a].apply(this.buffer, arguments),
      b.Collection.prototype[a].apply(this, arguments)
    }
  });
  var s = r.extend({
    model: q.prototype.model,
    collection: q,
    initialize: function () {
      r.prototype.initialize.apply(this, arguments),
      this.postCursors = {
      },
      this.fetchedReplies = 0,
      this.submittedPostsCache = new m('submitted_posts_cache'),
      this.on('set:done', this.mapStartPosts)
    },
    restoreFromCache: function () {
      var b = this.submittedPostsCache.getAll(),
      c = this;
      this.add(a.chain(b).reject(function (a) {
        return c.thread.get('id') !== a.thread || a.parent && !c.get(a.parent)
      }).map(function (a) {
        return a.isCached = !0,
        a
      }).value())
    },
    removeFromCache: function (a) {
      this.submittedPostsCache.removeItem(a.id)
    },
    saveToCache: function (a) {
      this.submittedPostsCache.setItem(a.id, a.toJSON())
    },
    mapStartPosts: function (c) {
      if (null !== c) {
        var d = this;
        c = Array.isArray(c) ? c : [
          c
        ],
        a.forEach(c.slice().reverse(), function (a) {
          var c = a instanceof b.Model ? a.get('parent') : a.parent;
          c && !d.postCursors[c] && (d.postCursors[c] = Object.defineProperty({
          }, 'startPost', {
            value: a.id,
            writeable: !1
          }))
        })
      }
    },
    fetch: function (c) {
      if (c = c || {
      }, !c.post) return this.buffer.fetch(c);
      var e = this;
      return c = a.extend({
        url: d.getURL('posts/getDescendants'),
        data: {
          limit: c.limit || this.perPage,
          order: this.getOrder(),
          post: c.post.id,
          start_post: this.postCursors[c.post.id] ? e.postCursors[c.post.id].startPost : '',
          cursor: c.cursor || ''
        }
      }, c),
      b.Collection.prototype.fetch.call(e, c)
    },
    parse: function (a, b) {
      if (!(b.url && b.url.indexOf('posts/getDescendants') > - 1)) return this.buffer.parse(a, b);
      this.postCursors[b.data.post] || (this.postCursors[b.data.post] = {
      }),
      this.postCursors[b.data.post].cursor = a.cursor,
      b.post.set('hasMore', a.cursor.hasNext),
      this.fetchedReplies += a.response.length;
      var c = this.buffer.indexOf(b.post),
      d = this.getDescendantsFromBuffer(b.post);
      return d && this.add(d, {
        at: c
      }),
      this.buffer.add(a.response, {
        at: c + d.length
      }),
      a.response
    },
    getDescendantsFromBuffer: function (b) {
      var c = {
      };
      c[b.id] = b;
      var d = this.buffer.slice(this.buffer.indexOf(b) + 1);
      return a.some(d, function (a) {
        var b = a.get('parent');
        return !b || !c[b] || (c[a.id] = a, !1)
      }),
      a.values(c)
    }
  }),
  t = b.Collection.extend({
    model: l.QueuedPost,
    initialize: function (a, b) {
      var c = this;
      c.thread = b.thread,
      c.counters = {
        comments: 0,
        replies: {
        }
      },
      c.on('add', function (a) {
        var b = a.getVisibleParent(c.thread),
        d = c.counters.replies;
        b ? (d[b.id] = (d[b.id] || 0) + 1, b.id === a.get('parentId') && a.set('immedReply', !0)) : c.counters.comments += 1
      })
    },
    comparator: function (a) {
      return parseInt(a.id, 10)
    },
    isDescendant: function (b, c) {
      var d = b.get('parentId'),
      e = d ? this.get(d) : null,
      f = {
      };
      for (a.each(c, function (a) {
        f[a] = !0
      }); e; ) {
        if (f[e.get('id')] === !0) return !0;
        d = e.get('parentId'),
        e = d ? this.get(d) : null
      }
      return !1
    },
    drain: function D(b) {
      function c(a) {
        var b = [
        ];
        e.each(function (a) {
          null === a.get('parentId') && b.push(a.get('id'))
        }),
        e.reset(e.filter(function (c) {
          return null === c.get('parentId') || e.isDescendant(c, b) ? void a(c) : c
        })),
        e.counters.comments = 0
      }
      function d(c) {
        var d,
        f = [
        ];
        d = e.filter(function (a) {
          var c = a.getVisibleParent(e.thread);
          return c && c.get('id') === b ? void f.push(a) : a
        }),
        f = a.sortBy(f, function (a) {
          return parseInt(a.get('id'), 10)
        }),
        a.each(f, function (a) {
          c(a)
        }),
        e.reset(d),
        e.counters.replies[b] = 0
      }
      var e = this,
      D = b ? d : c;
      return D(function (a) {
        e.thread.posts.add(a.toPost(e.thread))
      })
    }
  }),
  u = b.Collection.extend({
    models: l.TypingUser,
    initialize: function () {
      var b = this;
      b.gc = null,
      b.on('add remove reset', function () {
        var c = b.count();
        return c > 0 && null === b.gc ? void (b.gc = setInterval(a.bind(b.cleanup, b), 60000)) : void (c <= 0 && null !== b.gc && (clearInterval(b.gc), b.gc = null))
      }, b)
    },
    count: function (a) {
      var b = this.filter(function (b) {
        return !(a && b.id === a) && b.get('typing')
      });
      return b.length
    },
    cleanup: function () {
      var a = c();
      this.reset(this.filter(function (b) {
        return a.diff(b.lastModified, 'minutes') < 5
      }))
    }
  }),
  v = h.extend({
    model: k.wrap(l.Post),
    url: d.getURL('users/listPostActivity')
  }),
  w = h.extend({
    model: l.Thread,
    url: d.getURL('timelines/ranked'),
    initialize: function (a, b) {
      b = b || {
      },
      this.type = b.type,
      this.target = b.target
    },
    fetch: function (b) {
      return b = b || {
      },
      b.data = a.extend({
        type: this.type,
        target: this.target
      }, b.data),
      h.prototype.fetch.call(this, b)
    },
    parse: function (b) {
      return b = h.prototype.parse.call(this, b),
      a.map(b.activities, function (a) {
        return e.buildThread(b.objects, a.items[0].object)
      })
    }
  }),
  x = b.Collection.extend({
    model: l.SyncedTopUser,
    url: d.getURL('forums/listMostActiveUsers'),
    initialize: function (a, b) {
      this.forum = b.forum,
      this.limit = b.limit
    },
    fetch: function (c) {
      return b.Collection.prototype.fetch.call(this, a.extend({
        data: {
          forum: this.forum,
          limit: this.limit
        }
      }, c))
    },
    parse: function (b) {
      return a.filter(b.response, function (a) {
        if (parseFloat(a.rep) > 0.7) return a
      })
    }
  });
  g.prototype.model = k.wrap(l.User);
  var y = b.Collection.extend({
    model: l.SyncedUser,
    url: d.getURL('forums/listModerators'),
    initialize: function (a, b) {
      this.forum = b.forum
    },
    fetch: function (c) {
      return b.Collection.prototype.fetch.call(this, a.extend({
        data: {
          forum: this.forum
        }
      }, c))
    },
    parse: function (b) {
      return a.map(b.response, function (a) {
        return a.user
      })
    }
  }),
  z = 'reaction-vote',
  A = b.Collection.extend({
    url: d.getURL('threadReactions/loadReactions'),
    initialize: function (a, b) {
      this.thread = b.thread,
      this.enabled = Boolean(a.length),
      this.eligible = Boolean(b.eligible),
      this.userIsAnonymous = b.userIsAnonymous
    },
    fetch: function (c) {
      return b.Collection.prototype.fetch.call(this, a.extend({
        data: {
          thread: this.thread.id
        }
      }, c))
    },
    parse: function (a) {
      var b = a.response,
      c = b.reactions,
      d = b.selected && b.selected.id;
      if (!d && this.userIsAnonymous) {
        var e = f.get(z);
        d = e && e[this.thread.get('id')]
      }
      if (d) {
        var g = c.filter(function (a) {
          return a.id === d
        });
        g.length && (g[0].isSelected = !0, g[0].votes || (g[0].votes = 1))
      }
      return this.enabled = Boolean(c.length),
      this.eligible = b.eligible,
      this.prompt = b.prompt,
      c
    },
    toggleEnabled: function () {
      var a = this;
      d.call('threadReactions/disableForThread', {
        method: 'POST',
        data: {
          thread: this.thread.get('id'),
          enable: this.enabled ? 0 : 1
        },
        success: function () {
          a.enabled = !a.enabled,
          a.trigger('change:enabled'),
          a.enabled && !a.length && a.fetch()
        }
      })
    },
    vote: function (b, c) {
      var e = this.at(b);
      if (e && !e.get('isSelected')) {
        c = c || {
        },
        this.trigger('vote:start');
        var g = this;
        d.call('threadReactions/vote', a.extend({
        }, c, {
          method: 'POST',
          data: {
            thread: this.thread.get('id'),
            reaction: e.get('id')
          },
          success: function () {
            if (g.forEach(function (a, c) {
              var d = c === b,
              e = a.get('votes');
              d && (e += 1),
              a.get('isSelected') && (e = Math.max(0, e - 1)),
              a.set({
                isSelected: d,
                votes: e
              })
            }, g), g.trigger('vote:end'), g.userIsAnonymous) {
              var a = f.get(z) || {
              };
              a[g.thread.get('id')] = e.get('id'),
              f.set(z, a)
            }
            c.success && c.success()
          },
          error: function () {
            g.trigger('vote:end'),
            c.error && c.error()
          }
        }))
      }
    }
  }),
  B = b.Collection.extend({
    url: d.getURL('gifs/search'),
    model: l.GifObject,
    query: null,
    page: null,
    fetch: function (c) {
      return c.query === this.query ? this.page += 1 : this.page = 1,
      b.Collection.prototype.fetch.call(this, a.extend({
        data: {
          forum: c.forum,
          query: c.query,
          page: this.page
        }
      }, c))
    },
    parse: function (a, b) {
      var c = a.response,
      d = this.toJSON();
      return b.query === this.query ? d.concat(c) : (this.query = b.query, c)
    },
    reset: function () {
      return this.query = null,
      this.page = null,
      b.Collection.prototype.reset.call(this)
    }
  }),
  C = b.Collection.extend({
    url: d.getURL('mentions/listUsers'),
    model: l.SyncedUser,
    LIMIT: 5,
    query: null,
    cursor: null,
    initialize: function (a, b) {
      this.threadId = b && b.threadId
    },
    fetch: function (c) {
      var d = this.cursor && this.cursor.hasNext;
      if (this.query !== c.query || d) return b.Collection.prototype.fetch.call(this, a.extend({
        data: {
          thread: this.threadId,
          cursor: c.next && d && this.cursor.next ? this.cursor.next.slice(2) : null,
          query: c.query,
          limit: c.limit || this.LIMIT
        }
      }, c))
    },
    parse: function (a, c) {
      var d = a.response,
      e = a.cursor,
      f = this.toJSON();
      return f = c.query === this.query ? f.concat(d) : d,
      this.query = c.query,
      this.cursor = e,
      this.set(f),
      b.Collection.prototype.parse.call(this, f),
      f
    },
    reset: function () {
      return this.query = null,
      this.cursor = null,
      b.Collection.prototype.reset.call(this)
    }
  });
  return {
    PaginatedCollection: h,
    UserCollection: g,
    ChannelCollection: i,
    PostCollection: q,
    SubpaginatedPostCollection: s,
    TypingUserCollection: u,
    TopUserCollection: x,
    RankedThreadCollection: w,
    ThreadVoteCollection: p,
    PostActivityCollection: v,
    QueuedPostCollection: t,
    ModeratorCollection: y,
    ReactionsCollection: A,
    GifObjectsCollection: B,
    UserSuggestionsCollection: C
  }
}),
define('core/constants/storageConstants', [
  'exports'
], function (a) {
  'use strict';
  a.STORAGE_KEY_SESSION_ID = 'sessionId'
}),
define('core/models/Session', [
  'jquery',
  'underscore',
  'backbone',
  'moment',
  'core/api',
  'core/bus',
  'core/config',
  'core/constants/storageConstants',
  'core/time',
  'core/utils',
  'core/utils/cookies',
  'core/utils/guid',
  'core/utils/auth',
  'core/utils/storage',
  'core/models/BaseUser',
  'core/models/User'
], function (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p) {
  'use strict';
  var q = function () {
    return m.getFromCookie()
  },
  r = function () {
    return n.get(h.STORAGE_KEY_SESSION_ID)
  },
  s = c.Model.extend({
    initialize: function () {
      this.constructor.fromCookie = b.once(q),
      this.user = this.getAnonUserInstance()
    },
    setUser: function (a) {
      this.user && this.stopListening(this.user),
      this.user = a,
      this.setIfNewUser(),
      this.listenTo(a, 'all', this.trigger),
      this.trigger('change:id', a)
    },
    isLoggedOut: function () {
      return !this.isLoggedIn()
    },
    isLoggedIn: function () {
      return Boolean(this.user.get('id'))
    },
    fetch: function (a) {
      var c = a || {
      };
      return e.call('users/details.json', {
        data: c.data,
        success: b.bind(function (a) {
          a = a.response,
          a.id && this.setUser(this.getUserInstance(a)),
          c.success && c.success(a),
          c.complete && c.complete(a)
        }, this),
        error: function (a) {
          c.error && c.error(a),
          c.complete && c.complete(a)
        }
      })
    },
    getAnonUserInstance: function (a) {
      return new o(a)
    },
    getUserInstance: function (a) {
      return new p(a)
    },
    getCsrfToken: function () {
      var a = k.read('csrftoken');
      return a || (a = l.generate().replace(/\W/g, ''), k.create('csrftoken', a, {
        domain: window.location.hostname,
        expiresIn: 31536000000
      })),
      a
    },
    authenticate: function (c) {
      var d = this.authServices[c];
      if (d) {
        if (b.isFunction(d)) return d.call(this);
        f.trigger('uiAction:openLogin', c);
        var e = this.getAuthWindowArgs(d),
        g = d.url;
        g += (g.indexOf('?') > - 1 ? '&' : '?') + a.param(e),
        this.openAuthWindow(g, d.width, d.height)
      }
    },
    authServices: {
      disqus: {
        url: g.urls.login,
        width: 460,
        height: 355,
        attachExperiment: !0
      },
      twitter: {
        url: g.urls.oauth.twitter,
        width: 650,
        height: 680,
        csrf: !0,
        attachExperiment: !0
      },
      facebook: {
        url: g.urls.oauth.facebook,
        width: 550,
        height: 320,
        csrf: !0,
        attachExperiment: !0
      },
      google: {
        url: g.urls.oauth.google,
        width: 445,
        height: 635,
        csrf: !0,
        attachExperiment: !0
      },
      microsoft: {
        url: g.urls.oauth.microsoft,
        width: 650,
        height: 635,
        csrf: !0,
        attachExperiment: !0
      },
      apple: {
        url: g.urls.oauth.apple,
        width: 445,
        height: 750,
        csrf: !0,
        attachExperiment: !0
      }
    },
    getAuthWindowArgs: function (a) {
      var c = {
      };
      return a.csrf && (c.ctkn = this.getCsrfToken()),
      b.extend(c, a.params),
      c
    },
    openAuthWindow: function (a, b, c) {
      return j.openWindow(a, '_blank', {
        width: b,
        height: c
      })
    },
    setIfNewUser: function () {
      var a = this.user.get('joinedAt');
      if (this.user.get('isAnonymous') || !a) return void this.user.set('joinedRecently', !1);
      var b = i.assureTzOffset(a);
      this.user.set('joinedRecently', d().subtract(10, 'seconds').isBefore(b))
    }
  });
  return s.fromCookie = q,
  s.fromLocalStorage = r,
  s.isKnownToBeLoggedOut = function () {
    return !s.fromCookie().id && !s.fromLocalStorage()
  },
  s
}),
define('core/WindowBus', [
  'jquery',
  'underscore',
  'backbone',
  'modernizr'
], function (a, b, c, d) {
  'use strict';
  var e = c.Model.extend({
    initialize: function () {
      d.localstorage && a(window).on('storage', b.bind(this.onStorageEvent, this))
    },
    broadcast: function (a, b) {
      if (d.localstorage) {
        var c = JSON.stringify({
          name: a,
          data: b,
          time: (new Date).getTime()
        });
        try {
          window.localStorage.setItem(this.constructor.STORAGE_KEY, c)
        } catch (e) {
        }
      }
    },
    onStorageEvent: function (a) {
      var b = a.originalEvent.key,
      c = a.originalEvent.newValue;
      if (c && b === this.constructor.STORAGE_KEY) try {
        c = JSON.parse(c),
        this.trigger(c.name, c.data)
      } catch (d) {
      }
    }
  }, {
    STORAGE_KEY: 'disqus.bus'
  });
  return e
}),
define('templates/lounge/threadVotes', [
  'react',
  'core/config/urls',
  'core/strings',
  'core/switches',
  'core/utils/object/get'
], function (a, b, c, d, e) {
  'use strict';
  var f = c.gettext,
  g = function (c) {
    var g = c.thread && c.thread.forum,
    h = d.isFeatureActive('embed_refresh', {
      forum: g
    }),
    i = h && d.isFeatureActive('embed_refresh_v2', {
      forum: g
    }),
    j = h ? 'favorite-button-toggle' : 'dropdown-toggle',
    k = h ? 'label-count-refresh' : 'label-count',
    l = i ? 'favorite-icon favorite-icon--refresh-v2' : 'favorite-icon',
    m = function () {
      return i ? a.createElement('span', {
        className: 'label label-default'
      }, a.createElement('span', {
        className: l + ' icon-heart-empty'
      })) : h ? null : a.createElement('span', {
        className: 'label label-default'
      }, a.createElement('span', {
        className: 'favorite-icon icon-heart-empty'
      }))
    },
    n = function () {
      return i ? a.createElement('span', {
        className: 'label label-favorited'
      }, a.createElement('span', {
        className: l + ' icon-heart'
      })) : h ? null : a.createElement('span', {
        className: 'label label-favorited'
      }, a.createElement('span', {
        className: 'favorite-icon icon-heart'
      }))
    },
    o = function () {
      return h && !i ? a.createElement('div', {
        className: 'favorite-icon-wrapper'
      }, a.createElement('i', {
        className: 'favorite-icon-refresh'
      })) : null
    };
    return a.createElement('div', null, a.createElement('a', {
      href: '#',
      'data-action': 'favorite',
      title: f('Favorite this discussion'),
      className: j + ' ' + (i ? j + '--v2' : '') + ' ' + (e(c.thread, [
        'userScore'
      ]) ? 'upvoted' : ''),
      'aria-label': f('Favorite this discussion')
    }, m(), n(), o(), ' ', e(c.thread, [
      'likes'
    ]) ? a.createElement('span', {
      className: 'label ' + k + ' ' + (i ? k + '--v2' : '')
    }, e(c.thread, [
      'likes'
    ], null)) : null), a.createElement('ul', {
      className: 'dropdown-menu dropdown-menu--coachmark pull-right'
    }, a.createElement('li', null, c.loggedIn ? a.createElement('div', null, a.createElement('h2', {
      className: 'coachmark__heading'
    }, f('Your 1st favorited discussion!')), a.createElement('p', {
      className: 'coachmark__description'
    }, f('Favoriting means this is a discussion worth sharing. It gets shared to your followers\' %(Disqus)s feeds if you log in, and gives the creator kudos!', {
      Disqus: 'Disqus'
    }))) : a.createElement('div', null, a.createElement('h2', {
      className: 'coachmark__heading'
    }, f('Discussion Favorited!')), a.createElement('p', {
      className: 'coachmark__description'
    }, f('Favoriting means this is a discussion worth sharing. It gets shared to your followers\' %(Disqus)s feeds, and gives the creator kudos!', {
      Disqus: 'Disqus'
    }))), ' ', a.createElement('a', {
      href: (b.root || '') + '/home/?utm_source=disqus_embed&utm_content=recommend_btn',
      className: 'btn btn-primary coachmark__button',
      target: '_blank',
      rel: 'noopener noreferrer'
    }, f(c.loggedIn ? 'See Your Feed' : 'Find More Discussions')))))
  };
  return g
}),
define('lounge/views/favorite-button', [
  'backbone',
  'core/utils/storage',
  'templates/lounge/threadVotes'
], function (a, b, c) {
  'use strict';
  var d = a.View.extend({
    className: 'thread-likes',
    events: {
      'click [data-action=favorite]': 'favoriteHandler'
    },
    initialize: function (a) {
      this.session = a.session,
      this.thread = a.thread,
      this.loggedOutFavoriteFlag = this.session.getLoggedOutUserFlags().get(d.ONBOARDING_KEY),
      this.listenTo(this.thread, 'change:userScore', this.render),
      this.listenTo(this.thread, 'change:likes', this.render),
      this.listenTo(this.session, 'change:id', this.startFavoriteOnboarding),
      this.setTooltipEnabled()
    },
    setTooltipEnabled: function () {
      this.tooltipEnabled = this.session.isLoggedIn() ? b.get(d.ONBOARDING_KEY) : !this.loggedOutFavoriteFlag.isRead()
    },
    render: function () {
      return this.$el.html(c({
        thread: this.thread.toJSON(),
        user: this.session.toJSON(),
        loggedIn: this.session.isLoggedIn()
      })),
      this
    },
    startFavoriteOnboarding: function () {
      this.session.user.get('joinedRecently') && b.set(d.ONBOARDING_KEY, 'true'),
      this.setTooltipEnabled()
    },
    favoriteHandler: function (a) {
      a.stopPropagation(),
      a.preventDefault();
      var b = 0 === this.thread.get('userScore');
      this.trigger(b ? 'vote:like' : 'vote:unlike'),
      this.thread.vote(b ? 1 : 0),
      this.toggleTooltip(b),
      this.tooltipEnabled && b && this.markAsSeen()
    },
    markAsSeen: function () {
      this.session.isLoggedIn() ? b.remove(d.ONBOARDING_KEY) : this.loggedOutFavoriteFlag.markRead()
    },
    toggleTooltip: function (a) {
      this.tooltipEnabled && (a ? this.$el.parent().addClass('open') : this.$el.parent().removeClass('open'))
    }
  }, {
    ONBOARDING_KEY: 'showRecommendOnboarding'
  });
  return d
}),
define('common/collections/LoggedOutCache', [
  'backbone',
  'core/common/cached-storage',
  'lounge/views/favorite-button'
], function (a, b, c) {
  'use strict';
  var d = [
    {
      id: 'welcome',
      title: '',
      body: ''
    }
  ],
  e = [
    {
      id: c.ONBOARDING_KEY
    }
  ],
  f = new b('notes', 7776000),
  g = a.Model.extend({
    markRead: function () {
      f.setItem(this.id, !0)
    },
    isRead: function () {
      return Boolean(f.getItem(this.id))
    }
  }),
  h = a.Collection.extend({
    initialize: function (a, b) {
      this.session = b.session
    },
    model: g,
    markAllRead: function () {
      return this.each(function (a) {
        a.markRead()
      }),
      this.session.set('notificationCount', 0),
      this
    },
    getUnread: function () {
      return this.filter(function (a) {
        return !a.isRead()
      })
    }
  });
  return {
    storage: f,
    Collection: h,
    Model: g,
    LOGGED_OUT_NOTES: d,
    LOGGED_OUT_FLAGS: e
  }
}),
define('common/Session', [
  'jquery',
  'underscore',
  'core/analytics/jester',
  'core/api',
  'core/bus',
  'core/config',
  'core/constants/storageConstants',
  'common/models',
  'common/urls',
  'core/models/Session',
  'core/switches',
  'core/UniqueModel',
  'core/utils/cookies',
  'core/utils/url/serialize',
  'core/WindowBus',
  'core/utils/storage',
  'common/collections/LoggedOutCache',
  'common/keys',
  'common/utils',
  'lounge/common',
  'lounge/tracking'
], function (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u) {
  'use strict';
  var v,
  w = 3500,
  x = {
  },
  y = new o,
  z = j.extend({
    _defaults: {
      canReply: !0,
      canModerate: !1,
      audienceSyncVerified: !1,
      sso: null
    },
    socialLoginProviders: {
      facebook: function () {
        var b = a.Deferred();
        return require(['fb'], b.resolve.bind(b), b.reject.bind(b)),
        b.promise().then(function () {
          window.FB.init({
            appId: r.facebook,
            xfbml: !1,
            status: !0,
            version: 'v2.8'
          });
          var b = a.Deferred();
          return window.FB.getLoginStatus(function (a) {
            'connected' === a.status ? b.resolve(a) : b.reject()
          }),
          b.promise()
        }).then(function (a) {
          c.logStat('lounge.auto_login.fb');
          var b = a.authResponse;
          return {
            grant_type: 'urn:disqus:params:oauth:grant-type:facebook-login',
            client_id: r.embedAPI,
            expires: b.expiresIn,
            fb_access_token: b.accessToken
          }
        })
      },
      google: function () {
        var b = a.Deferred();
        return require(['gapi'], function (a) {
          setTimeout(b.reject.bind(b), w),
          a.load('auth2', b.resolve.bind(b, a))
        }, b.reject.bind(b)),
        b.promise().then(function (b) {
          var c = b.auth2.init({
            client_id: r.google,
            fetch_basic_profile: !1,
            scope: 'profile email'
          }),
          d = a.Deferred();
          return c.then(function () {
            c.isSignedIn.get() ? d.resolve(c.currentUser.get()) : d.reject()
          }),
          d.promise()
        }).then(function (a) {
          c.logStat('lounge.auto_login.google');
          var b = a.getAuthResponse();
          return {
            grant_type: 'urn:disqus:params:oauth:grant-type:google-login',
            client_id: r.embedAPI,
            expires: b.expires_in,
            google_access_token: JSON.stringify(b)
          }
        })
      }
    },
    initialize: function () {
      z.__super__.initialize.apply(this, arguments),
      !x.fromCookie().isAuthenticated && this.getSessionId() && d.headers({
        'X-Sessionid': this.getSessionId()
      })
    },
    setSessionId: function (a) {
      p.set(g.STORAGE_KEY_SESSION_ID, a)
    },
    removeSessionId: function () {
      p.remove(g.STORAGE_KEY_SESSION_ID)
    },
    getSessionId: function () {
      return p.get(g.STORAGE_KEY_SESSION_ID)
    },
    defaults: function () {
      var a = new q.Collection(q.LOGGED_OUT_NOTES, {
        session: this
      });
      return b.extend(this._defaults, {
        notificationCount: a.getUnread().length
      })
    },
    start: function (b) {
      var c = b || {
      };
      if (this.set(c), this.listenTo(y, 'auth:success', this.fetch), this.listenTo(e.frame, {
        '!auth:success': function (a) {
          a && (a.sessionId && (d.headers({
            'X-Sessionid': a.sessionId
          }), x.fromCookie().isAuthenticated || this.setSessionId(a.sessionId)), a.message && this.trigger('alert', a.message, {
            type: 'info'
          }), a.logEvent && e.trigger('uiAction:' + a.logEvent)),
          y.broadcast('auth:success'),
          this.fetch()
        }
      }), this.bindAudienceSyncHandlers(), this.shouldFetchSession()) this.fetch();
       else if (m.read('no_auto_login') || u.isPrivate() || c && c.thread && c.thread.forum.get('settings').ssoRequired) this.loginAsAnon();
       else {
        var f = this.socialLoginProviders,
        g = !1,
        h = 0,
        i = a.Deferred(),
        j = Object.keys(f).map(function (a) {
          return f[a].call(this)
        }, this),
        k = function (a) {
          g || (g = !0, i.resolve(a))
        },
        l = function (a) {
          h += 1,
          h === j.length && i.reject(a)
        };
        j.forEach(function (a) {
          a.then(k).fail(l)
        }),
        i.promise().then(function (b) {
          return a.post('https://disqus.com/api/oauth/2.0/access_token/', b)
        }).then(function (a) {
          this.fetch({
            data: {
              access_token: a.access_token
            }
          })
        }.bind(this)).fail(this.loginAsAnon.bind(this))
      }
    },
    stop: function () {
      this.stopListening(),
      this.off()
    },
    loginAsAnon: function () {
      this.setUser(this.getAnonUserInstance())
    },
    shouldFetchSession: function () {
      return Boolean(this.get('remoteAuthS3') || x.fromCookie().id || this.getSessionId())
    },
    getUserInstance: function (a) {
      return new l(h.User, a)
    },
    toJSON: function () {
      var a = this.user.toJSON.apply(this.user, arguments);
      return a.thread.canReply = this.get('canReply'),
      a.thread.canModerate || (a.thread.canModerate = this.get('canModerate')),
      a
    },
    fetch: function (a) {
      var b = this,
      c = a || {
      };
      b.has('thread') && (c.thread = b.get('thread'));
      var d = c.thread ? b.fetchThreadDetails(c) : j.prototype.fetch.call(b, c);
      return d.done(function () {
        b.set('notificationCount', 0)
      }),
      d
    },
    fetchNotificationCount: function () {
      var b = this;
      return b.isLoggedIn() ? d.call('timelines/getUnreadCount.json', {
        data: {
          type: 'notifications',
          routingVersion: f.feedApiVersion
        }
      }).done(function (a) {
        b.set('notificationCount', a.response)
      }) : a.Deferred().resolve()
    },
    fetchThreadDetails: function (a) {
      var c = this,
      e = a.thread;
      c._request && (c._request.abort(), c._request = null);
      var f = {
        thread: e.id,
        post: e.posts.pluck('id')
      };
      return c._request = d.call('embed/threadDetails.json', {
        data: f,
        success: function (a) {
          var d = a.response,
          f = {
          };
          if (d.user && (b.extend(f, d.user, {
            votes: d.votes
          }), f = b.omit(f, 'badges')), d.blockedUsers || d.blockingUsers) {
            var g = d.session.canModerate ? new Set(d.blockedUsers) : new Set([].concat(_toConsumableArray(d.blockedUsers), _toConsumableArray(d.blockingUsers)));
            b.extend(f, d.user, {
              blockedUserIdSet: g
            }),
            f.blockedUserIdSet.forEach(function (a) {
              new l(h.User, {
                id: a
              }).set({
                isBlocked: !0
              })
            })
          }
          var i = c.get('thread') && c.get('thread').forum && c.get('thread').forum.id;
          k.isFeatureActive('embed_refresh', {
            forum: i
          }) && d.followingUsers && (b.extend(f, d.user, {
            followingUserIdSet: new Set(d.followingUsers)
          }), f.followingUserIdSet.forEach(function (a) {
            return new l(h.User, {
              id: a,
              isFollowing: !0
            })
          })),
          c.set(d.session),
          f.id ? (c.setUser(new l(h.User, f)), e.users.add(c.user), d.thread && (e.set('userScore', d.thread.userScore), e.set('userSubscription', d.thread.userSubscription), e.set('userRating', d.thread.userRating))) : c.loginAsAnon(),
          c.trigger('fetchThreadDetails:success')
        },
        complete: function () {
          c._request = null
        }
      }),
      c._request
    },
    logout: function () {
      this.removeSessionId();
      var a = this.get('sso');
      this.isSSO() && a && a.logout ? e.frame.sendHostMessage('navigate', a.logout) : this.locationReplace(n(i.logout, {
        redirect: window.location.href
      }))
    },
    locationReplace: function (a) {
      window.location.replace(a)
    },
    isSSO: function () {
      return this.user && 'sso' === this.user.get('user_type')
    },
    getAuthWindowArgs: function (a) {
      var c = j.prototype.getAuthWindowArgs.call(this, a),
      d = t.getLounge().config;
      if (a.attachExperiment && d && d.experiment) {
        var e = d.experiment;
        c.evs = window.btoa([e.experiment,
        e.variant,
        e.service].join(':'))
      }
      return b.defaults({
        forum: this.get('thread') && this.get('thread').forum.id
      }, c)
    },
    openAuthWindow: function (a, b, c) {
      try {
        var d = this.get('thread'),
        e = d && d.currentUrl;
        window.sessionStorage && e && window.sessionStorage.setItem('discussionUrl', e)
      } catch (f) {
      }
      return j.prototype.openAuthWindow.call(this, a, b, c)
    },
    authServices: b.defaults({
      disqusDotcom: {
        url: i.dotcomLogin,
        width: 478,
        height: 590,
        params: {
          next: i.login
        },
        attachExperiment: !0
      },
      sso: function A() {
        var A = this.get('sso'),
        a = parseInt(A.width || '800', 10),
        c = parseInt(A.height || '500', 10),
        d = this.openAuthWindow(A.url, a, c);
        !function f() {
          s.isWindowClosed(d) ? e.frame.sendHostMessage('reload') : b.delay(f, 500)
        }()
      }
    }, j.prototype.authServices),
    bindAudienceSyncHandlers: function () {
      this.listenTo(this, 'change:id change:audienceSyncVerified', function () {
        this.get('audienceSyncVerified') && e.frame.sendHostMessage('session.identify', this.user.id)
      }),
      this.listenTo(e.frame, {
        '!audiencesync:grant': function () {
          this.set('audienceSyncVerified', !0)
        }
      })
    },
    getAudienceSyncUrl: function () {
      var a = {
        client_id: this.get('apiKey'),
        response_type: 'audiencesync',
        forum_id: this.get('thread').forum.id
      };
      return 'https:' === window.location.protocol && (a.ssl = 1),
      n(i.authorize, a)
    },
    getRecaptchaKey: function () {
      return this.get('recaptchaPublicKey')
    },
    audienceSync: function () {
      this.openAuthWindow(this.getAudienceSyncUrl(), 460, 355)
    },
    needsAudienceSyncAuth: function (a) {
      return a.get('settings').audienceSyncEnabled && this.isLoggedIn() && !this.get('audienceSyncVerified')
    },
    getLoggedOutUserFlags: function () {
      return this._loggedOutUserFlags ? this._loggedOutUserFlags : (this._loggedOutUserFlags = new q.Collection(q.LOGGED_OUT_FLAGS, {
        session: this
      }), this._loggedOutUserFlags)
    }
  });
  return b.extend(x, b.chain(z).keys().map(function (a) {
    return [a,
    z[a]]
  }).object().value(), {
    get: function () {
      return v = v || new z
    },
    setDefaults: function (a) {
      if (v) throw new Error('Session defaults cannot be changed after a session instance is created!');
      return z._defaults = b.extend(z.prototype._defaults, a),
      z._defaults
    },
    forget: function () {
      v && (v.stop(), v = null)
    }
  }),
  x
}),
define('common/views/mixins', [
  'jquery',
  'underscore',
  'core/bus',
  'core/UniqueModel',
  'common/models',
  'common/Session'
], function (a, b, c, d, e, f) {
  'use strict';
  var g = {
    proxyViewEvents: function (a) {
      this.listenTo(a, 'all', function (a) {
        0 === a.indexOf('uiAction:') && this.trigger.apply(this, arguments)
      }, this)
    }
  },
  h = {
    updateUserAvatarHelper: function (b, c) {
      a('img[data-user=' + b + '][data-role="user-avatar"]').attr('src', c)
    },
    updateUserNameHelper: function (c, d) {
      var e = '[data-username="' + c + '"][data-role=username]';
      a('a' + e + ', span' + e).html(b.escape(d))
    },
    bindProfileUIListeners: function (a) {
      this.listenTo(a, {
        'change:avatar': function () {
          this.updateUserAvatarHelper(a.user.id, a.user.get('avatar').cache)
        },
        'change:name': function () {
          this.updateUserNameHelper(a.user.get('username'), a.user.get('name'))
        }
      })
    }
  },
  i = {
    toggleFollow: function (b) {
      b.preventDefault(),
      b.stopPropagation();
      var c,
      g = b && a(b.target).closest('a[data-user]').attr('data-user');
      c = this.collection && g ? this.collection.get(g) : this.user ? this.user : d.get(e.User, g);
      var h = f.get();
      return h.isLoggedOut() ? (this.trigger('authenticating'), this.listenToOnce(h, 'change:id', function () {
        h.isLoggedIn() && this.follow(c)
      }), h.get('sso') && h.get('sso').url ? void h.authenticate('sso') : void h.authenticate('disqusDotcom')) : void (c.get('isFollowing') ? this.unfollow(c) : this.follow(c))
    },
    unfollow: function (a) {
      a.unfollow(),
      c.trigger('uiAction:unfollowUser', a)
    },
    follow: function (a) {
      a.follow(),
      c.trigger('uiAction:followUser', a)
    }
  };
  return {
    FollowButtonMixin: i,
    UiActionEventProxy: g,
    ProfileHtmlHelpers: h
  }
}),
define('core/utils/isIframed', [
], function () {
  'use strict';
  return function (a) {
    try {
      return a.self !== a.top
    } catch (b) {
      return !0
    }
  }
}),
define('core/utils/addElement', [
], function () {
  'use strict';
  var a = window.document;
  return function (b, c, d) {
    var e = a.createElement(c);
    return d && Object.keys(d).forEach(function (a) {
      e.setAttribute(a, d[a])
    }),
    b.appendChild(e),
    e
  }
}),
define('core/utils/isMediaTradecraftAdEnabled', [
  'core/utils/url/parseQueryString',
  'core/switches',
  'core/utils/addElement'
], function (a, b, c) {
  'use strict';
  function d() {
    var b = a();
    if (!window.isMtcAdded) {
      window.isMtcAdded = !0;
      var d = window.document.head;
      c(d, 'link', {
        rel: 'preconnect',
        href: 'https://01.cdn.mediatradecraft.com/',
        crossorigin: ''
      }),
      c(d, 'link', {
        rel: 'dns-prefetch',
        href: 'https://01.cdn.mediatradecraft.com/'
      }),
      c(d, 'link', {
        rel: 'preconnect',
        href: 'https://securepubads.g.doubleclick.net/',
        crossorigin: ''
      }),
      c(d, 'link', {
        rel: 'dns-prefetch',
        href: 'https://securepubads.g.doubleclick.net/'
      }),
      c(d, 'link', {
        rel: 'preconnect',
        href: 'https://c.amazon-adsystem.com/',
        crossorigin: ''
      }),
      c(d, 'link', {
        rel: 'dns-prefetch',
        href: 'https://c.amazon-adsystem.com/'
      }),
      c(d, 'link', {
        rel: 'preconnect',
        href: 'https://micro.rubiconproject.com/',
        crossorigin: ''
      }),
      c(d, 'link', {
        rel: 'dns-prefetch',
        href: 'https://micro.rubiconproject.com/'
      }),
      c(d, 'script', {
        src: 'https://c.amazon-adsystem.com/aax2/apstag.js',
        async: 'true'
      }),
      c(d, 'script', {
        src: 'https://securepubads.g.doubleclick.net/tag/js/gpt.js',
        async: 'true'
      }),
      'true' === b.mtctest && 'true' !== b.mtcprod ? (c(d, 'script', {
        src: 'https://01.cdn.mediatradecraft.com/disqus/stg/main.js',
        async: 'true'
      }), c(d, 'link', {
        href: 'https://01.cdn.mediatradecraft.com/disqus/stg/main.css',
        media: 'print',
        onload: 'this.media=\'all\'',
        rel: 'stylesheet'
      })) : (c(d, 'script', {
        src: 'https://01.cdn.mediatradecraft.com/disqus/main.js',
        async: 'true'
      }), c(d, 'link', {
        href: 'https://01.cdn.mediatradecraft.com/disqus/main.css',
        media: 'print',
        onload: 'this.media=\'all\'',
        rel: 'stylesheet'
      }))
    }
  }
  return function (c, e) {
    var f = a();
    if ('false' === f.mtctest) return !1;
    var g = (!e || !e.channelId || 'true' === f.mtctest || b.isFeatureActive('mtc_ads_channels')) && (c && 'mtcdisabled' === c.experiment.experiment && 'active' === c.experiment.variant || 'true' === f.mtctest || b.isFeatureActive('mtc_ads'));
    return g ? d() : window.isMtcAdded && location.reload(),
    g
  }
}),
define('core/viglink', [
  'remote/config'
], function (a) {
  'use strict';
  var b = {
  },
  c = null;
  return b.resetVersion = function () {
    c = null
  },
  b.forceVersion = function (a) {
    c = a
  },
  b.getVersion = function () {
    return c ? c : a.lounge && a.lounge.viglink && a.lounge.viglink.version || 'none'
  },
  b.getExperimentVersion = function () {
    return a.lounge && a.lounge.viglink && a.lounge.viglink.experiment_version || 'none'
  },
  b
}),
define('common/outboundlinkhandler', [
  'jquery',
  'underscore',
  'core/utils',
  'common/utils'
], function (a, b, c, d) {
  'use strict';
  function e() {
    this.handlers = [
    ],
    this.locked = {
    },
    this.timeout = 1000
  }
  return b.extend(e.prototype, {
    handleClick: function (d) {
      var e = a(d.currentTarget),
      f = this.getLinkTrackingId(e);
      if (this.shouldHandleClick(d, e, f)) {
        var g = b.chain(this.handlers).map(function (a) {
          return a[0].call(a[1], d, e)
        }).compact().value();
        c.willOpenNewWindow(d, e) || (d.preventDefault(), this.setLatestClick(f), this.delayNavigation(d, e, g))
      }
    },
    delayNavigation: function (c, e, f) {
      this.lockLink(this.getLinkTrackingId(e));
      var g = b.bind(function () {
        this.isLatestClick(this.getLinkTrackingId(e)) && d.triggerClick(e, c.originalEvent)
      }, this);
      b.delay(g, this.timeout),
      a.when.apply(a, f).always(g)
    },
    registerBeforeNavigationHandler: function (a, b) {
      this.handlers.push([a,
      b])
    },
    getLinkTrackingId: function (a) {
      var c = a.attr('data-tid');
      return c || (c = b.uniqueId(), a.attr('data-tid', c)),
      c
    },
    shouldHandleClick: function (a, b) {
      if (!this.isLinkLocked(this.getLinkTrackingId(b))) {
        if (a.isDefaultPrevented()) return !1;
        if (!b.is('a')) return !1;
        var c = /#.*/,
        d = (b.attr('href') || '').replace(c, '');
        return !!d
      }
    },
    setLatestClick: function (a) {
      this.latestLinkId = a
    },
    isLatestClick: function (a) {
      return this.latestLinkId === a
    },
    lockLink: function (a) {
      this.locked[a] = !0
    },
    isLinkLocked: function (a) {
      return this.locked[a]
    }
  }),
  e
}),
define('core/mixins/withEmailVerifyLink', [
  'jquery',
  'underscore',
  'core/config',
  'core/utils'
], function (a, b, c, d) {
  'use strict';
  var e = d.preventDefaultHandler,
  f = {
    events: {
      'click [data-action=verify-email]': 'showVerifyEmailPopup'
    },
    showVerifyEmailPopup: e(function (b) {
      var e = a(b.target).attr('data-forum'),
      f = c.urls.verifyEmail;
      return e && (f = f + '?f=' + e),
      d.openWindow(f, '_blank', {
        width: 460,
        height: 355
      })
    })
  };
  return function () {
    this.events = b.defaults({
    }, this.events, f.events),
    b.extend(this, b.pick(f, 'showVerifyEmailPopup'))
  }
}),
define('core/constants/behindClickConstants', [
  'exports',
  'core/strings'
], function (a, b) {
  'use strict';
  var c = b.get;
  a.DEFAULT_BUTTON_TEXT = b.interpolate(c('Show Comments (%(count)s)'), {
    count: '{postCount}'
  })
}),
define('core/templates/react/BehindClickTemplate', [
  'react',
  'core/constants/behindClickConstants'
], function (a, b) {
  'use strict';
  function c(a) {
    if (!a || a.indexOf(':') === - 1) return {
    };
    var b = {
    },
    c = a.split(';');
    return c.forEach(function (a) {
      var c = a.split(':').map(function (a) {
        return a.trim()
      });
      if (c[0].indexOf('-') > 0) {
        var d = c[0].split('-');
        c[0] = d[0] + d[1].charAt(0).toUpperCase() + d[1].slice(1)
      }
      b[c.splice(0, 1) [0]] = c.join(':')
    }),
    b
  }
  function d(a, b) {
    return a ? a.replace('{postCount}', b.toLocaleString()) : a
  }
  var e = function (e) {
    var f = e.postCount,
    g = e.buttonText,
    h = e.buttonCSS,
    i = e.titleEnabled,
    j = e.titleText,
    k = e.titleCSS;
    return a.createElement('div', {
      id: 'behind-click__container'
    }, i ? a.createElement('h3', {
      id: 'behind-click__title',
      style: c(k)
    }, d(j, f)) : null, a.createElement('button', {
      id: 'thread-visibility__button',
      className: 'btn alert',
      'data-action': 'toggle-thread-visibility',
      style: c(h)
    }, g ? d(g, f) : d(b.DEFAULT_BUTTON_TEXT, f)))
  };
  return e
}),
define('templates/lounge/partials/badgesMessage', [
  'react',
  'core/strings',
  'core/switches',
  'core/bus'
], function (a, b, c, d) {
  'use strict';
  var e = b.gettext,
  f = function (b) {
    var c = b.url;
    return a.createElement('a', {
      href: c,
      target: '_blank',
      rel: 'noopener noreferrer',
      className: 'policy-link publisher-anchor-color',
      onClick: function (a) {
        a.stopPropagation(),
        d.trigger('uiAction:clickBadgesMessage', c)
      }
    }, e('See the available badges'))
  },
  g = function (b) {
    var d = b.forum,
    g = b.forumBadgesLink,
    h = c.isFeatureActive('embed_refresh', {
      forum: d.id
    }),
    i = h ? 'comment-policy-refresh' : 'comment-policy',
    j = h ? 'comment-policy-refresh__text' : 'comment-policy-text',
    k = h ? 'comment-policy-refresh__heading' : 'comment-policy-text text-bold',
    l = h ? 'comment-policy-refresh__link' : 'comment-policy-link';
    return a.createElement('div', {
      id: 'badges-message',
      className: 'badges-message ' + i + ' publisher-anchor-color'
    }, a.createElement('span', {
      'data-action': 'close-badges-message',
      className: 'badges-message-close',
      tabIndex: '0'
    }), a.createElement('div', {
      className: 'content'
    }, a.createElement('p', {
      className: k
    }, e('Earn badges on %(forumName)s!', {
      forumName: d.name
    })), a.createElement('p', {
      className: j
    }, e('Badges are awarded for commenting, receiving upvotes, and other conditions established by the publisher. Awarded badges will be displayed next to your name in comments on this site as well as on your profile.'), a.createElement('p', {
      className: l
    }, a.createElement(f, {
      url: g,
      isRefreshEnabled: h
    })))), a.createElement('span', {
      'aria-hidden': 'true',
      className: 'badges-message-icon'
    }))
  };
  return g
}),
define('templates/lounge/partials/commentPolicy', [
  'react',
  'core/strings',
  'core/bus',
  'core/switches'
], function (a, b, c, d) {
  'use strict';
  var e = b.gettext,
  f = function (b) {
    var d = b.url,
    e = b.className,
    f = void 0 === e ? '' : e,
    g = b.children,
    h = b.isRefreshEnabled,
    i = h ? 'comment-policy-refresh__link' : 'comment-policy-link';
    return a.createElement('a', {
      href: d,
      target: '_blank',
      rel: 'noopener noreferrer',
      className: f + ' ' + i,
      onClick: function (a) {
        a.stopPropagation(),
        c.trigger('uiAction:clickCommentPolicy', d)
      }
    }, g)
  },
  g = function (b) {
    var c = b.forum,
    d = b.isRefreshEnabled;
    if (!c.commentPolicyLink) return null;
    var g = e('Please read our %(commentPolicyLink)s before commenting.', {
      commentPolicyLink: a.createElement(f, {
        url: c.commentPolicyLink,
        isRefreshEnabled: d
      }, e('Comment Policy'))
    });
    return g
  },
  h = function (b) {
    var c = b.forum,
    f = b.isPolicyAccepted,
    h = d.isFeatureActive('embed_refresh', {
      forum: c.id
    }),
    i = h && d.isFeatureActive('embed_refresh_v2', {
      forum: c.id
    }),
    j = h ? 'comment-policy-refresh ' + (i ? 'comment-policy-refresh--v2' : '') : 'comment-policy',
    k = h ? 'comment-policy-refresh__text' : 'comment-policy-text',
    l = h ? 'comment-policy-refresh__heading' : 'comment-policy-text text-bold';
    return a.createElement('div', {
      id: 'comment-policy',
      className: j + ' publisher-anchor-color ' + (f ? 'hidden' : '')
    }, a.createElement('div', {
      className: 'content'
    }, a.createElement('p', {
      className: l
    }, e('%(forumName)s Comment Policy', {
      forumName: c.name
    })), a.createElement('p', {
      className: k
    }, c.commentPolicyText || null, a.createElement('p', {
      className: 'comment-policy-refresh__prompt'
    }, a.createElement(g, {
      forum: c,
      isRefreshEnabled: h
    })))), h ? a.createElement('button', {
      className: 'btn comment-policy-refresh__button publisher-background-color',
      'data-action': 'accept-comment-policy'
    }, e('Got it')) : a.createElement('span', {
      'aria-hidden': 'true',
      className: 'icon icon-chat-bubble'
    }))
  };
  return h
}),
define('core/templates/react/ThreadTemplate', [
  'react',
  'core/constants/voteConstants',
  'core/strings',
  'core/switches',
  'core/utils/object/get',
  'templates/lounge/partials/badgesMessage',
  'templates/lounge/partials/commentPolicy'
], function (a, b, c, d, e, f, g) {
  'use strict';
  var h = c.gettext,
  i = function (b) {
    var c = d.isFeatureActive('embed_refresh', {
      forum: b.forum.id
    }),
    e = c && d.isFeatureActive('embed_refresh_v2', {
      forum: b.forum.id
    }),
    f = !1,
    i = c ? 'disqus-footer__wrapper disqus-footer__wrapper--refresh' : 'disqus-footer__wrapper',
    j = c ? 'load-more-refresh ' + (e ? 'load-more-refresh--v2' : '') : 'load-more',
    k = c ? 'btn load-more-refresh__button ' + (e ? '' : 'publisher-background-color-refresh') : 'btn load-more__button',
    l = c ? 'alert alert--realtime alert--realtime--refresh ' + (e ? 'alert--realtime--refresh-v2' : '') : 'alert alert--realtime',
    m = (b.forum.commentPolicyText || b.forum.commentPolicyLink) && !b.isPolicyAccepted,
    n = a.createElement('button', {
      className: l,
      style: {
        display: 'none'
      },
      'data-role': 'realtime-notification'
    }),
    o = f ? null : a.createElement('div', {
      id: 'highlighted-post',
      'data-tracking-area': 'highlighted',
      className: 'highlighted-post'
    });
    return a.createElement('div', {
      id: 'thread__wrapper'
    }, a.createElement('div', {
      id: 'placement-top',
      'data-tracking-area': 'discovery-north'
    }), a.createElement('div', {
      id: 'onboard',
      'data-tracking-area': 'onboard'
    }), m && c ? a.createElement(g, {
      forum: b.forum,
      isPolicyAccepted: b.isPolicyAccepted
    }) : null, a.createElement('div', {
      id: 'reactions__container'
    }), a.createElement('div', {
      id: 'ratings__container'
    }), m && !c ? a.createElement(g, {
      forum: b.forum,
      isPolicyAccepted: b.isPolicyAccepted
    }) : null, a.createElement('div', {
      id: 'badges-message__container'
    }), c ? null : o, a.createElement('div', {
      id: 'global-alert'
    }), a.createElement('div', {
      id: 'tos__container'
    }), b.inHome ? null : a.createElement('header', {
      id: 'main-nav',
      'data-tracking-area': 'main-nav'
    }), a.createElement('section', {
      id: 'conversation',
      'data-role': 'main',
      'data-tracking-area': 'main'
    }, a.createElement('div', {
      id: 'posts'
    }, a.createElement('div', {
      id: 'form',
      className: 'textarea-outer-wrapper--top-level'
    }), c ? null : n, a.createElement('div', {
      id: 'email-signup'
    }), a.createElement('div', {
      id: 'secondary-navigation'
    }), a.createElement('div', {
      id: 'no-posts',
      style: {
        display: 'none'
      }
    }), c ? o : null, c ? n : null, f ? a.createElement('div', {
      id: 'embed_v2-thread'
    }) : a.createElement('ul', {
      id: 'post-list',
      className: 'post-list loading'
    }), a.createElement('div', {
      className: j,
      'data-role': 'more',
      style: {
        display: 'none'
      }
    }, a.createElement('a', {
      href: '#',
      'data-action': 'more-posts',
      className: k
    }, h('Load more comments'))))), a.createElement('div', {
      id: 'placement-bottom',
      'data-tracking-area': 'discovery-south'
    }), b.hideFooter ? null : a.createElement('footer', {
      id: 'footer',
      'data-tracking-area': 'footer',
      className: i
    }))
  };
  return i
}),
define('lounge/menu-handler', [
  'jquery',
  'core/bus'
], function (a, b) {
  'use strict';
  return {
    init: function (c) {
      function d() {
        a('.dropdown').removeClass('open')
      }
      a('html').on('click', d),
      a('body').delegate('[data-toggle]', 'click', function (b) {
        b.stopPropagation(),
        b.preventDefault();
        var e = a(b.currentTarget),
        f = e.closest('.' + e.attr('data-toggle')),
        g = 'disabled' !== f.attr('data-dropdown') && !f.hasClass('open');
        if (f.attr('data-dropdown', 'enabled'), d(), g) {
          f.addClass('open');
          var h = f.data('view-id');
          h && c.trigger('opened:' + h, f)
        }
      }),
      b.frame.on('window.click', d)
    }
  }
}),
define('lounge/mixins', [
  'core/utils/url/serialize',
  'core/strings'
], function (a, b) {
  'use strict';
  var c = b.gettext,
  d = {
    _sharePopup: function (a, b) {
      return window.open(a, '_blank', b || 'width=550,height=520')
    },
    share: function (a) {
      this.sharers[a].call(this)
    },
    sharers: {
      twitter: function () {
        var b = 'https://twitter.com/intent/tweet',
        c = this.model.shortLink();
        this._sharePopup(a(b, {
          url: c,
          text: this.model.twitterText(c)
        }))
      },
      facebook: function () {
        this._sharePopup(a('https://www.facebook.com/sharer.php', {
          u: this.model.shortLink()
        }), 'width=655,height=352')
      },
      email: function () {
        window.location.href = a('mailto:', {
          subject: c('Somebody has shared this with you on Disqus'),
          body: c('Check out this discussion') + ': ' + this.model.shortLink()
        })
      }
    }
  },
  e = function () {
    function a() {
      return this.collapseTarget && this.collapseTarget.length || (this.collapseTarget = this.collapseTargetSelector ? this[this.collapseScope].find(this.collapseTargetSelector) : this[this.collapseScope]),
      this.collapseTarget
    }
    function b() {
      var b = this;
      if (b.isCollapseAllowed) {
        var c = a.call(b);
        c && c.length && (c.height(b.collapsedHeight), e.call(b))
      }
    }
    function c(a) {
      var b = this;
      if (b.collapseTarget && b.collapseTarget.length) {
        var c = b.collapseTarget;
        c.css('height', 'auto'),
        c.css('maxHeight', 'none'),
        f.call(b),
        a || (b.isCollapseAllowed = !1)
      }
    }
    function d() {
      return this.seeMoreButton && this.seeMoreButton.length || (this.seeMoreButton = a.call(this).siblings('[data-action=see-more]')),
      this.seeMoreButton
    }
    function e() {
      var a = this;
      d.call(this).removeClass('hidden').on('click', function () {
        a.expand()
      })
    }
    function f() {
      d.call(this).addClass('hidden').off('click')
    }
    return function (a) {
      var d = this;
      d.isCollapseAllowed = !0,
      d.collapsedHeight = a.collapsedHeight,
      d.collapseTargetSelector = a.collapseTargetSelector,
      d.collapseScope = a.collapseScope || '$el',
      d.collapse = b,
      d.expand = c
    }
  }();
  return {
    ShareMixin: d,
    asCollapsible: e
  }
}),
define('lounge/realtime', [
  'underscore',
  'backbone',
  'loglevel',
  'remote/config',
  'common/urls',
  'core/utils/url/serialize',
  'common/utils'
], function (a, b, c, d, e, f, g) {
  'use strict';
  function h() {
    s.apply(this, arguments),
    this.marker = 0,
    this.interval = m,
    this._boundOnError = a.bind(this.onError, this),
    this._boundOnLoad = a.bind(this.onLoad, this),
    this._boundOnProgress = a.bind(this.onProgress, this)
  }
  function i() {
    s.apply(this, arguments),
    this.handshakeSuccess = null,
    this.interval = m,
    this.handshakeFails = 0,
    this._boundOnOpen = a.bind(this.onOpen, this),
    this._boundError = a.bind(this.onError, this),
    this._boundClose = a.bind(this.onClose, this),
    this._boundMessage = a.compose(a.bind(this.onMessage, this), function (a) {
      return JSON.parse(a.data)
    })
  }
  var j = d.lounge.REALTIME || {
  },
  k = j.EXP_BASE || 2,
  l = j.BACKOFF_LIMIT || 300,
  m = j.BACKOFF_INTERVAL || 1,
  n = j.MAX_HANDSHAKE_FAILS || 1,
  o = j.WEBSOCKETS_ENABLED !== !1 && window.WebSocket && 2 === window.WebSocket.CLOSING,
  p = j.XHR_ENABLED !== !1,
  q = function () {
  },
  r = function () {
    throw new Error('Pipe class cannot be used directly.')
  },
  s = function (b) {
    this.channel = b,
    this.connection = null,
    this.paused = !1,
    this._msgBuffer = [
    ],
    this._boundOpen = a.bind(this.open, this)
  };
  a.extend(s.prototype, b.Events, {
    getUrl: function (b) {
      var c = {
      };
      return a.extend(c, b),
      f(this.baseUrl + this.channel, c)
    },
    onMessage: function (a) {
      var b = a.message_type,
      d = a.firehose_id;
      this.lastEventId = d,
      c.debug('RT: new message:', b, d);
      var e = {
        type: b,
        data: a.message_body,
        lastEventId: d
      };
      this.trigger(b, e)
    },
    _msgToBuffer: function () {
      this._msgBuffer.push(a.toArray(arguments))
    },
    pause: function (a) {
      this.paused || (this.paused = !0, this._trigger = this.trigger, this.trigger = a === !1 ? q : this._msgToBuffer, c.debug('RT: paused, buffered: %s', a !== !1))
    },
    resume: function () {
      if (this.paused) {
        this.paused = !1,
        this.trigger = this._trigger,
        c.debug('RT: resumed, buffered messages: %s', this._msgBuffer.length);
        for (var a; a = this._msgBuffer.shift(); ) this.trigger.apply(this, a)
      }
    },
    open: r,
    close: function () {
      var a = this.connection;
      return !!a && (this.connection = null, a)
    }
  }),
  a.extend(h.prototype, s.prototype, {
    baseUrl: e.realertime + '/api/2/',
    onError: function () {
      this.connection && (this.connection = null, this.trigger('error', this), this.interval <= l && (this.interval *= k), c.info('RT: Connection error, backing off %s secs', this.interval), a.delay(this._boundOpen, 1000 * this.interval))
    },
    onLoad: function () {
      this.connection && (this.connection = null, this.trigger('success', this), a.defer(this._boundOpen))
    },
    onProgress: function () {
      if (this.connection) {
        var a,
        b,
        d,
        e,
        f = this.connection.responseText,
        g = 0;
        if (f && !(this.marker >= f.length)) {
          a = f.slice(this.marker).split('\n');
          for (var h = a.length, i = 0; i < h; i++) if (b = a[i], g += b.length + 1, d = b.replace(/^\s+|\s+$/g, '')) {
            try {
              e = JSON.parse(d)
            } catch (j) {
              if (i === h - 1) {
                g -= b.length + 1;
                break
              }
              c.debug('RT: unable to parse: ', d, b);
              continue
            }
            this.onMessage(e)
          } else c.debug('RT: ignoring empty row...');
          g > 0 && (this.marker += g - 1)
        }
      }
    },
    open: function () {
      this.close();
      var a = this.connection = g.CORS.request('GET', this.getUrl(), this._boundOnLoad, this._boundOnError);
      if (!a) return void c.debug('RT: Cannot use any cross-domain request tool with StreamPipe. Bailing out.');
      a.onprogress = this._boundOnProgress,
      this.connection = a,
      this.marker = 0;
      try {
        a.send()
      } catch (b) {
        this.connection = null,
        c.debug('RT: Attempt to send a CORS request failed.')
      }
    },
    close: function () {
      var a = s.prototype.close.apply(this);
      return a && a.abort()
    }
  }),
  a.extend(i.prototype, s.prototype, {
    baseUrl: 'wss:' + e.realertime + '/ws/2/',
    onOpen: function () {
      c.debug('RT: [Socket] Connection established.'),
      this.handshakeSuccess = !0
    },
    onError: function () {
      if (!this.handshakeSuccess) {
        if (this.handshakeFails >= n) return c.debug('RT: [Socket] Error before open, bailing out.'),
        void this.trigger('fail');
        this.handshakeFails += 1
      }
      this.connection && (this.connection = null, this.trigger('error'), this.interval <= l && (this.interval *= k), c.error('RT: Connection error, backing off %s secs', this.interval), a.delay(this._boundOpen, 1000 * this.interval))
    },
    onClose: function (a) {
      if (this.connection) {
        if (!a.wasClean) return this.onError();
        this.connection = null,
        c.debug('RT: [Socket] Connection closed. Restarting...'),
        this.trigger('close'),
        this.open()
      }
    },
    open: function () {
      this.close();
      try {
        this.connection = new window.WebSocket(this.getUrl())
      } catch (a) {
        return this.onError()
      }
      var b = this.connection;
      b.onopen = this._boundOnOpen,
      b.onerror = this._boundError,
      b.onmessage = this._boundMessage,
      b.onclose = this._boundClose
    },
    close: function () {
      var a = s.prototype.close.apply(this);
      return a && a.close()
    }
  });
  var t = {
    _wsSupported: o,
    initialize: function (b, c, d) {
      this.close(),
      this._initArgs = [
        b,
        c,
        d
      ];
      var e = this._wsSupported,
      f = e && i || p && h;
      if (f) {
        var g = this.pipe = new f(b);
        a.chain(c).pairs().each(function (a) {
          g.on(a[0], a[1], d)
        }),
        e && g.on('fail', function () {
          this._wsSupported = !1,
          g.off(),
          this.initialize.apply(this, this._initArgs)
        }, this),
        g.open()
      }
    },
    pause: function (a) {
      this.pipe && this.pipe.pause(a)
    },
    resume: function () {
      this.pipe && this.pipe.resume()
    },
    close: function () {
      this.pipe && (this.pipe.close(), this.pipe = null)
    }
  };
  return window.addEventListener('unload', a.bind(t.close, t)),
  {
    Pipe: s,
    StreamPipe: h,
    SocketPipe: i,
    Manager: t,
    MAX_HANDSHAKE_FAILS: n
  }
}),
define('lounge/views/badges-message', [
  'jquery',
  'underscore',
  'backbone',
  'react',
  'react-dom',
  'core/switches',
  'core/common/cached-storage',
  'templates/lounge/partials/badgesMessage'
], function (a, b, c, d, e, f, g, h) {
  'use strict';
  var i = new g('badges-message', 7776000);
  i.getAll();
  var j = c.View.extend({
    events: {
      'click [data-action=close-badges-message]': 'handleDismiss',
      'keyup [data-action=close-badges-message]': 'handleDismiss'
    },
    initialize: function (a) {
      b.extend(this, b.pick(a, [
        'forum',
        'session'
      ])),
      this.model = new c.Model({
        dismissed: Boolean(i.getItem(this.forum.id))
      }),
      this.handleDismiss = this.handleDismiss.bind(this),
      this.listenTo(this.model, 'change', this.render)
    },
    handleDismiss: function (a) {
      var b = 13;
      if (!a.keyCode || a.keyCode === b) return this.model.set('dismissed', !0),
      i.setItem(this.forum.id, !0),
      Promise.resolve()
    },
    render: function () {
      var a = this.forum.get('badges');
      if (!a || !Object.keys(a).length || this.model.get('dismissed')) return this.$el.empty(),
      this;
      var b = '//disqus.com/home/forum/' + this.forum.get('id') + '/badges';
      return e.render(d.createElement(h, {
        forum: this.forum.toJSON(),
        forumBadgesLink: b
      }), this.el),
      this
    }
  });
  return j
}),
define('core/templates/react/aet/EmailSignupComplete', [
  'react',
  'core/switches'
], function (a, b) {
  'use strict';
  var c = function (c) {
    var d = c.forum,
    e = c.isVerified,
    f = c.onDismiss;
    return a.createElement('div', {
      className: 'newsletter-box spacing-bottom-large text-center'
    }, a.createElement('div', {
      className: b.isFeatureActive('embed_refresh', {
        forum: d.name
      }) ? 'text-large spacing-bottom-small' : 'text-medium spacing-bottom-small'
    }, a.createElement('strong', null, 'Thanks for subscribing!')), e ? a.createElement('div', {
      className: 'spacing-bottom-small'
    }, (d.aetBannerConfirmation || '').split('\n').map(function (b, c) {
      return a.createElement('div', {
        key: c
      }, b)
    })) : a.createElement('div', {
      className: 'spacing-bottom-small'
    }, 'To begin receiving email updates from ', d.name, ', please click the link in the confirmation email we\'ve sent to your inbox.'), a.createElement('a', {
      className: 'newsletter-box__hide',
      href: '#',
      onClick: function (a) {
        a.preventDefault(),
        f()
      }
    }, 'Dismiss this message'))
  };
  return c
}),
define('core/templates/react/aet/EmailSignupForm', [
  'react',
  'core/strings',
  'core/switches'
], function (a, b, c) {
  'use strict';
  var d = b.gettext,
  e = function (b) {
    var e = b.forum,
    f = b.isLoading,
    g = b.isLoggedIn,
    h = b.onDismiss,
    i = b.onSubscribe,
    j = b.allowEmpty;
    return a.createElement('div', {
      className: 'newsletter-box spacing-bottom-large'
    }, a.createElement('div', {
      className: c.isFeatureActive('embed_refresh', {
        forum: e.name
      }) ? 'text-large spacing-bottom-small' : 'text-medium spacing-bottom-small'
    }, a.createElement('strong', null, e.aetBannerTitle)), g ? a.createElement('button', {
      className: 'button button-fill--brand button-padding-wider pull-right',
      disabled: f,
      onClick: function () {
        i && i()
      }
    }, 'Subscribe') : null, a.createElement('div', {
      className: 'spacing-bottom'
    }, (e.aetBannerDescription || '').split('\n').map(function (b, c) {
      return a.createElement('div', {
        key: c
      }, b)
    })), a.createElement('div', {
      className: 'align align--wrap'
    }, g ? null : a.createElement('form', {
      className: 'align__item--grow',
      onSubmit: function (a) {
        a.preventDefault();
        var b = a.target.elements.email.value.trim();
        (b || j) && i && i(b)
      }
    }, a.createElement('div', {
      className: 'newsletter-box__input-group'
    }, a.createElement('span', {
      className: 'icon icon-mail text-large newsletter-box__input-group__icon'
    }), a.createElement('input', {
      type: 'email',
      name: 'email',
      placeholder: d('Enter email address'),
      'aria-label': 'Enter your email address here to opt into receiving a weekly digest of the latest articles from this publisher'
    })), a.createElement('input', {
      type: 'submit',
      className: 'button button-fill--brand button-padding-wider newsletter-box__submit',
      disabled: f,
      value: d('Subscribe'),
      'aria-label': 'Submit your email address'
    })), a.createElement('a', {
      href: '#',
      className: 'newsletter-box__hide publisher-anchor-color',
      onClick: function (a) {
        a.preventDefault(),
        h && h()
      }
    }, d('Hide this message'))))
  };
  return e
}),
define('lounge/views/email-signup', [
  'backbone',
  'react',
  'react-dom',
  'stance',
  'core/api',
  'core/bus',
  'core/templates/react/aet/EmailSignupComplete',
  'core/templates/react/aet/EmailSignupForm',
  'core/common/cached-storage'
], function (a, b, c, d, e, f, g, h, i) {
  'use strict';
  var j = 0,
  k = 2,
  l = new i('aet-dismiss');
  l.getAll();
  var m = a.View.extend({
    initialize: function (b) {
      var c = b.forum,
      d = b.session;
      this.forum = c,
      this.session = d,
      this.model = new a.Model({
        dismissed: Boolean(l.getItem(this.forum.id)),
        loading: !1,
        signupComplete: !1
      }),
      this._isFirstRender = !0,
      this.handleCompleteDismiss = this.handleCompleteDismiss.bind(this),
      this.handleDismiss = this.handleDismiss.bind(this),
      this.handleSubscribe = this.handleSubscribe.bind(this),
      this.listenTo(this.model, 'change', this.render),
      this.listenTo(this.session, 'change', this.render)
    },
    getTrackingCopy: function () {
      return {
        title: this.forum.get('aetBannerTitle'),
        description_copy: this.forum.get('aetBannerDescription'),
        confirmation_copy: this.forum.get('aetBannerConfirmation')
      }
    },
    isLoggedIn: function () {
      return Boolean(this.session.user && this.session.user.id)
    },
    handleDismiss: function () {
      return this.model.set('dismissed', !0),
      f.trigger('uiAction:clickEmailSubscriptionPromptDismiss', this.getTrackingCopy()),
      this.isLoggedIn() ? Promise.resolve(e.call('aet/dismiss', {
        data: {
          forum: this.forum.id
        },
        method: 'POST'
      })) : (l.setItem(this.forum.id, !0), Promise.resolve())
    },
    handleCompleteDismiss: function () {
      this.model.set('dismissed', !0)
    },
    handleSubscribe: function () {
      var a = this,
      b = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : null;
      if (!this.model.get('loading')) return f.trigger('uiAction:clickEmailSubscriptionPromptSubscribe', this.getTrackingCopy()),
      this.model.set('loading', !0),
      Promise.resolve(b ? e.call('aet/anonymousSubscribe', {
        data: {
          email: b,
          forum: this.forum.id
        },
        method: 'POST'
      }) : e.call('aet/subscribe', {
        data: {
          forum: this.forum.id
        },
        method: 'POST'
      })).then(function (b) {
        return a.model.set({
          loading: !1,
          signupComplete: !0
        }),
        b
      }) ['catch'](function () {
        a.model.set('loading', !1)
      })
    },
    reportView: function () {
      f.trigger('uiAction:viewEmailSubscriptionPrompt', this.getTrackingCopy())
    },
    render: function () {
      if (!this.forum.get('aetEnabled') || this.model.get('dismissed')) return this.$el.empty(),
      this;
      var a = this.session.shouldFetchSession() ? this.session.get('aetBannerStatus') : j;
      switch (a) {
        case j:
        case k:
          if (this.model.get('signupComplete') || a === k ? c.render(b.createElement(g, {
            forum: this.forum.toJSON(),
            isVerified: Boolean(this.session.user && this.session.user.get('isVerified')),
            onDismiss: this.handleCompleteDismiss
          }), this.el) : c.render(b.createElement(h, {
            forum: this.forum.toJSON(),
            isLoading: this.model.get('loading'),
            isLoggedIn: this.isLoggedIn(),
            onDismiss: this.handleDismiss,
            onSubscribe: this.handleSubscribe
          }), this.el), this._isFirstRender) {
            this._isFirstRender = !1,
            f.trigger('uiAction:loadEmailSubscriptionPrompt', this.getTrackingCopy());
            var e = d(this);
            e.isVisible() ? this.reportView() : this.listenToOnce(e, 'enter', this.reportView)
          }
          break;
        default:
          this.$el.empty()
      }
      return this
    }
  });
  return m
}),
define('react-dom/server', [
  'underscore'
], function (a) {
  'use strict';
  var b = function c(b) {
    if (null === b) return '';
    if (a.isArray(b)) return b.map(c).join('');
    if (a.isElement(b)) return b.outerHTML;
    if (b && b.nodeType === window.Node.DOCUMENT_FRAGMENT_NODE) {
      var d = window.document.createElement('div');
      return d.appendChild(b),
      d.innerHTML
    }
    return a.escape(String(b))
  };
  return {
    renderToString: b,
    renderToStaticMarkup: b
  }
}),
define('core/utils/media/upload', [
  'underscore',
  'exports',
  'core/api',
  'core/models/Media',
  'core/UniqueModel'
], function (a, b, c, d, e) {
  'use strict';
  b.uploadSupported = Boolean(window.FormData),
  b._extractFirstImageFile = function (b) {
    return a.find(b, function (a) {
      return a.type.match(/^image\//)
    })
  },
  b._uploadViaApi = function (a, b, d) {
    return Promise.resolve(c.call(a, {
      data: b,
      contentType: !1,
      processData: !1,
      method: 'POST',
      xhr: function () {
        var a = new window.XMLHttpRequest,
        b = d && d.onProgress;
        return b && a.upload.addEventListener('progress', function (a) {
          a.total && b(100 * a.loaded / a.total)
        }),
        a
      }
    }))
  },
  b.UPLOAD_URL = 'https://uploads.services.disqus.com/api/3.0/media/create.json',
  b.uploadMediaUrl = function (c, f) {
    var g,
    h = new window.FormData,
    i = b._extractFirstImageFile(c);
    return i ? (h.append('upload', i), h.append('permanent', 1), b._uploadViaApi(b.UPLOAD_URL, h, f).then(function (b) {
      var c = b.response,
      f = a.first(a.values(c));
      if (!f || !f.ok) throw g = new Error('Upload failed'),
      g.code = f && f['error-code'],
      g;
      return new e(d, {
        mediaType: d.MEDIA_TYPES.IMAGE_UPLOAD,
        url: f.url,
        thumbnailUrl: f.url
      })
    }, function (a) {
      if (a.responseJSON && 4 === a.responseJSON.code) throw g = new Error('Upload failed'),
      g.code = 'not-authenticated',
      g;
      throw a
    })) : (g = new Error('No image file to upload'), g.code = 'invalid-content-type', Promise.reject(g))
  }
}),
define('core/views/media/DragDropUploadView', [
  'underscore',
  'backbone',
  'core/utils'
], function (a, b, c) {
  'use strict';
  var d = c.stopEventHandler,
  e = b.View.extend({
    events: {
      dragover: '_dragOn',
      dragenter: '_dragOn',
      dragleave: '_dragOff',
      dragexit: '_dragOff',
      drop: '_drop'
    },
    _dragOn: d(function () {
      this.trigger('uploader:dragEnter'),
      this._toggleDragPlaceholder(!0)
    }),
    _dragOff: d(function () {
      this._toggleDragPlaceholder(!1)
    }),
    _drop: d(function (a) {
      this._toggleDragPlaceholder(!1);
      var b = a.originalEvent.dataTransfer.files;
      return b.length ? void this.trigger('uploader:attachMedia', b) : void this.trigger('uploader:dropError', 'No files')
    }),
    _toggleDragPlaceholder: a.throttle(function (a) {
      a ? this.trigger('uploader:showPlaceholder') : this.trigger('uploader:hidePlaceholder')
    }, 50)
  });
  return e
}),
define('core/templates/postMediaUploadButton', [
  'handlebars',
  'core/templates/handlebars.partials',
  'core/extensions/handlebars.helpers'
], function (a) {
  return a.template({
    compiler: [
      8,
      '>= 4.3.0'
    ],
    main: function (a, b, c, d, e) {
      return '<a href="#" data-action="attach" class="attach" title="' + a.escapeExpression(c.gettext.call(null != b ? b : a.nullContext || {
      }, 'Upload Images', {
        name: 'gettext',
        hash: {
        },
        data: e,
        loc: {
          start: {
            line: 1,
            column: 55
          },
          end: {
            line: 1,
            column: 82
          }
        }
      })) + '" tabIndex="0" aria-label="Open file attachment menu">\n<div class="wysiwyg__attach wysiwyg__attach-dims"\nrole="img"\n/>\n</a>\n<input type="file" data-role="media-upload" tabIndex="-1" accept="image/*">\n'
    },
    useData: !0
  })
}),
define('core/views/media/UploadButtonView', [
  'jquery',
  'underscore',
  'backbone',
  'core/templates/postMediaUploadButton',
  'core/utils'
], function (a, b, c, d, e) {
  'use strict';
  var f = e.stopEventHandler,
  g = 'input[type=file][data-role=media-upload]',
  h = c.View.extend({
    events: function () {
      var a = {
        'click [data-action=attach]': '_attachMedia',
        'keydown [data-action=attach]': 'keydownHandler'
      };
      return a['change ' + g] = '_selectorChange',
      a
    }(),
    initialize: function (a) {
      this.template = a && a.template || this.generateImageUploadButton
    },
    keydownHandler: function (a) {
      var b = 13,
      c = 32;
      a.keyCode !== b && a.keyCode !== c || (a.preventDefault(), this._attachMedia())
    },
    generateImageUploadButton: function () {
      return d({
        imageUrl: 'https://c.disquscdn.com/next/embed/assets/img/attach.03c320b14aa9c071da30c904d0a0827f.svg'
      })
    },
    render: function () {
      return this.$el.html(this.template()),
      this
    },
    _attachMedia: f(b.throttle(function () {
      this.$(g).click()
    }, 1000, {
      trailing: !1
    })),
    _selectorChange: function (b) {
      var c = b.target,
      d = c.files;
      d.length && (this.trigger('uploader:attachMedia', d), a(c).replaceWith(c.cloneNode()))
    }
  });
  return h
}),
define('core/templates/postMediaUploadProgress', [
  'handlebars',
  'core/templates/handlebars.partials',
  'core/extensions/handlebars.helpers'
], function (a) {
  return a.template({
    1: function (a, b, c, d, e) {
      return '<li>\n<div class="media-progress-box">\n<div class="media-progress">\n<div class="bar" style="right: ' + a.escapeExpression(a.lambda(null != b ? b.remainingPerc : b, b)) + '%"></div>\n</div>\n</div>\n</li>\n'
    },
    compiler: [
      8,
      '>= 4.3.0'
    ],
    main: function (a, b, c, d, e) {
      var f;
      return null != (f = c.each.call(null != b ? b : a.nullContext || {
      }, null != b ? b.collection : b, {
        name: 'each',
        hash: {
        },
        fn: a.program(1, e, 0),
        inverse: a.noop,
        data: e,
        loc: {
          start: {
            line: 1,
            column: 0
          },
          end: {
            line: 9,
            column: 9
          }
        }
      })) ? f : ''
    },
    useData: !0
  })
}),
define('core/views/media/UploadsProgressSubView', [
  'backbone',
  'core/templates/postMediaUploadProgress'
], function (a, b) {
  'use strict';
  var c = a.View.extend({
    initialize: function () {
      this.collection = new a.Collection,
      this.listenTo(this.collection, 'add remove change', this.render)
    },
    hasVisible: function () {
      return Boolean(this.collection.length)
    },
    render: function () {
      return this.$el.html(b({
        collection: this.collection.toJSON()
      })),
      this
    }
  });
  return c
}),
define('core/templates/postMediaUploadRich', [
  'handlebars',
  'core/templates/handlebars.partials',
  'core/extensions/handlebars.helpers'
], function (a) {
  return a.template({
    1: function (a, b, c, d, e) {
      return '<video src="' + a.escapeExpression(a.lambda(null != b ? b.thumbnailUrl : b, b)) + '" autoplay muted loop></video>\n'
    },
    3: function (a, b, c, d, e) {
      var f;
      return '<img src="' + a.escapeExpression(a.lambda(null != b ? b.thumbnailUrl : b, b)) + '" alt="' + (null != (f = c['if'].call(null != b ? b : a.nullContext || {
      }, null != (f = null != b ? b.media : b) ? f.title : f, {
        name: 'if',
        hash: {
        },
        fn: a.program(4, e, 0),
        inverse: a.program(6, e, 0),
        data: e,
        loc: {
          start: {
            line: 9,
            column: 33
          },
          end: {
            line: 9,
            column: 112
          }
        }
      })) ? f : '') + '">\n'
    },
    4: function (a, b, c, d, e) {
      var f;
      return a.escapeExpression(a.lambda(null != (f = null != b ? b.media : b) ? f.title : f, b))
    },
    6: function (a, b, c, d, e) {
      return a.escapeExpression(c.gettext.call(null != b ? b : a.nullContext || {
      }, 'Media attachment', {
        name: 'gettext',
        hash: {
        },
        data: e,
        loc: {
          start: {
            line: 9,
            column: 75
          },
          end: {
            line: 9,
            column: 105
          }
        }
      }))
    },
    compiler: [
      8,
      '>= 4.3.0'
    ],
    main: function (a, b, c, d, e) {
      var f;
      return '<li class="publisher-border-color">\n<div class="media-box">\n<div class="media-ct">\n<div class="media-surface">\n<a href="' + a.escapeExpression(a.lambda(null != (f = null != b ? b.media : b) ? f.url : f, b)) + '" target="_blank">\n' + (null != (f = c['if'].call(null != b ? b : a.nullContext || {
      }, null != b ? b.isVideo : b, {
        name: 'if',
        hash: {
        },
        fn: a.program(1, e, 0),
        inverse: a.program(3, e, 0),
        data: e,
        loc: {
          start: {
            line: 6,
            column: 0
          },
          end: {
            line: 10,
            column: 7
          }
        }
      })) ? f : '') + '</a>\n</div>\n</div>\n</div>\n</li>\n'
    },
    useData: !0
  })
}),
define('core/views/media/UploadsRichSubView', [
  'underscore',
  'backbone',
  'core/models/Media',
  'core/UniqueModel',
  'core/utils',
  'core/templates/postMediaUploadRich'
], function (a, b, c, d, e, f) {
  'use strict';
  var g = b.View.extend({
    initialize: function () {
      this._hasVisible = !1,
      this.collection = new b.Collection([], {
        model: c,
        comparator: 'index'
      }),
      this.listenTo(this.collection, 'add remove reset sort change:thumbnailUrl change:mediaType change:editsFinished', this.render),
      this.listenTo(this.collection, 'change:index', a.bind(this.collection.sort, this.collection))
    },
    render: function () {
      return this.$el.empty(),
      this._hasVisible = !1,
      this.collection.each(function (b) {
        b.get('thumbnailUrl') && (a.contains(c.WEBPAGE_TYPES, b.get('mediaType')) || b.get('editsFinished') && (this.$el.append(f({
          media: b.toJSON(),
          isVideo: this.isVideo(b),
          thumbnailUrl: b.get('thumbnailUrl')
        })), this._hasVisible = !0))
      }, this),
      this
    },
    isVideo: function (a) {
      return a.get('mediaType') === c.MEDIA_TYPES.MP4_VIDEO
    },
    hasVisible: function () {
      return this._hasVisible
    },
    addMedia: function (a, b) {
      var e = d.get(c, a.url);
      if (e) e.set(a);
       else {
        if (!a.editsFinished) return;
        e = new d(c, a),
        e.fetch(b)
      }
      return this.collection.add(e),
      e
    },
    updateFromText: function (b, c, d) {
      if (!b) return void this.collection.reset();
      var f = e.bleachFindUrls(b);
      f = a.uniq(f, !1, function (a) {
        return a.url
      });
      var g = {
      };
      a.each(f, function (e) {
        g[e.url] = !0;
        var f = a.pick(e, 'index', 'url'),
        h = e.index < c && c <= e.endIndex || '.' === b[e.endIndex];
        h && !d.isPasteEvent || (f.editsFinished = !0),
        this.addMedia(f, d)
      }, this);
      var h = this.collection.pluck('url');
      g = a.keys(g);
      var i = a.difference(h, g);
      this.collection.remove(this.collection.filter(function (b) {
        return a.contains(i, b.get('url'))
      }))
    }
  });
  return g
}),
define('core/templates/postMediaUploads', [
  'handlebars',
  'core/templates/handlebars.partials',
  'core/extensions/handlebars.helpers'
], function (a) {
  return a.template({
    compiler: [
      8,
      '>= 4.3.0'
    ],
    main: function (a, b, c, d, e) {
      return '<ul data-role="media-progress-list"></ul>\n<ul data-role="media-rich-list"></ul>\n<div class="media-expanded empty" data-role="media-preview-expanded">\n<img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=="\ndata-role="media-preview-expanded-image" alt="' + a.escapeExpression(c.gettext.call(null != b ? b : a.nullContext || {
      }, 'Media preview placeholder', {
        name: 'gettext',
        hash: {
        },
        data: e,
        loc: {
          start: {
            line: 6,
            column: 46
          },
          end: {
            line: 6,
            column: 85
          }
        }
      })) + '">\n</div>\n'
    },
    useData: !0
  })
}),
define('core/views/media/UploadsView', [
  'backbone',
  'core/views/media/UploadsProgressSubView',
  'core/views/media/UploadsRichSubView',
  'core/templates/postMediaUploads'
], function (a, b, c, d) {
  'use strict';
  var e = a.View.extend({
    initialize: function () {
      this.richView = new c,
      this.rich = this.richView.collection,
      this.uploadProgressView = new b,
      this.uploadProgress = this.uploadProgressView.collection,
      this.listenTo(this.rich, 'all', this._updateEmpty),
      this.listenTo(this.uploadProgress, 'all', this._updateEmpty)
    },
    render: function () {
      return this.richView.$el.detach(),
      this.uploadProgressView.$el.detach(),
      this.$el.html(d()),
      this._updateEmpty(),
      this.richView.setElement(this.$('[data-role=media-rich-list]') [0]),
      this.uploadProgressView.setElement(this.$('[data-role=media-progress-list]') [0]),
      this
    },
    clear: function () {
      this.rich.reset(),
      this.uploadProgress.reset()
    },
    _updateEmpty: function () {
      this.richView.hasVisible() || this.uploadProgressView.hasVisible() ? this.$el.removeClass('empty') : this.$el.addClass('empty')
    }
  });
  return e
}),
define('core/mixins/withUploadForm', [
  'underscore',
  'backbone',
  'core/strings',
  'core/utils',
  'core/utils/media/upload',
  'core/utils/storage',
  'core/views/media/DragDropUploadView',
  'core/views/media/UploadButtonView',
  'core/views/media/UploadsView'
], function (a, b, c, d, e, f, g, h, i) {
  'use strict';
  var j = c.get,
  k = function () {
    a.defaults(this, k.bothProto, k.uploadsProto, k.previewsProto)
  },
  l = {
    'invalid-image-file': j('Unfortunately your image upload failed. Please verify that the file is valid and in a supported format (JPEG, PNG, or GIF).'),
    'invalid-content-type': j('Unfortunately your image upload failed. Please verify that the file is in a supported format (JPEG, PNG, or GIF).'),
    'file-too-large': j('Unfortunately your image upload failed. Please verify that your image is under 5MB.'),
    'not-authenticated': j('You must be logged in to upload an image.')
  },
  m = j('Unfortunately your image upload failed. Please verify that your image is in a supported format (JPEG, PNG, or GIF) and under 5MB. If you continue seeing this error, please try again later.');
  return k.previewsProto = {
    initMediaPreviews: function (b, c) {
      this.mediaUploadsView = new i({
        el: b[0]
      }),
      this.mediaUploadsView.render(),
      this.updateLiveMediaDebounced = a.partial(a.debounce(this.updateLiveMedia, 500), c, !1),
      this.stopListening(c, 'keychange'),
      this.stopListening(c, 'paste'),
      this.listenTo(c, {
        keychange: this.updateLiveMediaDebounced,
        paste: function (b, d) {
          d && d.fake || a.defer(a.bind(this.updateLiveMedia, this, c, !0))
        }
      }),
      this.updateLiveMedia(c, !0)
    },
    clearMediaPreviews: function () {
      this.mediaUploadsView && this.mediaUploadsView.clear()
    },
    updateLiveMedia: function (a, b) {
      if (this.mediaUploadsView) {
        var c = a.get(),
        d = a.offset();
        this.mediaUploadsView.richView.updateFromText(c, d, {
          isPasteEvent: b,
          forum: this.thread.forum.id
        })
      }
    }
  },
  k.uploadsProto = {
    initMediaUploads: function (a, b, c) {
      this.mediaDragDropView && this.stopListening(this.mediaDragDropView),
      this.mediaDragDropView = new g({
        el: b[0]
      }),
      this.listenTo(this.mediaDragDropView, {
        'uploader:attachMedia': function () {
          f.set('usedDragDrop', 1),
          this.handleAttachMedia.apply(this, arguments)
        },
        'uploader:dragEnter': function () {
          this.$el.addClass('expanded')
        },
        'uploader:showPlaceholder': function () {
          a.show()
        },
        'uploader:hidePlaceholder': function () {
          a.hide()
        },
        'uploader:dropError': function () {
          var a = j('Sorry we didn\'t catch that. Try again?');
          this.alert(a, {
            type: 'error',
            isUploadError: !0
          })
        }
      }),
      this.mediaUploadButtonView && this.stopListening(this.mediaUploadButtonView),
      this.mediaUploadButtonView = new h({
        el: c[0]
      }),
      this.listenTo(this.mediaUploadButtonView, {
        'uploader:attachMedia': this.handleUploadViaButton
      }),
      this.mediaUploadButtonView.render()
    },
    handleUploadViaButton: function (a) {
      if (a && f.isPersistent && !f.get('usedDragDrop') && !d.isMobileUserAgent()) {
        var b = this.alert(j('Did you know you can drag and drop images too? Try it now!'));
        this.listenToOnce(b, 'dismiss', function () {
          f.set('usedDragDrop', 1)
        })
      }
      this.handleAttachMedia.apply(this, arguments)
    },
    handleAttachMedia: function (c, d) {
      var f = this,
      g = new b.Model({
        remainingPerc: 100
      });
      f.mediaUploadsView.uploadProgress.add(g),
      d = a.extend(d || {
      }, {
        onProgress: function (a) {
          g.set('remainingPerc', 100 - a)
        }
      });
      var h = function () {
        f.mediaUploadsView.uploadProgress.remove(g)
      };
      e.uploadMediaUrl(c, d).then(function (a) {
        a.fetch({
          forum: f.thread.forum.id
        }),
        f.textarea.insertAtCursor(a.get('url')),
        f.updateLiveMedia(f.textarea, !0),
        f.dismissUploadError()
      }) ['catch'](function (a) {
        var b;
        a && a.code && (b = l[a.code]),
        b || (b = m),
        f.alert(b, {
          type: 'error',
          isUploadError: !0
        })
      }).then(h, h)
    },
    dismissUploadError: function () {
      this.dismissAlert(function (a) {
        return a.options && a.options.isUploadError
      })
    },
    uploadSupported: e.uploadSupported,
    isUploadInProgress: function () {
      return this.mediaUploadsView && this.mediaUploadsView.uploadProgress.length
    }
  },
  k.bothProto = {
    initMediaViews: function (a) {
      (a.mediaembedEnabled || a.gifPickerEnabled) && this.initMediaPreviews(this.$('[data-role=media-preview]'), a.textarea),
      a.allowUploads && this.initMediaUploads(this.$('[data-role=drag-drop-placeholder]'), this.$('[data-role=textarea]'), this.$('[data-role=media-uploader]'))
    }
  },
  k
}),
define('core/editable', [
], function () {
  'use strict';
  function a(a) {
    return a.replace(e, ' ')
  }
  function b(c, d, e) {
    var f,
    h,
    i,
    j,
    k = '',
    l = [
    ];
    for ('string' != typeof e && (e = '\n\n'), j = 0; j < c.length; ++j) h = c[j],
    f = h.nodeName.toLowerCase(),
    1 === h.nodeType ? (i = d && d(h), i ? k += i : g.hasOwnProperty(f) ? (k && l.push(k), k = b(h.childNodes, d, e)) : k += 'br' === f ? '\n' : b(h.childNodes, d, e)) : 3 === h.nodeType && (k += a(h.nodeValue));
    return l.push(k),
    l.join(e)
  }
  var c = window.document,
  d = 'character',
  e = new RegExp(String.fromCharCode(160), 'gi'),
  f = 'h1 h2 h3 h4 h5 h6 p pre blockquote address ul ol dir menu li dl div form'.split(' '),
  g = {
  },
  h = 0;
  for (h = 0; h < f.length; h++) g[f[h]] = !0;
  var i = function (a, b, c) {
    var d = this;
    if (!a || !a.contentEditable) throw new Error('First argument must be contentEditable');
    this.elem = a,
    this.emulateTextarea = a.getAttribute('plaintext-only') || b,
    this.emulateTextarea && (this.pasteHandler = function (a) {
      var b = a && a.clipboardData || window.clipboardData;
      b && !b.getData('text') && (a.preventDefault(), a.stopPropagation());
      var c = d.plainTextReformat,
      e = function () {
        c.timeout = null,
        c.call(d)
      };
      c.timeout && clearTimeout(c.timeout),
      c.timeout = setTimeout(e, 0)
    }, a.addEventListener('paste', this.pasteHandler));
    for (var e in c) c.hasOwnProperty(e) && (this[e] = c[e])
  };
  return i.prototype = {
    insertHTML: function (a) {
      if (c.all) {
        var b = c.selection.createRange();
        return b.pasteHTML(a),
        b.collapse(!1),
        b.select()
      }
      return c.execCommand('insertHTML', !1, a)
    },
    insertNode: function (a) {
      var b,
      d,
      e;
      window.getSelection ? (b = window.getSelection(), b.getRangeAt && b.rangeCount && (d = b.getRangeAt(0), d.deleteContents(), d.insertNode(a), d.collapse(!1), b.removeAllRanges(), b.addRange(d))) : c.selection && c.selection.createRange && (d = c.selection.createRange(), e = 3 === a.nodeType ? a.data : a.outerHTML, d.pasteHTML(e), d.collapse(!1))
    },
    getTextNodes: function (a) {
      var b = this.elem;
      a && a.nodeType ? a = [
        a
      ] : a || (a = b.childNodes);
      for (var c, d = [
      ], e = 0; e < a.length; ++e) if (c = a[e]) switch (c.nodeType) {
        case 1:
          d = d.concat(this.getTextNodes(c.childNodes));
          break;
        case 3:
          /^\n\s+/.test(c.nodeValue) || d.push(c)
      }
      return d
    },
    text: function (a) {
      var c,
      d,
      e,
      f = this.elem;
      try {
        d = Array.prototype.slice.call(f.childNodes)
      } catch (g) {
        for (d = [
        ], e = 0; e < f.childNodes.length; ++e) d.push(f.childNodes[e])
      }
      return c = b(d, a, this.emulateTextarea && '\n'),
      c.replace(/^\s+|\s+$/g, '')
    },
    setText: function (a) {
      a = a || '';
      var b,
      d,
      e,
      f = c.createDocumentFragment(),
      g = [
        a
      ],
      h = g && g.length;
      for (b = 0; b < h; b++) d = g[b],
      e = this.createParagraph(d),
      f.appendChild(e);
      if (f.lastChild.appendChild(c.createElement('br')), this.elem.innerHTML = '', this.elem.appendChild(f), 'WebkitAppearance' in c.documentElement.style && window.navigator.userAgent.indexOf('Firefox') === - 1 && window.navigator.userAgent.indexOf('MSIE') === - 1) {
        var i = window.getSelection && window.getSelection();
        i && i.anchorNode === this.elem && i.modify && i.modify('move', 'forward', 'line')
      }
    },
    createParagraph: function (a) {
      var b,
      d,
      e,
      f,
      g,
      h,
      i,
      j = c.createElement('p');
      for (e = a.split(/\r\n|\r|\n/), d = 0, g = e.length; d < g; d++) {
        for (f = e[d], i = this.getHtmlElements(f), b = 0, h = i.length; b < h; b++) j.appendChild(i[b]);
        j.appendChild(c.createElement('br'))
      }
      return j.lastChild && j.removeChild(j.lastChild),
      j
    },
    getHtmlElements: function (a) {
      return [c.createTextNode(a)]
    },
    plainTextReformat: function () {
      if (!(this.elem.getElementsByTagName('p').length <= 1)) {
        this.emulateTextarea = !1;
        var a = this.text();
        this.emulateTextarea = !0,
        this.setText(a)
      }
    },
    removeNode: function (a) {
      var b,
      d,
      e;
      window.getSelection ? (b = a.previousSibling, a.parentNode.removeChild(a), d = window.getSelection(), e = c.createRange(), b && (e.setStart(b, b.length), e.setEnd(b, b.length)), d.addRange(e)) : a.parentNode.removeChild(a)
    },
    selectedTextNode: function () {
      var b,
      e,
      f,
      g,
      h,
      i,
      j,
      k,
      l,
      m = this.elem;
      if (window.getSelection) return b = window.getSelection(),
      b.anchorNode;
      if (c.selection.createRange) {
        for (e = c.selection.createRange().duplicate(); e.moveStart(d, - 1000) === - 1000; );
        var n = e.text;
        for (k = 0; k < m.childNodes.length; ++k) for (f = m.childNodes[k], h = this.getTextNodes(f), l = 0; l < h.length; ++l) if (g = h[l], j = a(g.nodeValue), n.indexOf(j) > - 1) i = g,
        n = n.replace(j, '');
         else if (j.indexOf(n) > - 1) return g;
        return i
      }
    },
    selectedTextNodeOffset: function (b) {
      var e,
      f,
      g;
      if (window.getSelection) {
        var h = window.getSelection();
        h && h.anchorOffset && (g = h.anchorOffset)
      } else if (b && c.selection.createRange) {
        var i = a(b.nodeValue);
        e = c.selection.createRange();
        var j = e.duplicate(),
        k = j.parentElement();
        for (f = 0; 0 !== e.moveStart(d, - 1) && (0 !== i.indexOf(a(e.text)) && k === e.parentElement()); f++) j = e.duplicate(),
        k = j.parentElement();
        g = f
      }
      return isNaN(g) ? 0 : g
    },
    offset: function () {
      function b(d, e) {
        function f(a) {
          i += a[0];
          for (var b = 1; b < a.length; ++b) h.push(i),
          i = a[b]
        }
        'string' != typeof e && (e = '\n\n');
        for (var h = [
        ], i = '', j = 0; j < d.length; ++j) {
          var k = d[j],
          l = k.nodeName.toLowerCase();
          1 === k.nodeType ? g.hasOwnProperty(l) ? (i && (i += e), f(b(k.childNodes, e))) : 'br' === l ? i += '\n' : f(b(k.childNodes, e)) : 3 === k.nodeType && (k === c.anchorNode ? (i += a(k.nodeValue.slice(0, c.anchorOffset)), h.push(i), i = a(k.nodeValue.slice(c.anchorOffset))) : i += a(k.nodeValue))
        }
        return h.push(i),
        h
      }
      var c = window.getSelection();
      if (!c || !c.anchorNode || 3 !== c.anchorNode.nodeType) return 0;
      var d,
      e = this.elem;
      try {
        d = Array.prototype.slice.call(e.childNodes)
      } catch (f) {
        d = [
        ];
        for (var h = 0; h < e.childNodes.length; ++h) d.push(e.childNodes[h])
      }
      var i = b(d, this.emulateTextarea && '\n');
      if (1 === i.length) return 0;
      var j = i[0].length,
      k = i.join(''),
      l = k.match(/\s+$/);
      if (l) {
        var m = l[0].length;
        j = Math.min(j, k.length - m)
      }
      var n = k.match(/^\s+/);
      if (n) {
        var o = n[0].length;
        j -= o
      }
      return j
    },
    selectNodeText: function (b, e, f) {
      var g,
      h,
      i = this.elem;
      if (window.getSelection) return g = window.getSelection(),
      g.removeAllRanges(),
      h = c.createRange(),
      h.setStart(b, e),
      h.setEnd(b, f),
      g.addRange(h),
      g;
      if (c.selection.createRange) {
        h = c.selection.createRange();
        var j = a(b.nodeValue);
        if ('body' === h.parentElement().nodeName.toLowerCase()) {
          for (i.focus(), h = c.selection.createRange(); h.moveStart(d, - 1000) === - 1000; );
          for (; 1000 === h.moveEnd(d, 1000); );
          var k = a(h.text),
          l = k.indexOf(j);
          l > 0 && h.moveStart(d, l + 2),
          h.collapse()
        }
        for (; h.moveStart(d, - 1) === - 1 && 0 !== j.indexOf(a(h.text)); );
        for (; 1 === h.moveEnd(d, 1) && j !== a(h.text); );
        return h.moveStart(d, e),
        h.moveEnd(d, - 1 * (f - e - h.text.length)),
        h.select(),
        h
      }
    }
  },
  i.normalizeSpace = a,
  i
}),
define('core/utils/html/nodeTypes', [
], function () {
  'use strict';
  var a = function (a) {
    return 'p' === a.nodeName.toLowerCase()
  },
  b = function (a) {
    return 'div' === a.nodeName.toLowerCase()
  },
  c = function (a) {
    return '#text' === a.nodeName.toLowerCase()
  },
  d = function (a) {
    return 'br' === a.nodeName.toLowerCase()
  },
  e = function (a) {
    return 'button' === a.nodeName.toLowerCase()
  },
  f = function (a) {
    return 'br' === a.nodeName.toLowerCase() || '#text' === a.nodeName.toLowerCase() && '\n' === a.nodeValue
  },
  g = function (a) {
    return 'p' === a.nodeName.toLowerCase() || 'div' === a.nodeName.toLowerCase()
  },
  h = function (a) {
    return 'span' === a.nodeName.toLowerCase()
  };
  return {
    isP: a,
    isDiv: b,
    isText: c,
    isBr: d,
    isButton: e,
    isNewline: f,
    isPorDiv: g,
    isSpan: h
  }
}),
define('core/CappedStorage', [
  'core/utils/storage'
], function (a) {
  'use strict';
  var b = function (a, b) {
    this.max = a || 10,
    this.queueKey = b || '__queue',
    this.getQueue() || this.setQueue([])
  };
  return b.prototype.set = function (b, c) {
    var d = this.getQueue() || this.setQueue([]);
    d.length === this.max && a.remove(d.shift()),
    a.set(b, c),
    d.push(b),
    this.setQueue(d)
  },
  b.prototype.get = function (b) {
    return a.get(b)
  },
  b.prototype.remove = function (b) {
    a.remove(b);
    for (var c = this.getQueue() || [
    ], d = 0; d < c.length; d++) if (c[d] === b) {
      c.splice(d, 1);
      break
    }
    this.setQueue(c)
  },
  b.prototype.clear = function () {
    a.clear(),
    this.setQueue([])
  },
  b.prototype.getQueue = function () {
    return a.get(this.queueKey)
  },
  b.prototype.setQueue = function (b) {
    return a.set(this.queueKey, b),
    b
  },
  b
}),
define('core/extensions/jquery.autoresize', [
  'jquery',
  'underscore'
], function (a, b) {
  'use strict';
  return a.fn.autoresize = function (c) {
    var d = b.extend({
      extraSpace: 0,
      maxHeight: 1000
    }, c);
    return this.each(function () {
      var c = a(this).css({
        resize: 'none',
        overflow: 'hidden'
      }),
      e = 'true' === String(c[0].contentEditable) ? 'html' : 'val',
      f = 'html' === e ? '<br>' : '\n',
      g = c.height(),
      h = function () {
        var d = {
        };
        b.each(d, function (a, b) {
          d[b] = c.css(b)
        });
        var e = a(c[0].cloneNode(!0));
        return e.removeAttr('id').removeAttr('name').css({
          visibility: 'hidden',
          position: 'absolute',
          top: '-9999px',
          left: '-9999px',
          contentEditable: !1
        }).css(d).attr('tabIndex', '-1'),
        e.insertAfter(c[0]),
        e
      }(),
      i = null,
      j = function () {
        h[0].style.height = 0,
        h[e](c[e]() + f),
        h.scrollTop(h[0].scrollHeight);
        var a = Math.max(h[0].scrollHeight, g) + parseInt(d.extraSpace, 10);
        d.maxHeight && (a >= d.maxHeight ? (c.css('overflow', ''), a = d.maxHeight) : c.css('overflow', 'hidden')),
        i !== a && (i = a, c.height(a), c.trigger && c.trigger('resize'))
      },
      k = b.throttle(j, 500),
      l = function (a) {
        13 === a.keyCode ? j() : k()
      };
      c.bind('keyup', l).bind('paste', j).css('overflow', 'hidden'),
      j()
    })
  },
  a
}),
define('core/views/TextareaView', [
  'underscore',
  'jquery',
  'backbone',
  'core/utils',
  'core/utils/html/nodeTypes',
  'core/CappedStorage',
  'core/extensions/jquery.autoresize'
], function (a, b, c, d, e, f) {
  'use strict';
  var g = c.View.extend({
    events: {
      'keydown  [data-role=editable]': 'handleKeyDown',
      'keyup    [data-role=editable]': 'handleKeyUp',
      'paste    [data-role=editable]': 'handlePaste',
      'focusin  [data-role=editable]': 'handleFocusIn',
      'blur     [data-role=editable]': 'handleBlur'
    },
    initialize: function (b) {
      b = b || {
      },
      this.storageKey = b.storageKey,
      this.value = b.value || this.getDraft() [0],
      this.history = [
        this.value
      ],
      this.historyPosition = 0,
      this.placeholder = b.placeholder,
      this.selectionIndices = {
        start: 0,
        end: 0,
        endElemInd: 0,
        endElemSelectionInd: 0,
        startElemInd: 0,
        startElemSelectionInd: 0
      },
      this.inputFixed = !1,
      this.listenTo(this, 'keychange', a.debounce(this.saveDraft, this.constructor.SAVE_DRAFT_INTERVAL))
    },
    render: function () {
      return this.$input = this.createInput(),
      this.set(this.value),
      this.$el.append(this.$input),
      this.$input.autoresize({
        maxHeight: this.constructor.MAX_TEXTAREA_HEIGHT
      }),
      this
    },
    createInput: function () {
      return b('<textarea>').attr({
        'class': 'textarea',
        placeholder: this.placeholder,
        'data-role': 'editable'
      })
    },
    resize: function () {
      this.$input.trigger('paste', {
        fake: !0
      })
    },
    get: function () {
      return this.$input.val().replace(/^\s+|\s+$/g, '')
    },
    getSelected: function () {
      var a = this.$input[0];
      return 'number' == typeof a.selectionStart ? this.$input.val().substring(a.selectionStart, a.selectionEnd) : ''
    },
    offset: function () {
      var a = this.$input[0],
      b = this.$input.val(),
      c = 'number' == typeof a.selectionStart ? a.selectionStart : 0,
      d = b.match(/\s+$/);
      if (d) {
        var e = d[0].length;
        c = Math.min(c, b.length - e)
      }
      var f = b.match(/^\s+/);
      if (f) {
        var g = f[0].length;
        c = Math.max(c - g, 0)
      }
      return c
    },
    insertAtCursor: function (a) {
      this.focus();
      var b = this.get(),
      c = this.offset(),
      e = d.insertWithWhitespace(b, c, a),
      f = this.$input[0];
      if (this.set(e), f.setSelectionRange) {
        var g = e.indexOf(a, c) + a.length + 1;
        f.setSelectionRange(g, g)
      }
    },
    insertAroundSelection: function (a, b) {
      this.focus();
      var c,
      d,
      e = this.$input[0];
      'number' == typeof e.selectionStart ? (c = e.selectionStart, d = e.selectionEnd) : c = d = 0;
      var f = this.get(),
      g = f.substring(0, c) + a + f.substring(c, d) + b + f.substring(d);
      this.set(g),
      e.setSelectionRange && e.setSelectionRange(c + a.length, d + a.length)
    },
    set: function (a) {
      this.$input.val(a)
    },
    clear: function () {
      this.set('')
    },
    focus: function () {
      this.$input.focus()
    },
    handleKeyDown: function (a) {
      this.trigger('keydown', a)
    },
    handleKeyUp: function (a) {
      this.trigger('keychange', a)
    },
    handlePaste: function (a, b) {
      b = b || {
      },
      this.trigger(b.fake ? 'paste' : 'paste keychange'),
      this.$input.trigger('resize')
    },
    handleFocusIn: function () {
      this.fixInputStructure(),
      this.trigger('focus')
    },
    handleBlur: function () {
      this.trigger('blur')
    },
    saveDraft: function () {
      if (this.storageKey) return b.trim(this.get()) ? void this.constructor.storage.set(this.storageKey, this.toJSON()) : void this.removeDraft()
    },
    toJSON: function () {
      return [this.get(),
      b.now()]
    },
    getDraft: function () {
      var a = [
        ''
      ];
      if (!this.storageKey) return a;
      var c = this.constructor.storage.get(this.storageKey);
      if (!c) return a;
      if (a = c, !a.length) return [''];
      var d = b.now() - a[1] >= this.constructor.DRAFT_MAX_AGE;
      return d ? (this.removeDraft(), [
        ''
      ]) : a
    },
    removeDraft: function () {
      this.storageKey && this.constructor.storage.remove(this.storageKey)
    },
    fixInputStructure: function () {
      var a,
      b,
      c,
      f,
      g,
      h,
      i,
      j = !1,
      k = !1,
      l = window.document,
      m = this.$input[0];
      if (m.type && 'textarea' === m.type);
       else if (d.browser.isChrome()) 0 === m.childNodes.length ? (b = m.appendChild(l.createElement('p')), b.appendChild(l.createTextNode('\n')), j = !0) : (a = m.childNodes[0], a.childNodes.forEach(function (b) {
        e.isBr(b) && a.replaceChild(l.createTextNode('\n'), b)
      }));
       else if (d.browser.isIE()) {
        if (0 === m.childNodes.length) c = l.createElement('p'),
        c.appendChild(l.createTextNode('')),
        m.appendChild(c),
        j = !0;
         else for (g = m.childNodes.length, i = 0; i < g; i++) if (e.isP(m.childNodes[i])) if (f = m.childNodes[i].childNodes.length, 0 === f) m.childNodes[i].appendChild(l.createTextNode('')),
        1 === g && (j = !0);
         else if (1 === f) e.isBr(m.childNodes[i].childNodes[0]) && (m.childNodes[i].replaceChild(l.createTextNode(''), m.childNodes[i].childNodes[0]), 1 === g && (j = !0));
         else for (; f > 0; ) h = m.childNodes[i].childNodes[0],
        1 === f && e.isBr(h) ? (m.childNodes[i].replaceChild(l.createTextNode(''), h), f -= 1) : 2 === f && e.isBr(h) && e.isText(m.childNodes[i].childNodes[1]) && this.inputFixed ? (c = l.createElement('p'), c.appendChild(l.createTextNode('')), m.insertBefore(c, m.childNodes[i]), i += 1, g += 1, m.childNodes[i].removeChild(h), f -= 2, this.selectionIndices = {
          startElemInd: i,
          endElemInd: i,
          startElemSelectionInd: 0,
          endElemSelectionInd: 0
        }, k = !0) : 2 === f && e.isText(h) && e.isBr(m.childNodes[i].childNodes[1]) ? (this.inputFixed && (c = l.createElement('p'), c.appendChild(l.createTextNode('')), i === g - 1 ? m.appendChild(c) : m.insertBefore(c, m.childNodes[i + 1]), g += 1, this.selectionIndices = {
          startElemInd: i + 1,
          endElemInd: i + 1,
          startElemSelectionInd: 0,
          endElemSelectionInd: 0
        }, k = !0), m.childNodes[i].removeChild(m.childNodes[i].childNodes[1]), f -= 2) : f > 2 && e.isText(h) && e.isBr(m.childNodes[i].childNodes[1]) ? (c = l.createElement('p'), c.appendChild(l.createTextNode(h.nodeValue)), m.insertBefore(c, m.childNodes[i]), i += 1, g += 1, m.childNodes[i].removeChild(m.childNodes[i].childNodes[1]), m.childNodes[i].removeChild(h), f -= 2) : f -= 1
      } else if (d.browser.isFirefox()) {
        if (1 === m.childNodes.length && e.isP(m.childNodes[0]) && m.childNodes[0].childNodes.length > 2) {
          for (f = m.childNodes[0].childNodes.length, i = 0; i < f; i++) h = m.childNodes[0].childNodes[i],
          e.isText(h) ? (c = l.createElement('p'), c.appendChild(l.createTextNode(h.nodeValue)), i < f - 1 && e.isBr(m.childNodes[0].childNodes[i + 1]) && (i += 1)) : e.isBr(h) && (c = l.createElement('p'), c.appendChild(l.createElement('br'))),
          m.appendChild(c);
          m.removeChild(m.childNodes[0])
        } else 1 === m.childNodes.length && e.isBr(m.childNodes[0]) ? (m.removeChild(m.childNodes[0]), c = l.createElement('p'), c.appendChild(l.createElement('br')), m.appendChild(c)) : 0 === m.childNodes.length && (c = l.createElement('p'), c.appendChild(l.createElement('br')), m.appendChild(c), j = !0);
        for (i = 0; i < m.childNodes.length; i++) {
          var n = m.childNodes[i];
          e.isP(n) && 1 === n.childNodes.length && e.isBr(n.childNodes[0]) ? n.insertBefore(l.createTextNode(''), n.childNodes[0]) : e.isDiv(n) && (c = l.createElement('p'), 1 === n.childNodes.length && e.isBr(n.childNodes[0]) ? (c.appendChild(l.createTextNode('')), c.appendChild(l.createElement('br'))) : 2 === n.childNodes.length && e.isText(n.childNodes[0]) && n.childNodes[0].nodeValue.length > 0 && e.isBr(n.childNodes[1]) && c.appendChild(l.createTextNode(n.childNodes[0].nodeValue)), m.replaceChild(c, n))
        }
      } else if (d.browser.isSafari() || d.browser.isEdge()) if (0 !== m.childNodes.length && e.isP(m.childNodes[0])) {
        for (a = m.childNodes[0], f = a.childNodes.length, i = 0; i < f; i += 1) e.isBr(a.childNodes[i]) && (0 === i || e.isBr(a.childNodes[i - 1])) && (a.insertBefore(l.createTextNode(''), a.childNodes[i]), i === f - 1 && (j = !0));
        for (i = 0; i < f - 1; i += 1) e.isText(a.childNodes[i]) && '' === a.childNodes[i].nodeValue && e.isText(a.childNodes[i + 1]) && (a.removeChild(a.childNodes[i]), i -= 1, f -= 1)
      } else {
        for (c = l.createElement('p'), c.appendChild(l.createTextNode('')), c.appendChild(l.createElement('br')); m.firstChild; ) m.removeChild(m.firstChild);
        m.appendChild(c),
        j = !0
      } else if (d.browser.isOpera()) if (0 === m.childNodes.length) c = l.createElement('p'),
      c.appendChild(l.createTextNode('\n')),
      m.appendChild(c),
      j = !0;
       else for (a = m.childNodes[0], i = 0; i < a.childNodes.length; i++) e.isBr(a.childNodes[i]) && a.replaceChild(l.createTextNode('\n'), a.childNodes[i]);
      this.inputFixed = !0,
      k ? this.selectText() : j && this.focusEndOfText()
    },
    focusEndOfText: function () {
      var a,
      b = this.$input[0],
      c = 0,
      f = 0,
      g = 0,
      h = 0;
      d.browser.isChrome() || d.browser.isOpera() ? (a = b.childNodes[0], c = f = a.childNodes.length - 1, g = h = a.childNodes[c].nodeValue.length) : d.browser.isSafari() || d.browser.isEdge() ? (a = b.childNodes[0], c = f = e.isText(a.childNodes[a.childNodes.length - 1]) ? a.childNodes.length - 1 : a.childNodes.length - 2, g = h = a.childNodes[c].nodeValue.length) : (d.browser.isFirefox() || d.browser.isIE()) && (c = f = b.childNodes.length - 1, g = b.childNodes[c].childNodes[0].nodeValue.length, h = g),
      this.selectionIndices = {
        startElemInd: c,
        startElemSelectionInd: g,
        endElemInd: f,
        endElemSelectionInd: h
      },
      this.selectText()
    },
    getWhichChildIndex: function (a, b) {
      for (var c = 0; c < a.childNodes.length; c++) if (a.childNodes[c] === b) return c;
      return - 1
    },
    getNodeLength: function (a) {
      return e.isBr(a) ? 1 : a.nodeValue.length
    },
    placeholderSetSelection: function () {
      var a,
      b,
      c = window.getSelection();
      this.$input[0].type && 'textarea' === this.$input[0].type ? (a = this.$input[0].selectionStart, b = this.$input[0].selectionEnd) : 'DIV' === c.anchorNode.tagName ? (a = 0, b = this.get().length) : 'P' === c.anchorNode.tagName ? a = b = this.get().length : (a = Math.min(c.focusOffset, c.anchorOffset), b = Math.max(c.focusOffset, c.anchorOffset)),
      this.selectionIndices = {
        start: a,
        end: b,
        endElemInd: 0,
        endElemSelectionInd: 0,
        startElemInd: 0,
        startElemSelectionInd: 0
      }
    },
    setSelection: function () {
      var a,
      b,
      c,
      f,
      g,
      h,
      i;
      this.fixInputStructure();
      var j = this.$input[0],
      k = !1,
      l = window.getSelection();
      if (j.type && 'textarea' === j.type) b = j.selectionStart,
      c = j.selectionEnd;
       else if (l.rangeCount) {
        var m = l.getRangeAt(0);
        if (d.browser.isChrome()) {
          for (a = j.childNodes[0], b = f = 0; a.childNodes[f] && a.childNodes[f] !== m.startContainer; ) e.isSpan(a.childNodes[f]) || (b += this.getNodeLength(a.childNodes[f])),
          f += 1;
          if (h = m.startOffset, b += m.startOffset, m.collapsed) g = f,
          c = b,
          i = h;
           else if (m.startContainer === m.endContainer) g = f,
          i = m.endOffset,
          c = b + (m.endOffset - m.startOffset);
           else {
            for (g = f, c = b - m.startOffset; a.childNodes[g] && a.childNodes[g] !== m.endContainer; ) e.isSpan(a.childNodes[g]) || (c += this.getNodeLength(a.childNodes[g])),
            g += 1;
            e.isNewline(a.childNodes[g]) ? (i = this.getNodeLength(a.childNodes[g - 1]), g -= 1) : (c += m.endOffset, i = m.endOffset)
          }
        } else if (d.browser.isIE()) e.isDiv(m.startContainer) && e.isDiv(m.endContainer) && m.collapsed ? (f = j.childNodes.length - 1, g = j.childNodes.length - 1, h = j.childNodes[f].childNodes[0].nodeValue.length, i = j.childNodes[g].childNodes[0].nodeValue.length, k = !0) : e.isDiv(m.startContainer) && e.isDiv(m.endContainer) && !m.collapsed ? (f = m.startOffset, g = m.endOffset - 1, h = 0, i = j.childNodes[g].childNodes[0].nodeValue.length) : e.isText(m.startContainer) && e.isText(m.endContainer) ? (f = this.getWhichChildIndex(j, m.startContainer.parentNode), g = this.getWhichChildIndex(j, m.endContainer.parentNode), h = m.startOffset, i = m.endOffset) : e.isText(m.startContainer) && e.isDiv(m.endContainer) ? (f = this.getWhichChildIndex(j, m.startContainer.parentNode), g = m.endOffset - 1, h = m.startOffset, i = j.childNodes[g].childNodes[0].nodeValue.length) : (f = 0, g = 0, h = 0, i = 0);
         else if (d.browser.isFirefox()) e.isDiv(m.startContainer) && e.isDiv(m.endContainer) && m.startContainer === j && m.endContainer === j && m.collapsed ? (f = j.childNodes.length - 1, g = j.childNodes.length - 1, h = j.childNodes[f].childNodes[0].nodeValue.length, i = j.childNodes[g].childNodes[0].nodeValue.length, k = !0) : e.isDiv(m.startContainer) && e.isDiv(m.endContainer) && m.startContainer === j && m.endContainer === j && !m.collapsed ? (f = m.startOffset, g = m.endOffset - 1, h = 0, i = j.childNodes[g].childNodes[0].nodeValue.length) : e.isDiv(m.startContainer) && e.isText(m.endContainer) && m.startContainer === j ? (f = 0, g = this.getWhichChildIndex(j, m.endContainer.parentNode), h = 0, i = m.endOffset) : e.isDiv(m.startContainer) && e.isP(m.endContainer) && m.startContainer === j ? (f = 0, g = this.getWhichChildIndex(j, m.endContainer), h = 0, i = j.childNodes[g].childNodes[0].nodeValue.length) : e.isText(m.startContainer) && e.isText(m.endContainer) ? (f = this.getWhichChildIndex(j, m.startContainer.parentNode), g = this.getWhichChildIndex(j, m.endContainer.parentNode), h = m.startOffset, i = m.endOffset) : e.isText(m.startContainer) && e.isP(m.endContainer) ? (f = this.getWhichChildIndex(j, m.startContainer.parentNode), g = this.getWhichChildIndex(j, m.endContainer), h = m.startOffset, i = f === g ? j.childNodes[g].childNodes[0].nodeValue.length : 0) : e.isP(m.startContainer) && e.isText(m.endContainer) ? (f = this.getWhichChildIndex(j, m.startContainer), g = this.getWhichChildIndex(j, m.endContainer.parentNode), h = 0, i = m.endOffset) : e.isP(m.startContainer) && e.isP(m.endContainer) ? (f = this.getWhichChildIndex(j, m.startContainer), g = this.getWhichChildIndex(j, m.endContainer), h = 0, i = j.childNodes[g].childNodes[0].nodeValue.length) : (f = 0, g = 0, h = 0, i = 0);
         else if (d.browser.isSafari() || d.browser.isEdge()) a = j.childNodes[0],
        e.isText(m.startContainer) ? (f = this.getWhichChildIndex(a, m.startContainer), h = m.startOffset) : e.isP(m.startContainer) ? (f = m.startOffset < a.childNodes.length && e.isText(a.childNodes[m.startOffset]) ? m.collapsed ? m.startOffset : m.startOffset - 2 : m.startOffset - 1, h = a.childNodes[f].nodeValue.length) : e.isDiv(m.startContainer) && (m.collapsed ? (f = e.isText(a.childNodes[a.childNodes.length - 1]) ? a.childNodes.length - 1 : a.childNodes.length - 2, h = a.childNodes[f].nodeValue.length) : (f = 0, h = 0)),
        e.isText(m.endContainer) ? (g = this.getWhichChildIndex(a, m.endContainer), i = m.endOffset) : e.isP(m.endContainer) ? (g = m.endOffset < a.childNodes.length && e.isText(a.childNodes[m.endOffset]) ? m.collapsed ? m.endOffset : m.endOffset - 2 : m.endOffset - 1 < a.childNodes.length && e.isText(a.childNodes[m.endOffset - 1]) ? m.endOffset - 1 : m.endOffset - 1 < a.childNodes.length && e.isBr(a.childNodes[m.endOffset - 1]) ? m.endOffset - 2 : a.childNodes.length - 2, i = a.childNodes[g].nodeValue.length) : e.isDiv(m.endContainer) && (g = e.isText(a.childNodes[a.childNodes.length - 1]) ? a.childNodes.length - 1 : a.childNodes.length - 2, i = a.childNodes[f].nodeValue.length);
         else {
          if (!d.browser.isOpera()) return this.placeholderSetSelection();
          a = j.childNodes[0],
          f = this.getWhichChildIndex(a, m.startContainer),
          g = this.getWhichChildIndex(a, m.endContainer),
          h = m.startOffset,
          i = m.endOffset
        }
      } else this.focusEndOfText();
      this.selectionIndices = {
        start: b,
        end: c,
        startElemInd: f,
        startElemSelectionInd: h,
        endElemInd: g,
        endElemSelectionInd: i
      },
      k && this.selectText()
    },
    addTagTextarea: function (a) {
      var b,
      c,
      d,
      e = this.selectionIndices.start,
      f = this.selectionIndices.end,
      g = this.selectionIndices.startElemInd,
      h = this.selectionIndices.endElemInd,
      i = this.selectionIndices.startElemSelectionInd,
      j = this.selectionIndices.endElemSelectionInd;
      switch (a) {
        case 'a':
          b = '<a href="#">',
          c = '</a>';
          break;
        default:
          b = '<' + a + '>',
          c = '</' + a + '>'
      }
      var k = this.get(),
      l = k.slice(0, e),
      m = k.slice(e, f),
      n = k.slice(f),
      o = new RegExp('<' + a + '[^<>]*>'),
      p = new RegExp(c + '$'),
      q = m.match(o),
      r = m.match(p);
      q && r && 0 === q.index && r.index === f - e - c.length ? (d = m.replace(o, '').replace(p, ''), f -= q[0].length + r[0].length, j -= q[0].length + r[0].length) : (d = b + m + c, f += b.length + c.length, j += b.length + c.length),
      this.selectionIndices = {
        start: e,
        end: f,
        startElemInd: g,
        endElemInd: h,
        startElemSelectionInd: i,
        endElemSelectionInd: j
      },
      this.set(l + d + n),
      this.debouncedSaveHistory(),
      this.selectText()
    },
    addTag: function (a) {
      var b,
      c,
      e,
      f,
      g,
      h,
      i,
      j,
      k,
      l,
      m,
      n,
      o,
      p = window.document,
      q = this.$input[0],
      r = this.selectionIndices.start,
      s = this.selectionIndices.end,
      t = this.selectionIndices.startElemInd,
      u = this.selectionIndices.endElemInd,
      v = this.selectionIndices.startElemSelectionInd,
      w = this.selectionIndices.endElemSelectionInd;
      switch (a) {
        case 'a':
          b = '<a href="#">',
          c = '</a>';
          break;
        default:
          b = '<' + a + '>',
          c = '</' + a + '>'
      }
      var x = new RegExp('<' + a + '[^<>]*>'),
      y = new RegExp(c + '$');
      if (q.type && 'textarea' === q.type) return this.addTagTextarea(a);
      if (d.browser.isChrome() || d.browser.isSafari() || d.browser.isOpera() || d.browser.isEdge()) k = q.childNodes[0],
      l = k.childNodes[t],
      m = k.childNodes[u],
      n = l.nodeValue,
      o = m.nodeValue,
      f = n.slice(v).match(x),
      g = o.slice(0, w).match(y),
      f && g && 0 === f.index && g.index === w - c.length ? (t === u ? (h = n.slice(0, v) + n.slice(v, w).replace(x, '').replace(y, '') + n.slice(w), k.replaceChild(p.createTextNode(h), l), w -= f[0].length + g[0].length) : (i = n.slice(0, v) + n.slice(v).replace(x, ''), j = o.slice(0, w).replace(y, '') + o.slice(w), k.replaceChild(p.createTextNode(i), l), k.replaceChild(p.createTextNode(j), m), w -= g[0].length), s -= f[0].length + g[0].length) : (t === u ? (h = n.slice(0, v) + b + n.slice(v, w) + c + n.slice(w), k.replaceChild(p.createTextNode(h), l), w += b.length + c.length) : (i = n.slice(0, v) + b + n.slice(v), j = o.slice(0, w) + c + o.slice(w), k.replaceChild(p.createTextNode(i), l), k.replaceChild(p.createTextNode(j), m), w += c.length), s += b.length + c.length);
       else if (d.browser.isFirefox() || d.browser.isIE()) {
        var z = q.childNodes[this.selectionIndices.startElemInd],
        A = q.childNodes[this.selectionIndices.endElemInd];
        l = z.childNodes[0],
        m = A.childNodes[0],
        n = l.nodeValue,
        o = m.nodeValue,
        f = n.slice(v).match(x),
        g = o.slice(0, w).match(y),
        f && g && 0 === f.index && g.index === w - c.length ? (t === u ? (h = n.slice(0, v) + n.slice(v, w).replace(x, '').replace(y, '') + n.slice(w), z.replaceChild(p.createTextNode(h), l), w -= f[0].length + g[0].length) : (i = n.slice(0, v) + n.slice(v).replace(x, ''), j = o.slice(0, w).replace(y, '') + o.slice(w), z.replaceChild(p.createTextNode(i), l), A.replaceChild(p.createTextNode(j), m), w -= g[0].length), s -= f[0].length + g[0].length) : (t === u ? (h = n.slice(0, v) + b + n.slice(v, w) + c + n.slice(w), z.replaceChild(p.createTextNode(h), l), w += b.length + c.length) : (i = n.slice(0, v) + b + n.slice(v), j = o.slice(0, w) + c + o.slice(w), z.replaceChild(p.createTextNode(i), l), A.replaceChild(p.createTextNode(j), m), w += c.length), s += b.length + c.length)
      } else {
        var B = this.get(),
        C = B.slice(0, r),
        D = B.slice(r, s),
        E = B.slice(s);
        f = D.match(x),
        g = D.match(y),
        f && g && 0 === f.index && g.index === s - r - c.length ? (e = D.replace(x, '').replace(y, ''), s = s - f[0].length - g[0].length) : (e = b + D + c, s = s + b.length + c.length),
        this.set(C + e + E)
      }
      this.debouncedSaveHistory(),
      this.selectionIndices = {
        start: r,
        end: s,
        startElemInd: t,
        startElemSelectionInd: v,
        endElemInd: u,
        endElemSelectionInd: w
      },
      this.selectText()
    },
    selectText: function () {
      var a,
      b,
      c,
      e,
      f = this.$input[0],
      g = window.document.createRange(),
      h = this.selectionIndices.start,
      i = this.selectionIndices.end,
      j = f.childNodes[0],
      k = window.getSelection();
      if (f.type && 'textarea' === f.type) f.setSelectionRange(h, i);
       else if (d.browser.isChrome() || d.browser.isSafari() || d.browser.isOpera() || d.browser.isEdge()) a = j.childNodes[this.selectionIndices.startElemInd],
      b = this.selectionIndices.startElemSelectionInd,
      c = j.childNodes[this.selectionIndices.endElemInd],
      e = this.selectionIndices.endElemSelectionInd,
      g.setStart(a, b),
      g.setEnd(c, e),
      k.removeAllRanges(),
      k.addRange(g);
       else if (d.browser.isFirefox() || d.browser.isIE()) a = f.childNodes[this.selectionIndices.startElemInd].childNodes[0],
      b = this.selectionIndices.startElemSelectionInd,
      c = f.childNodes[this.selectionIndices.endElemInd].childNodes[0],
      e = this.selectionIndices.endElemSelectionInd,
      g.setStart(a, b),
      g.setEnd(c, e),
      (!d.browser.isIE() || k.rangeCount > 0 && k.getRangeAt(0).getClientRects().length > 0) && k.removeAllRanges(),
      k.addRange(g);
       else {
        var l = j.childNodes[0];
        g.setStart(l, h),
        g.setEnd(l, i),
        k.removeAllRanges(),
        k.addRange(g)
      }(d.browser.isEdge() || f.type && 'textarea' === f.type) && this.focus()
    },
    debouncedSaveHistory: a.debounce(function () {
      var a = this.toJSON() [0];
      a !== this.history[this.historyPosition] && (this.historyPosition !== this.history.length - 1 && (this.history = this.history.slice(0, this.historyPosition + 1)), this.history.push(a), this.historyPosition += 1)
    }, 200),
    undoTextarea: function () {
      this.historyPosition > 0 && (this.historyPosition -= 1, this.set(this.history[this.historyPosition]), this.fixInputStructure(), this.focusEndOfText())
    },
    redoTextarea: function () {
      this.historyPosition < this.history.length - 1 && (this.historyPosition += 1, this.set(this.history[this.historyPosition]), this.fixInputStructure(), this.focusEndOfText())
    }
  }, {
    MAX_TEXTAREA_HEIGHT: 350,
    SAVE_DRAFT_INTERVAL: 500,
    DRAFT_MAX_AGE: 86400000,
    storage: new f(5, 'drafts.queue')
  });
  return g
}),
define('core/views/ContentEditableView', [
  'jquery',
  'underscore',
  'core/editable',
  'core/views/TextareaView'
], function (a, b, c, d) {
  'use strict';
  var e = window.document,
  f = d,
  g = f.prototype,
  h = f.extend({
    events: b.defaults({
      'focusout [data-role=editable]': 'handleFocusOut',
      'click .placeholder': 'handlePlaceholderClick'
    }, g.events),
    initialize: function () {
      g.initialize.apply(this, arguments),
      this.hasFocus = !1,
      this._selectionRange = null
    },
    saveSelection: function () {
      var a = window.getSelection();
      this._selectionRange = a && a.rangeCount && a.getRangeAt(0)
    },
    restoreSelection: function () {
      if (this._selectionRange) {
        var a = window.getSelection();
        a.removeAllRanges(),
        a.addRange(this._selectionRange),
        this._selectionRange = null
      }
    },
    render: function () {
      return this.$input = this.createInput(),
      this.$el.append(this.$input),
      this.set(this.value),
      this.renderPlaceholder(),
      this
    },
    createInput: function () {
      var b = a('<div>').attr({
        'class': 'textarea',
        tabIndex: 0,
        role: 'textbox',
        'aria-multiline': 'true',
        contenteditable: 'PLAINTEXT-ONLY',
        'data-role': 'editable'
      }).css({
        overflow: 'auto',
        'word-wrap': 'break-word',
        'max-height': this.constructor.MAX_TEXTAREA_HEIGHT + 'px'
      }),
      d = b[0];
      return 'plaintext-only' !== d.contentEditable && (d.contentEditable = 'true'),
      this.content = new c(d, (!0)),
      b
    },
    renderPlaceholder: function () {
      var b = this.placeholder;
      b && (this.$input.attr('aria-label', b), this.$placeholder = a('<span class="placeholder">' + b + '</span>'), this.updatePlaceholderDisplay())
    },
    updatePlaceholderDisplay: function () {
      this.$placeholder && (this.hasFocus || this.content.text() ? this.$placeholder.remove() : this.$el.prepend(this.$placeholder))
    },
    handlePlaceholderClick: function () {
      this.$input.focus()
    },
    handleFocusIn: function () {
      g.handleFocusIn.call(this),
      this.restoreSelection(),
      this.hasFocus = !0,
      this.updatePlaceholderDisplay()
    },
    handleFocusOut: function () {
      this.saveSelection(),
      this.hasFocus = !1,
      this.updatePlaceholderDisplay()
    },
    get: function () {
      return this.content.text()
    },
    getSelected: function () {
      return this.hasFocus && window.getSelection ? window.getSelection().toString() : this._selectionRange ? this._selectionRange.toString() : ''
    },
    offset: function () {
      return this.content.offset()
    },
    set: function (a) {
      this.content.setText(a),
      this.resize(),
      this.updatePlaceholderDisplay()
    },
    insertAtCursor: function (a) {
      this.focus();
      var b = ' ' + a + ' ';
      e.queryCommandSupported && e.queryCommandSupported('insertText') && e.execCommand('insertText', !1, b) || this.content.insertNode(e.createTextNode(b))
    },
    clear: function () {
      g.clear.call(this),
      b.defer(function (a) {
        a.$input.blur()
      }, this)
    },
    insertAroundSelection: function (a, b) {
      this.focus();
      var c = window.getSelection();
      if (c.rangeCount) {
        var d = c.getRangeAt(0),
        f = d.cloneRange();
        f.collapse(!1);
        var g = e.createTextNode(b);
        f.insertNode(g);
        var h = d.cloneRange();
        h.collapse(!0);
        var i = e.createTextNode(a);
        h.insertNode(i),
        d.setStart(i, a.length),
        d.setEnd(g, 0),
        c.removeAllRanges(),
        c.addRange(d)
      }
    }
  });
  return h
}),
define('core/views/PostReplyView', [
  'jquery',
  'underscore',
  'backbone',
  'modernizr',
  'moment',
  'core/UniqueModel',
  'core/mixins/withAlert',
  'core/mixins/withUploadForm',
  'core/models/Post',
  'core/models/User',
  'core/strings',
  'core/time',
  'core/utils',
  'core/switches',
  'core/views/ContentEditableView',
  'core/views/TextareaView',
  'core/utils/threadRatingsHelpers'
], function (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q) {
  'use strict';
  var r = k.get,
  s = m.preventDefaultHandler,
  t = c.View.extend({
    tagName: 'form',
    className: 'reply',
    events: {
      submit: 'submitForm'
    },
    postboxAlertSelector: '[role=postbox-alert]',
    initialize: function (a) {
      this.session = a.session,
      this.parent = a.parent,
      this.thread = a.thread,
      this.isRefreshEnabled = n.isFeatureActive('embed_refresh', {
        forum: this.thread && this.thread.forum && this.thread.forum.id
      }),
      this.isRefreshV2Enabled = this.isRefreshEnabled && n.isFeatureActive('embed_refresh_v2', {
        forum: this.thread && this.thread.forum && this.thread.forum.id
      }),
      this.$el.addClass(this.isRefreshEnabled ? 'form-refresh' : ''),
      this.$el.addClass(this.isRefreshV2Enabled ? 'form-refresh-v2' : ''),
      this.gifPickerEnabled = Boolean(this.thread) && Boolean(this.thread.forum) && Boolean(this.thread.forum.get('settings').gifPickerEnabled),
      this.post = this.makePostInstance(),
      this.setAlertSelector('[role=alert]'),
      this.shouldShowEmailAlertInForm = a.shouldShowEmailAlertInForm,
      this.parentView = a.parentView,
      this._isHidden = !1,
      this.parent && (t.open[this.parent.cid] = this),
      this.mediaembedEnabled = this.thread.forum.get('settings').mediaembedEnabled,
      this.allowUploads = this.mediaembedEnabled && this.uploadSupported,
      this.listenTo(this.session, 'change:id', this.redraw)
    },
    redraw: function () {
      var b = this.$el.hasClass('expanded'),
      c = this.el,
      d = this.$el.find('textarea').val();
      this.render(),
      this.$el.find('textarea').val(d),
      b && this.$el.addClass('expanded'),
      0 !== a(c).parent().length && c.parentNode.replaceChild(this.el, c)
    },
    getPlaceholderText: function () {
      return this.thread.get('posts') ? this.thread.forum.get('commentsPlaceholderTextPopulated') || r('Join the discussion…') : this.thread.forum.get('commentsPlaceholderTextEmpty') || r('Start the discussion…')
    },
    getTemplateData: function () {
      return {
        user: this.session.toJSON(),
        displayMediaPreviews: this.mediaembedEnabled || this.gifPickerEnabled,
        displayMediaUploadButton: this.allowUploads,
        gifPickerEnabled: this.gifPickerEnabled
      }
    },
    render: function () {
      return this.$el.html(this.template(this.getTemplateData())),
      this.initTextEditor(null, !0),
      this.parent ? this.$el.addClass('expanded') : this.$el.removeClass('expanded'),
      this.initTextarea(),
      this.initMediaViews({
        mediaembedEnabled: this.mediaembedEnabled,
        gifPickerEnabled: this.gifPickerEnabled,
        allowUploads: this.allowUploads,
        textarea: this.textarea
      }),
      this.constructor.mustVerifyEmailToPost(this.session.user, this.thread.forum) && this._alertMustVerify(this.shouldShowEmailAlertInForm),
      this._isHidden && this.$el.addClass('hidden'),
      this.initStarRatings(),
      this
    },
    createTextarea: function () {
      var a = {
        placeholder: this.getPlaceholderText(),
        storageKey: this.post.storageKey()
      };
      return this.constructor.canUseContentEditable ? new this.constructor.ContentEditableView(a) : new this.constructor.TextareaView(a)
    },
    initTextarea: function () {
      var a = this.textarea = this.createTextarea();
      this.$('[data-role=textarea]').prepend(a.render().el),
      this.listenTo(a, {
        keydown: function (a) {
          !a || !a.ctrlKey && !a.metaKey || 13 !== a.keyCode && 10 !== a.keyCode || this.submitForm(),
          this.session.get('banned') && this.alertBannedError()
        },
        focus: function () {
          this.$el.hasClass('expanded') || this.$el.addClass('expanded')
        }
      })
    },
    resize: function () {
      this.textarea.resize()
    },
    focus: function () {
      this.textarea.focus()
    },
    clear: function () {
      var a = this;
      a.textarea.clear(),
      a.clearMediaPreviews(),
      a.$el.removeClass('expanded'),
      b.delay(function () {
        a.resize()
      }, 200),
      a.parent && a.hide()
    },
    restore: function (a) {
      var c = this;
      c.textarea.set(a.get('raw_message')),
      c.textarea.handleFocusIn(),
      b.delay(function () {
        c.resize()
      }, 200),
      c.parent && c.show()
    },
    _alertMustVerify: function (a) {
      var b = this.emailVerifyAlertTemplate({
        user: this.session.user.toJSON(),
        forumName: this.thread.forum.get('name'),
        forumId: this.thread.forum.id
      });
      this.alert(b, {
        safe: !0,
        type: a ? 'error' : 'warn',
        target: a ? this.postboxAlertSelector : null
      })
    },
    submitForm: s(function () {
      return this.dismissAlert(),
      this.initiatePost()
    }),
    makePostInstance: function () {
      return new f(this.constructor.Post, {
        thread: this.thread.id,
        depth: this.parent ? this.parent.get('depth') + 1 : 0,
        parent: this.parent ? this.parent.id : null
      })
    },
    getPostParams: function () {
      var a = {
        raw_message: this.textarea.get(),
        rating: this.rating
      };
      b.extend(a, this.getAuthorParams());
      var c = this.mediaUploadsView;
      return c && (a.media = c.rich.invoke('toJSON')),
      a
    },
    getAuthorParams: function () {
      return {
        author_id: this.session.user.id
      }
    },
    initiatePost: function () {
      this.createPost(this.getPostParams())
    },
    createPost: function (c) {
      var d = this,
      e = this.post;
      this.dismissAlert();
      var f = a.now();
      if (!this.shouldAbortCreatePost(e, c)) return this.listenTo(e, {
        error: this._onCreateError,
        sync: b.partial(this._onCreateSync, f)
      }),
      e.save(c, {
        success: function () {
          b.isNumber(d.rating) && q.isThreadModelRatingsEnabled(d.thread) && (d.thread.set('userRating', d.rating), b.delay(b.bind(d.thread.fetchRatings, d.thread), 500))
        }
      }),
      this.attachAuthorToPost(e, c),
      e.created = !0,
      this.addPostToThread(e),
      this.clear(),
      e
    },
    shouldAbortCreatePost: function (a, b) {
      return this.isUploadInProgress() ? (this.alert(r('Please wait until your images finish uploading.'), {
        type: 'error',
        target: this.postboxAlertSelector
      }), !0) : !a.set(b, {
        validate: !0
      }) && (this.alert(a.validationError, {
        type: 'error',
        target: this.postboxAlertSelector
      }), !0)
    },
    alertBannedError: function () {
      var a = {
        blocker: this.session.user.get('isOnGlobalBlacklist') ? 'Disqus' : this.thread.forum.get('name')
      };
      if (this.session.get('banExpires')) {
        var b = e(l.assureTzOffset(this.session.get('banExpires')), l.ISO_8601);
        if (b.isBefore(e())) return;
        a.expirationRelative = b.fromNow()
      }
      this.alert(this.blacklistErrorMessageTemplate(a), {
        type: 'error',
        target: this.postboxAlertSelector,
        safe: !0
      })
    },
    _onCreateError: function (a, c) {
      12 === c.code && /not have permission to post on this thread/.test(c.response) ? this.alertBannedError() : 12 === c.code && /not have permission via SSO to post on this thread/.test(c.response) ? this.thread.forum.get('name') ? this.alert(k.interpolate(r('Please sign into %(forumName)s to comment.'), {
        forumName: this.thread.forum.get('name')
      }), {
        type: 'error',
        target: this.postboxAlertSelector
      }) : this.alert(r('Please sign into this site to comment'), {
        type: 'error',
        target: this.postboxAlertSelector
      }) : 12 === c.code && /verify/.test(c.response) ? this._alertMustVerify(!0) : b.isString(c.response) ? this.alert(c.response, {
        type: 'error',
        target: this.postboxAlertSelector
      }) : this.alert(r('Oops! We\'re having trouble posting your comment. Check your internet connection and try again.'), {
        type: 'error',
        target: this.postboxAlertSelector
      }),
      this.thread.posts.remove(a),
      this.restore(a)
    },
    _onCreateSync: function (b, c) {
      this.textarea.removeDraft(),
      this.thread.trigger('create', c),
      this.trigger('uiCallback:postCreated', c, {
        duration: a.now() - b
      }),
      this.parentView && this.parentView.toggleReplyLink(!1),
      this.stopListening(c, 'error', this._onCreateError),
      this.stopListening(c, 'sync', this._onCreateSync),
      this.post = this.makePostInstance(),
      this.trigger('domReflow')
    },
    attachAuthorToPost: function (a, b) {
      this.session.isLoggedIn() ? a.author = this.session.user : a.author = new f(this.constructor.User, {
        name: b.author_name,
        email: b.author_email
      })
    },
    addPostToThread: function (a) {
      this.thread.posts.add(a)
    },
    remove: function () {
      this.parent && delete t.open[this.parent.cid],
      c.View.prototype.remove.call(this)
    },
    toggle: function () {
      this.isOpen() ? this.hide() : this.show()
    },
    show: function () {
      var a = this;
      a._isHidden = !1,
      a.$el.removeClass('hidden'),
      a.trigger('show')
    },
    hide: function () {
      var a = this;
      a._isHidden = !0,
      a.dismissAlert(),
      a.$el.addClass('hidden'),
      a.trigger('hide')
    },
    isOpen: function () {
      return !this._isHidden
    }
  }, {
    mustVerifyEmailToPost: function (a, b) {
      if (a.isAnonymous()) return !1;
      var c = b.get('settings').mustVerifyEmail,
      d = a.get('isVerified');
      return c && !d
    },
    canUseContentEditable: d.contenteditable && !m.isMobileUserAgent() && !(window.opera && window.opera.version),
    TextareaView: p,
    ContentEditableView: o,
    User: j,
    Post: i,
    open: {
    }
  });
  return g.call(t.prototype),
  h.call(t.prototype),
  t
}),
define('constants/gifPickerConstants', [
], function () {
  'use strict';
  return {
    GIF_PICKER_CATEGORIES: {
      LEFT: [
        {
          title: 'Trending',
          gifUrl: 'https://media.giphy.com/media/WsV5AoDeKePw4/200w_d.gif',
          width: 200,
          height: 113
        },
        {
          title: 'OMG',
          gifUrl: 'https://media.giphy.com/media/5VKbvrjxpVJCM/200w_d.gif',
          width: 200,
          height: 160
        },
        {
          title: 'No',
          gifUrl: 'https://media.giphy.com/media/z5WtAAaFpnIgU/200w_d.gif',
          width: 200,
          height: 150
        },
        {
          title: 'Slow clap',
          gifUrl: 'https://media.giphy.com/media/58FMN3DmsmYta2m0aB/200w_d.gif',
          width: 200,
          height: 150
        },
        {
          title: 'Love',
          gifUrl: 'https://media.giphy.com/media/Xf7g5BjIIMun8fR14k/200w_d.gif',
          width: 200,
          height: 199
        },
        {
          title: 'Eye roll',
          gifUrl: 'https://media.giphy.com/media/sbwjM9VRh0mLm/200w_d.gif',
          width: 200,
          height: 142
        }
      ],
      RIGHT: [
        {
          title: 'Applause',
          gifUrl: 'https://media.giphy.com/media/fnK0jeA8vIh2QLq3IZ/200w_d.gif',
          width: 200,
          height: 201
        },
        {
          title: 'Agree',
          gifUrl: 'https://media.giphy.com/media/3og0ILzGlzG26yNINq/200w_d.gif',
          width: 200,
          height: 166
        },
        {
          title: 'Ok',
          gifUrl: 'https://media.giphy.com/media/mgqefqwSbToPe/200w_d.gif',
          width: 200,
          height: 150
        },
        {
          title: 'Thumbs up',
          gifUrl: 'https://media.giphy.com/media/j5QcmXoFWl4Q0/200w_d.gif',
          width: 200,
          height: 125
        },
        {
          title: 'Thumbs down',
          gifUrl: 'https://media.giphy.com/media/KUrgyFtn9bQNW/200w_d.gif',
          width: 200,
          height: 128
        },
        {
          title: 'Thank you',
          gifUrl: 'https://media.giphy.com/media/QAsBwSjx9zVKoGp9nr/200w_d.gif',
          width: 200,
          height: 144
        }
      ]
    }
  }
}),
define('templates/lounge/gifsView', [
  'react'
], function (a) {
  'use strict';
  var b = function (b) {
    return a.createElement('div', {
      className: 'gif-picker__gifs-view'
    }, a.createElement('div', {
      className: 'gif-picker__gifs-view-left'
    }, b.gifsLeft ? b.gifsLeft.map(function (b) {
      return a.createElement('div', {
        key: b.id,
        className: 'gif-picker__image',
        'data-action': 'gif-picker-image',
        'data-tag': b['default'].url,
        tabIndex: '0',
        'aria-label': b.title
      }, a.createElement('img', {
        src: b.fixedWidth200.url,
        title: b.title,
        style: {
          height: parseInt(b.fixedWidth200.height, 10) + 'px',
          width: parseInt(b.fixedWidth200.width, 10) + 'px'
        }
      }))
    }) : null), a.createElement('div', {
      className: 'gif-picker__gifs-view-right'
    }, b.gifsRight ? b.gifsRight.map(function (b) {
      return a.createElement('div', {
        key: b.fixedWidth200.url,
        className: 'gif-picker__image',
        'data-action': 'gif-picker-image',
        'data-tag': b['default'].url
      }, a.createElement('img', {
        src: b.fixedWidth200.url,
        title: b.title,
        style: {
          height: parseInt(b.fixedWidth200.height, 10) + 'px',
          width: parseInt(b.fixedWidth200.width, 10) + 'px'
        }
      }))
    }) : null))
  };
  return b
}),
define('templates/lounge/gifsCategory', [
  'react',
  'core/strings'
], function (a, b) {
  'use strict';
  var c = b.get,
  d = function (d) {
    return a.createElement('div', {
      className: 'gif-picker__gifs-view gif-picker__categories'
    }, a.createElement('div', {
      className: 'gif-picker__gifs-view-left'
    }, d.categoriesLeft ? d.categoriesLeft.map(function (d) {
      return a.createElement('div', {
        key: d.title,
        className: 'gif-picker__image',
        'data-action': 'gif-picker-category',
        'data-tag': d.title,
        tabIndex: '0',
        'aria-label': 'Collection of animated images in the category of ' + d.title
      }, a.createElement('img', {
        src: d.gifUrl,
        className: 'gif-picker__category-gif',
        style: {
          height: d.height + 'px',
          width: d.width + 'px'
        }
      }), a.createElement('div', {
        className: 'gif-picker__category-overlay'
      }), a.createElement('div', {
        className: 'gif-picker__category-title align align--middle align--center'
      }, a.createElement('b', null, b.interpolate(c('%(title)s'), {
        title: d.title
      }))))
    }) : null), a.createElement('div', {
      className: 'gif-picker__gifs-view-right'
    }, d.categoriesRight ? d.categoriesRight.map(function (d) {
      return a.createElement('div', {
        key: d.title,
        className: 'gif-picker__image',
        'data-action': 'gif-picker-category',
        'data-tag': d.title,
        tabIndex: '0',
        'aria-label': 'Collection of animated images in the category of ' + d.title
      }, a.createElement('img', {
        src: d.gifUrl,
        className: 'gif-picker__category-gif',
        style: {
          height: d.height + 'px',
          width: d.width + 'px'
        }
      }), a.createElement('div', {
        className: 'gif-picker__category-overlay'
      }), a.createElement('div', {
        className: 'gif-picker__category-title align align--middle align--center'
      }, a.createElement('b', null, b.interpolate(c('%(title)s'), {
        title: d.title
      }))))
    }) : null))
  };
  return d
}),
define('templates/lounge/gifsPopout', [
  'react',
  'core/strings'
], function (a, b) {
  'use strict';
  var c = b.get,
  d = function () {
    return a.createElement('div', {
      className: 'gif-picker__popout'
    }, a.createElement('textarea', {
      className: 'gif-picker__search-bar',
      placeholder: c('Search for gifs'),
      'data-role': 'gif-picker-input',
      wrap: 'soft',
      rows: '1'
    }), a.createElement('div', {
      className: 'gif-picker__gifs-view-container',
      'data-role': 'gifs-view-container'
    }), a.createElement('img', {
      className: 'gif-picker__powered-by',
      src: 'https://c.disquscdn.com/next/embed/assets/img/powered-by-giphy.b72f56fe31b44adb55a65c343c691d63.png'
    }))
  };
  return d
}),
define('lounge/mixins/asGifPicker', [
  'jquery',
  'underscore',
  'core/bus',
  'core/strings',
  'constants/gifPickerConstants',
  'templates/lounge/gifsView',
  'templates/lounge/gifsCategory',
  'templates/lounge/gifsPopout',
  'common/collections'
], function (a, b, c, d, e, f, g, h, i) {
  'use strict';
  var j = d.get,
  k = {
    events: {
      'mousedown  [data-role=gif-picker-toggle]': 'toggleGifPicker',
      'keydown  [data-role=gif-picker-toggle]': 'toggleGifPicker',
      'mousedown  [data-action=gif-picker-image]': 'pickGif',
      'keydown  [data-action=gif-picker-image]': 'pickGif',
      'mousedown  [data-action=gif-picker-category]': 'pickGifCategory',
      'keydown  [data-action=gif-picker-category]': 'pickGifCategory',
      'keydown    [data-role=gif-picker-input]': 'onKeydown',
      'keyup      [data-role=gif-picker-input]': 'onKeyup'
    },
    initialize: function (a, b) {
      b = b || {
      },
      a.call(this, b)
    },
    initGifPicker: function () {
      this.gifPicker = this.$('.gif-picker'),
      this.toggle = this.$('[data-role=gif-picker-toggle]'),
      this.gifsCollection = new i.GifObjectsCollection,
      this.popoutContainer = this.$('[data-role=gif-picker-popout-container]'),
      this.categories = e.GIF_PICKER_CATEGORIES,
      this.gifPickerQuery = null,
      this.rescrollToTop = 0,
      this.popoutTemplate = h({
      }),
      this.popoutContainer.html(this.popoutTemplate),
      this.renderCategoriesView(),
      this.revealGifPicker(),
      this.listenTo(this.gifsCollection, 'sync', this.syncGifsCollection)
    },
    fetchGifObjectsCollection: function (a) {
      this.gifsCollection.fetch({
        forum: this.thread.forum.id,
        query: a
      })
    },
    syncGifsCollection: function () {
      this.renderGifsView(),
      this.positionGifPickerPopout(),
      this.gifsView[0].scrollTo({
        top: this.rescrollToTop
      })
    },
    dismissGifPicker: function (b) {
      this.gifPicker.length && !this.gifPicker[0].contains(b.target) && (this.hideGifPicker(), a(window).off('mousedown', this.dismissGifPicker))
    },
    toggleGifPicker: function (a) {
      if ('keydown' === a.type) {
        var b = 13,
        c = 32;
        if (a.keyCode !== b && a.keyCode !== c) return;
        a.preventDefault()
      }
      this.popoutTemplate ? this.popoutContainer.hasClass('hidden') ? this.revealGifPicker() : this.hideGifPicker() : this.initGifPicker()
    },
    pickGif: function (a) {
      if ('keydown' === a.type) {
        if (32 !== a.keyCode && 13 !== a.keyCode) return;
        a.preventDefault()
      }
      this.textarea.set(this.textarea.get() + ' ' + a.currentTarget.getAttribute('data-tag')),
      b.delay(b.bind(function () {
        this.hideGifPicker()
      }, this), 500)
    },
    pickGifCategory: function (a) {
      if ('keydown' === a.type) {
        if (32 !== a.keyCode && 13 !== a.keyCode) return;
        a.preventDefault()
      }
      var b = a.currentTarget.getAttribute('data-tag');
      b = 'Trending' === b ? '' : d.interpolate(j('%(category)s'), {
        category: b
      }),
      this.gifPickerQuery = b,
      this.rescrollToTop = 0,
      this.fetchGifObjectsCollection(b),
      this.gifsInput.val(b)
    },
    revealGifPicker: function () {
      this.popoutContainer.removeClass('hidden'),
      a(window).on('mousedown', b.bind(this.dismissGifPicker, this)),
      this.positionGifPickerPopout(),
      this.triggerClick()
    },
    hideGifPicker: function () {
      this.popoutContainer.addClass('hidden')
    },
    onKeydown: function (a) {
      13 === a.keyCode && a.preventDefault()
    },
    onKeyup: function (a) {
      a.target.value !== this.gifPickerQuery && (this.gifPickerQuery = '' === a.target.value ? null : a.target.value, this.rescrollToTop = 0, this.debouncedSearch())
    },
    debouncedSearch: b.debounce(function () {
      this.gifPickerQuery || '' === this.gifPickerQuery ? this.fetchGifObjectsCollection(this.gifPickerQuery) : this.renderCategoriesView()
    }, 250),
    renderCategoriesView: function () {
      this.gifsCollection.reset(),
      this.gifsContainer = this.$('[data-role=gifs-view-container]'),
      this.gifsInput = this.$('[data-role=gif-picker-input]'),
      this.gifCategories ? (this.gifsContainer.html(this.gifCategories), this.gifsView = this.gifCategories) : (this.gifsContainer.html(g({
        categoriesLeft: this.categories.LEFT,
        categoriesRight: this.categories.RIGHT
      })), this.gifCategories = this.gifsView = this.gifsContainer.children())
    },
    renderGifsView: function () {
      var a = this.gifsCollection && this.gifsCollection.toJSON(),
      c = [
      ],
      d = [
      ],
      e = 0,
      g = 0;
      b.forEach(a, function (a) {
        var b = parseInt(a.fixedWidth200.height, 10) + 10;
        g >= e ? (c.push(a), e += b) : (d.push(a), g += b)
      }),
      this.gifsContainer.html(f({
        gifsLeft: c,
        gifsRight: d
      })),
      this.gifsView = this.gifsContainer.children()
    },
    positionGifPickerPopout: function () {
      var b = this,
      c = 450,
      d = 800,
      e = 0,
      f = 0,
      g = d,
      h = !1,
      i = 873,
      j = 236,
      k = 73,
      l = 20,
      m = this.toggle.outerWidth() + 2,
      n = this.popoutContainer.height() + l,
      o = this.toggle.outerHeight(),
      p = this.toggle.offset().left,
      q = this.toggle.offset().top + o - 2,
      r = a(window.document).height(),
      s = a(window.document).width();
      if (n > r || n < i && n < r && r < i ? (g = Math.min(r, i) - k, e = - q + o, f = m, h = !0) : r > i && r - q < i ? (e = r - q - Math.max(n, i) + o, f = m, h = !0) : r - q > i && (h = !0, e = o, f = Math.min(0, s - (this.toggle.offset().left + j))), s < c) {
        this.popoutContainer.find('.gif-picker__popout').css({
          padding: '4px 4px 4px'
        });
        var t = this.popoutContainer.outerWidth() - this.gifsView.outerWidth(),
        u = s - (p + t + f + 10),
        v = u / 2;
        this.popoutContainer.find('.gif-picker__image > img').each(function () {
          a(this).css({
            width: v,
            height: v * a(this).height() / a(this).width()
          })
        }),
        h = !0
      }
      h && (this.gifsView.css('maxHeight', g), this.popoutContainer.css({
        top: e,
        left: f
      })),
      this.lastScrollTop = 0,
      this.gifsView[0].onscroll = function (a) {
        var c = a.target.scrollHeight - a.target.scrollTop - g,
        d = a.target.scrollTop > b.lastScrollTop;
        b.lastScrollTop = a.target.scrollTop,
        b.rescrollToTop = a.target.scrollTop,
        d && null !== b.gifPickerQuery && c < Math.min(1000, 0.5 * g) && b.throttledOnScrollToBottom(a.target.scrollTop)
      }
    },
    throttledOnScrollToBottom: b.throttle(function () {
      this.debouncedSearch()
    }, 500, {
      trailing: !1
    }),
    triggerClick: function () {
      c.trigger('uiAction:gifsClickButton')
    },
    triggerScroll: function () {
      c.trigger('uiAction:gifsScrollToBottom')
    }
  };
  return function () {
    this.events = b.defaults({
    }, this.events, k.events),
    this.initialize = b.wrap(this.initialize, k.initialize),
    b.extend(this, b.pick(k, [
      'initGifPicker',
      'fetchGifObjectsCollection',
      'syncGifsCollection',
      'toggleGifPicker',
      'dismissGifPicker',
      'pickGif',
      'pickGifCategory',
      'revealGifPicker',
      'hideGifPicker',
      'onKeydown',
      'onKeyup',
      'debouncedSearch',
      'renderCategoriesView',
      'renderGifsView',
      'positionGifPickerPopout',
      'throttledOnScrollToBottom',
      'triggerClick',
      'triggerScroll'
    ]))
  }
}),
define('core/constants/textEditorConstants', [
  'exports'
], function (a) {
  'use strict';
  a.EDITOR_BUTTONS_ORDER = [
    'b',
    'spoiler',
    'i',
    's',
    'u',
    'a',
    'code',
    'blockquote'
  ],
  a.GIF_PICKER_BUTTON = 'gif-picker',
  a.MEDIA_UPLOADER_BUTTON = 'media-uploader'
}),
define('lounge/mixins/asTextEditor', [
  'jquery',
  'underscore',
  'core/constants/textEditorConstants'
], function (a, b, c) {
  'use strict';
  var d = {
    events: {
      'mousedown [data-action=text-editor-tag]': 'textEditorTag',
      'keydown [data-action=text-editor-tag]': 'textEditorTag',
      'mouseup   [data-action=text-editor-buttons]': 'textEditorForceSelectText',
      'mousedown [data-role=editable]': 'textEditorMouseDown',
      'keyup     [data-role=editable]': 'textEditorKeyUp',
      'keydown   [data-role=editable]': 'textEditorKeyDown'
    },
    initialize: function (c, d) {
      d = d || {
      },
      c.call(this, d),
      this.textEditorMouseUp = b.bind(this.textEditorMouseUp, this),
      this.editBox = this.el && this.el.className && this.el.className.indexOf('edit') > - 1,
      a(window).on('resize', b.bind(this.initTextEditor, this)),
      this.mostRecentPostBoxWidth = null
    },
    textEditorTag: function (a) {
      if ('keydown' === a.type) {
        var b = 13,
        c = 32;
        return void (a.keyCode !== b && a.keyCode !== c || (a.preventDefault(), this.textarea.addTag(a.currentTarget.getAttribute('data-tag'))))
      }
      this.textarea.addTag(a.currentTarget.getAttribute('data-tag'))
    },
    textEditorForceSelectText: function () {
      this.textarea.selectText()
    },
    textEditorMouseDown: function () {
      a(window).on('mouseup', this.textEditorMouseUp)
    },
    textEditorMouseUp: function () {
      a(window).off('mouseup', this.textEditorMouseUp),
      setTimeout(b.bind(this.textarea.setSelection, this.textarea), 200)
    },
    textEditorKeyUp: function () {
      this.textarea.setSelection()
    },
    textEditorKeyDown: function (a) {
      !a.ctrlKey && !a.metaKey || 'z' !== a.key && 'y' !== a.key && 'Z' !== a.key && 'Y' !== a.key ? this.textarea.debouncedSaveHistory() : (a.preventDefault(), this.textarea.debouncedSaveHistory(), 'y' === a.key || 'Y' === a.key || a.shiftKey && ('z' === a.key || 'Z' === a.key) ? this.textarea.redoTextarea() : 'z' !== a.key && 'Z' !== a.key || this.textarea.undoTextarea())
    },
    getTextEditorTemplateData: function () {
      var a = [
      ],
      b = !this.editBox && this.gifPickerEnabled,
      d = !this.editBox && this.allowUploads,
      e = this.$('.post-actions').outerWidth() || 0;
      this.mostRecentPostBoxWidth = e;
      var f = this.$('.wysiwyg__item').outerWidth(!0) || 0,
      g = (this.$('.edit-button').outerWidth() || 0) + (this.$('.post-action__cancel').outerWidth(!0) || 0),
      h = this.$('.full-size-button').outerWidth() || 0,
      i = this.$('.small-size-button').outerWidth() || 0,
      j = b || d ? this.$('.vertical-separator').outerWidth() || 30 : 0,
      k = c.EDITOR_BUTTONS_ORDER.length + (!this.editBox && this.gifPickerEnabled ? 1 : 0) + (!this.editBox && this.allowUploads ? 1 : 0),
      l = h + j + (k + 1) * f >= e,
      m = l ? i : h,
      n = this.editBox ? g : m,
      o = Math.floor((e - n - j) / f) || 0;
      return b && o > a.length && (a = a.concat([c.GIF_PICKER_BUTTON])),
      o > a.length && (a = a.concat(c.EDITOR_BUTTONS_ORDER.slice(0, 1))),
      d && o > a.length && (a = a.concat([c.MEDIA_UPLOADER_BUTTON])),
      o > a.length && (a = a.concat(c.EDITOR_BUTTONS_ORDER.slice(1, o - a.length))),
      {
        user: this.session.toJSON(),
        displayMediaPreviews: this.mediaembedEnabled || this.gifPickerEnabled,
        displayMediaUploadButton: this.allowUploads,
        gifPickerEnabled: this.gifPickerEnabled,
        useSmallPostButton: l,
        buttonsToShow: a,
        edit: this.editBox,
        forum: this.thread.forum.id
      }
    },
    initTextEditor: function (a, b) {
      var c = this.$('.post-actions').outerWidth();
      if (!(a && 'resize' === a.type && this.mostRecentPostBoxWidth && c && c === this.mostRecentPostBoxWidth)) return this.$('.text-editor-container').html(this.textEditorTemplate(this.getTextEditorTemplateData())),
      b && null === c ? void this.initTextEditor(null, !1) : void (!this.editBox && this.textarea && this.initMediaViews({
        mediaembedEnabled: this.mediaembedEnabled,
        gifPickerEnabled: this.gifPickerEnabled,
        allowUploads: this.allowUploads,
        textarea: this.textarea
      }))
    }
  };
  return function () {
    this.events = b.defaults({
    }, this.events, d.events),
    this.initialize = b.wrap(this.initialize, d.initialize),
    b.extend(this, b.pick(d, [
      'textEditorTag',
      'textEditorForceSelectText',
      'textEditorMouseDown',
      'textEditorMouseUp',
      'textEditorKeyUp',
      'textEditorKeyDown',
      'getTextEditorTemplateData',
      'initTextEditor'
    ]))
  }
}),
define('lounge/mixins/asTextEditorV2', [
  'underscore',
  'core/strings',
  'core/switches'
], function (a, b, c) {
  'use strict';
  var d = b.translations,
  e = [
  ];
  Object.defineProperties(window, {
    _loadTextEditor: {
      writable: !0
    },
    loadTextEditor: {
      get: function () {
        return this._loadTextEditor
      },
      set: function (a) {
        for (this._loadTextEditor = a; e.length; ) {
          var b = e.shift();
          b()
        }
      }
    }
  });
  var f = {
    initialize: function (a, b) {
      a.call(this, b),
      this.isEmbedV2Enabled = c.isFeatureActive('embed_v2', {
        forum: this.thread.forum.id
      })
    },
    loadEditorV2: function (b) {
      var c = this.$el.find('[data-role=textarea]') [0],
      f = a.extend({
        forum: this.thread.forum.id,
        thread: this.thread.id,
        lang: this.thread.forum.get('language'),
        translations: d,
        setAlert: a.partial(this.alert, a, a, !0).bind(this),
        clearAlert: this.alert.bind(this, '', null, !0),
        key: this.post && this.post.cid
      }, b),
      g = function () {
        var a = this.editorV2Root && this.editorV2Root._internalRoot && this.editorV2Root._internalRoot.containerInfo === c;
        this.editorV2Root && !a ? (this.editorV2Root.unmount(), this.editorV2Root = window.loadTextEditor(c, f)) : this.editorV2Root = window.loadTextEditor(c, f, this.editorV2Root)
      };
      window.loadTextEditor ? g.call(this) : e.push(g.bind(this))
    },
    resize: function (a) {
      this.isEmbedV2Enabled || a.call(this)
    },
    focus: function (a) {
      this.isEmbedV2Enabled || a.call(this)
    },
    initTextEditor: function (a) {
      this.isEmbedV2Enabled || a.call(this)
    },
    remove: function (a) {
      this.editorV2Root && (this.editorV2Root.unmount(), this.editorV2Root = null),
      a.call(this)
    },
    alert: function (a, b, c, d) {
      c = c || {
      };
      var e = '[role=postbox-alert]' === this._alertSelector || '[role=postbox-alert]' === c.target;
      if (!this.isEmbedV2Enabled || !d && !e) return a.call(this, b, c);
      var f = this.getEditorProps ? this.getEditorProps() : {
      };
      f.alert = {
        message: b,
        type: c.type,
        safe: c.safe
      },
      this.loadEditorV2(f)
    }
  };
  return function () {
    this.initialize = a.wrap(this.initialize, f.initialize),
    this.resize = a.wrap(this.resize, f.resize),
    this.focus = a.wrap(this.focus, f.focus),
    this.remove = a.wrap(this.remove, f.remove),
    this.alert = a.wrap(this.alert, f.alert),
    this.initTextEditor = a.wrap(this.initTextEditor, f.initTextEditor),
    a.extend(this, a.pick(f, [
      'loadEditorV2'
    ]))
  }
}),
define('templates/lounge/rate', [
  'react',
  'core/strings'
], function (a, b) {
  'use strict';
  var c = b.gettext,
  d = function (b) {
    return a.createElement('div', {
      className: 'ratings-rate'
    }, a.createElement('div', {
      className: 'ratings-text'
    }, c(b.submitted ? 'You rated this' : 'Rate and comment')), a.createElement('div', {
      className: 'ratings-stars'
    }, a.createElement('div', {
      className: 'stars animation-star-container'
    }, a.createElement('div', {
      className: 'animation-star'
    }, a.createElement('div', {
      className: 'rating-star'
    }, '★'), a.createElement('div', {
      className: 'rating-star'
    }, '★'), a.createElement('div', {
      className: 'rating-star'
    }, '★'), a.createElement('div', {
      className: 'rating-star'
    }, '★'), a.createElement('div', {
      className: 'rating-star'
    }, '★'))), b.selected ? a.createElement('div', {
      className: 'stars selection-stars',
      style: {
        width: 20 * b.selectedValue + '%'
      }
    }, a.createElement('div', {
      className: 'rating-star'
    }, '★'), a.createElement('div', {
      className: 'rating-star'
    }, '★'), a.createElement('div', {
      className: 'rating-star'
    }, '★'), a.createElement('div', {
      className: 'rating-star'
    }, '★'), a.createElement('div', {
      className: 'rating-star'
    }, '★')) : null, a.createElement('div', {
      className: 'stars voting-stars'
    }, a.createElement('div', {
      className: 'rating-star',
      'data-action': 'rateThread',
      'data-tag': '1',
      tabIndex: '0'
    }, '★'), a.createElement('div', {
      className: 'rating-star',
      'data-action': 'rateThread',
      'data-tag': '2',
      tabIndex: '0'
    }, '★'), a.createElement('div', {
      className: 'rating-star',
      'data-action': 'rateThread',
      'data-tag': '3',
      tabIndex: '0'
    }, '★'), a.createElement('div', {
      className: 'rating-star',
      'data-action': 'rateThread',
      'data-tag': '4',
      tabIndex: '0'
    }, '★'), a.createElement('div', {
      className: 'rating-star',
      'data-action': 'rateThread',
      'data-tag': '5',
      tabIndex: '0'
    }, '★')), a.createElement('div', {
      className: 'stars base-stars'
    }, a.createElement('div', {
      className: 'rating-star'
    }, '★'), a.createElement('div', {
      className: 'rating-star'
    }, '★'), a.createElement('div', {
      className: 'rating-star'
    }, '★'), a.createElement('div', {
      className: 'rating-star'
    }, '★'), a.createElement('div', {
      className: 'rating-star'
    }, '★'))))
  };
  return d
}),
define('lounge/mixins/withStarRatings', [
  'underscore',
  'core/strings',
  'core/utils/threadRatingsHelpers',
  'templates/lounge/rate'
], function (a, b, c, d) {
  'use strict';
  var e = b.gettext,
  f = 13,
  g = {
    events: {
      'click     [data-action=rateThread]': 'rateThread',
      'keydown   [data-action=rateThread]': function (a) {
        a.keyCode && a.keyCode === f && (a.preventDefault(), this.rateThread(a))
      },
      'mouseover [data-action=rateThread]': 'highlightRating',
      'mouseout  [data-action=rateThread]': 'unhighlightRating',
      'focusin   [data-action=rateThread]': 'highlightRating',
      'focusout  [data-action=rateThread]': 'unhighlightRating'
    },
    initialize: function (a, b) {
      b = b || {
      },
      a.call(this, b),
      this.rateTemplate = d,
      this.rating = null,
      this.ratingsEnabled = !this.post.get('parent') && c.isThreadModelRatingsEnabled(this.thread),
      this.listenTo(this.thread, 'change', function () {
        var a = this.thread.changedAttributes();
        return void 0 !== a.ratingsEnabled ? (this.ratingsEnabled = !this.post.get('parent') && c.isThreadModelRatingsEnabled(this.thread), this.initStarRatings(this.thread.get('userRating'))) : a.userRating && a.userRating !== this.rating ? this.initStarRatings(a.userRating) : void 0
      }),
      this.listenToOnce(this.thread.forum, 'change:features', function () {
        return this.ratingsEnabled = !this.post.get('parent') && c.isThreadModelRatingsEnabled(this.thread),
        this.initStarRatings(this.thread.get('userRating'))
      })
    },
    initStarRatings: function (b) {
      if (!this.ratingsEnabled) {
        var c = this.$('[data-role=ratings-container]');
        return void (c.length && this.$('[data-role=ratings-container]').empty())
      }
      return this.rating = a.isNumber(b) ? b : this.thread.get('userRating'),
      this.$('[data-role=ratings-container]').html(this.rateTemplate({
        selected: a.isNumber(this.rating),
        submitted: Boolean(this.thread.get('userRating')),
        selectedValue: this.rating
      }))
    },
    rateThread: function (a) {
      var b = this,
      c = parseInt(a.currentTarget.getAttribute('data-tag'), 10);
      Promise.resolve(this.initStarRatings(c)).then(function () {
        var a = b.$('.animation-star-container'),
        d = b.$('.animation-star-container > .animation-star');
        d.children().slice(c).remove(),
        a.addClass('animate-star'),
        d.css({
          position: 'absolute',
          left: '0',
          width: 20 * c + '%'
        }),
        setTimeout(function () {
          a.removeClass('animate-star')
        }, 500)
      }).then(function () {
        return b.textarea.focus()
      }).then(function () {
        return !b.postEditMode && b.alert(e('Please post a comment to submit your rating.'), {
          type: 'info',
          target: b.postboxAlertSelector
        })
      })
    },
    highlightRating: function (a) {
      this.$(a.currentTarget).addClass('selected-star'),
      this.$(a.currentTarget).prevAll().addClass('selected-star')
    },
    unhighlightRating: function (a) {
      this.$(a.currentTarget).removeClass('selected-star'),
      this.$(a.currentTarget).prevAll().removeClass('selected-star')
    }
  };
  return function () {
    this.events = a.defaults({
    }, this.events, g.events),
    this.initialize = a.wrap(this.initialize, g.initialize),
    a.extend(this, a.pick(g, [
      'initStarRatings',
      'rateThread',
      'highlightRating',
      'unhighlightRating'
    ]))
  }
}),
define('lounge/mixins/post-reply', [
  'underscore',
  'common/models',
  'lounge/common'
], function (a, b, c) {
  'use strict';
  var d = {
    initialize: function () {
      this.canBindTypingHandlers() && this.bindTypingHandlers()
    },
    canBindTypingHandlers: function () {
      return this.parent && c.getLounge().isRealtimeEnabled() && this.session && this.thread && this.thread.forum
    },
    bindTypingHandlers: function () {
      return a.map([[this,
      'show',
      this.typingStart],
      [
        this,
        'hide',
        this.typingStop
      ]], function (a) {
        return this.listenTo.apply(this, a),
        a
      }, this)
    },
    syncTyping: function (a) {
      this.typingUser && (void 0 !== a && this.typingUser.set('typing', a), this.typingUser.sync())
    },
    typingStart: function () {
      var a = this.parent;
      this.typingUser || (this.typingUser = b.TypingUser.make({
        user: this.session.user.id,
        post: a.id,
        thread: this.thread.id,
        forum: this.thread.forum.id
      }), a.usersTyping.add(this.typingUser)),
      this.syncTyping(!0)
    },
    typingStop: function () {
      this.syncTyping(!1)
    }
  },
  e = function (b) {
    var c = b.initialize,
    e = b.remove;
    a.extend(b, d),
    b.initialize = function () {
      c.apply(this, arguments),
      d.initialize.call(this)
    },
    b.remove = function () {
      return this.parent && this.typingStop(),
      e.call(this)
    }
  };
  return {
    asRealtimeTyping: e
  }
}),
define('templates/lounge/suggestions', [
  'react',
  'core/strings'
], function (a, b) {
  'use strict';
  var c = b.gettext,
  d = function () {
    return a.createElement('ul', {
      className: 'user-mention__list',
      id: 'user-mention-list'
    }, a.createElement('li', {
      className: 'header user-mention__header'
    }, a.createElement('h5', null, c('in this conversation'))))
  };
  return d
}),
define('templates/lounge/suggestedUser', [
  'react',
  'core/strings',
  'core/utils/object/get'
], function (a, b, c) {
  'use strict';
  var d = b.gettext,
  e = function (b) {
    return a.createElement('li', {
      className: 'user-mention__item',
      'data-cid': b.cid || ''
    }, a.createElement('img', {
      src: c(b.avatar, [
        'cache'
      ], ''),
      className: 'avatar',
      alt: d('Avatar')
    }), a.createElement('span', null, b.name || b.username || null))
  };
  return e
}),
define('lounge/views/posts/SuggestionView', [
  'jquery',
  'underscore',
  'backbone',
  'templates/lounge/suggestions',
  'templates/lounge/suggestedUser'
], function (a, b, c, d, e) {
  'use strict';
  var f = c.View.extend({
    events: {
      'click li': 'handleClick'
    },
    initialize: function (a) {
      this.active = !1,
      this.userSuggestions = a.userSuggestions,
      this.scrollListener = null,
      this.userHtmlCache = {
      },
      this.userSuggestions && this.userSuggestions.userCollection && this.listenTo(this.userSuggestions.userCollection, 'sync', this.syncUserCollection)
    },
    syncUserCollection: function () {
      this.active && (this.userSuggestions.userCollection.models.length ? this.renderUsers(this.userSuggestions.userCollection.models) : this.clear())
    },
    suggest: function (a, b) {
      return a ? (this.userSuggestions.find(a, b), this.currTerms = a, this.active = !0, void this.$el.show()) : void this.clear()
    },
    throttledSuggestMore: b.throttle(function () {
      this.suggest(this.currTerms, !0)
    }, 200, {
      trailing: !1
    }),
    render: function () {
      var a = this;
      return this.$el.html(d()),
      this.active || this.$el.hide(),
      this.scrollListener || (this.scrollListener = this.$el.find('#user-mention-list') [0].onscroll = function (b) {
        b.target.scrollHeight - b.target.scrollTop === b.target.clientHeight && a.throttledSuggestMore()
      }),
      this
    },
    renderUsers: function (c) {
      var d = b.reduce(c, function (b, c) {
        var d = this.userHtmlCache[c.cid];
        return void 0 === d && (this.userHtmlCache[c.cid] = d = a(this.renderSingleUser(c))),
        b.appendChild(d[0]),
        b
      }, window.document.createDocumentFragment(), this);
      this.$('.header').siblings().remove().end().after(d).siblings().removeClass('active').first().addClass('active')
    },
    renderSingleUser: function (a) {
      var b = a.toJSON();
      return b.cid = a.cid,
      e(b)
    },
    clear: function () {
      this.active = !1,
      this.$el.hide()
    },
    handleClick: function (b) {
      var c = a(b.currentTarget);
      this.select(c.attr('data-cid'))
    },
    select: function (a) {
      this.active && (a || (a = this.$el.find('.active').attr('data-cid')), this.trigger('select', a), this.clear())
    },
    move: function (a) {
      if (this.active) {
        var b = this.$el.find('.active'),
        c = 'up' === a ? 'prev' : 'next',
        d = b[c]();
        d.length && d.attr('data-cid') && (b.removeClass('active'), d.addClass('active'))
      }
    }
  }, {
    MAX_SUGGESTIONS: 5
  });
  return f
}),
define('lounge/views/posts/ContentEditableView', [
  'jquery',
  'underscore',
  'core/editable',
  'core/views/ContentEditableView',
  'common/collections',
  'lounge/common',
  'lounge/views/posts/SuggestionView'
], function (a, b, c, d, e, f, g) {
  'use strict';
  var h = window.document,
  i = d,
  j = i.prototype,
  k = i.extend({
    initialize: function (a) {
      j.initialize.call(this, a),
      a = a || {
      },
      this.userSuggestions = a.userSuggestions,
      this.mentionsCache = new e.UserCollection,
      this.restoreMentionedUsers(),
      this.suggestions = new g({
        userSuggestions: this.userSuggestions,
        mentions: this.mentionsCache
      }),
      this.listenTo(this.suggestions, 'select', this.insertMention),
      this.reset(),
      this.$input = null
    },
    restoreMentionedUsers: function () {
      var a = this.getDraft() [2];
      a && !b.isEmpty(a) && this.userSuggestions.addRemote(new e.UserCollection(a))
    },
    reset: function () {
      this.anchorNode = null,
      this.anchorOffset = null,
      this.anchorLength = 0,
      this.suggestions.clear()
    },
    render: function () {
      return d.prototype.render.call(this),
      this.$el.append(this.suggestions.render().el),
      this
    },
    createInput: function () {
      var a = d.prototype.createInput.call(this);
      return this.content.getHtmlElements = b.bind(this.getHtmlElements, this),
      a
    },
    getHtmlElements: function (a) {
      if (!a) return a;
      var c = [
        a
      ],
      d = this.getMentionNodes(a);
      return b.each(d, function (a, d) {
        for (var e = 0; e < c.length; e++) {
          var f,
          g = c[e],
          h = e;
          if (b.isString(g)) {
            for (; (f = g.indexOf(d)) > - 1; ) f > 0 && (c.splice(e, 0, g.substring(0, f)), e += 1),
            c.splice(e, 0, a.cloneNode(!0)),
            e += 1,
            g = g.substring(f + d.length);
            g && g !== c[h] && (c.splice(e, 0, g), e += 1),
            h !== e && c.splice(e, 1)
          }
        }
      }),
      c = b.map(c, function (a) {
        return b.isString(a) ? h.createTextNode(a) : a
      })
    },
    getMentionNodes: function (a) {
      var b = k.MENTIONS_RE_GROUPED,
      c = {
      };
      b.lastIndex = 0;
      for (var d = b.exec(a); d; ) {
        var e = d[1],
        f = this.userSuggestions.all().findWhere({
          username: e
        });
        if (f) {
          var g = k.getMentionDom(f),
          h = d[0];
          c[h] = g,
          this.updateCache(f, f.cid)
        }
        d = b.exec(a)
      }
      return c
    },
    handleKeyDown: function (a) {
      switch (d.prototype.handleKeyDown.call(this, a), a.keyCode) {
        case 9:
          this.suggestions.active && (this.suggestions.select(), a.preventDefault(), a.stopPropagation());
          break;
        case 10:
        case 13:
        case 38:
        case 40:
          this.suggestions.active && (a.preventDefault(), a.stopPropagation())
      }
    },
    handleKeyUp: function (a) {
      switch (d.prototype.handleKeyUp.call(this, a), a.preventDefault(), a.stopPropagation(), this.setSelection(), this.checkExistingMentions(), a.keyCode) {
        case 10:
        case 13:
          this.suggestions.select();
          break;
        case 27:
          this.reset(a);
          break;
        case 38:
          this.suggestions.move('up');
          break;
        case 40:
          this.suggestions.move('down');
          break;
        default:
          this.throttledSuggest(a)
      }
    },
    handleFocusIn: function () {
      var a = f.getLounge();
      a && this.$input && this.$input.on('transitionend webkitTransitionEnd oTransitionEnd otransitionend MSTransitionEnd resize', function () {
        a.resize()
      }),
      j.handleFocusIn.call(this)
    },
    suggest: function () {
      var a = this.parseSearchTerms();
      this.suggestions.suggest(a)
    },
    throttledSuggest: b.throttle(function () {
      this.suggest()
    }, 250),
    insertMention: function (a) {
      var c = this.userSuggestions.get(a);
      if (c) {
        this.selectSearchString(c),
        this.updateCache(c, a);
        var d = k.getMentionDom(c);
        this.content.insertNode(d);
        var e = this.$el.find('span[data-cid]');
        b.each(e, function (a) {
          a.contentEditable !== !1 && (a.contentEditable = !1)
        })
      }
    },
    updateCache: function (a, b) {
      this.mentionsCache.get(b) || this.mentionsCache.add(a)
    },
    selectSearchString: function () {
      this.content.selectNodeText(this.anchorNode, this.anchorOffset - 1, this.anchorOffset + this.anchorLength)
    },
    get: function () {
      function a(a) {
        return c(a, !0) ? b.mentionToText(a) : null
      }
      var b = this,
      c = k.isMention;
      return this.content.text(a)
    },
    parseSearchTerms: function () {
      var a = this.content.selectedTextNode(),
      b = a ? a.nodeValue : '',
      d = c.normalizeSpace;
      if (b) {
        var e = this.content.selectedTextNodeOffset(a),
        f = c.normalizeSpace(b.slice(0, e).split('').reverse().join('')),
        g = f.indexOf('@');
        if (g === - 1) return null;
        this.anchorNode = a,
        this.anchorOffset = e - g,
        this.anchorLength = g;
        var h = d(b.slice(this.anchorOffset - 1, e)).match(k.MENTIONS_RE);
        return h ? h[0].slice(1).split(' ') : 0 === g ? [
          ''
        ] : void 0
      }
    },
    checkExistingMentions: function () {
      var d = c.normalizeSpace,
      e = this.$el.find('span'),
      f = b.filter(e, k.isMention),
      g = this.mentionsCache,
      h = {
      };
      b.each(f, function (c) {
        var e = a(c).attr('data-cid'),
        f = b.reduce(this.content.getTextNodes(c), function (a, b) {
          return a + d(b.nodeValue)
        }, ''),
        i = g.get(e);
        i && i.get('name') !== f ? (this.mentionsCache.remove(i), this.content.removeNode(c), this.content.insertHTML(' '), this.reset()) : h[e] = c
      }, this),
      g.each(function (a) {
        h[a.cid] || g.remove(a)
      })
    },
    mentionToText: function (b) {
      var c = a(b).attr('data-cid'),
      d = this.mentionsCache.get(c),
      e = b.innerText || b.textContent;
      return d && d.get('username') && (e = d.get('username')),
      [
        '@',
        e,
        ':',
        'disqus'
      ].join('')
    },
    toJSON: function () {
      var a = d.prototype.toJSON.call(this);
      return a.push(this.mentionsCache.models),
      a
    }
  }, {
    MENTIONS_RE: new RegExp('@\\w+\\s?(?:\\w+\\s?){0,5}(?:\\w+)?$'),
    MENTIONS_RE_GROUPED: /@([\d\w]+)\s?(:\s?(\w+))?/gi,
    isMention: function (b, c) {
      var d;
      do {
        if (d = a(b), d.hasClass('mention') && d.attr('data-cid')) return !0;
        b = b.parentElement
      } while (c && b);
      return !1
    },
    getMentionDom: function (a) {
      var b = h.createDocumentFragment(),
      c = h.createElement('span'),
      d = h.createElement('span'),
      e = h.createTextNode(a.get('name') || a.get('username'));
      return c.setAttribute('contenteditable', !0),
      d.setAttribute('contenteditable', !1),
      d.setAttribute('data-cid', a.cid),
      d.className = 'mention',
      d.appendChild(e),
      c.appendChild(d),
      b.appendChild(c),
      b.appendChild(h.createTextNode(' ')),
      b
    }
  });
  return k
}),
define('lounge/views/posts/DummyTextareaView', [
  'backbone',
  'core/CappedStorage',
  'core/extensions/jquery.autoresize'
], function (a, b) {
  'use strict';
  var c = a.View.extend({
    initialize: function (a) {
      a = a || {
      },
      this.storageKey = a.storageKey,
      this.value = a.value,
      this.history = [
        this.value
      ],
      this.historyPosition = 0,
      this.placeholder = a.placeholder,
      this.selectionIndices = {
        start: 0,
        end: 0,
        endElemInd: 0,
        endElemSelectionInd: 0,
        startElemInd: 0,
        startElemSelectionInd: 0
      },
      this.inputFixed = !1
    },
    render: function () {
      return this
    },
    createInput: function () {
    },
    resize: function () {
    },
    get: function () {
    },
    getSelected: function () {
    },
    offset: function () {
    },
    insertAtCursor: function () {
    },
    insertAroundSelection: function () {
    },
    set: function () {
    },
    clear: function () {
    },
    focus: function () {
    },
    handleKeyDown: function () {
    },
    handleKeyUp: function () {
    },
    handlePaste: function () {
    },
    handleFocusIn: function () {
    },
    handleBlur: function () {
    },
    saveDraft: function () {
    },
    toJSON: function () {
    },
    getDraft: function () {
    },
    removeDraft: function () {
    },
    fixInputStructure: function () {
    },
    focusEndOfText: function () {
    },
    getWhichChildIndex: function () {
    },
    getNodeLength: function () {
    },
    placeholderSetSelection: function () {
    },
    setSelection: function () {
    },
    addTagTextarea: function () {
    },
    addTag: function () {
    },
    selectText: function () {
    },
    debouncedSaveHistory: function () {
    },
    undoTextarea: function () {
    },
    redoTextarea: function () {
    }
  }, {
    MAX_TEXTAREA_HEIGHT: 350,
    SAVE_DRAFT_INTERVAL: 500,
    DRAFT_MAX_AGE: 86400000,
    storage: new b(5, 'drafts.queue')
  });
  return c
}),
define('core/views/common/LoginFormView', [
  'underscore',
  'backbone',
  'core/strings'
], function (a, b, c) {
  'use strict';
  var d = c.get,
  e = b.View.extend({
    initialize: function () {
      this.model = new this.User
    },
    parseRegistrationErrorResponse: function (a) {
      if (a.responseJSON) {
        var b = a.responseJSON.response;
        return window.grecaptcha && window.grecaptcha.reset(),
        /Unable to create user/i.test(b) ? {
          email: [
            d('That email address is already registered with a Disqus account. Log in or enter another email.')
          ]
        }
         : /The e-mail address you specified is already in use./i.test(b) ? {
          email: [
            d('The e-mail address you specified is already in use.') + '<br><a class="link" href="#" data-action="auth:disqus">' + d('Try logging in.') + '</a>'
          ]
        }
         : (/You must re-submit this request with a response to the captcha challenge/i.test(b) && this.showCaptcha && this.showCaptcha(null, !0), {
          all: [
            b
          ]
        })
      }
    },
    getPassword: function () {
      var a = this.$el.find('input[name=password]');
      return a.length ? a.val() : null
    },
    getDisplayName: function () {
      return this.$el.find('input[name=display_name]').val()
    },
    getEmail: function () {
      return this.$el.find('input[name=email]').val()
    },
    disableForm: function () {
      this.$('[data-role=submit-btn-container]').addClass('is-submitting')
    },
    enableForm: function () {
      this.$('[data-role=submit-btn-container]').removeClass('is-submitting')
    },
    handleRegistrationErrorResponse: function (a) {
      this.handleRegistrationError(this.parseRegistrationErrorResponse(a))
    },
    registerUser: function () {
      return this.model.set({
        display_name: this.$el.find('input[name=display_name]').val(),
        email: this.$el.find('input[name=email]').val(),
        password: this.getPassword()
      }),
      this.model.isValid() ? (this.disableForm(), void this.model.register({
        gRecaptchaResponse: this.captchaShown && window.grecaptcha && window.grecaptcha.getResponse(),
        error: a.bind(this.handleRegistrationErrorResponse, this),
        success: a.bind(this.handleRegistrationSuccess, this)
      }).always(a.bind(this.enableForm, this))) : void this.handleRegistrationError(this.model.validationError)
    }
  });
  return e
}),
define('templates/lounge/partials/audienceSync', [
  'react',
  'core/config/urls',
  'core/strings'
], function (a, b, c) {
  'use strict';
  var d = c.gettext,
  e = function (c) {
    return a.createElement('div', {
      className: 'audiencesync'
    }, a.createElement('h6', null, d('Connect with %(forumName)s', {
      forumName: c.forumName
    })), a.createElement('div', {
      className: 'services'
    }, a.createElement('div', {
      className: 'audiencesync__icons'
    }, a.createElement('img', {
      className: 'icon',
      alt: 'Disqus',
      src: 'https://c.disquscdn.com/next/embed/assets/img/audiencesync/sync-icon.74333606cf6b545eb92a69a61b112481.png'
    }), a.createElement('i', {
      className: 'icon icon-proceed'
    }), a.createElement('img', {
      className: 'icon',
      alt: c.forumName,
      src: (b.root || '') + '/api/applications/icons/' + (c.apiKey || '') + '.png'
    })), a.createElement('p', null, d('%(forumName)s needs permission to access your account.', {
      forumName: c.forumName
    }))), a.createElement('button', {
      type: 'button',
      'data-action': 'audiencesync',
      className: 'proceed btn submit'
    }, d('Next')))
  };
  return e
}),
define('templates/lounge/partials/guestForm', [
  'react',
  'core/strings',
  'core/utils/object/get'
], function (a, b, c) {
  'use strict';
  var d = b.gettext,
  e = function () {
    return a.createElement('div', {
      className: 'acceptance-wrapper'
    }, a.createElement('label', null, a.createElement('input', {
      type: 'checkbox',
      name: 'tos'
    }), a.createElement('span', {
      className: 'spacing-left-small'
    }, d('I agree to Disqus\' %(terms)s', {
      terms: a.createElement('a', {
        href: 'https://help.disqus.com/customer/portal/articles/466260-terms-of-service',
        target: '_blank',
        rel: 'noopener noreferrer'
      }, d('Terms of Service'))
    }))), a.createElement('label', null, a.createElement('input', {
      type: 'checkbox',
      name: 'privacy-policy'
    }), a.createElement('span', {
      className: 'spacing-left-small'
    }, d('I consent to Disqus’ processing of my personal data, in accordance with its %(policy)s and %(terms)s, (including the use of strictly necessary cookies) to the extent needed to authenticate me and enable me to post comments or use other Disqus services. I acknowledge that my personal data will be processed in the United States', {
      policy: a.createElement('a', {
        href: 'https://disqus.com/privacy-policy',
        target: '_blank',
        rel: 'noopener noreferrer'
      }, d('Privacy Policy')),
      terms: a.createElement('a', {
        href: 'https://help.disqus.com/customer/portal/articles/466260-terms-of-service',
        target: '_blank',
        rel: 'noopener noreferrer'
      }, d('Terms of Service'))
    }))), a.createElement('label', null, a.createElement('input', {
      type: 'checkbox',
      name: 'data-sharing'
    }), a.createElement('span', {
      className: 'spacing-left-small'
    }, d('I consent to Disqus collecting, using, and disclosing my personal data for marketing purposes, including the use of tracking cookies for cross context behavioral advertising. My personal data may be transferred to the companies listed %(dataRecipients)s. I may withdraw my consent at any time by clicking %(policy)s', {
      policy: a.createElement('a', {
        href: 'https://disqus.com/data-sharing-settings/',
        target: '_blank',
        rel: 'noopener noreferrer'
      }, d('here')),
      dataRecipients: a.createElement('a', {
        href: 'https://help.disqus.com/en/articles/1944034-cookies-and-data-recipients',
        target: '_blank',
        rel: 'noopener noreferrer'
      }, d('here'))
    }))))
  },
  f = function (b) {
    var f = b.isRefreshEnabled,
    g = f ? 'sign-up-wrapper-refresh' : '',
    h = f ? 'guest guest--refresh' : 'guest',
    i = f ? 'guest-form-title guest-form-title--refresh' : 'guest-form-title';
    return a.createElement('div', {
      className: h
    }, a.createElement('div', {
      className: g
    }, a.createElement('h6', {
      className: i
    }, a.createElement('span', {
      className: 'register-text'
    }, ' ', d('or sign up with Disqus'), ' '), a.createElement('span', {
      className: 'guest-text'
    }, ' ', d('or pick a name'), ' ')), ' ', a.createElement('button', {
      type: 'button',
      className: 'help-tooltip__wrapper help-icon',
      name: 'guest_tooltip',
      tabIndex: 0
    }, a.createElement('div', {
      id: 'rules',
      className: 'help-tooltip__container',
      'data-role': 'guest-form-tooltip'
    }, a.createElement('div', {
      className: 'tooltip show help-tooltip'
    }, a.createElement('h3', {
      className: 'help-tooltip__heading'
    }, d('Disqus is a discussion network')), a.createElement('ul', {
      className: 'help-tooltip__list'
    }, a.createElement('li', null, a.createElement('span', null, d('Don\'t be a jerk or do anything illegal. Everything is easier that way.')))), a.createElement('p', {
      className: 'clearfix'
    }, a.createElement('a', {
      href: 'https://docs.disqus.com/kb/terms-and-policies/',
      className: 'btn btn-small help-tooltip__button',
      rel: 'noopener noreferrer',
      target: '_blank'
    }, d('Read full terms and conditions'))))))), a.createElement('p', {
      className: 'input-wrapper'
    }, a.createElement('input', {
      dir: 'auto',
      type: 'text',
      placeholder: d('Name'),
      name: 'display_name',
      id: (b.cid || '') + '_display_name',
      maxLength: '30',
      className: 'input--text',
      'aria-label': 'name'
    })), a.createElement('div', {
      className: 'guest-details ' + (c(b.sso, [
        'url'
      ]) ? 'expanded' : ''),
      'data-role': 'guest-details'
    }, a.createElement('p', {
      className: 'input-wrapper'
    }, a.createElement('input', {
      dir: 'auto',
      type: 'email',
      placeholder: d('Email'),
      name: 'email',
      id: (b.cid || '') + '_email',
      className: 'input--text',
      'aria-label': 'email'
    })), a.createElement('p', {
      className: 'input-wrapper'
    }, a.createElement('input', {
      dir: 'auto',
      disabled: !c(b.sso, [
        'url'
      ]),
      type: c(b.sso, [
        'url'
      ]) ? 'password' : 'text',
      className: 'register-text input--text',
      placeholder: d('Password'),
      name: 'password',
      'aria-label': 'password',
      id: (b.cid || '') + '_password'
    })), b.isPrivate ? a.createElement(e, null) : a.createElement('p', {
      className: 'privacy-info'
    }, a.createElement('div', null, d('By clicking submit, I authorize Disqus, Inc. and its affiliated companies to'), ':'), a.createElement('div', null, a.createElement('ul', {
      className: 'privacy-info-list'
    }, a.createElement('li', null, d('Use, sell, and share my information to enable me to use its comment services and for marketing purposes, including cross-context behavioral advertising, as described in our %(terms)s and %(policy)s', {
      policy: a.createElement('a', {
        href: 'https://disqus.com/privacy-policy',
        target: '_blank',
        rel: 'noopener noreferrer'
      }, d('Privacy Policy')),
      terms: a.createElement('a', {
        href: 'https://help.disqus.com/customer/portal/articles/466260-terms-of-service',
        target: '_blank',
        rel: 'noopener noreferrer'
      }, d('Terms of Service'))
    })), a.createElement('li', null, d('Supplement the information that I provide with additional information lawfully obtained from other sources, like demographic data from public sources, interests inferred from web page views, or other data relevant to what might interest me, like past purchase or location data')), a.createElement('li', null, d('Contact me or enable others to contact me by email with offers for goods and services (from any category) at the email address provided')), a.createElement('li', null, d('Process any sensitive personal information that I submit in a comment for the purpose of displaying the comment')), a.createElement('li', null, d('Retain my information while I am engaging with marketing messages that I receive and for a reasonable amount of time thereafter. I understand I can opt out at any time through an email that I receive.  Companies that we share data with are listed %(dataRecipients)s.', {
      dataRecipients: a.createElement('a', {
        href: 'https://help.disqus.com/en/articles/1944034-cookies-and-data-recipients',
        target: '_blank',
        rel: 'noopener noreferrer'
      }, d('here'))
    }))))), b.allowAnonPost ? a.createElement('div', {
      className: 'guest-checkbox'
    }, a.createElement('label', null, a.createElement('input', {
      type: 'checkbox',
      name: 'author-guest'
    }), ' ', d('I\'d rather post as a guest'))) : a.createElement('input', {
      type: 'checkbox',
      name: 'author-guest',
      style: {
        display: 'none'
      }
    }), a.createElement('div', {
      className: 'g-recaptcha',
      'data-role': 'grecaptcha-container'
    }), a.createElement('div', {
      className: 'proceed',
      'data-role': 'submit-btn-container'
    }, b.allowAnonPost ? a.createElement('div', null, a.createElement('button', {
      type: 'submit',
      className: 'proceed__button btn submit',
      'aria-label': d('Post')
    }, a.createElement('span', {
      className: 'icon-proceed'
    }), a.createElement('div', {
      className: 'spinner'
    })), a.createElement('button', {
      type: 'submit',
      className: 'proceed__button btn next',
      'aria-label': d('Next')
    }, a.createElement('span', {
      className: 'icon-proceed'
    }), a.createElement('div', {
      className: 'spinner'
    }))) : a.createElement('button', {
      type: 'submit',
      className: 'proceed__button btn submit',
      'aria-label': d('Next')
    }, a.createElement('span', {
      className: 'icon-proceed'
    }), a.createElement('div', {
      className: 'spinner'
    })))))
  };
  return f
}),
define('templates/lounge/partials/loginButtons', [
  'react',
  'core/utils/object/get'
], function (a, b) {
  'use strict';
  var c = function (c) {
    return a.createElement('ul', {
      'data-role': 'login-menu',
      className: 'services login-buttons'
    }, b(c.sso, [
      'url'
    ]) ? a.createElement('li', {
      className: 'sso'
    }, a.createElement('button', {
      type: 'button',
      'data-action': 'auth:sso',
      title: b(c.sso, [
        'name'
      ], ''),
      className: 'sso__button ' + (b(c.sso, [
        'button'
      ]) ? 'image' : 'no-image')
    }, b(c.sso, [
      'button'
    ]) ? a.createElement('img', {
      alt: b(c.sso, [
        'name'
      ], ''),
      src: b(c.sso, [
        'button'
      ], '')
    }) : b(c.sso, [
      'name'
    ], null))) : null, a.createElement('li', {
      className: 'auth-disqus'
    }, a.createElement('button', {
      type: 'button',
      'data-action': 'auth:disqus',
      title: 'Disqus',
      className: 'connect__button',
      'aria-label': 'Login with Disqus'
    }, a.createElement('i', {
      className: 'icon-disqus'
    }))), a.createElement('li', {
      className: 'auth-facebook'
    }, a.createElement('button', {
      type: 'button',
      'data-action': 'auth:facebook',
      title: 'Facebook',
      className: 'connect__button',
      'aria-label': 'Login with Facebook'
    }, a.createElement('i', {
      className: 'icon-facebook-circle'
    }))), a.createElement('li', {
      className: 'auth-twitter'
    }, a.createElement('button', {
      type: 'button',
      'data-action': 'auth:twitter',
      title: 'X (Twitter)',
      className: 'connect__button',
      'aria-label': 'Login with X (Twitter)'
    }, a.createElement('i', {
      className: 'icon-twitter-x'
    }))), a.createElement('li', {
      className: 'auth-google'
    }, a.createElement('button', {
      type: 'button',
      'data-action': 'auth:google',
      title: 'Google',
      className: 'connect__button',
      'aria-label': 'Login with Google'
    }, a.createElement('i', {
      className: 'icon-google-plus-circle'
    }))), a.createElement('li', {
      className: 'auth-microsoft'
    }, a.createElement('button', {
      type: 'button',
      'data-action': 'auth:microsoft',
      title: 'Microsoft',
      className: 'connect__button',
      'aria-label': 'Login with Microsoft'
    })), a.createElement('li', {
      className: 'auth-apple'
    }, a.createElement('button', {
      type: 'button',
      'data-action': 'auth:apple',
      title: 'Apple',
      className: 'connect__button',
      'aria-label': 'Login with Apple'
    })))
  };
  return c
}),
define('templates/lounge/loginForm', [
  'react',
  'core/strings',
  'core/switches',
  'core/utils/object/get',
  'templates/lounge/partials/audienceSync',
  'templates/lounge/partials/guestForm',
  'templates/lounge/partials/loginButtons'
], function (a, b, c, d, e, f, g) {
  'use strict';
  var h = b.gettext,
  i = function (b) {
    var i = b.forumName,
    j = c.isFeatureActive('embed_refresh', {
      forum: i
    }),
    k = j ? 'connect__heading' : '';
    return a.createElement('div', null, d(b.user, [
      'isAnonymous'
    ]) ? a.createElement('section', {
      className: 'auth-section logged-out__display'
    }, a.createElement('div', {
      className: 'connect'
    }, a.createElement('h6', {
      className: k
    }, h('Log in with')), a.createElement(g, {
      sso: b.sso
    })), a.createElement(f, {
      cid: b.cid,
      sso: b.sso,
      allowAnonPost: b.allowAnonPost,
      isPrivate: b.isPrivate,
      captcha_site_key: b.captcha_site_key,
      isRefreshEnabled: j
    })) : null, b.audienceSyncRequired ? a.createElement('section', {
      className: 'auth-section'
    }, a.createElement(e, {
      apiKey: b.apiKey,
      forumName: b.forumName
    })) : null)
  };
  return i
}),
define('lounge/views/posts/LoginFormView', [
  'underscore',
  'jquery',
  'remote/config',
  'core/bus',
  'core/api',
  'core/views/common/LoginFormView',
  'common/models',
  'lounge/common',
  'templates/lounge/loginForm'
], function (a, b, c, d, e, f, g, h, i) {
  'use strict';
  var j = f.extend({
    events: {
      'click input[name=author-guest]': 'updateLoginForm',
      'focusin input[name=display_name]': 'expandGuestForm',
      'change input[name=tos], input[name=privacy-policy]': 'updateEnabled',
      'keyup input[name=display_name]': 'showCaptcha',
      'click button[name=guest_tooltip]': 'toggleGuestFormTooltip'
    },
    User: g.User,
    initialize: function (b) {
      f.prototype.initialize.call(this, b),
      this.thread = b.thread,
      this.session = b.session,
      this.alert = b.alert,
      this.config = a.property('config') (h.getLounge()) || {
      }
    },
    expandGuestForm: function () {
      this.$('[data-role=guest-details]').hasClass('expanded') || (this.$('[data-role=guest-details]').addClass('expanded'), this.$('input[name=password]').attr('type', 'password').removeAttr('disabled'), this.$('[name=display_name]').focus())
    },
    retractGuestForm: function () {
      this.$('[data-role=guest-details]').hasClass('expanded') && this.$('[data-role=guest-details]').removeClass('expanded')
    },
    toggleGuestFormTooltip: function () {
      this.$('[data-role=guest-form-tooltip]').hasClass('expanded') ? this.$('[data-role=guest-form-tooltip]').removeClass('expanded') : this.$('[data-role=guest-form-tooltip]').addClass('expanded')
    },
    showCaptcha: function (d, e) {
      !this.captchaShown && this.$('input[name=display_name]').val().trim().length && (c.register.ENABLE_CAPTCHA || e) && (window.onCaptchaChange = a.bind(this.updateEnabled, this), window.onCaptchaLoad = a.bind(function () {
        window.grecaptcha && (this.captchaId = window.grecaptcha.render(this.$('[data-role=grecaptcha-container]') [0], {
          sitekey: this.session.getRecaptchaKey(),
          callback: 'onCaptchaChange',
          'expired-callback': 'onCaptchaChange'
        }), this.updateEnabled(), a.delay(function () {
          b('iframe[title^="recaptcha challenge"]').parent().parent().addClass('recaptcha-challenge-container')
        }, 1000))
      }, this), b('<script>').attr('src', 'https://www.google.com/recaptcha/api.js?onload=onCaptchaLoad&render=explicit').appendTo(b('head')), this.captchaShown = !0)
    },
    shouldRegisterUser: function () {
      return this.session.isLoggedOut() && !this.$('input[name=author-guest]').is(':checked')
    },
    render: function () {
      return this.$el.html(i({
        user: this.session.toJSON(),
        forumName: this.thread.forum.get('name'),
        audienceSyncRequired: this.session.needsAudienceSyncAuth(this.thread.forum),
        allowAnonPost: this.thread.forum.get('settings').allowAnonPost,
        apiKey: this.config.apiKey || '',
        sso: this.session.get('sso'),
        cid: this.cid,
        isPrivate: Boolean(this.config.isPrivate)
      })),
      this.updateEnabled(),
      this
    },
    updateEnabled: function () {
      this.$el.closest('form').find('button[type=submit]').attr('disabled', Boolean(this.config.isPrivate) && (!this.$('input[name=tos]').prop('checked') || !this.$('input[name=privacy-policy]').prop('checked')) || Boolean(this.captchaShown && window.grecaptcha && !window.grecaptcha.getResponse(this.captchaId)))
    },
    handleRegistrationSuccess: function () {
      var a = this.$('input[name=data-sharing]');
      a.length && e.call('internal/users/setDNT', {
        method: 'POST',
        data: {
          value: a.prop('checked') ? 0 : 1
        }
      }),
      this.session.setUser(this.model),
      d.frame.trigger('onboardAlert.show'),
      this.retractGuestForm()
    },
    handleRegistrationError: function (b) {
      var c = this;
      c.clearRegistrationErrors(),
      a.isString(b) && (b = {
        all: [
          b
        ]
      }),
      a.has(b, 'all') && (c.alert && c.alert(b.all[0], {
        type: 'error'
      }), b = a.omit(b, 'all')),
      a.each(b, function (a, b) {
        var d = c.$('input[name=' + b + ']');
        d.attr('aria-invalid', 'true').attr('aria-labelledby', 'label-for-' + d.attr('id')).after('<label for="' + d.attr('id') + '" id="label-for-' + d.attr('id') + '" class="input-label">' + a[0] + '</label>').parent('.input-wrapper').addClass('has-error')
      }),
      c.$('[aria-invalid]').first().focus()
    },
    updateLoginForm: function () {
      var a = this.$el,
      b = a.find('input[name=author-guest]').is(':checked'),
      c = a.find('.guest'),
      d = a.find('input[name=password]');
      d.val(''),
      c.toggleClass('is-guest', b),
      this.clearRegistrationErrors()
    },
    clearRegistrationErrors: function () {
      this.$('.input-wrapper.has-error').removeClass('has-error').find('.input-label').remove(),
      this.$('[aria-invalid]').removeAttr('aria-invalid')
    }
  });
  return j
});
var _extends = Object.assign || function (a) {
  for (var b = 1; b < arguments.length; b++) {
    var c = arguments[b];
    for (var d in c) Object.prototype.hasOwnProperty.call(c, d) && (a[d] = c[d])
  }
  return a
};
define('templates/lounge/partials/profileLink', [
  'react',
  'core/switches',
  'core/utils/object/get'
], function (a, b, c) {
  'use strict';
  var d = function (d) {
    var e = d.children,
    f = d.user,
    g = d.forumId,
    h = d.profileTab,
    i = _objectWithoutProperties(d, [
      'children',
      'user',
      'forumId',
      'profileTab'
    ]),
    j = c(f, [
      'isSSOProfileUrl'
    ]);
    if (!j && b.isFeatureActive('sso_less_branding', {
      forum: g
    })) return a.createElement('span', i, e);
    var k = c(f, [
      'profileUrl'
    ], ''),
    l = 'profile';
    return j ? l = null : k && h && (k = '' + k + h),
    a.createElement('a', _extends({
      href: k,
      'data-action': l,
      'data-tab': h || '',
      'data-username': c(f, [
        'username'
      ], ''),
      target: '_blank',
      rel: 'noopener noreferrer'
    }, i), e)
  };
  return d
}),
define('templates/lounge/partials/userAvatar', [
  'react',
  'core/strings',
  'core/switches',
  'core/utils',
  'core/utils/object/get',
  'templates/lounge/partials/profileLink'
], function (a, b, c, d, e, f) {
  'use strict';
  var g = b.gettext,
  h = d.getInitials,
  i = function (b) {
    var d = b.defaultAvatarUrl,
    i = b.forum,
    j = b.user,
    k = b.hasForumAvatar,
    l = c.isFeatureActive('embed_refresh', {
      forum: i.id
    }),
    m = l && c.isFeatureActive('embed_refresh_v2', {
      forum: i.id
    }),
    n = l ? 'user user--refresh' : 'user',
    o = void 0,
    p = e(i, [
      'avatar',
      'large',
      'cache'
    ], '');
    return void 0 === j.avatar.isCustom || j.avatar.isCustom === !0 ? o = e(j, [
      'avatar',
      'cache'
    ], '') : l ? l && k && (o = p) : o = p ? p : d,
    a.createElement(f, {
      user: j,
      forumId: i.id,
      className: n
    }, o ? a.createElement('img', {
      'data-role': 'user-avatar',
      'data-user': e(j, [
        'id'
      ], ''),
      src: d || o,
      'data-src': d ? o : null,
      alt: g('Avatar'),
      className: l ? 'image-refresh' : null
    }) : a.createElement('div', null, m ? h(j.name) [0] : h(j.name)))
  };
  return i
}),
define('templates/lounge/form', [
  'react',
  'core/strings',
  'core/switches',
  'core/utils',
  'core/utils/object/get',
  'templates/lounge/partials/userAvatar'
], function (a, b, c, d, e, f) {
  'use strict';
  var g = b.gettext,
  h = function (b) {
    var h = b.forum.id,
    i = c.isFeatureActive('embed_refresh', {
      forum: h
    }),
    j = c.isFeatureActive('embed_v2', {
      forum: h
    }),
    k = i ? 'textarea-outer-wrapper textarea-outer-wrapper--refresh' : 'textarea-outer-wrapper',
    l = i ? 'user user--refresh' : 'user',
    m = i ? 'image-refresh' : '',
    n = !d.isDefaultAvatar(e(b.forum, [
      'avatar',
      'large',
      'cache'
    ], ''));
    return a.createElement('div', {
      className: 'postbox'
    }, a.createElement('div', {
      role: 'alert'
    }), a.createElement('div', {
      className: 'ratings-wrapper',
      'data-role': 'ratings-container'
    }), a.createElement('div', {
      className: 'compose-wrapper'
    }, a.createElement('div', {
      className: 'avatar'
    }, e(b.user, [
      'isRegistered'
    ]) ? a.createElement(f, {
      forum: b.forum,
      user: b.user,
      hasForumAvatar: n
    }) : a.createElement('span', {
      className: l
    }, i && !n ? a.createElement('div', null, 'G') : a.createElement('img', {
      'data-role': 'user-avatar',
      src: e(b.forum, [
        'avatar',
        'large',
        'cache'
      ], ''),
      alt: g('Avatar'),
      className: m
    }))), a.createElement('div', {
      className: k
    }, j ? a.createElement('div', {
      className: 'textarea-wrapper textarea-wrapper--embedv2',
      'data-role': 'textarea',
      dir: 'auto'
    }, a.createElement('div', {
      className: 'textarea-skeleton'
    })) : a.createElement('div', {
      className: 'textarea-wrapper',
      'data-role': 'textarea',
      dir: 'auto'
    }, a.createElement('div', {
      'data-role': 'drag-drop-placeholder',
      className: 'media-drag-hover',
      style: {
        display: 'none'
      }
    }, a.createElement('div', {
      className: 'drag-text'
    }, '⬇ ', g('Drag and drop your images here to upload them.'))), b.displayMediaPreviews ? a.createElement('div', {
      className: 'media-preview empty',
      'data-role': 'media-preview'
    }) : null, a.createElement('div', {
      className: 'edit-alert',
      role: 'postbox-alert'
    }), a.createElement('div', {
      className: 'text-editor-container'
    })))), a.createElement('div', {
      'data-role': 'login-form'
    }))
  };
  return h
}),
define('templates/lounge/textEditor', [
  'react',
  'core/constants/textEditorConstants',
  'core/strings',
  'core/switches',
  'core/utils/object/get'
], function (a, b, c, d, e) {
  'use strict';
  var f = c.gettext,
  g = function (b) {
    var c = b.forum,
    g = d.isFeatureActive('embed_refresh', {
      forum: c
    }),
    h = function () {
      return g ? b.useSmallPostButton ? 'hidden' : '' : e(b.user, [
        'isRegistered'
      ]) && !b.useSmallPostButton ? '' : 'hidden'
    };
    return a.createElement('div', {
      className: 'temp-post'
    }, a.createElement('button', {
      type: 'submit',
      className: 'btn post-action__button full-size-button ' + h()
    }, g ? f('Comment') : f('Post as %(name)s', {
      name: a.createElement('span', {
        'data-username': e(b.user, [
          'username'
        ], ''),
        'data-role': 'username'
      }, e(b.user, [
        'name'
      ], null))
    })), a.createElement('button', {
      type: 'submit',
      className: 'btn post-action__button small-size-button' + (e(b.user, [
        'isRegistered'
      ]) && b.useSmallPostButton ? '' : ' hidden')
    }, f(g ? 'Comment' : 'Post')))
  },
  h = function (b) {
    return a.createElement('div', {
      className: 'logged-in'
    }, a.createElement('section', null, b.edit ? a.createElement('div', {
      className: 'temp-post'
    }, a.createElement('button', {
      className: 'btn post-action__button edit-button',
      type: 'submit'
    }, f('Save Edit')), a.createElement('a', {
      className: 'cancel post-action__cancel',
      href: '#',
      'data-action': 'edit'
    }, f('Cancel'))) : a.createElement(g, b)))
  },
  i = function (c) {
    return a.createElement('div', {
      className: 'wysiwyg'
    }, c.buttonsToShow.indexOf(b.GIF_PICKER_BUTTON) > - 1 ? a.createElement('div', {
      className: 'gif-picker'
    }, a.createElement('div', {
      className: 'wysiwyg__item',
      'data-role': 'gif-picker-toggle',
      title: f('GIF'),
      'aria-label': 'Open GIF menu',
      tabIndex: '0'
    }, a.createElement('div', {
      className: 'wysiwyg__gif',
      title: f('GIF'),
      role: 'img'
    })), a.createElement('div', {
      className: 'hidden gif-picker__popout-container',
      'data-role': 'gif-picker-popout-container'
    }), a.createElement('div', {
      className: 'new-feature-badge-star',
      title: f('New')
    }, a.createElement('div', {
      className: 'wysiwyg__star-badge wysiwyg__star-badge-dims'
    }))) : null, c.buttonsToShow.indexOf(b.MEDIA_UPLOADER_BUTTON) > - 1 ? a.createElement('div', {
      className: 'media-uploader'
    }, a.createElement('li', {
      className: 'wysiwyg__item',
      'data-role': 'media-uploader',
      tabIndex: '-1'
    })) : null, (c.buttonsToShow.indexOf(b.GIF_PICKER_BUTTON) > - 1 || c.buttonsToShow.indexOf(b.MEDIA_UPLOADER_BUTTON) > - 1) && c.buttonsToShow.length > 1 ? a.createElement('div', {
      className: 'vertical-separator'
    }) : null, a.createElement('div', {
      'data-action': 'text-editor-buttons'
    }, a.createElement('div', {
      className: 'wysiwyg__item' + (c.buttonsToShow.indexOf('b') > - 1 ? '' : ' hidden'),
      'data-action': 'text-editor-tag',
      'data-tag': 'b',
      tabIndex: '0',
      'aria-label': 'Add bold tags to text editor'
    }, a.createElement('div', {
      className: 'wysiwyg__bold',
      title: f('Bold'),
      role: 'img'
    })), a.createElement('div', {
      className: 'wysiwyg__item' + (c.buttonsToShow.indexOf('i') > - 1 ? '' : ' hidden'),
      'data-action': 'text-editor-tag',
      'data-tag': 'i',
      tabIndex: '0',
      'aria-label': 'Add italics tags to text editor'
    }, a.createElement('div', {
      className: 'wysiwyg__italic',
      title: f('Italic'),
      role: 'img'
    })), a.createElement('div', {
      className: 'wysiwyg__item' + (c.buttonsToShow.indexOf('u') > - 1 ? '' : ' hidden'),
      'data-action': 'text-editor-tag',
      'data-tag': 'u',
      tabIndex: '0',
      'aria-label': 'Add underline tags to text editor'
    }, a.createElement('div', {
      className: 'wysiwyg__underline',
      title: f('Underline'),
      role: 'img'
    })), a.createElement('div', {
      className: 'wysiwyg__item' + (c.buttonsToShow.indexOf('s') > - 1 ? '' : ' hidden'),
      'data-action': 'text-editor-tag',
      'data-tag': 's',
      tabIndex: '0',
      'aria-label': 'Add strikethrough tags to text editor'
    }, a.createElement('div', {
      className: 'wysiwyg__strikethrough',
      title: f('Strikethrough'),
      role: 'img'
    })), a.createElement('div', {
      className: 'wysiwyg__item' + (c.buttonsToShow.indexOf('a') > - 1 ? '' : ' hidden'),
      'data-action': 'text-editor-tag',
      'data-tag': 'a',
      tabIndex: '0',
      'aria-label': 'Add link tags to text editor'
    }, a.createElement('div', {
      className: 'wysiwyg__link',
      title: f('Link'),
      role: 'img'
    })), a.createElement('div', {
      className: 'wysiwyg__item' + (c.buttonsToShow.indexOf('spoiler') > - 1 ? '' : ' hidden'),
      'data-action': 'text-editor-tag',
      'data-tag': 'spoiler',
      tabIndex: '0',
      'aria-label': 'Add spoiler tags to text editor'
    }, a.createElement('div', {
      className: 'wysiwyg__spoiler',
      title: f('Spoiler'),
      role: 'img'
    })), a.createElement('div', {
      className: 'wysiwyg__item' + (c.buttonsToShow.indexOf('code') > - 1 ? '' : ' hidden'),
      'data-action': 'text-editor-tag',
      'data-tag': 'code',
      tabIndex: '0',
      'aria-label': 'Add code tags to text editor'
    }, a.createElement('div', {
      className: 'wysiwyg__code',
      title: f('Code'),
      role: 'img'
    })), a.createElement('div', {
      className: 'wysiwyg__item' + (c.buttonsToShow.indexOf('blockquote') > - 1 ? '' : ' hidden'),
      'data-action': 'text-editor-tag',
      'data-tag': 'blockquote',
      tabIndex: '0',
      'aria-label': 'Add block quote tags to text editor'
    }, a.createElement('div', {
      className: 'wysiwyg__blockquote',
      title: f('Quote'),
      role: 'img'
    }))))
  },
  j = function (b) {
    return a.createElement('div', {
      className: 'post-actions'
    }, a.createElement(i, b), a.createElement(h, b))
  };
  return j
}),
define('templates/lounge/blacklistErrorMessage', [
  'react',
  'core/strings'
], function (a, b) {
  'use strict';
  var c = b.gettext,
  d = function (b) {
    return [b.expirationRelative ? c('We are unable to post your comment because %(blocker)s has placed your account in a timeout. You will be able to comment again when your timeout expires %(expirationRelative)s.', {
      blocker: b.blocker,
      expirationRelative: b.expirationRelative
    }) : c('We are unable to post your comment because you have been banned by %(blocker)s.', {
      blocker: b.blocker
    }),
    ' ',
    a.createElement('a', {
      key: 'error-link',
      target: '_blank',
      href: 'https://help.disqus.com/customer/portal/articles/466223-who-deleted-or-removed-my-comment-'
    }, c('Find out more.'))]
  };
  return d
}),
define('templates/lounge/emailVerifyAlert', [
  'react',
  'core/strings',
  'core/utils/object/get'
], function (a, b, c) {
  'use strict';
  var d = b.gettext,
  e = function (b) {
    return [d('%(forumName)s requires you to verify your email address before posting.', {
      forumName: b.forumName
    }),
    ' ',
    a.createElement('a', {
      key: 'alert-link',
      'data-action': 'verify-email',
      'data-forum': b.forumId,
      title: d('Verify Email'),
      href: '/verify'
    }, d('Send verification email to %(email)s', {
      email: c(b.user, [
        'email'
      ], '')
    }))]
  };
  return e
}),
define('lounge/views/posts/PostReplyView', [
  'jquery',
  'underscore',
  'react',
  'react-dom/server',
  'core/utils',
  'core/bus',
  'core/switches',
  'core/views/PostReplyView',
  'common/models',
  'lounge/mixins/asGifPicker',
  'lounge/mixins/asTextEditor',
  'lounge/mixins/asTextEditorV2',
  'lounge/mixins/withStarRatings',
  'lounge/mixins/post-reply',
  'lounge/common',
  'lounge/views/posts/ContentEditableView',
  'lounge/views/posts/DummyTextareaView',
  'lounge/views/posts/LoginFormView',
  'templates/lounge/form',
  'templates/lounge/textEditor',
  'templates/lounge/blacklistErrorMessage',
  'templates/lounge/emailVerifyAlert'
], function (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v) {
  'use strict';
  var w = e.preventDefaultHandler,
  x = h,
  y = x.prototype,
  z = x.extend({
    initialize: function (a) {
      y.initialize.call(this, a),
      this.listenTo(this.session, 'change:audienceSyncVerified', this.redraw),
      this.userSuggestions = a.userSuggestions,
      this.loginFormView = new r({
        thread: this.thread,
        session: this.session,
        alert: b.bind(this.alert, this)
      });
      var e = o.getLounge();
      b.each(['uiCallback:postCreated',
      'domReflow'], function (a) {
        this.listenTo(this, a, b.bind(e.trigger, e, a))
      }, this),
      this.template = s,
      this.textEditorTemplate = t,
      this.blacklistErrorMessageTemplate = function (a) {
        return d.renderToStaticMarkup(c.createElement(u, a))
      },
      this.emailVerifyAlertTemplate = function (a) {
        return d.renderToStaticMarkup(c.createElement(v, a))
      },
      this.postEditMode = !1
    },
    getTemplateData: function () {
      var a = y.getTemplateData.call(this);
      return a.audienceSyncRequired = this.session.needsAudienceSyncAuth(this.thread.forum),
      a.forum = this.thread.forum.toJSON(),
      a
    },
    getEditorProps: function () {
      return {
        placeholder: this.getPlaceholderText(),
        allowUploads: this.allowUploads,
        gifPickerEnabled: this.gifPickerEnabled,
        focusOnLoad: Boolean(this.parent),
        onSubmit: this.submitForm.bind(this, null),
        draftKey: 'v2:' + this.post.storageKey()
      }
    },
    render: function () {
      return this.loginFormView.$el.detach(),
      this.isEmbedV2Enabled ? (this.$el.html(this.template(this.getTemplateData())), this.loadEditorV2(this.getEditorProps()), this.textarea = new q, this.constructor.mustVerifyEmailToPost(this.session.user, this.thread.forum) && this._alertMustVerify(this.shouldShowEmailAlertInForm), this._isHidden && this.$el.addClass('hidden'), this.initStarRatings()) : y.render.call(this),
      this.loginFormView.render(),
      this.loginFormView.$el.appendTo(this.$('[data-role=login-form]')),
      this.session.user.id ? this.$el.addClass('authenticated') : this.$el.removeClass('authenticated'),
      this
    },
    createTextarea: function () {
      var a = {
        placeholder: this.getPlaceholderText(),
        storageKey: this.post.storageKey()
      };
      return this.constructor.canUseContentEditable ? (a.userSuggestions = this.userSuggestions, new this.constructor.ContentEditableView(a)) : new this.constructor.TextareaView(a)
    },
    getPostParams: function (c) {
      var d = a.Deferred(),
      e = y.getPostParams.call(this);
      return b.isString(c) && (e.raw_message = c),
      g.isFeatureActive('before_comment_callback', {
        forum: this.thread.forum.id
      }) ? (f.frame.sendHostMessage('posts.beforeCreate', {
        raw_message: e.raw_message
      }), this.listenToOnce(f.frame, 'posts.beforeCreate.response', function (a) {
        a && (e.raw_message = a),
        d.resolve(e)
      })) : d.resolve(e),
      d.promise()
    },
    getAuthorParams: function () {
      return this.session.isLoggedIn() ? {
        author_id: this.session.user.id
      }
       : {
        author_name: this.loginFormView.getDisplayName(),
        author_email: this.loginFormView.getEmail()
      }
    },
    initiatePost: function (a) {
      var c = b.bind(this.createPost, this);
      this.getPostParams(a).done(c)
    },
    shouldAbortCreatePost: function (a, c) {
      return this.constructor.mustVerifyEmailToPost(this.session.user, this.thread.forum) ? (this.session.fetch().always(b.bind(function () {
        this.constructor.mustVerifyEmailToPost(this.session.user, this.thread.forum) ? this._alertMustVerify(!0) : this.createPost(c)
      }, this)), !0) : y.shouldAbortCreatePost.call(this, a, c)
    },
    _onCreateError: function (a, b) {
      y._onCreateError.call(this, a, b),
      this.thread.incrementPostCount( - 1)
    },
    _onCreateSync: function (a, c) {
      y._onCreateSync.call(this, a, c),
      this.thread.posts.saveToCache(c),
      this.isEmbedV2Enabled && this.loadEditorV2(b.extend({
        clearDraft: !0
      }, this.getEditorProps()))
    },
    addPostToThread: function (a) {
      this.thread.incrementPostCount(1),
      this.thread.posts.add(a)
    },
    remove: function () {
      return this.loginFormView && (this.loginFormView.remove(), this.loginFormView = null),
      y.remove.call(this)
    },
    _submitForm: function (a, b) {
      return this.dismissAlert(),
      this.loginFormView.shouldRegisterUser() ? void this.loginFormView.registerUser() : this.initiatePost(b)
    },
    submitForm: w(function (a, c) {
      if (this.isEmbedV2Enabled && !b.isString(c)) {
        var d = this.$el.find('[data-role=textarea] button[type=button]');
        return void d.trigger('click')
      }
      return this._submitForm(a, c)
    })
  }, {
    ContentEditableView: p,
    User: i.User,
    Post: i.Post
  });
  return n.asRealtimeTyping(z.prototype),
  m.call(z.prototype),
  k.call(z.prototype),
  l.call(z.prototype),
  j.call(z.prototype),
  z
}),
define('core/constants/badgesConstants', [
  'exports'
], function (a) {
  'use strict';
  a.ACTION_TYPES = {
    AWARD: 'award',
    REMOVE: 'remove'
  },
  a.BADGES_CRITERIA = {
    MANUAL: 'MANUAL',
    COMMENTS: 'COMMENTS',
    FEATURED_COMMENTS: 'FEATURED_COMMENTS',
    COMMENT_UPVOTES: 'COMMENT_UPVOTES'
  },
  a.MAX_BADGE_COUNT = 8
}),
define('core/models/RichMediaViewModel', [
  'backbone'
], function (a) {
  'use strict';
  return a.Model.extend({
    defaults: {
      deferred: !0,
      showButtons: !0,
      activated: !1,
      kind: 'image',
      deferredHeight: 0,
      providerExpandMessage: '',
      providerCollapseMessage: '',
      providerIcon: 'icon-proceed',
      respectSettings: !0
    }
  })
}),
define('core/templates/postMediaInlineLink', [
  'handlebars',
  'core/templates/handlebars.partials',
  'core/extensions/handlebars.helpers'
], function (a) {
  return a.template({
    1: function (a, b, c, d, e) {
      var f;
      return null != (f = c['if'].call(null != b ? b : a.nullContext || {
      }, null != b ? b.hasUserText : b, {
        name: 'if',
        hash: {
        },
        fn: a.program(2, e, 0),
        inverse: a.noop,
        data: e,
        loc: {
          start: {
            line: 2,
            column: 0
          },
          end: {
            line: 5,
            column: 7
          }
        }
      })) ? f : ''
    },
    2: function (a, b, c, d, e) {
      var f = a.lambda,
      g = a.escapeExpression;
      return '<a href="' + g(f(null != b ? b.href : b, b)) + '" rel="nofollow">' + g(f(null != b ? b.text : b, b)) + '</a>\n'
    },
    4: function (a, b, c, d, e) {
      var f,
      g = a.lambda,
      h = a.escapeExpression,
      i = null != b ? b : a.nullContext || {
      };
      return '<a href="' + h(g(null != b ? b.href : b, b)) + '" class="post-media-link" data-action="expand-collapse-media" rel="nofollow">' + (null != (f = c['if'].call(i, null != (f = null != b ? b.model : b) ? f.providerIcon : f, {
        name: 'if',
        hash: {
        },
        fn: a.program(5, e, 0),
        inverse: a.noop,
        data: e,
        loc: {
          start: {
            line: 10,
            column: 3
          },
          end: {
            line: 10,
            column: 74
          }
        }
      })) ? f : '') + h(g(null != b ? b.mediaLinkText : b, b)) + (null != (f = c['if'].call(i, null != b ? b.domain : b, {
        name: 'if',
        hash: {
        },
        fn: a.program(7, e, 0),
        inverse: a.noop,
        data: e,
        loc: {
          start: {
            line: 14,
            column: 3
          },
          end: {
            line: 14,
            column: 87
          }
        }
      })) ? f : '') + '</a>\n'
    },
    5: function (a, b, c, d, e) {
      var f;
      return '<i class="' + a.escapeExpression(a.lambda(null != (f = null != b ? b.model : b) ? f.providerIcon : f, b)) + '"></i>'
    },
    7: function (a, b, c, d, e) {
      return '<span class="post-media-link-domain"> &mdash; ' + a.escapeExpression(a.lambda(null != b ? b.domain : b, b)) + '</span>'
    },
    compiler: [
      8,
      '>= 4.3.0'
    ],
    main: function (a, b, c, d, e) {
      var f;
      return null != (f = c['if'].call(null != b ? b : a.nullContext || {
      }, null != (f = null != b ? b.model : b) ? f.deferred : f, {
        name: 'if',
        hash: {
        },
        fn: a.program(1, e, 0),
        inverse: a.program(4, e, 0),
        data: e,
        loc: {
          start: {
            line: 1,
            column: 0
          },
          end: {
            line: 16,
            column: 7
          }
        }
      })) ? f : ''
    },
    useData: !0
  })
}),
define('core/views/RichMediaLinkView', [
  'backbone',
  'core/utils',
  'core/templates/postMediaInlineLink'
], function (a, b, c) {
  'use strict';
  return a.View.extend({
    tagName: 'span',
    events: {
      'click [data-action=expand-collapse-media]': 'handleToggle'
    },
    initialize: function (a) {
      this.media = a.media;
      var c = a.$link;
      this.linkText = c.text(),
      this.linkHref = c.attr('href'),
      this.linkDomain = b.getDomain(this.linkHref),
      this.linkHasUserText = this.isUserText(c),
      this.hasGenericMessage = !1,
      this.linkHasUserText ? this.mediaLinkText = this.linkText : this.media.get('title') ? this.mediaLinkText = b.niceTruncate(this.media.get('title'), 60) : (this.hasGenericMessage = !0, this.mediaLinkText = this.model.get('providerExpandMessage')),
      this.listenTo(this.model, 'change:deferred', this.render),
      this.listenTo(this.model, 'change:activated', this.onChangeActivated)
    },
    isUserText: function (a) {
      if ('A' !== a[0].nodeName) return !1;
      var b = (a.text() || '').toLowerCase();
      if (!b) return !1;
      if (0 === b.indexOf('http') || 0 === b.indexOf('www')) return !1;
      b = b.replace(/\.\.\.$/, '');
      var c = (a.attr('href') || '').toLowerCase();
      return c.indexOf(b) === - 1
    },
    render: function () {
      var a = this.mediaLinkText;
      return this.hasGenericMessage && this.model.get('activated') && (a = this.model.get('providerCollapseMessage')),
      this.$el.html(c({
        model: this.model.toJSON(),
        text: this.linkText,
        href: this.linkHref,
        mediaLinkText: a,
        domain: this.linkDomain,
        hasUserText: this.linkHasUserText
      })),
      this
    },
    onChangeActivated: function () {
      this.hasGenericMessage && this.render()
    },
    handleToggle: function (a) {
      this.model.get('deferred') || (this.model.set('activated', !this.model.get('activated')), a && a.preventDefault && a.preventDefault())
    }
  })
}),
define('core/templates/postMedia', [
  'handlebars',
  'core/templates/handlebars.partials',
  'core/extensions/handlebars.helpers'
], function (a) {
  return a.template({
    1: function (a, b, c, d, e) {
      var f;
      return (null != (f = c['if'].call(null != b ? b : a.nullContext || {
      }, null != (f = null != b ? b.media : b) ? f.providerName : f, {
        name: 'if',
        hash: {
        },
        fn: a.program(2, e, 0),
        inverse: a.noop,
        data: e,
        loc: {
          start: {
            line: 5,
            column: 26
          },
          end: {
            line: 5,
            column: 90
          }
        }
      })) ? f : '') + a.escapeExpression(a.lambda(null != (f = null != b ? b.media : b) ? f.title : f, b))
    },
    2: function (a, b, c, d, e) {
      var f;
      return a.escapeExpression(a.lambda(null != (f = null != b ? b.media : b) ? f.providerName : f, b)) + ' &ndash; '
    },
    4: function (a, b, c, d, e) {
      var f;
      return '<i class="' + a.escapeExpression(a.lambda(null != (f = null != b ? b.model : b) ? f.providerIcon : f, b)) + ' publisher-background-color"></i>'
    },
    6: function (a, b, c, d, e) {
      return 'media-video'
    },
    compiler: [
      8,
      '>= 4.3.0'
    ],
    main: function (a, b, c, d, e) {
      var f,
      g = a.lambda,
      h = a.escapeExpression,
      i = null != b ? b : a.nullContext || {
      };
      return '\n<a class="media-button media-button-expand publisher-color publisher-border-color" href="' + h(g(null != (f = null != b ? b.media : b) ? f.url : f, b)) + '" rel="nofollow" target="_blank" data-action="expand"\ntitle="' + (null != (f = c['if'].call(i, null != (f = null != b ? b.media : b) ? f.title : f, {
        name: 'if',
        hash: {
        },
        fn: a.program(1, e, 0),
        inverse: a.noop,
        data: e,
        loc: {
          start: {
            line: 5,
            column: 7
          },
          end: {
            line: 5,
            column: 112
          }
        }
      })) ? f : '') + '">\n' + (null != (f = c['if'].call(i, null != (f = null != b ? b.model : b) ? f.providerIcon : f, {
        name: 'if',
        hash: {
        },
        fn: a.program(4, e, 0),
        inverse: a.noop,
        data: e,
        loc: {
          start: {
            line: 6,
            column: 0
          },
          end: {
            line: 6,
            column: 98
          }
        }
      })) ? f : '') + '\n' + h(g(null != (f = null != b ? b.model : b) ? f.providerExpandMessage : f, b)) + '\n</a>\n<a class="media-button media-button-contract publisher-color publisher-border-color" href="#" target="_blank" data-action="contract">\n<i class="icon-cancel publisher-background-color"></i> ' + h(g(null != (f = null != b ? b.model : b) ? f.providerCollapseMessage : f, b)) + '\n</a>\n<div class="media-content-loader" data-role="content-loader"></div>\n<div data-role="content-placeholder" class="media-content-placeholder media-' + h(g(null != (f = null != b ? b.media : b) ? f.providerName : f, b)) + ' ' + (null != (f = c['if'].call(i, null != b ? b.isVideo : b, {
        name: 'if',
        hash: {
        },
        fn: a.program(6, e, 0),
        inverse: a.noop,
        data: e,
        loc: {
          start: {
            line: 15,
            column: 99
          },
          end: {
            line: 15,
            column: 132
          }
        }
      })) ? f : '') + '"></div>\n'
    },
    useData: !0
  })
}),
define('core/templates/postMediaPlaceholder', [
  'handlebars',
  'core/templates/handlebars.partials',
  'core/extensions/handlebars.helpers'
], function (a) {
  return a.template({
    compiler: [
      8,
      '>= 4.3.0'
    ],
    main: function (a, b, c, d, e) {
      var f;
      return '<a href="#" class="media-force-load" data-action="force-load"><i class="' + a.escapeExpression(a.lambda(null != (f = null != b ? b.model : b) ? f.providerIcon : f, b)) + '"></i></a>\n'
    },
    useData: !0
  })
}),
define('core/constants/mediaTypeConstants', [
  'exports'
], function (a) {
  'use strict';
  a.VIDEO_CODES = [
    '3',
    '9',
    '12',
    '14'
  ]
}),
define('core/views/RichMediaView', [
  'jquery',
  'underscore',
  'backbone',
  'core/utils',
  'core/mediaConfig',
  'core/views/RichMediaLinkView',
  'core/templates/postMedia',
  'core/templates/postMediaPlaceholder',
  'core/constants/mediaTypeConstants'
], function (a, b, c, d, e, f, g, h, i) {
  'use strict';
  var j = d.preventDefaultHandler,
  k = function (a, b, c, d) {
    a[b.get(c) ? 'addClass' : 'removeClass'](d)
  };
  return c.View.extend({
    className: 'media-container',
    events: {
      'click [data-action=expand]': 'handleExpand',
      'click [data-action=contract]': 'handleContract',
      'click [data-action=force-load]': 'handleForceLoad'
    },
    template: g,
    initialize: function (a) {
      this.options = a,
      this.media = a.media,
      this.template = a.template || this.template,
      this.$linkEl = null,
      this.setupMode(),
      this.listenTo(this.model, 'change:activated', this.applyState),
      this.listenTo(this.model, 'change:deferredHeight', this.onChangeDeferredHeight),
      this.listenTo(this.model, 'change:showButtons', this.updateElementClass),
      this.listenTo(this.model, 'change:deferred', this.render),
      this.listenTo(e, 'change:collapsed', this.setupMode)
    },
    getMediaDimensions: function () {
      return {
        width: null,
        height: null
      }
    },
    getAvailableWidth: function () {
      return this.$el.parent().width() || e.get('loadedThumbnailWidth')
    },
    updateDeferredHeight: function () {
      this.model.set('deferredHeight', this.calculateDeferredHeight())
    },
    calculateDeferredHeight: function () {
      var a = this.getMediaDimensions(),
      b = a.width,
      c = a.height;
      if (!b || !c) return c;
      var d = this.getAvailableWidth(),
      e = d * c / b;
      return e
    },
    convertToButton: function (a) {
      this.model.set('showButtons', !1),
      this.linkSubview && this.linkSubview.remove(),
      this.linkSubview = new f({
        model: this.model,
        media: this.media,
        $link: a
      }),
      a.replaceWith(this.linkSubview.$el),
      this.linkSubview.render()
    },
    applyContentNodeHeight: function (a) {
      this.contentNode.height(a || 'auto')
    },
    shouldAutoplay: function () {
      return !this.model.get('deferred')
    },
    generateContentHtml: function () {
      return this.media.get('html')
    },
    createContentNode: function (b) {
      return a(b)
    },
    insertContentNode: function (a) {
      this.contentNode.html(a)
    },
    prepareElementEvents: function () {
    },
    displayContent: function () {
      this.updateDeferredHeight();
      var a = this.generateContentHtml(),
      b = this.createContentNode(a);
      this.prepareElementEvents(b),
      this.insertContentNode(b),
      this.applyContentNodeHeight(null)
    },
    configureDeferred: function () {
      this.enterViewport()
    },
    configureContentFromActivated: function () {
      this.model.get('activated') ? this.displayContent() : this.displayPlaceholder()
    },
    displayPlaceholder: function () {
      this.contentNode.html(h({
        model: this.model.toJSON()
      }))
    },
    updateElementClass: function () {
      var a = this.$el,
      b = this.model;
      k(a, b, 'deferred', 'media-mode-deferred'),
      k(a, b, 'activated', 'media-activated'),
      k(a, b, 'showButtons', 'media-show-buttons')
    },
    applyState: function () {
      this.configureDeferred(),
      this.configureContentFromActivated(),
      this.updateElementClass()
    },
    render: function () {
      return this.$el.html(this.template({
        model: this.model.toJSON(),
        media: this.media.toJSON(),
        isVideo: b.contains(i.VIDEO_CODES, this.media.get('mediaType'))
      })),
      this.contentNode = this.$el.find('[data-role=content-placeholder]'),
      this.applyState(),
      this
    },
    remove: function () {
      this.linkSubview && this.linkSubview.remove(),
      c.View.prototype.remove.apply(this, arguments)
    },
    enterViewport: function () {
      this.model.get('deferred') && this.activate()
    },
    activate: function () {
      this.model.set('activated', !0)
    },
    setupMode: function () {
      if (this.model.get('respectSettings')) {
        this.model.set('activated', !1);
        var a = e.get('collapsed');
        a ? this.model.set('deferred', !1) : this.model.set('deferred', !0)
      }
    },
    onChangeDeferredHeight: function () {
      this.model.get('deferred') && !this.model.get('activated') && this.applyContentNodeHeight(this.model.get('deferredHeight'))
    },
    handleExpand: j(function () {
      this.model.set('activated', !0)
    }),
    handleContract: j(function () {
      this.model.set('activated', !1)
    }),
    handleForceLoad: j(function () {
      this.model.get('deferred') && this.model.set('activated', !0)
    })
  })
}),
define('core/templates/postMediaImage', [
  'handlebars',
  'core/templates/handlebars.partials',
  'core/extensions/handlebars.helpers'
], function (a) {
  return a.template({
    1: function (a, b, c, d, e) {
      return '<video src="' + a.escapeExpression(a.lambda(null != b ? b.thumbnailUrl : b, b)) + '" autoplay muted loop></video>\n'
    },
    3: function (a, b, c, d, e) {
      var f,
      g = a.escapeExpression,
      h = null != b ? b : a.nullContext || {
      };
      return '<img src="' + g(a.lambda(null != b ? b.thumbnailUrl : b, b)) + '" alt="' + g(c.gettext.call(h, 'Thumbnail', {
        name: 'gettext',
        hash: {
        },
        data: e,
        loc: {
          start: {
            line: 6,
            column: 33
          },
          end: {
            line: 6,
            column: 56
          }
        }
      })) + '" ' + (null != (f = c['if'].call(h, null != (f = null != b ? b.model : b) ? f.deferredHeight : f, {
        name: 'if',
        hash: {
        },
        fn: a.program(4, e, 0),
        inverse: a.noop,
        data: e,
        loc: {
          start: {
            line: 6,
            column: 58
          },
          end: {
            line: 6,
            column: 128
          }
        }
      })) ? f : '') + '>\n'
    },
    4: function (a, b, c, d, e) {
      var f;
      return ' height="' + a.escapeExpression(a.lambda(null != (f = null != b ? b.model : b) ? f.deferredHeight : f, b)) + '" '
    },
    compiler: [
      8,
      '>= 4.3.0'
    ],
    main: function (a, b, c, d, e) {
      var f;
      return '<a href="' + a.escapeExpression(a.lambda(null != b ? b.imageUrl : b, b)) + '" target="_blank" rel="nofollow">\n' + (null != (f = c['if'].call(null != b ? b : a.nullContext || {
      }, null != b ? b.isVideo : b, {
        name: 'if',
        hash: {
        },
        fn: a.program(1, e, 0),
        inverse: a.program(3, e, 0),
        data: e,
        loc: {
          start: {
            line: 3,
            column: 0
          },
          end: {
            line: 7,
            column: 8
          }
        }
      })) ? f : '') + '</a>\n'
    },
    useData: !0
  })
}),
define('core/views/ImageRichMediaView', [
  'core/views/RichMediaView',
  'core/models/Media',
  'core/utils',
  'core/config',
  'core/mediaConfig',
  'core/templates/postMediaImage'
], function (a, b, c, d, e, f) {
  'use strict';
  var g = new RegExp('(^|\\.)' + c.getDomain(d.urls.media).split('.').slice( - 2).join('\\.') + '$');
  return a.extend({
    getMediaDimensions: function () {
      return {
        width: this.media.get('thumbnailWidth'),
        height: this.media.get('thumbnailHeight')
      }
    },
    getImageUrl: function () {
      return this.media.get('resolvedUrlRedirect') || this.media.get('urlRedirect') || this.media.get('thumbnailUrl')
    },
    getImageThumbnailUrl: function () {
      var a = this.media.get('thumbnailUrl');
      return this.constructor.isOnDisqusCDN(a) && !this.isVideo() && (a = c.serialize(a, {
        w: e.get('loadedThumbnailWidth'),
        h: this.model.get('deferredHeight')
      })),
      a
    },
    isVideo: function () {
      return this.media.get('mediaType') === b.MEDIA_TYPES.MP4_VIDEO
    },
    generateContentHtml: function () {
      return f({
        model: this.model.toJSON(),
        media: this.media.toJSON(),
        thumbnailUrl: this.getImageThumbnailUrl(),
        imageUrl: this.getImageUrl(),
        isVideo: this.isVideo()
      })
    },
    prepareElementEvents: function (a) {
      var b = this,
      c = a.find('img');
      c.on('load.richMediaView error.richMediaView', function (a) {
        b.trigger(a.type),
        c.off('.richMediaView')
      })
    },
    calculateDeferredHeight: function () {
      var b = Math.floor(a.prototype.calculateDeferredHeight.apply(this, arguments)),
      c = this.getMediaDimensions().height;
      return Math.min(c, b) || null
    }
  }, {
    isOnDisqusCDN: function (a) {
      var b = c.getDomain(a);
      return g.test(b)
    }
  })
}),
define('core/views/IframeRichMediaView', [
  'underscore',
  'core/mediaConfig',
  'core/views/RichMediaView'
], function (a, b, c) {
  'use strict';
  return c.extend({
    getMediaDimensions: function () {
      return {
        width: this.media.get('htmlWidth'),
        height: this.media.get('htmlHeight')
      }
    },
    _findIframe: function (a) {
      return a.is('iframe') ? a : a.find('iframe')
    },
    configureContentFromActivated: function () {
      c.prototype.configureContentFromActivated.apply(this, arguments),
      this.model.get('activated') || this.$el.removeClass('media-loading')
    },
    createContentNode: function () {
      var a = c.prototype.createContentNode.apply(this, arguments);
      return a.attr({
        width: '100%',
        height: this.model.get('deferredHeight')
      }),
      a
    },
    insertContentNode: function (a) {
      this.loaderNode = this.$el.find('[data-role=content-loader]'),
      this.loaderHeight = this.model.get('deferredHeight') || b.get('defaultIframeHeight'),
      this.loaderNode.height(this.loaderHeight),
      this.$el.addClass('media-loading'),
      c.prototype.insertContentNode.call(this, a)
    },
    prepareElementEvents: function (b) {
      var c = this._findIframe(b);
      c.one('load', a.bind(this.finishLoad, this, c))
    },
    finishLoad: function (a) {
      this.$el.removeClass('media-loading'),
      a.height(this.loaderHeight),
      this.trigger('load')
    }
  })
}),
define('core/views/FacebookPhotoRichMediaView', [
  'core/views/ImageRichMediaView'
], function (a) {
  'use strict';
  return a.extend({
    getImageThumbnailUrl: function () {
      return this.media.get('metadata').imageUrl || a.prototype.getImageThumbnailUrl.call(this)
    }
  })
}),
define('core/views/AutoplayRichMediaView', [
  'underscore',
  'jquery',
  'core/utils',
  'core/views/IframeRichMediaView'
], function (a, b, c, d) {
  'use strict';
  return d.extend({
    createContentNode: function () {
      var a = d.prototype.createContentNode.apply(this, arguments),
      b = a.attr('src');
      return this.shouldAutoplay() && b && !this.model.get('playerjs') && (b = c.serialize(b, {
        auto_play: !0,
        autoplay: 1
      }), a.attr('src', b)),
      a
    },
    insertContentNode: function (c) {
      if (this.model.get('playerjs')) {
        var e = this._findIframe(c),
        f = e.attr('src');
        '//' === f.substr(0, 2) && (f = window.location.protocol + f);
        var g = f.split('/');
        g = g[0] + '//' + g[2],
        this.playerjs = {
          ready: !1,
          queue: [
          ],
          origin: g,
          $iframe: e
        },
        this.model.get('mute') && this.send('mute'),
        this.shouldAutoplay() && this.send('play');
        var h = a.once(a.bind(function () {
          this.playerjs.ready = !0;
          var b = this.playerjs.queue;
          this.playerjs.queue = [
          ],
          a.each(b, this.send, this)
        }, this));
        b(window).on('message', function (a) {
          if (a = a.originalEvent, a.origin === g) {
            var b;
            try {
              b = JSON.parse(a.data)
            } catch (c) {
              return
            }
            'ready' === b.event && b.value && b.value.src === f && h()
          }
        })
      }
      return d.prototype.insertContentNode.apply(this, arguments)
    },
    send: function (a) {
      if (this.playerjs) {
        if (!this.playerjs.ready) return void this.playerjs.queue.push(a);
        var b = {
          context: 'player.js',
          version: '0.0.10',
          method: a
        };
        this.playerjs.$iframe[0].contentWindow.postMessage(JSON.stringify(b), this.playerjs.origin)
      }
    }
  })
}),
define('core/views/DynamicHeightRichMediaView', [
  'underscore',
  'core/views/RichMediaView'
], function (a, b) {
  'use strict';
  return b.extend({
    insertContentNode: function () {
      b.prototype.insertContentNode.apply(this, arguments),
      this.finishLoad()
    },
    finishLoad: function () {
      var b = this,
      c = 0,
      d = 150,
      e = 20,
      f = function () {
        c += 1,
        c < e ? a.delay(f, d) : b.trigger('load')
      };
      f()
    }
  })
}),
define('core/templates/postMediaTwitterContent', [
  'handlebars',
  'core/templates/handlebars.partials',
  'core/extensions/handlebars.helpers'
], function (a) {
  return a.template({
    compiler: [
      8,
      '>= 4.3.0'
    ],
    main: function (a, b, c, d, e) {
      var f = a.lambda,
      g = a.escapeExpression;
      return '<meta name="twitter:widgets:csp" content="on">\n<blockquote class="twitter-tweet" data-theme="' + g(f(null != b ? b.theme : b, b)) + '" data-link-color="' + g(f(null != b ? b.linkColor : b, b)) + '" lang="' + g(f(null != b ? b.language : b, b)) + '">\n<a href="' + g(f(null != b ? b.url : b, b)) + '"></a>\n</blockquote>\n<script src="//platform.twitter.com/widgets.js"></script>\n'
    },
    useData: !0
  })
}),
define('core/views/TwitterRichMediaView', [
  'underscore',
  'core/views/DynamicHeightRichMediaView',
  'core/templates/postMediaTwitterContent'
], function (a, b, c) {
  'use strict';
  var d = b.extend({
    generateContentHtml: function () {
      var b = window.document.documentElement.lang;
      b = b && b.substring(0, 2);
      var e = this.media.get('url');
      return this.media.get('resolvedUrl').indexOf('/status') !== - 1 && (e = this.media.get('resolvedUrl')),
      c({
        url: e,
        theme: a.result(d, 'theme'),
        linkColor: a.result(d, 'linkColor'),
        language: b
      })
    }
  }, {
    theme: 'light',
    linkColor: '#2e9fff'
  });
  return d
}),
define('core/views/SoundCloudRichMediaView', [
  'core/views/AutoplayRichMediaView'
], function (a) {
  'use strict';
  return a.extend({
    getMediaDimensions: function () {
      return {
        width: null,
        height: this.media.get('htmlHeight')
      }
    }
  })
}),
define('core/views/VineRichMediaView', [
  'core/views/AutoplayRichMediaView',
  'core/utils'
], function (a, b) {
  'use strict';
  return a.extend({
    createContentNode: function () {
      var c = a.prototype.createContentNode.apply(this, arguments),
      d = c.attr('src');
      return this.shouldAutoplay() && d && (d = b.serialize(d, {
        audio: 1
      }), c.attr('src', d)),
      c
    }
  })
}),
define('core/views/IframeGifRichMediaView', [
  'core/views/IframeRichMediaView'
], function (a) {
  'use strict';
  return a.extend({
    insertContentNode: function (b) {
      a.prototype.insertContentNode.call(this, b),
      this.loaderNode.width(this.getMediaDimensions().width)
    },
    createContentNode: function () {
      var b = a.prototype.createContentNode.apply(this, arguments);
      return b.attr(this.getMediaDimensions()),
      b
    },
    calculateDeferredHeight: function () {
      return this.getMediaDimensions().height
    },
    displayPlaceholder: function () {
      a.prototype.displayPlaceholder.call(this);
      var b = this.getMediaDimensions();
      this.contentNode.height(b.height).width(b.width)
    }
  })
}),
define('core/media', [
  'underscore',
  'core/strings',
  'core/models/Media',
  'core/models/RichMediaViewModel',
  'core/views/ImageRichMediaView',
  'core/views/IframeRichMediaView',
  'core/views/FacebookPhotoRichMediaView',
  'core/views/AutoplayRichMediaView',
  'core/views/TwitterRichMediaView',
  'core/views/SoundCloudRichMediaView',
  'core/views/VineRichMediaView',
  'core/views/IframeGifRichMediaView'
], function (a, b, c, d, e, f, g, h, i, j, k, l) {
  'use strict';
  var m = b.get,
  n = {
    PLAY_HIDE: {
      kind: 'html',
      providerExpandMessage: m('Play'),
      providerCollapseMessage: m('Hide')
    },
    VIEW_HIDE: {
      kind: 'html',
      providerExpandMessage: m('View'),
      providerCollapseMessage: m('Hide')
    },
    VIEW_IMAGE: {
      kind: 'image',
      providerIcon: 'icon-images',
      providerExpandMessage: m('View'),
      providerCollapseMessage: m('Hide')
    }
  },
  o = function (b) {
    var m = function (b, c) {
      return a.defaults({
        providerIcon: c
      }, n[b])
    },
    o = null,
    p = null,
    q = c.MEDIA_TYPES;
    switch (b.get('mediaType')) {
      case q.IMAGE:
      case q.IMAGE_UPLOAD:
      case q.MP4_VIDEO:
        o = n.VIEW_IMAGE;
        break;
      case q.FACEBOOK_PHOTO:
        p = g,
        o = n.VIEW_IMAGE;
        break;
      case q.GIF_VIDEO:
        p = l,
        o = n.VIEW_HIDE;
        break;
      case q.VIMEO_VIDEO:
      case q.YOUTUBE_VIDEO:
        p = h,
        o = m('PLAY_HIDE', 'icon-video');
        break;
      case q.TWITTER_STATUS:
        p = i,
        o = m('VIEW_HIDE', 'icon-twitter-x');
        break;
      case q.VINE_VIDEO:
        p = k,
        o = m('PLAY_HIDE', 'icon-video');
        break;
      case q.FACEBOOK_VIDEO:
        o = m('VIEW_HIDE', 'icon-video');
        break;
      case q.SOUNDCLOUD_SOUND:
        p = j,
        o = m('PLAY_HIDE', 'icon-music');
        break;
      case q.GOOGLE_MAP:
        o = m('VIEW_HIDE', 'icon-map');
        break;
      default:
        return null
    }
    if (null === p) switch (o.kind) {
      case 'webpage':
        return null;
      case 'html':
        p = f;
        break;
      case 'image':
        p = e
    }
    var r = new d(o);
    return {
      Cls: p,
      mediaViewModel: r
    }
  },
  p = function (a) {
    var b = o(a);
    return b ? new b.Cls({
      model: b.mediaViewModel,
      media: a
    }) : null
  },
  q = function (a) {
    return new e({
      model: new d(n.VIEW_IMAGE),
      media: a
    })
  };
  return {
    instantiateRichMediaView: p,
    instantiateRichMediaThumbnail: q,
    getRichMediaViewConfig: o
  }
}),
define('core/mixins/withRichMedia', [
  'underscore',
  'jquery',
  'core/collections/MediaCollection',
  'core/media'
], function (a, b, c, d) {
  'use strict';
  function e(a) {
    var c = {
    };
    return a.length ? (a.find('a').each(function (a, d) {
      var e = d.href;
      c[e] || (c[e] = b(d))
    }), c) : c
  }
  function f() {
    a.extend(this, g)
  }
  var g = {
    renderRichMedia: function (a, f, g) {
      return g = g || {
      },
      a = a instanceof c ? a : new c(a),
      a.chain().map(function (a) {
        return d.instantiateRichMediaView(a)
      }).without(null).map(function (a) {
        var c = a.media.get('urlRedirect');
        g.normalize && (c = g.normalize.call(this, c));
        var d = e(this.$('[data-role=message]')),
        h = d[c];
        return g.beforeRender && g.beforeRender.call(this, a),
        a.render(),
        h ? g.convertLinkToButton ? (h.after(a.$el), a.convertToButton(h)) : h.replaceWith(a.$el) : (f = f || this.$('[data-role=post-media-list]'), f.append(b('<li>').append(a.$el))),
        a
      }, this).value()
    }
  };
  return f
}),
define('core/views/common/HoverCard', [
  'jquery',
  'underscore',
  'backbone',
  'core/bus'
], function (a, b, c, d) {
  'use strict';
  var e = c.View.extend({
    events: {
      mouseenter: 'enter',
      mouseleave: 'leave'
    },
    initialize: function () {
      this._id = b.uniqueId(),
      this._rendered = !1,
      this._hoverState = 'out',
      this._visible = !1,
      this._enterTimeout = null,
      this._leaveTimeout = null,
      e.open = {
      },
      this.events = this.events || {
      },
      this.events['click [data-action=profile]'] = 'handleShowProfile',
      this.listenTo(this, 'authenticating', this.keepOpen)
    },
    render: function () {
      return this.hide(),
      a('body').append(this.el),
      this
    },
    target: function (a) {
      a.on('mouseenter', b.bind(this.enter, this, a)),
      a.on('mouseleave', b.bind(this.leave, this))
    },
    enter: function (a) {
      var c = this;
      a.originalEvent && (a = null),
      a && (c.$target = a),
      c._leaveTimeout && clearTimeout(c._leaveTimeout),
      'in' !== c._hoverState && (c._hoverState = 'in', c._enterTimeout = b.delay(function () {
        'in' === c._hoverState && c.show(),
        c._enterTimeout = null
      }, e.DELAY_ENTER), e.open[this.uid] = this)
    },
    leave: function () {
      var a = this;
      a._enterTimeout && clearTimeout(a._enterTimeout),
      'out' !== a._hoverState && (a._hoverState = 'out', a._leaveTimeout = b.delay(function () {
        'out' === a._hoverState && a.hide(),
        a._leaveTimeout = null
      }, e.DELAY_LEAVE), e.open[this.uid] && delete e.open[this.uid])
    },
    show: function () {
      var a = this;
      a._rendered || (a._rendered = !0, a.render()),
      a.moveTo(a.$target),
      a.$el.show(),
      a._visible = !0,
      a.trigger('show')
    },
    moveTo: function (a) {
      if (a) {
        var b = e.POSITION_OFFSET,
        c = a.offset(),
        d = this.$el,
        f = d.height(),
        g = this.getContainerPosition();
        c.top -= b;
        var h = c.top + f + g.containerOffset.top,
        i = g.pageOffset + g.containerHeight;
        h <= i ? d.css('top', c.top) : d.css('top', c.top - f + 2 * b),
        d.css('left', c.left + b)
      }
    },
    getContainerPosition: function () {
      return {
        pageOffset: a(window).scrollTop(),
        containerOffset: {
          top: 0,
          height: a(window).height()
        },
        containerHeight: a(window).height()
      }
    },
    hide: function () {
      this._keepOpen || (this._enterTimeout && clearTimeout(this._enterTimeout), this.$el.hide(), this._visible = !1)
    },
    keepOpen: function () {
      this._keepOpen = !0,
      this.setupKeepOpenCanceler()
    },
    setupKeepOpenCanceler: function () {
      var c = this,
      e = function () {
        'out' === c._hoverState && (c.stopListening(d, 'window.click', e), a('body').off('click', e), c._keepOpen = !1, c.hide())
      };
      b.delay(function () {
        c.listenTo(d, 'window.click', e),
        a('body').on('click', e)
      }, 100)
    },
    isVisible: function () {
      return this._visible
    },
    handleShowProfile: function () {
      this.hide()
    }
  }, {
    open: {
    },
    instances: {
    },
    DELAY_ENTER: 350,
    DELAY_LEAVE: 175,
    POSITION_OFFSET: 20,
    exitAll: function () {
      b.invoke(e.open, 'leave')
    },
    create: function (a, b, c, d) {
      var f = e.instances[c];
      f || (e.instances[c] = f = {
      });
      var g = f[a];
      return g || (g = new d(b), f[a] = g),
      b.targetElement && g.target(b.targetElement),
      g
    }
  });
  return function () {
    a(window.document).on('mouseout', b.debounce(function (a) {
      var b = a.relatedTarget || a.toElement;
      b && 'HTML' !== b.nodeName || e.exitAll()
    }, 10))
  }(),
  e
}),
define('core/utils/views', [
  'underscore'
], function (a) {
  'use strict';
  var b = function (b, c, d) {
    var e = b.prototype,
    f = a.extend({
    }, c, d);
    if (a.defaults(e, f), a.defaults(e.events, f.events), void 0 !== e.initialize && void 0 !== f.initialize) {
      var g = e.initialize;
      e.initialize = function () {
        var a = g.apply(this, arguments);
        return f.initialize.apply(this, arguments),
        a
      }
    }
  };
  return {
    mixin: b
  }
}),
define('core/views/common/mixins/LocalScroll', [
], function () {
  'use strict';
  var a = {
    events: {
      mousewheel: 'handleScrollEvent',
      wheel: 'handleScrollEvent'
    },
    scrollMeasureSelector: '',
    getScrollMeasure: function () {
      return this.scrollMeasure || (this.scrollMeasure = this.$el, this.scrollMeasureSelector && (this.scrollMeasure = this.$el.find(this.scrollMeasureSelector))),
      this.scrollMeasure
    },
    handleScrollEvent: function (a) {
      var b = a.originalEvent,
      c = b.wheelDeltaY || - b.deltaY,
      d = this.$el,
      e = d.height(),
      f = this.getScrollMeasure(),
      g = f.height(),
      h = f.parent() [0].scrollTop,
      i = h >= g - e,
      j = 0 === h;
      (i && c < 0 || j && c > 0) && a.preventDefault()
    }
  };
  return a
}),
define('core/templates/usersCard', [
  'handlebars',
  'core/templates/handlebars.partials',
  'core/extensions/handlebars.helpers'
], function (a) {
  return a.template({
    1: function (a, b, c, d, e) {
      return 'guests-only'
    },
    3: function (a, b, c, d, e) {
      return 'tooltip--post-refresh'
    },
    5: function (a, b, c, d, e, f, g) {
      var h;
      return null != (h = c.each.call(null != b ? b : a.nullContext || {
      }, null != b ? b.users : b, {
        name: 'each',
        hash: {
        },
        fn: a.program(6, e, 0, f, g),
        inverse: a.noop,
        data: e,
        loc: {
          start: {
            line: 5,
            column: 0
          },
          end: {
            line: 7,
            column: 9
          }
        }
      })) ? h : ''
    },
    6: function (a, b, c, d, e, f, g) {
      var h;
      return null != (h = a.invokePartial(d.cardUser, b, {
        name: 'cardUser',
        hash: {
          isRefreshEnabled: null != g[1] ? g[1].isRefreshEnabled : g[1],
          forumId: null != g[1] ? g[1].forumId : g[1],
          highlight: null != g[1] ? g[1].highlight : g[1]
        },
        data: e,
        helpers: c,
        partials: d,
        decorators: a.decorators
      })) ? h : ''
    },
    8: function (a, b, c, d, e) {
      return 'tooltip-point--refresh'
    },
    compiler: [
      8,
      '>= 4.3.0'
    ],
    main: function (a, b, c, d, e, f, g) {
      var h,
      i = null != b ? b : a.nullContext || {
      };
      return '<div class="tooltip-wrapper">\n<div class="tooltip voters ' + (null != (h = c.unless.call(i, null != (h = null != b ? b.users : b) ? h.length : h, {
        name: 'unless',
        hash: {
        },
        fn: a.program(1, e, 0, f, g),
        inverse: a.noop,
        data: e,
        loc: {
          start: {
            line: 2,
            column: 27
          },
          end: {
            line: 2,
            column: 73
          }
        }
      })) ? h : '') + ' ' + (null != (h = c['if'].call(i, null != b ? b.isRefreshEnabled : b, {
        name: 'if',
        hash: {
        },
        fn: a.program(3, e, 0, f, g),
        inverse: a.noop,
        data: e,
        loc: {
          start: {
            line: 2,
            column: 74
          },
          end: {
            line: 2,
            column: 126
          }
        }
      })) ? h : '') + '">\n<ul class="scroll-measure" data-role="content">\n' + (null != (h = c['if'].call(i, null != (h = null != b ? b.users : b) ? h.length : h, {
        name: 'if',
        hash: {
        },
        fn: a.program(5, e, 0, f, g),
        inverse: a.noop,
        data: e,
        loc: {
          start: {
            line: 4,
            column: 0
          },
          end: {
            line: 8,
            column: 7
          }
        }
      })) ? h : '') + '</ul>\n</div>\n</div>\n<div class="tooltip-point hidden ' + (null != (h = c['if'].call(i, null != b ? b.isRefreshEnabled : b, {
        name: 'if',
        hash: {
        },
        fn: a.program(8, e, 0, f, g),
        inverse: a.noop,
        data: e,
        loc: {
          start: {
            line: 12,
            column: 33
          },
          end: {
            line: 12,
            column: 86
          }
        }
      })) ? h : '') + '"></div>\n'
    },
    usePartial: !0,
    useData: !0,
    useDepths: !0
  })
}),
define('core/views/UsersCard', [
  'jquery',
  'underscore',
  'handlebars',
  'core/config',
  'core/bus',
  'core/utils/views',
  'core/switches',
  'core/utils',
  'core/views/common/HoverCard',
  'core/views/common/mixins/LocalScroll',
  'core/templates/usersCard'
], function (a, b, c, d, e, f, g, h, i, j, k) {
  'use strict';
  var l = function (a) {
    return a.get('isAnonymous') || a.get('isBlocked') || a.get('isBlocking')
  },
  m = i.extend({
    guestTextPartialName: 'cardOtherUserText',
    initialize: function (a) {
      this.isRefreshEnabled = a.isRefreshEnabled,
      this.$el.attr('class', this.isRefreshEnabled ? 'tooltip-outer voters-outer voters-outer--refresh' : 'tooltip-outer voters-outer'),
      i.prototype.initialize.call(this, a),
      this.collection = this.collection || a.collection,
      this.session = a.session,
      this.numUsers = a.numUsers,
      this.voteType = a.voteType,
      this.listenTo(this.collection, 'add', this.addUser),
      this.listenTo(this.collection, 'change:isBlocked', this.render),
      this.listenTo(this.collection, 'remove', this.removeUser),
      this.listenTo(this.collection, 'reset', this.render)
    },
    addUser: function (a) {
      l(a) ? this.updateGuests() : this.$listEl && this.$listEl.length && (this.$listEl.prepend(c.partials.cardUser(this.getUserTemplateData(a))), this.stopHighlightUsername())
    },
    removeUser: function (a) {
      if (l(a)) this.updateGuests();
       else {
        var b = this.$el.find('[data-username=' + a.get('username') + ']');
        b.length && b.remove()
      }
    },
    stopHighlightUsername: b.debounce(function () {
      var a = this.$el.find('.highlight');
      a.removeClass('highlight')
    }, 1100),
    getGuestCount: function () {
      return Math.max(this.numUsers - this.collection.reject(l).length, 0)
    },
    updateGuests: function () {
      var a = this.$el.find('[data-role=guest]'),
      b = this.getGuestCount(),
      e = c.partials[this.guestTextPartialName]({
        guestCount: b
      }),
      f = {
        guestCount: b,
        guestAvatarUrl: d.urls.avatar.generic,
        highlight: a.length,
        guestText: e,
        isRefreshEnabled: this.isRefreshEnabled
      },
      g = c.partials.cardGuestUser(f);
      a.length ? (a.replaceWith(g), this.stopHighlightUsername()) : this.$listEl && this.$listEl.length && this.$listEl.append(g)
    },
    getTemplateData: function () {
      var a = b.invoke(this.collection.reject(l), 'toJSON').map(function (a) {
        return a.initials = h.getInitials(a.name || ''),
        a
      });
      return {
        users: a,
        highlight: !1,
        isRefreshEnabled: this.isRefreshEnabled
      }
    },
    getUserTemplateData: function (a) {
      var c = a.toJSON();
      return c.initials = h.getInitials(c.name || ''),
      b.extend({
        highlight: !0,
        isRefreshEnabled: this.isRefreshEnabled
      }, c)
    },
    render: function () {
      delete this.pointEl,
      this.$el.html(k(this.getTemplateData())),
      i.prototype.render.call(this),
      this.$listEl = this.$el.find('.voters ul'),
      this.updateGuests()
    },
    show: function () {
      this.numUsers && !this.isVisible() && (i.prototype.show.call(this), e.trigger('uiAction:userCardShow'))
    },
    showPoint: function (a) {
      var c = [
        'tl',
        'bl'
      ],
      d = this.$el.find('.tooltip--post-refresh'),
      e = this.$el.find('.tooltip-wrapper');
      this.pointEl || (this.pointEl = this.$el.find('.tooltip-point'), this.pointEl.removeClass('hidden')),
      b.each(c, function (a) {
        this.pointEl.removeClass('point-position-' + a),
        d.removeClass('tooltip--' + a),
        e.removeClass('tooltip-wrapper--' + a)
      }, this),
      this.pointEl.addClass('point-position-' + a),
      d.addClass('tooltip--' + a),
      e.addClass('tooltip-wrapper--' + a)
    },
    moveTo: function (a, b) {
      if (a) {
        var c = i.POSITION_OFFSET,
        d = a.offset(),
        e = this.$el,
        f = e.height(),
        g = a.outerWidth(),
        h = this.getContainerPosition();
        b && (f += e.find('li.user').height() + 10),
        d.top - f - c >= 0 && d.top - f + h.containerOffset.top >= h.pageOffset ? (e.css({
          bottom: h.containerOffset.height - d.top + c,
          top: 'inherit'
        }), this.showPoint('bl')) : (e.css({
          bottom: 'inherit',
          top: d.top + 2 * c
        }), this.showPoint('tl')),
        'rtl' === window.document.documentElement.dir ? e.css('right', d.left ? h.containerOffset.width - d.left - g - c : 0) : e.css('left', d.left - c)
      }
    },
    handleShowProfile: function (b) {
      i.prototype.handleShowProfile.call(this, b);
      var c = a(b.currentTarget),
      d = c.attr('data-username');
      e.trigger('uiCallback:showProfile', d, b)
    }
  }, {
    create: function (a, b) {
      return i.create(a, b, 'UsersCard', m)
    }
  });
  return f.mixin(m, j, {
    scrollMeasureSelector: '[data-role=content]'
  }),
  m
}),
define('core/views/VotersCard', [
  'underscore',
  'core/views/common/HoverCard',
  'core/views/UsersCard',
  'core/switches',
  'core/utils'
], function (a, b, c, d, e) {
  'use strict';
  var f = e.preventDefaultHandler,
  g = c.extend({
    guestTextPartialName: 'cardGuestVoterText',
    initialize: function (b) {
      this.voteType = b.voteType;
      var d = b.model,
      e = 1 === this.voteType ? d.getUpvotersUserCollection() : d.getDownvotersUserCollection();
      a.extend(b, {
        collection: e,
        numUsers: 1 === this.voteType ? d.get('likes') : d.get('dislikes')
      }),
      c.prototype.initialize.call(this, b),
      this.model = d,
      this.session = b.session,
      this.likes = d.get('likes'),
      this.dislikes = d.get('dislikes'),
      this.hadLikes = Boolean(this.likes),
      this.hadDislikes = Boolean(this.dislikes),
      this.isRefreshEnabled = b.isRefreshEnabled,
      this._fetched = !1,
      this._rendered = !1,
      this.listenTo(this.model, 'change:userScore', this.updateUserSet),
      1 === this.voteType ? this.listenTo(this.model, 'change:likes', this.updateGuests) : this.listenTo(this.model, 'change:dislikes', this.updateGuests)
    },
    updateGuests: function () {
      this.numUsers = (1 === this.voteType ? this.model.get('likes') : this.model.get('dislikes')) || 0,
      c.prototype.updateGuests.call(this)
    },
    updateUserSet: function () {
      var a = this.session.user,
      b = this.likes,
      c = this.dislikes,
      d = !1;
      this.likes = this.model.get('likes'),
      this.dislikes = this.model.get('dislikes'),
      this.model.get('userScore') === this.voteType ? (this.session.isLoggedIn() && this.collection.add(a), 1 === this.voteType && this.likes && !b || this.voteType === - 1 && this.dislikes && !c ? (this._rendered = !1, this.show()) : d = !!this.session.isLoggedOut() || Boolean((1 === this.voteType ? this.likes : this.dislikes) - 1 - this.collection.length)) : (this.collection.remove(a), (1 === this.voteType && !this.likes || this.voteType === - 1 && !this.dislikes) && this.hide()),
      this.updateGuests(),
      this.moveTo(this.$target, d)
    },
    show: function () {
      if (this.isRefreshEnabled && (b.prototype.constructor.POSITION_OFFSET = 12), !(1 === this.voteType && !this.likes || this.voteType === - 1 && !this.dislikes || this.isVisible())) {
        if ((1 === this.voteType && !this.hadLikes || this.voteType === - 1 && !this.hadDislikes) && (this._fetched = !0), !this._fetched) return void this.collection.fetch({
          vote: this.voteType
        }).done(a.bind(function () {
          this._fetched = !0,
          this.show()
        }, this));
        var d = this.session.user;
        this.model.get('userScore') === this.voteType && this.session.isLoggedIn() && !this.collection.contains(d) && this.collection.add(d),
        c.prototype.show.call(this)
      }
    },
    handleShowProfile: f(function (a) {
      c.prototype.handleShowProfile.call(this, a)
    }),
    getTemplateData: function () {
      var b = c.prototype.getTemplateData.apply(this, arguments);
      return a.extend({
      }, b, {
        forumId: this.model.get('forum')
      })
    },
    getUserTemplateData: function () {
      var b = c.prototype.getUserTemplateData.apply(this, arguments);
      return a.extend({
      }, b, {
        forumId: this.model.get('forum')
      })
    }
  }, {
    create: function (a) {
      var c = a.model;
      if (c.has('id')) return b.create([c.get('id'),
      '-',
      a.voteType].join(''), a, 'VotersCard', g)
    }
  });
  return g
}),
define('templates/lounge/contextCard', [
  'react',
  'core/strings',
  'core/utils/object/get',
  'core/utils',
  'core/switches',
  'templates/lounge/partials/profileLink'
], function (a, b, c, d, e, f) {
  'use strict';
  var g = b.gettext,
  h = d.getInitials,
  i = function (b) {
    var d = e.isFeatureActive('embed_refresh', {
      forum: b.post.forum
    }),
    f = !c(b.post, [
      'author',
      'avatar',
      'isCustom'
    ]);
    return f && d ? a.createElement('div', {
      className: 'initials user--refresh'
    }, h(b.post.author.name)) : a.createElement('img', {
      src: c(b.post, [
        'author',
        'avatar',
        'cache'
      ], ''),
      className: 'user',
      alt: g('Avatar')
    })
  },
  j = function (b) {
    var d = e.isFeatureActive('embed_refresh', {
      forum: b.post.forum
    }),
    g = d ? 'avatar avatar--refresh' : 'avatar',
    h = d ? 'tooltip tooltip--post-refresh' : 'tooltip';
    return a.createElement('div', {
      className: h
    }, a.createElement('div', {
      className: 'notch'
    }), c(b.post, [
      'author',
      'isAnonymous'
    ]) ? a.createElement('div', {
      className: g
    }, a.createElement(i, {
      post: b.post
    })) : a.createElement(f, {
      className: g,
      user: c(b.post, [
        'author'
      ]),
      forumId: b.post.forum
    }, a.createElement(i, {
      post: b.post
    })), a.createElement('div', {
      className: 'tooltip__content'
    }, a.createElement('h3', null, c(b.post, [
      'author',
      'isAnonymous'
    ]) ? a.createElement('h3', null, c(b.post, [
      'author',
      'name'
    ], null)) : a.createElement(f, {
      user: c(b.post, [
        'author'
      ]),
      forumId: b.post.forum
    }, a.createElement('h3', null, c(b.post, [
      'author',
      'name'
    ], null)))), a.createElement('p', null, c(b.post, [
      'excerpt'
    ], null))))
  };
  return j
}),
define('templates/lounge/partials/followButtonSmall', [
  'react',
  'core/config/urls',
  'core/strings',
  'core/utils/object/get',
  'core/switches'
], function (a, b, c, d, e) {
  'use strict';
  var f = c.gettext,
  g = function (c) {
    var g = e.isFeatureActive('embed_refresh', {
      forum: c.forumId
    }),
    h = g && e.isFeatureActive('embed_refresh_v2', {
      forum: c.forumId
    });
    return d(c.user, [
      'isSession'
    ]) ? d(c.user, [
      'isEditable'
    ]) ? g ? a.createElement('a', {
      href: b.editProfile || '',
      target: '_blank',
      className: c.buttonAsLink ? 'publisher-anchor-color follow-link hover-card' : 'follow-btn btn-small hover-card edit'
    }, f('Edit')) : a.createElement('a', {
      href: b.editProfile || '',
      target: '_blank',
      className: c.buttonAsLink ? 'publisher-anchor-color follow-link' : 'btn btn-small'
    }, f('Edit profile')) : null : d(c.user, [
      'isPrivate'
    ]) ? g ? h ? a.createElement('span', {
      className: 'btn btn-small follow-btn private'
    }, a.createElement('a', {
      href: d(c.user, [
        'profileUrl'
      ], ''),
      'data-action': 'profile',
      'data-username': d(c.user, [
        'username'
      ], ''),
      target: '_blank',
      rel: 'noopener noreferrer'
    }, a.createElement('i', {
      'aria-hidden': 'true',
      className: 'icon-lock'
    }), a.createElement('span', {
      className: 'btn-text'
    }, f('Private Profile')))) : null : a.createElement('span', {
      className: 'btn btn-small follow-btn private'
    }, a.createElement('i', {
      'aria-hidden': 'true',
      className: 'icon-lock'
    }), ' ', a.createElement('span', {
      className: 'btn-text'
    }, f('Private'))) : g ? h ? a.createElement('a', {
      href: d(c.user, [
        'profileUrl'
      ], ''),
      className: '' + (c.buttonAsLink ? 'publisher-anchor-color follow-link' : 'btn btn-small follow-btn hover-card') + (d(c.user, [
        'isFollowing'
      ]) ? ' following' : ''),
      'data-action': 'toggleFollow',
      'data-user': d(c.user, [
        'id'
      ], ''),
      target: '_blank',
      rel: 'noopener noreferrer'
    }, a.createElement('span', {
      className: 'btn-text following-text hover-card'
    }, a.createElement('span', {
      className: 'follow-user is-following'
    }), f('Following')), a.createElement('span', {
      className: 'btn-text follow-text'
    }, a.createElement('span', {
      className: 'follow-user publisher-background-color-refresh hover-card'
    }), f('Follow'))) : a.createElement('a', {
      href: d(c.user, [
        'profileUrl'
      ], ''),
      className: '' + (c.buttonAsLink ? 'publisher-anchor-color follow-link' : 'btn btn-small follow-btn hover-card') + (d(c.user, [
        'isFollowing'
      ]) ? ' following' : ''),
      'data-action': 'toggleFollow',
      'data-user': d(c.user, [
        'id'
      ], ''),
      target: '_blank',
      rel: 'noopener noreferrer'
    }, a.createElement('span', {
      className: 'btn-text following-text hover-card'
    }, a.createElement('span', {
      className: 'follow-user is-following publisher-background-color-refresh'
    })), a.createElement('span', {
      className: 'btn-text follow-text'
    }, a.createElement('span', {
      className: 'follow-user publisher-background-color-refresh hover-card'
    }))) : a.createElement('a', {
      href: d(c.user, [
        'profileUrl'
      ], ''),
      className: '' + (c.buttonAsLink ? 'publisher-anchor-color follow-link' : 'btn btn-small follow-btn') + (d(c.user, [
        'isFollowing'
      ]) ? ' following' : ''),
      'data-action': 'toggleFollow',
      'data-user': d(c.user, [
        'id'
      ], ''),
      target: '_blank',
      rel: 'noopener noreferrer'
    }, a.createElement('span', {
      className: 'btn-text following-text'
    }, f('Following')), a.createElement('span', {
      className: 'btn-text follow-text'
    }, f('Follow')), a.createElement('i', {
      'aria-hidden': 'true',
      className: 'icon-checkmark'
    }))
  };
  return g
}),
define('templates/lounge/partials/hovercardActions', [
  'react',
  'core/strings',
  'core/switches',
  'templates/lounge/partials/followButtonSmall',
  'templates/lounge/partials/profileLink'
], function (a, b, c, d, e) {
  'use strict';
  var f = b.gettext,
  g = function (b) {
    var g = c.isFeatureActive('embed_refresh', {
      forum: b.forumId
    }),
    h = g && c.isFeatureActive('embed_refresh_v2', {
      forum: b.forumId
    });
    return g ? h ? a.createElement('div', {
      className: 'hovercard-actions-container'
    }, b.showFollowButton ? a.createElement(d, {
      user: b.user,
      buttonAsLink: b.buttonAsLink,
      forumId: b.forumId
    }) : null, b.user.isPrivate && !b.user.isEditable ? null : a.createElement(e, {
      user: b.user,
      forumId: null,
      className: 'view-profile'
    }, a.createElement('span', {
      className: 'eye'
    }), f('View Profile'))) : a.createElement('div', null, b.showFollowButton ? a.createElement(d, {
      user: b.user,
      buttonAsLink: b.buttonAsLink,
      forumId: b.forumId
    }) : null) : a.createElement('div', null, a.createElement(e, {
      user: b.user,
      forumId: null,
      className: 'full-profile'
    }, f('Full profile')), b.showFollowButton ? a.createElement(d, {
      user: b.user,
      buttonAsLink: b.buttonAsLink
    }) : null, ' ')
  };
  return g
}),
define('templates/lounge/partials/hovercardCounters', [
  'react',
  'core/strings',
  'core/utils/object/get',
  'core/switches'
], function (a, b, c, d) {
  'use strict';
  var e = b.gettext,
  f = function (b) {
    var f = d.isFeatureActive('embed_refresh', {
      forum: b.forumId
    }),
    g = f && d.isFeatureActive('embed_refresh_v2', {
      forum: b.forumId
    });
    return f ? g ? a.createElement('div', {
      className: 'hovercard-counters-container hovercard-counters-container-v2'
    }, a.createElement('div', {
      className: 'counters'
    }, a.createElement('span', {
      className: 'count count-v2 comment'
    }), 1 === c(b.user, [
      'numPosts'
    ]) ? '1' : b.user.numPosts), a.createElement('div', {
      className: 'counters'
    }, a.createElement('span', {
      className: 'count count-v2 like'
    }), 1 === c(b.user, [
      'numLikesReceived'
    ]) ? '1' : b.user.numLikesReceived)) : a.createElement('div', {
      className: 'hovercard-counters-container'
    }, a.createElement('div', {
      className: 'counters'
    }, a.createElement('span', {
      className: 'count comment'
    }), 1 === c(b.user, [
      'numPosts'
    ]) ? '1' : b.user.numPosts), a.createElement('div', {
      className: 'counters'
    }, a.createElement('span', {
      className: 'count like'
    }), 1 === c(b.user, [
      'numLikesReceived'
    ]) ? '1' : b.user.numLikesReceived)) : a.createElement('div', null, 1 === c(b.user, [
      'numPosts'
    ]) ? e('1 comment') : e('%(numPosts)s comments', {
      numPosts: c(b.user, [
        'numPosts'
      ], '')
    }), ' ', a.createElement('span', {
      className: 'bullet'
    }, '•'), ' ', 1 === c(b.user, [
      'numLikesReceived'
    ]) ? e('1 vote') : e('%(numLikesReceived)s votes', {
      numLikesReceived: c(b.user, [
        'numLikesReceived'
      ], '')
    }))
  };
  return f
}),
define('templates/lounge/hovercard', [
  'react',
  'core/strings',
  'core/switches',
  'core/utils/object/get',
  'core/utils',
  'templates/lounge/partials/hovercardActions',
  'templates/lounge/partials/hovercardCounters',
  'templates/lounge/partials/profileLink'
], function (a, b, c, d, e, f, g, h) {
  'use strict';
  var i = b.gettext,
  j = e.getInitials,
  k = function (b, c) {
    return b.length <= c ? b : a.createElement('span', null, b.slice(0, c), '…')
  },
  l = function (b) {
    var e = c.isFeatureActive('embed_refresh', {
      forum: b.forumId
    }),
    l = e && c.isFeatureActive('embed_refresh_v2', {
      forum: b.forumId
    }),
    m = d(b.user, [
      'isPrivate'
    ]),
    n = d(b.user, [
      'avatar',
      'isCustom'
    ]) ? d(b.user, [
      'avatar',
      'cache'
    ], '') : b.forumAvatar;
    return e ? l ? a.createElement('div', {
      className: 'tooltip tooltip-v2 tooltip--refresh--v2'
    }, a.createElement('div', {
      className: 'tooltip__header'
    }, a.createElement(h, {
      user: b.user,
      forumId: b.forumId,
      className: 'avatar avatar--refresh-v2'
    }, n ? a.createElement('img', {
      'data-user': d(b.user, [
        'id'
      ], ''),
      'data-role': 'user-avatar',
      src: n,
      className: 'user',
      alt: i('Avatar')
    }) : a.createElement('div', {
      className: 'initials'
    }, j(b.user.name) [0])), a.createElement('div', {
      className: 'tooltip__content tooltip__content--refresh-v2'
    }, a.createElement('h3', {
      className: 'profile-link-container'
    }, a.createElement('div', {
      className: 'profile-link-username profile-link-username-refresh-v2'
    }, a.createElement(h, {
      user: b.user,
      forumId: null,
      'data-role': 'username'
    }, d(b.user, [
      'name'
    ], null)))), a.createElement('p', {
      className: 'stats stats--refresh-v2',
      'data-role': 'counters'
    }, null !== d(b.user, [
      'numPosts'
    ], null) && null !== d(b.user, [
      'numLikesReceived'
    ], null) ? a.createElement(g, {
      user: b.user
    }) : null))), a.createElement('div', {
      className: 'tooltip__bio'
    }, d(b.user, [
      'about'
    ]) ? a.createElement('p', {
      className: 'bio'
    }, d(b.user, [
      'about'
    ], '')) : null), a.createElement('footer', {
      className: 'tooltip__footer-v2',
      'data-role': 'actions'
    }, a.createElement(f, {
      user: b.user,
      buttonAsLink: b.buttonAsLink,
      showFollowButton: b.showFollowButton,
      forumId: b.forumId
    }))) : a.createElement('div', {
      className: 'tooltip tooltip--refresh'
    }, a.createElement(h, {
      user: b.user,
      forumId: b.forumId,
      className: 'avatar avatar--refresh'
    }, n ? a.createElement('img', {
      'data-user': d(b.user, [
        'id'
      ], ''),
      'data-role': 'user-avatar',
      src: n,
      className: 'user user--refresh',
      alt: i('Avatar')
    }) : a.createElement('div', {
      className: 'initials user--refresh'
    }, j(b.user.name)), m ? a.createElement('div', {
      className: 'view-profile-message-container'
    }, a.createElement('i', {
      'aria-hidden': 'true',
      className: 'icon-lock'
    }), a.createElement('div', null, 'Private')) : a.createElement('div', {
      className: 'view-profile-message-container'
    }, a.createElement('div', null, 'View'), a.createElement('div', null, 'Profile'))), a.createElement('div', {
      className: 'tooltip__content tooltip__content--refresh'
    }, a.createElement('h3', {
      className: 'profile-link-container'
    }, a.createElement('div', {
      className: 'profile-link-username'
    }, a.createElement(h, {
      user: b.user,
      forumId: null,
      'data-role': 'username'
    }, d(b.user, [
      'name'
    ], null))), a.createElement('div', {
      className: 'tooltip__actions',
      'data-role': 'actions'
    }, a.createElement(f, {
      user: b.user,
      buttonAsLink: b.buttonAsLink,
      showFollowButton: b.showFollowButton,
      forumId: b.forumId
    }))), a.createElement('p', {
      className: 'stats stats--refresh',
      'data-role': 'counters'
    }, null !== d(b.user, [
      'numPosts'
    ], null) && null !== d(b.user, [
      'numLikesReceived'
    ], null) ? a.createElement(g, {
      user: b.user
    }) : null))) : a.createElement('div', {
      className: 'tooltip'
    }, a.createElement('div', {
      className: 'notch'
    }), a.createElement(h, {
      user: b.user,
      forumId: null,
      className: 'avatar'
    }, a.createElement('img', {
      'data-user': d(b.user, [
        'id'
      ], ''),
      'data-role': 'user-avatar',
      src: d(b.user, [
        'avatar',
        'cache'
      ], ''),
      className: 'user',
      alt: i('Avatar')
    })), a.createElement('div', {
      className: 'tooltip__content'
    }, a.createElement('h3', null, a.createElement(h, {
      user: b.user,
      forumId: null,
      'data-role': 'username'
    }, d(b.user, [
      'name'
    ], null)), ' ', d(b.user, [
      'thread',
      'canModerate'
    ]) ? a.createElement('span', {
      className: 'badge moderator'
    }, i('MOD')) : null), d(b.user, [
      'about'
    ]) ? a.createElement('p', {
      className: 'bio'
    }, k(d(b.user, [
      'about'
    ], ''), 80)) : null, a.createElement('p', {
      className: 'stats',
      'data-role': 'counters'
    }, null !== d(b.user, [
      'numPosts'
    ], null) && null !== d(b.user, [
      'numLikesReceived'
    ], null) ? a.createElement(g, {
      user: b.user
    }) : null), a.createElement('div', {
      className: 'hovercard-badges',
      'data-role': 'hovercard-badges'
    })), a.createElement('footer', {
      className: 'tooltip__footer',
      'data-role': 'actions'
    }, a.createElement(f, {
      user: b.user,
      buttonAsLink: b.buttonAsLink,
      showFollowButton: b.showFollowButton
    })))
  };
  return l
}),
define('templates/lounge/upgradeCard', [
  'react',
  'core/strings',
  'core/utils/object/get'
], function (a, b, c) {
  'use strict';
  var d = b.gettext,
  e = function (b) {
    return a.createElement('div', {
      className: 'tooltip'
    }, a.createElement('div', {
      className: 'notch'
    }), a.createElement('div', null, a.createElement('p', {
      className: 'text-normal'
    }, d('Disqus Pro gives you access to exclusive features like auto-moderation, shadow banning, and customization options.')), a.createElement('a', {
      href: [
        'https://disqus.com/admin/',
        b.organization ? 'orgs/' + c(b.organization, [
          'id'
        ]) + '/' + c(b.organization, [
          'slug'
        ], 'sites') + '/' : '',
        'settings/subscription/'
      ].join(''),
      target: '_blank',
      rel: 'noopener noreferrer',
      className: 'btn btn-small',
      'data-role': 'upgrade-link'
    }, d('Subscriptions and Billing'))))
  };
  return e
}),
define('templates/lounge/partials/userBadges', [
  'react',
  'core/bus',
  'templates/lounge/partials/profileLink'
], function (a, b, c) {
  'use strict';
  var d = function (b) {
    var d = b.badge,
    e = b.user,
    f = b.forumId,
    g = b.context,
    h = b.trackClick,
    i = b.postId;
    return d.image ? a.createElement(c, {
      user: e,
      forumId: f,
      profileTab: 'badges',
      id: g + '-badge_' + e.id + '-' + d.id + '-' + i,
      className: 'user-badge badge-tooltip__wrapper',
      'data-role': 'user-badge',
      'data-badge': d.id,
      onClick: function (a) {
        return h(a, d.id)
      },
      tabIndex: 0
    }, a.createElement('img', {
      className: 'user-badge-image',
      src: d.image,
      alt: d.name
    }), a.createElement('div', {
      className: 'badge-tooltip__container'
    }, a.createElement('div', {
      className: 'tooltip show badge-tooltip'
    }, a.createElement('span', {
      className: 'badge-tooltip__content'
    }, d.name)))) : null
  },
  e = function (a, b) {
    return b.badges ? b.badges.filter(function (b) {
      return a.badges[b.id]
    }) : [
    ]
  },
  f = function (f) {
    var g = f.forum,
    h = f.user,
    i = f.context,
    j = f.limit,
    k = f.postId;
    if (!(g.settings.badgesEnabled && g.badges && Object.keys(g.badges).length && h)) return null;
    var l = e(g, h),
    m = function (a, c) {
      b.trigger('uiAction:clickBadge', a, c)
    },
    n = l.length > j,
    o = n ? j - 1 : j;
    return l.length ? a.createElement('span', {
      'data-role': 'badges',
      className: 'user-badges-collection',
      'data-tracking-area': i
    }, l.map(function (b, c) {
      return c < o ? a.createElement(d, {
        key: c,
        badge: b,
        user: h,
        forumId: g.id,
        context: i,
        trackClick: m,
        postId: k
      }) : null
    }), n ? a.createElement(c, {
      user: h,
      forumId: g.id,
      profileTab: 'badges',
      className: 'user-badge truncate-badge publisher-background-color',
      'data-role': 'user-badge',
      onClick: function (a) {
        return m(a, 'more')
      },
      tabIndex: 0
    }, a.createElement('span', {
      className: 'user-badge-more'
    }, '+', l.length - o)) : null) : a.createElement('span', {
      'data-role': 'badges',
      className: 'user-badges-collection'
    })
  };
  return f
}),
define('lounge/views/cards', [
  'jquery',
  'underscore',
  'lounge/common',
  'core/utils',
  'core/switches',
  'common/models',
  'common/views/mixins',
  'core/constants/badgesConstants',
  'core/views/common/HoverCard',
  'core/views/VotersCard',
  'templates/lounge/contextCard',
  'templates/lounge/hovercard',
  'templates/lounge/upgradeCard',
  'templates/lounge/partials/hovercardActions',
  'templates/lounge/partials/hovercardCounters',
  'templates/lounge/partials/userBadges'
], function (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p) {
  'use strict';
  i.prototype.getContainerPosition = function () {
    var a = c.getLounge().getPosition();
    return {
      pageOffset: a.pageOffset,
      containerOffset: a.frameOffset,
      containerHeight: a.height
    }
  },
  function () {
    var c = 10;
    a(window.document).on('mouseout', b.debounce(function (a) {
      var b = a.relatedTarget || a.toElement;
      b && 'HTML' !== b.nodeName || i.exitAll()
    }, c))
  }();
  var q = i.extend({
    className: 'tooltip-outer profile-card',
    events: b.defaults({
      'click [data-action=toggleFollow]': 'toggleFollow'
    }, i.prototype.events),
    initialize: function (a) {
      var b = this;
      i.prototype.initialize.call(b, a),
      b.session = a.session,
      b.user = a.user,
      b._fetched = !1,
      b.listenTo(b.session, 'change:id', function () {
        this._rendered && this.render()
      }),
      b.session.attributes.thread && e.isFeatureActive('embed_refresh', {
        forum: b.session.attributes.thread.forum.id
      }) && b.el.classList.add('profile-card--refresh')
    },
    onFetch: function (a) {
      this.user = new f.SyncedUser(a.attributes),
      this.updateCounters(),
      this.updateActions(),
      this.updateBadges(),
      this.listenTo(this.user, {
        'change:numPosts change:numLikesReceived': b.debounce(function () {
          this.updateCounters()
        }),
        'change:isFollowing': this.updateActions
      });
      var c = function (a) {
        this.set('isFollowing', a.get('isFollowing'))
      };
      a.listenTo(this.user, 'change:isFollowing', c),
      this.user.listenTo(a, 'change:isFollowing', c)
    },
    serialize: function () {
      var a = this.user.toJSON({
        session: this.session
      });
      a.numLikesReceived = a.numLikesReceived || this.user.get('numVotes') || 0;
      var b = this.session.get('thread').forum.get('avatar');
      return b = b && b.large && b.large.cache,
      b = d.isDefaultAvatar(b) ? null : b,
      {
        forumId: this.session.attributes.thread.forum.id,
        forumAvatar: b,
        user: a,
        showFollowButton: this.user.has('isFollowing') || this.session.isLoggedOut()
      }
    },
    render: function () {
      this.$el.html(l(this.serialize())),
      i.prototype.render.call(this)
    },
    setBadges: function (a) {
      this._fetched && (this.user.set('badges', a), this.updateBadges())
    },
    updateBadges: function () {
      if (!e.isFeatureActive('embed_refresh', {
        forum: this.session.attributes.thread.forum.id
      })) {
        var a = this.session.get('thread') && this.session.get('thread').forum,
        b = Boolean(a && a.get('settings') && a.get('settings').badgesEnabled && a.get('badges')),
        c = Boolean(b && this.user.get('badges') && this.user.get('badges').length);
        c && !this.el.classList.contains('has-badges') ? this.el.classList.add('has-badges') : !c && this.el.classList.contains('has-badges') && this.el.classList.remove('has-badges'),
        b && this.$el.find('[data-role=hovercard-badges]').html(p({
          forum: a.attributes,
          user: this.user.attributes,
          context: 'hovercard',
          limit: h.MAX_BADGE_COUNT
        }))
      }
    },
    updateCounters: function () {
      this.$el.find('[data-role=counters]').html(o(this.serialize()))
    },
    updateActions: function () {
      this.$el.find('[data-role=actions]').html(n(this.serialize()))
    },
    show: function () {
      this._fetched || (this._fetched = !0, this.user.fetch({
        success: b.bind(this.onFetch, this)
      })),
      e.isFeatureActive('embed_refresh', {
        forum: this.session.attributes.thread.forum.id
      }) && (i.prototype.constructor.POSITION_OFFSET = 0, i.prototype.constructor.DELAY_ENTER = 0, i.prototype.constructor.DELAY_LEAVE = 0),
      i.prototype.show.call(this)
    }
  }, {
    create: function (a) {
      var b = a.user;
      return i.create(b.id, a, 'ProfileCard', q)
    }
  });
  b.extend(q.prototype, g.FollowButtonMixin);
  var r = i.extend({
    className: 'context-card tooltip-outer',
    initialize: function (a) {
      var b = this;
      i.prototype.initialize.call(b, a),
      b.post = a.post
    },
    render: function () {
      var a = this.post,
      b = a.toJSON();
      b.excerpt = d.niceTruncate(b.plaintext, 40),
      this.$el.html(k({
        post: b
      })),
      i.prototype.render.call(this)
    }
  }, {
    create: function (a) {
      var b = a.post;
      return i.create(b.id, a, 'ContextCard', r)
    }
  }),
  s = i.extend({
    className: 'tooltip-outer upgrade-card',
    events: b.defaults({
      'click [data-role=upgrade-link]': 'onClickUpgrade'
    }, i.prototype.events),
    initialize: function (a) {
      i.prototype.initialize.call(this, a),
      this.organization = a.organization
    },
    render: function () {
      this.$el.html(m({
        organization: this.organization
      })),
      i.prototype.render.call(this)
    },
    onClickUpgrade: function (a) {
      this.trigger('click:upgrade', a)
    }
  }, {
    create: function (a) {
      var b = a.organization;
      return i.create(b ? b.id : 'upgrade', a, 'UpgradeCard', s)
    }
  });
  return {
    HoverCard: i,
    ProfileCard: q,
    ContextCard: r,
    VotersCard: j,
    UpgradeCard: s
  }
}),
define('core/views/SourcelessIframeRichMediaView', [
  'jquery',
  'core/mediaConfig',
  'core/views/RichMediaView'
], function (a, b, c) {
  'use strict';
  return c.extend({
    createContentNode: function (b) {
      return a('<iframe>').attr({
        frameBorder: 0,
        scrolling: 'no',
        width: '100%',
        height: this.model.get('deferredHeight'),
        'data-src': b,
        src: 'javascript:window.frameElement.getAttribute("data-src");'
      })
    },
    insertContentNode: function (a) {
      c.prototype.insertContentNode.apply(this, arguments);
      var d = this.model.get('deferredHeight') || b.get('defaultIframeHeight');
      a.height(d)
    }
  })
}),
define('lounge/views/media', [
  'underscore',
  'stance',
  'core/utils',
  'core/utils/storage',
  'core/utils/html/toHexColorString',
  'core/media',
  'core/mediaConfig',
  'core/models/RichMediaViewModel',
  'core/views/RichMediaLinkView',
  'core/views/RichMediaView',
  'core/views/IframeRichMediaView',
  'core/views/SoundCloudRichMediaView',
  'core/views/AutoplayRichMediaView',
  'core/views/SourcelessIframeRichMediaView',
  'core/views/DynamicHeightRichMediaView',
  'core/views/TwitterRichMediaView',
  'core/views/ImageRichMediaView',
  'core/views/FacebookPhotoRichMediaView',
  'core/views/VineRichMediaView',
  'lounge/common'
], function (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t) {
  'use strict';
  function u() {
    var b = d.get('disqus.collapse-media');
    return a.isBoolean(b) || (b = c.isMobileUserAgent()),
    b
  }
  return a.extend(j.prototype, {
    topEdgeOffset: function () {
      return - t.getLounge().getPosition().height
    },
    configureDeferred: function () {
      this.model.get('deferred') && !this.model.get('activated') && this.listenToOnce(b(this), 'enter', function () {
        this.relatedPost && this.listenToOnce(this, 'load error', function () {
          t.getLounge().postsView.onDeferredViewReady(this.relatedPost)
        }),
        this.enterViewport()
      }),
      this.listenToOnce(t.getLounge().postsView, 'render:end', this.updateDeferredHeight)
    }
  }),
  p.theme = function () {
    return t.getLounge().config.colorScheme
  },
  p.linkColor = function () {
    return e(t.getLounge().config.anchorColor)
  },
  g.set({
    collapsed: u()
  }),
  g.on('change:collapsed', function (b, c) {
    if (a.isObject(c)) {
      if (!c.persist) return;
      c = c.value
    }
    d.set('disqus.collapse-media', c)
  }),
  {
    settings: g,
    getCollapseDefault: u,
    getDomain: c.getDomain,
    RichMediaLinkView: i,
    RichMediaViewModel: h,
    RichMediaView: j,
    IframeRichMediaView: k,
    SoundCloudRichMediaView: l,
    AutoplayRichMediaView: m,
    SourcelessIframeRichMediaView: n,
    DynamicHeightRichMediaView: o,
    TwitterRichMediaView: p,
    ImageRichMediaView: q,
    FacebookPhotoRichMediaView: r,
    VineRichMediaView: s,
    instantiateRichMediaView: f.instantiateRichMediaView,
    getRichMediaViewConfig: f.getRichMediaViewConfig
  }
}),
define('core/templates/react/BadgesManageTemplate', [
  'react',
  'underscore',
  'core/strings',
  'core/constants/badgesConstants'
], function (a, b, c, d) {
  'use strict';
  var e = c.gettext,
  f = d.ACTION_TYPES,
  g = function (b) {
    var c = b.text,
    d = b.value,
    e = b.selected,
    f = b.handleChange,
    g = function (a) {
      var b = 13;
      a.keyCode === b && f(a)
    };
    return a.createElement('label', {
      className: 'padding-default align align__item--grow align__item--equal align--center align--column modal__option' + (e ? ' -selected' : ''),
      tabIndex: '0',
      onKeyPress: g,
      onChange: f
    }, a.createElement('input', {
      type: 'radio',
      name: 'badge_action',
      value: d,
      checked: e
    }), a.createElement('p', {
      className: 'text-semibold text-center modal__option-text'
    }, c))
  },
  h = function (b) {
    var c = b.badge,
    d = b.selectedBadge,
    e = b.handleChange;
    return a.createElement('span', {
      key: c.id,
      className: 'badge-option spacing-right ' + (d && d === c.id ? ' selected' : '') + (c.disabled ? ' disabled' : '')
    }, a.createElement('input', {
      id: 'badge-' + c.id + '-input',
      name: 'badge',
      type: 'radio',
      className: 'badge-option_input',
      value: c.id,
      onChange: e,
      disabled: c.disabled,
      tabIndex: '0'
    }), a.createElement('label', {
      htmlFor: 'badge-' + c.id + '-input',
      className: 'badge-option_label'
    }, a.createElement('span', {
      className: 'badge-option_image-wrapper'
    }, a.createElement('img', {
      className: 'badge-option_image',
      src: c.image,
      alt: c.name
    })), a.createElement('span', {
      className: 'badge-option_title'
    }, c.name)))
  },
  i = function (b) {
    var c = b.badgeAction,
    d = b.formValues,
    i = b.badgeOptions,
    j = b.updateBadgeAction,
    k = b.updateBadgeSelection,
    l = b.handleSubmit,
    m = b.handleClose,
    n = 'https://' + d.forum + '.disqus.com/admin/settings/badges';
    return a.createElement('form', {
      className: 'badges-manage-form'
    }, a.createElement('div', {
      className: 'admin-modal__content padding-bottom'
    }, a.createElement('div', null, a.createElement('div', {
      className: 'align align--stretch align--wrap'
    }, a.createElement(g, {
      text: e('Award a Badge'),
      value: f.AWARD,
      selected: c === f.AWARD,
      handleChange: j
    }), a.createElement(g, {
      text: e('Remove a Badge'),
      value: f.REMOVE,
      selected: c === f.REMOVE,
      handleChange: j
    })), a.createElement('div', {
      className: 'modal__description border-bottom-dark'
    }, a.createElement('p', {
      className: 'modal__option-subtext'
    }, e(c === f.AWARD ? 'Select a badge below to award it to this commenter.' : 'Select one of the manually awarded badges below to remove it from this commenter. Automatically awarded badges can only be removed by removing the badge from your site entirely.'), a.createElement('br', null), e('You can manage your site\'s badges using the '), a.createElement('a', {
      href: n,
      target: '_blank',
      rel: 'noopener noreferrer'
    }, e('Badges settings')), e(' in the Disqus Admin.'))), a.createElement('div', {
      className: 'modal__config'
    }, a.createElement('div', {
      className: 'badge-options_list'
    }, i.map(function (b) {
      return a.createElement(h, {
        key: b.id,
        badge: b,
        selectedBadge: d.badge,
        handleChange: k
      })
    }), c === f.AWARD ? a.createElement('span', {
      className: 'badge-option spacing-right create-badge'
    }, a.createElement('a', {
      className: 'badge-option_link',
      href: n,
      target: '_blank',
      rel: 'noopener noreferrer'
    }, a.createElement('span', {
      className: 'badge-option_image-wrapper'
    }, a.createElement('span', {
      className: 'icon icon-plus badge-option_add-icon'
    })), a.createElement('span', {
      className: 'badge-option_title'
    }, e('Create a new badge')))) : null), c !== f.REMOVE || i.length ? null : a.createElement('div', {
      className: 'badge-options_empty'
    }, e('This user doesn\'t have any badges.')), d.errorMessage ? a.createElement('div', {
      className: 'spacing-top-narrow'
    }, a.createElement('p', {
      className: 'text-small modal__option-subtext modal__error'
    }, d.errorMessage)) : null))), a.createElement('div', {
      className: 'admin-modal__footer clearfix'
    }, a.createElement('button', {
      className: 'button button-fill--brand button-small text-capitalized',
      onClick: l
    }, e(c === f.AWARD ? 'Award badge' : 'Remove badge')), a.createElement('button', {
      className: 'button button-fill button-small text-capitalized',
      onClick: m
    }, e('Cancel'))))
  };
  return i
});
var _extends = Object.assign || function (a) {
  for (var b = 1; b < arguments.length; b++) {
    var c = arguments[b];
    for (var d in c) Object.prototype.hasOwnProperty.call(c, d) && (a[d] = c[d])
  }
  return a
};
define('lounge/views/posts/BadgesManageView', [
  'underscore',
  'backbone',
  'core/api',
  'core/bus',
  'core/strings',
  'core/utils',
  'core/templates/react/BadgesManageTemplate',
  'core/constants/badgesConstants'
], function (a, b, c, d, e, f, g, h) {
  'use strict';
  var i = h.ACTION_TYPES,
  j = h.BADGES_CRITERIA,
  k = f.preventDefaultHandler,
  l = e.get,
  m = b.View.extend({
    className: 'badges-action',
    initialize: function (a) {
      this.forum = a.forum
    },
    render: function () {
      var a = this.$el;
      return this.badgeAction = this.badgeAction || i.AWARD,
      this.formValues = _extends({
        user: this.model.author.id,
        forum: this.forum.id
      }, this.formValues),
      a.html(g({
        badgeAction: this.badgeAction,
        formValues: this.formValues,
        badgeOptions: this.getBadgeOptions(),
        updateBadgeAction: this.updateBadgeAction.bind(this),
        updateBadgeSelection: this.updateBadgeSelection.bind(this),
        handleSubmit: this.submit.bind(this),
        handleClose: this.cancel.bind(this)
      })),
      this.trigger('render'),
      this
    },
    updateBadgeAction: function (a) {
      this.formValues.badge = null,
      this.formValues.errorMessage = null,
      this.badgeAction = a.target.value || a.target.children[0].value,
      this.render()
    },
    updateBadgeSelection: function (a) {
      this.formValues.errorMessage = null,
      a.target.disabled || (this.formValues.badge = a.target.value)
    },
    getBadgeOptions: function () {
      var a = [
      ],
      b = [
      ],
      c = this.forum.get('badges') ? f.deepClone(this.forum.get('badges')) : [
      ],
      d = this.model.author.get('badges') || [
      ];
      if (this.badgeAction === i.AWARD) {
        var e = d.map(function (a) {
          return a.id
        });
        Object.keys(c).forEach(function (d) {
          var f = c[d];
          f.criteria === j.MANUAL && (e.indexOf(f.id) > - 1 ? (f.disabled = !0, b.push(f)) : a.push(f))
        })
      } else this.badgeAction === i.REMOVE && d.forEach(function (c) {
        c.criteria === j.MANUAL ? a.push(c) : (c.disabled = !0, b.push(c))
      });
      return [].concat(a, b)
    },
    submit: k(function () {
      var b = this;
      if (this.formValues.badge) {
        this.formValues.errorMessage = null;
        var e = this.badgeAction === i.AWARD ? 'uiAction:awardBadge' : 'uiAction:removeBadge';
        c.call('badges/' + this.badgeAction, {
          method: 'POST',
          data: a.omit(this.formValues, a.isNull),
          success: function (a) {
            b.trigger('success', {
              action: b.badgeAction,
              badge: a.response
            }),
            d.trigger(e, a.response.id)
          },
          error: function (a) {
            b.formValues.errorMessage = a.responseJSON.response,
            b.render()
          }
        })
      } else this.badgeAction === i.AWARD ? this.formValues.errorMessage = l('You must select a badge to award') : this.formValues.errorMessage = l('You must select a badge to remove'),
      this.render()
    }),
    cancel: k(function () {
      this.trigger('cancel')
    })
  }, {
    defaultFormValues: {
      badge: null,
      errorMessage: null
    }
  });
  return m
}),
define('core/constants/moderationUserLists', [
  'exports',
  'moment'
], function (a, b) {
  'use strict';
  a.LIST_TYPES = {
    WHITELIST: 'whitelist',
    BLACKLIST: 'blacklist'
  },
  a.BAN_TYPES = {
    SHADOW: 'shadowban',
    PERMANENT: 'permanent',
    TEMP: 'temp'
  },
  a.RETROACTIVE_ACTION_TYPES = {
    DO_NOTHING: '',
    DELETE: '1',
    MARK_AS_SPAM: '2'
  },
  a.DEFAULT_FORM_VALUES = {
    durationHours: '24',
    customDurationAmount: '1',
    customDurationScale: '1'
  },
  a.STORAGE_KEY_BAN_TYPE = 'defaultBan',
  a.getDateExpires = function (a) {
    return 'custom' === a.durationHours && (a.durationHours = parseInt(a.customDurationAmount, 10) * parseInt(a.customDurationScale, 10)),
    b().add(a.durationHours, 'hours').toISOString()
  },
  a.isBanTypeSupported = function (b, c) {
    return !!c && (b === a.BAN_TYPES.SHADOW ? c.shadowBanning : b === a.BAN_TYPES.TEMP ? c.temporaryBanning : Boolean(b))
  }
}),
define('core/templates/react/ModerationUserListsTemplate', [
  'react',
  'underscore',
  'core/strings',
  'core/constants/moderationUserLists'
], function (a, b, c, d) {
  'use strict';
  var e = this,
  f = c.gettext,
  g = d.LIST_TYPES,
  h = d.BAN_TYPES,
  i = d.RETROACTIVE_ACTION_TYPES,
  j = 168,
  k = [
    {
      label: f('1 day'),
      durationHours: '24'
    },
    {
      label: f('1 week'),
      durationHours: j.toString()
    },
    {
      label: f('2 weeks'),
      durationHours: (2 * j).toString()
    }
  ],
  l = function (c) {
    var d = c.user,
    j = c.listName,
    l = c.ipAddress,
    m = c.formValues,
    n = c.supportsShadowBanning,
    o = c.supportsTempBanning,
    p = c.selectRetroactiveAction,
    q = c.toggleBanTypeCallback,
    r = c.toggleUserValueChecked,
    s = c.toggleIpAddressChecked,
    t = c.updateDuration,
    u = c.updateCustomDurationAmount,
    v = c.updateCustomDurationScale,
    w = c.updateReason,
    x = c.handleSubmit,
    y = c.handleClose,
    z = c.handleChangeValue,
    A = c.closeText,
    B = c.getPlaceholderForValue,
    C = c.itemTypes,
    D = c.itemType,
    E = c.UpgradeIcon,
    F = c.itemValue;
    return j ? a.createElement('form', {
      className: j + '-form'
    }, a.createElement('div', {
      className: 'admin-modal__content padding-bottom'
    }, a.createElement('div', null, j === g.WHITELIST ? a.createElement('p', {
      className: 'spacing-default'
    }, f('Adding this person to the whitelist will automatically approve his or her new comments from now on.')) : a.createElement('div', {
      className: 'align align--stretch align--wrap'
    }, a.createElement('label', {
      className: [
        'padding-default',
        'align',
        'align__item--grow',
        'align__item--equal',
        'align--center',
        'align--column',
        'modal__option',
        'ban__option',
        o ? null : '-disabled',
        m.type === h.TEMP ? '-selected' : null
      ].join(' ')
    }, a.createElement('input', {
      type: 'radio',
      name: 'ban_type',
      value: h.TEMP,
      checked: m.type === h.TEMP,
      onChange: q,
      disabled: !o
    }), a.createElement('p', {
      className: 'text-semibold text-center modal__option-text ban__option-text'
    }, f('Timeout'), o ? null : a.createElement(E, {
      tooltipClass: 'tooltip-timeout'
    }))), j === g.BLACKLIST && m.type === h.TEMP ? a.createElement('div', {
      className: 'padding-default modal__description ban__description border-bottom-dark'
    }, a.createElement('div', {
      className: 'text-small modal__option-subtext ban__option-subtext'
    }, f('Restrict a user\'s ability to comment for a period of time. This notifies the user of their timeout. If discussions get heated, enforce timeouts so that users cool off and improve their behavior.'), k.map(function (b) {
      return a.createElement('label', {
        className: 'fieldset__block--checkbox text-medium spacing-bottom-small text-semibold text-gray-dark',
        key: b.durationHours
      }, a.createElement('input', {
        type: 'radio',
        name: 'duration',
        checked: m.durationHours === b.durationHours,
        onChange: t,
        value: b.durationHours,
        className: 'spacing-right-small'
      }), b.label)
    }), a.createElement('div', null, a.createElement('label', {
      className: 'text-medium spacing-bottom-small inline__item spacing-right text-semibold text-gray-dark'
    }, a.createElement('input', {
      type: 'radio',
      name: 'duration',
      checked: 'custom' === m.durationHours,
      onChange: t,
      value: 'custom',
      className: 'spacing-right-small'
    }), f('Custom')), a.createElement('input', {
      name: 'customDurationAmount',
      type: 'number',
      value: m.customDurationAmount,
      onChange: u,
      onFocus: u,
      onKeyPress: u,
      className: 'spacing-right-small -text-small',
      maxLength: '2',
      style: {
        width: '50px'
      },
      min: '0'
    }), a.createElement('select', {
      value: m.customDurationScale,
      onChange: v
    }, a.createElement('option', {
      value: '1'
    }, 'Hour(s)'), a.createElement('option', {
      value: '24'
    }, 'Day(s)'), a.createElement('option', {
      value: 168 .toString()
    }, 'Week(s)'))))) : null, a.createElement('label', {
      className: [
        'padding-default',
        'align',
        'align__item--grow',
        'align__item--equal',
        'align--center',
        'align--column',
        'modal__option',
        'ban__option',
        n ? null : '-disabled',
        m.type === h.SHADOW ? '-selected' : null
      ].join(' ')
    }, a.createElement('input', {
      type: 'radio',
      name: 'ban_type',
      value: h.SHADOW,
      checked: m.type === h.SHADOW,
      onChange: q,
      disabled: !n
    }), a.createElement('p', {
      className: 'text-semibold text-center modal__option-text ban__option-text'
    }, f('Shadow Ban'), n ? null : a.createElement(E, null))), j === g.BLACKLIST && m.type === h.SHADOW ? a.createElement('div', {
      className: 'modal__description ban__description border-bottom-dark'
    }, a.createElement('p', {
      className: 'text-small modal__option-subtext ban__option-subtext'
    }, f('Ban a user without them knowing. The user can still comment, however, their posts will only be visible to themselves. Use it against trolls and spammers who attempt to circumvent a ban with new accounts.'))) : null, a.createElement('label', {
      className: [
        'padding-default',
        'align',
        'align__item--grow',
        'align__item--equal',
        'align--center',
        'align--column',
        'modal__option',
        'ban__option',
        m.type === h.PERMANENT ? '-selected' : null
      ].join(' ')
    }, a.createElement('input', {
      type: 'radio',
      name: 'ban_type',
      value: h.PERMANENT,
      checked: m.type === h.PERMANENT,
      onChange: q
    }), a.createElement('p', {
      className: 'text-semibold text-center modal__option-text ban__option-text'
    }, 'Permanent Ban')), j === g.BLACKLIST && m.type === h.PERMANENT ? a.createElement('div', {
      className: 'modal__description ban__description border-bottom-dark'
    }, a.createElement('p', {
      className: 'text-small modal__option-subtext ban__option-subtext'
    }, f('Permanently ban the user so they can no longer post, vote, or flag comments on your site. If the user repeatedly violates your comment policy, revoke their ability to participate.'), a.createElement('label', {
      className: 'fieldset__block--checkbox text-medium spacing-bottom-small'
    }, a.createElement('span', {
      className: 'text-semibold text-gray-dark'
    }, f('Last 30 days of comments:'), ' '), a.createElement('select', {
      value: m.retroactiveAction,
      onChange: p,
      className: 'custom-select'
    }, a.createElement('option', {
      value: i.DO_NOTHING
    }, f('Do nothing')), a.createElement('option', {
      value: i.DELETE
    }, f('Delete')), a.createElement('option', {
      value: i.MARK_AS_SPAM
    }, f('Mark as spam')))))) : null)), a.createElement('div', {
      className: 'padding-default modal__config ban__config'
    }, !d || d.isAnonymous ? null : a.createElement('div', {
      className: 'align align--stretch access__block spacing-bottom embed-hidden'
    }, a.createElement('a', {
      href: d.profileUrl,
      className: 'spacing-right'
    }, a.createElement('img', {
      src: d.avatar.cache,
      alt: d.name,
      className: 'comment-__avatar border-radius-sm'
    })), a.createElement('div', {
      className: 'access__value'
    }, a.createElement('h4', null, d.name), a.createElement('p', {
      className: 'text-gray text-small'
    }, ' ', d.username, ' '))), d ? a.createElement('label', {
      className: 'fieldset__block--checkbox text-medium spacing-bottom-small'
    }, a.createElement('input', {
      type: 'checkbox',
      checked: Boolean(m.username),
      onChange: b.partial(r, b, 'username'),
      className: 'spacing-right-small'
    }), f('User:'), ' ', ' ', a.createElement('strong', null, ' ', d.username, ' ')) : a.createElement(a.Fragment, null, a.createElement('div', {
      className: 'spacing-top spacing-bottom form-attribute-input'
    }, a.createElement('div', null, a.createElement('h3', {
      className: 'text-gray-darker'
    }, 'Type')), a.createElement('select', {
      name: 'itemType',
      className: 'input--select',
      value: e.itemType,
      onChange: z,
      disabled: C.length <= 1
    }, C.map(function (b) {
      return a.createElement('option', {
        key: b.value,
        value: b.value
      }, ' ', b.displayName, ' ')
    }))), a.createElement('div', {
      className: 'spacing-top spacing-bottom form-attribute-input'
    }, a.createElement('h3', {
      className: 'text-gray-darker'
    }, 'Value'), a.createElement('div', null, a.createElement('input', {
      className: 'input--textbox',
      name: 'itemValue',
      type: 'text',
      placeholder: B(D),
      value: F,
      onChange: z
    })))), d && j === g.BLACKLIST ? a.createElement('label', {
      className: 'fieldset__block--checkbox text-medium spacing-bottom-small'
    }, a.createElement('input', {
      type: 'checkbox',
      checked: Boolean(m.email),
      onChange: b.partial(r, b, 'email'),
      className: 'spacing-right-small'
    }), f('Email:'), ' ', a.createElement('strong', null, ' ', d.email, ' ')) : null, j === g.BLACKLIST && l ? a.createElement('label', {
      className: 'fieldset__block--checkbox text-medium spacing-bottom-small'
    }, a.createElement('input', {
      type: 'checkbox',
      checked: Boolean(m.ipAddress),
      onChange: s,
      className: 'spacing-right-small'
    }), f('IP Address:'), ' ', a.createElement('strong', null, ' ', l, ' '), a.createElement('div', {
      className: [
        'spacing-default-narrow',
        'text-small',
        'text-gray',
        'spacing-left-large',
        'embed-hidden'
      ].join(' ')
    }, a.createElement('strong', null, f('Note:'), ' '), f('Adding an IP address to the banned list may also unintentionally block others who may share this IP address.'))) : null, j === g.BLACKLIST ? a.createElement('div', null, a.createElement('div', {
      className: 'spacing-bottom-small spacing-top-narrow'
    }, a.createElement('label', {
      className: 'modal__reason ban__reason'
    }, f('Reason for banning:'), a.createElement('input', {
      name: 'reason',
      type: 'text',
      value: m.reason || '',
      onChange: w,
      className: 'input--textbox -text-small border-gray-light',
      maxLength: '50'
    }))), a.createElement('p', {
      className: 'text-small modal__option-subtext ban__option-subtext'
    }, f('You can remove the user from the banned list at any time.'))) : null)), a.createElement('div', {
      className: 'admin-modal__footer clearfix'
    }, a.createElement('div', null, a.createElement('button', {
      className: [
        'button',
        'button-fill--brand',
        'button-small',
        'text-capitalized'
      ].join(' '),
      disabled: !(m.email || m.username || m.ipAddress || F),
      onClick: x
    }, f(j === g.WHITELIST ? 'Add to Trusted List' : 'Add to Banned List')), j === g.BLACKLIST ? a.createElement('button', {
      className: [
        'button',
        'button-fill',
        'button-small',
        'text-capitalized'
      ].join(' '),
      onClick: y
    }, f(A)) : null))) : null
  };
  return l
}),
define('lounge/utils', [
  'jquery',
  'core/api'
], function (a, b) {
  'use strict';
  var c = {
  },
  d = function (d) {
    if (c[d]) return c[d];
    var e = a.Deferred();
    return d ? (c[d] = e.promise(), b.call('forums/details', {
      method: 'GET',
      data: {
        forum: d,
        attach: 'forumFeatures'
      }
    }).done(function (a) {
      e.resolve(a.response.features)
    }).fail(function () {
      e.reject({
      })
    }), e.promise()) : e.reject({
    })
  };
  return d._clearCache = function () {
    c = {
    }
  },
  {
    getSaasFeatures: d
  }
});
var _extends = Object.assign || function (a) {
  for (var b = 1; b < arguments.length; b++) {
    var c = arguments[b];
    for (var d in c) Object.prototype.hasOwnProperty.call(c, d) && (a[d] = c[d])
  }
  return a
};
define('lounge/views/posts/BlacklistView', [
  'jquery',
  'underscore',
  'backbone',
  'react',
  'moment',
  'core/bus',
  'core/api',
  'core/utils',
  'core/utils/storage',
  'core/templates/react/ModerationUserListsTemplate',
  'core/constants/moderationUserLists',
  'lounge/utils',
  'lounge/views/cards'
], function (a, b, c, d, e, f, g, h, i, j, k, l, m) {
  'use strict';
  var n = k.BAN_TYPES,
  o = k.LIST_TYPES,
  p = k.STORAGE_KEY_BAN_TYPE,
  q = k.RETROACTIVE_ACTION_TYPES,
  r = k.DEFAULT_FORM_VALUES,
  s = k.getDateExpires,
  t = k.isBanTypeSupported,
  u = h.preventDefaultHandler,
  v = c.View.extend({
    className: 'moderate',
    initialize: function (b) {
      this.forum = b.forum;
      var c = [
        l.getSaasFeatures(this.model.get('forum'))
      ];
      this.model.get('ipAddress') && this.model.author.get('email') || c.push(this.model.fetch()),
      this.loading = a.when.apply(a, c)
    },
    render: function () {
      var a = this,
      b = this.$el;
      return b.addClass('loading'),
      f.trigger('uiAction:viewBanUser'),
      this.loading.always(function (c) {
        var e = a.model.author,
        f = i.get(p);
        a.saasFeatures = c,
        a.formValues = _extends({
        }, r, {
          type: t(f, c) ? f : n.PERMANENT,
          username: e.get('username'),
          email: e.get('email'),
          user: e.get('id'),
          postId: a.model.id
        }, a.formValues),
        b.removeClass('loading'),
        b.html(j({
          user: e.toJSON(),
          listName: o.BLACKLIST,
          ipAddress: a.model.get('ipAddress'),
          formValues: a.formValues,
          supportsShadowBanning: t(n.SHADOW, a.saasFeatures),
          supportsTempBanning: t(n.TEMP, a.saasFeatures),
          selectRetroactiveAction: a.selectRetroactiveAction.bind(a),
          toggleBanTypeCallback: a.toggleBanTypeCallback.bind(a),
          toggleUserValueChecked: a.toggleUserValueChecked.bind(a),
          toggleIpAddressChecked: a.toggleIpAddressChecked.bind(a),
          updateReason: a.updateReason.bind(a),
          updateDuration: a.updateDuration.bind(a),
          updateCustomDurationAmount: a.updateCustomDurationAmount.bind(a),
          updateCustomDurationScale: a.updateCustomDurationScale.bind(a),
          handleSubmit: a.submit.bind(a),
          handleClose: a.cancel.bind(a),
          closeText: 'Cancel',
          UpgradeIcon: function () {
            return d.createElement('span', {
              className: 'text-largest text-yellow icon-upgrade-arrow-pro media-middle spacing-left upgrade-card',
              'data-role': 'upgrade-card-target'
            })
          }
        })),
        a.initUpgradeCard()
      }),
      this.trigger('render'),
      this
    },
    initUpgradeCard: function () {
      var b = m.UpgradeCard.create({
        organization: this.forum ? {
          id: this.forum.get('organizationId')
        }
         : null
      });
      this.$('[data-role=upgrade-card-target]').each(function () {
        b.target(a(this))
      }),
      this.listenToOnce(b, 'show', function () {
        f.trigger('uiAction:viewUpgradeCard')
      }),
      this.listenTo(b, 'click:upgrade', function (a) {
        a.stopPropagation(),
        f.trigger('uiAction:clickUpgrade')
      })
    },
    toggleBanType: function (a, b) {
      t(b, this.saasFeatures) && (this.formValues.type = b, i.set(p, b), this.render())
    },
    toggleBanTypeCallback: function (a) {
      this.toggleBanType(a, a.target.value)
    },
    selectRetroactiveAction: function (a) {
      this.formValues.retroactiveAction = a.target.value || q.DO_NOTHING
    },
    toggleUserValueChecked: function (a, b) {
      this.formValues[b] = a.target.checked ? 1 : 0
    },
    toggleIpAddressChecked: function (a) {
      this.formValues.ipAddress = a.target.checked ? 1 : 0
    },
    updateReason: function (a) {
      this.formValues.reason = a.target.value
    },
    updateDuration: function (a) {
      this.formValues.durationHours = a.target.value
    },
    updateCustomDurationAmount: function (a) {
      var b = this;
      if ('keypress' === a.type && /[^\d]/.test(a.key)) return void a.preventDefault();
      var c = a.target.value,
      d = 'custom';
      this.formValues.customDurationAmount === c && this.formValues.durationHours === d || (this.formValues.customDurationAmount = c, this.formValues.durationHours = d, a.target === window.document.activeElement && this.once('render', function () {
        b.$('input[name=customDurationAmount]').focus()
      }), this.render())
    },
    updateCustomDurationScale: function (a) {
      this.formValues.customDurationScale = a.target.value,
      this.formValues.durationHours = 'custom',
      this.render()
    },
    cancel: u(function () {
      this.trigger('cancel')
    }),
    submit: u(function () {
      var a = this,
      c = this.formValues.type === n.TEMP ? s(this.formValues) : null;
      f.trigger('uiAction:clickBanUser', JSON.stringify({
        date_expires: c,
        date_added: e().toISOString()
      }));
      var d = {
        post: this.formValues.postId,
        notes: this.formValues.reason,
        shadowBan: this.formValues.type === n.SHADOW ? 1 : 0,
        dateExpires: c
      };
      this.formValues.email && (d.banEmail = 1),
      this.formValues.username && (d.banUser = 1),
      this.formValues.ipAddress && (d.banIp = 1),
      this.formValues.type === n.PERMANENT && (d.retroactiveAction = this.formValues.retroactiveAction),
      d.post && g.call('forums/block/banPostAuthor.json', {
        method: 'POST',
        data: b.omit(d, b.isNull),
        success: function () {
          a.trigger('success')
        }
      })
    })
  }, {
    defaultFormValues: {
      postId: null,
      username: null,
      email: null,
      ipAddress: null,
      reason: '',
      retroactiveAction: null
    }
  });
  return v
}),
define('templates/lounge/edit', [
  'react',
  'core/switches'
], function (a, b) {
  'use strict';
  var c = function (c) {
    var d = c.forum.id,
    e = b.isFeatureActive('embed_refresh', {
      forum: d
    }),
    f = b.isFeatureActive('embed_v2', {
      forum: d
    }),
    g = e ? 'textarea-outer-wrapper textarea-outer-wrapper--refresh' : 'textarea-outer-wrapper',
    h = f ? 'textarea-wrapper textarea-wrapper--embedv2' : 'textarea-wrapper';
    return a.createElement('div', {
      className: g
    }, a.createElement('div', {
      className: 'ratings-wrapper',
      'data-role': 'ratings-container'
    }), a.createElement('div', {
      className: h,
      'data-role': 'textarea'
    }, a.createElement('div', {
      className: 'edit-alert',
      role: 'postbox-alert'
    }), a.createElement('div', {
      className: 'text-editor-container'
    })))
  };
  return c
}),
define('lounge/views/posts/PostEditView', [
  'backbone',
  'moment',
  'underscore',
  'core/bus',
  'core/mixins/withAlert',
  'core/strings',
  'core/switches',
  'core/time',
  'core/views/TextareaView',
  'core/utils/threadRatingsHelpers',
  'lounge/common',
  'lounge/mixins/asTextEditor',
  'lounge/mixins/asTextEditorV2',
  'lounge/mixins/withStarRatings',
  'lounge/views/posts/DummyTextareaView',
  'templates/lounge/edit',
  'templates/lounge/textEditor'
], function (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q) {
  'use strict';
  var r = f.get,
  s = a.View.extend({
    tagName: 'form',
    className: 'edit',
    events: {
      submit: 'submitForm',
      'click [data-action=cancel]': 'cancel'
    },
    initialize: function (a) {
      this.post = a.post,
      this.session = a.session,
      this.thread = a.thread,
      this.isRefreshEnabled = g.isFeatureActive('embed_refresh', {
        forum: this.thread.forum.id
      }),
      this.isRefreshV2Enabled = this.isRefreshEnabled && g.isFeatureActive('embed_refresh_v2', {
        forum: this.thread.forum.id
      }),
      this.$el.addClass(this.isRefreshEnabled ? 'form-refresh' : ''),
      this.$el.addClass(this.isRefreshV2Enabled ? 'form-refresh-v2' : ''),
      this._alertSelector = '[role=postbox-alert]',
      this.textEditorTemplate = q,
      this.postEditMode = !0
    },
    cancel: function () {
      this.trigger('cancel')
    },
    getEditTimeLeft: function () {
      var a,
      c = b().format(h.ISO_8601);
      return a = c < this.post.get('editableUntil') ? f.interpolate(r('You have until %(editableUntil)s to edit this comment.'), {
        editableUntil: this.post.getRelativeCreatedAt('editableUntil')
      }) : r('The edit period for this comment has expired.'),
      '<div class="edit-time-left">' + a + ' <a class="edit-time-message"href="https://help.disqus.com/commenting/remove-and-edit-your-comments"target="_blank"rel="noopener noreferrer"align="center">' + r('Learn more') + '</a></div>'
    },
    getEditorProps: function () {
      return {
        focusOnLoad: !0,
        onSubmit: this.submitForm.bind(this, null),
        isEdit: !0,
        onCancel: this.cancel.bind(this),
        initialState: this.post.toJSON().message
      }
    },
    render: function () {
      var a = this.post.toJSON();
      this.$el.html(p({
        post: a,
        user: this.session.toJSON(),
        forum: this.thread.forum
      }));
      var b = this.getEditTimeLeft();
      if (this.isEmbedV2Enabled) this.loadEditorV2(this.getEditorProps()),
      this.textarea = new o,
      this.$('[data-role=textarea]').after(b);
       else {
        this.initTextEditor();
        var c = this.textarea = new i({
          value: a.raw_message
        });
        this.$('[data-role=textarea]').prepend(c.render().el).after(b)
      }
      return this.initStarRatings(),
      this
    },
    resize: function () {
      var a = k.getLounge();
      a && this.textarea && this.textarea.$input && this.textarea.$input.on('transitionend webkitTransitionEnd oTransitionEnd otransitionend MSTransitionEnd', function () {
        a.resize()
      }),
      this.textarea.resize()
    },
    submitForm: function (a, b) {
      this.dismissAlert(),
      a && a.preventDefault() && a.preventDefault();
      var e = this,
      f = {
        raw_message: b || this.textarea.get(),
        rating: this.rating
      },
      g = e.post.validateMessage(f);
      return void 0 !== g ? this.alert(g, {
        type: 'error'
      }) : void e.post.save(f, {
        success: function () {
          e.trigger('submitted'),
          d.trigger('uiCallback:postUpdated', e.post, {
            area: 'main'
          }),
          c.isNumber(e.rating) && j.isThreadModelRatingsEnabled(e.thread) && (e.thread.set('userRating', e.rating), c.delay(c.bind(e.thread.fetchRatings, e.thread), 500))
        },
        error: function (a, b) {
          var c;
          return c = b.response.indexOf('Comment edit period expired') > - 1 ? r('You can no longer edit this comment. Comments can only be edited within 7 days after posting.') + ' <a href="https://help.disqus.com/commenting/remove-and-edit-your-comments" target="_blank" rel="noopener noreferrer"style="color:white ! important" >' + r('Learn more') + '</a>' : b.response,
          e.alert(c, {
            type: 'error',
            safe: !0
          })
        }
      })
    },
    remove: function () {
      this.$el.remove()
    }
  });
  return e.call(s.prototype),
  n.call(s.prototype),
  l.call(s.prototype),
  m.call(s.prototype),
  s
}),
define('lounge/views/posts/TypingUserView', [
  'backbone',
  'core/strings',
  'core/switches',
  'core/utils/object/get'
], function (a, b, c, d) {
  'use strict';
  var e = b.get,
  f = a.View.extend({
    initialize: function (a) {
      this.options = a
    },
    render: function () {
      var a,
      d = this.options.parentView.reply,
      f = d && d.typingUser,
      g = this.model.usersTyping.count(f && f.id),
      h = c.isFeatureActive('embed_refresh', {
        forum: this.model.get('forum')
      });
      return g <= 0 ? void this.$el.hide() : (1 === g ? a = e(h ? '1 person writing a comment…' : 'One other person is typing…') : (a = e(h ? '%(num)s people writing comments…' : '%(num)s other people are typing…'), a = b.interpolate(a, {
        num: g
      })), this.$el.text(a), this.$el.show(), this)
    }
  });
  return f
});
var _extends = Object.assign || function (a) {
  for (var b = 1; b < arguments.length; b++) {
    var c = arguments[b];
    for (var d in c) Object.prototype.hasOwnProperty.call(c, d) && (a[d] = c[d])
  }
  return a
};
define('templates/lounge/flaggingReasons', [
  'react',
  'core/strings',
  'core/switches'
], function (a, b, c) {
  'use strict';
  var d = b.gettext,
  e = [
    {
      id: 6,
      title: d('I disagree with this user')
    },
    {
      id: 0,
      title: d('Targeted harassment'),
      description: d('posted or encouraged others to post harassing comments or hate speech targeting me, other individuals, or groups')
    },
    {
      id: 1,
      title: d('Spam'),
      description: d('posted spam comments or discussions')
    },
    {
      id: 2,
      title: d('Inappropriate profile'),
      description: d('profile contains inappropriate images or text')
    },
    {
      id: 3,
      title: d('Threatening content'),
      description: d('posted directly threatening content')
    },
    {
      id: 4,
      title: d('Impersonation'),
      description: d('misrepresents themselves as someone else')
    },
    {
      id: 5,
      title: d('Private information'),
      description: d('posted someone else\'s personally identifiable information')
    }
  ],
  f = function (b) {
    var c = b.id,
    d = b.title,
    e = b.description,
    f = b.updateReason;
    return a.createElement('label', {
      className: [
        'padding-default',
        'flagging__reason'
      ].join(' ')
    }, a.createElement('input', {
      type: 'radio',
      name: 'reason',
      value: c,
      onChange: f
    }), a.createElement('p', {
      className: 'text-bold flagging__reason-text'
    }, d, e ? a.createElement('span', {
      className: 'text-small text-normal'
    }, ' — ', e) : null))
  },
  g = function (b) {
    var g = b.updateReason,
    h = b.handleSubmit,
    i = b.handleCancel,
    j = b.forumId;
    return a.createElement('form', {
      className: 'flagging-form'
    }, a.createElement('div', {
      className: 'flagging__title text-semibold'
    }, d('Flag Comment')), a.createElement('div', {
      className: 'flagging__content'
    }, a.createElement('p', {
      className: 'flagging__subtitle text-semibold'
    }, d('Why are you flagging this comment?')), e.map(function (b) {
      return a.createElement(f, _extends({
        key: b.id,
        updateReason: g
      }, b))
    }), a.createElement('p', {
      className: 'flagging__reason-subtext'
    }, c.isFeatureActive('sso_less_branding', {
      forum: j
    }) ? d('Your username will be shown to the moderator, so you should only flag this comment for one of the reasons listed above.') : d('Before flagging, please keep in mind that %(disqus)s does not moderate communities. Your username will be shown to the moderator, so you should only flag this comment for one of the reasons listed above.', {
      disqus: 'Disqus'
    }))), a.createElement('div', {
      className: 'admin-modal__footer -mobile clearfix'
    }, a.createElement('button', {
      className: 'button button-fill--brand',
      onClick: h
    }, d('Flag Comment')), ' ', a.createElement('button', {
      className: 'button button-fill',
      onClick: i
    }, d('Cancel'))))
  };
  return g
}),
define('templates/lounge/flaggingUserBlocking', [
  'react',
  'core/strings',
  'core/switches',
  'templates/lounge/partials/profileLink'
], function (a, b, c, d) {
  'use strict';
  var e = b.gettext,
  f = function (b) {
    var f = b.user,
    g = b.forumId,
    h = b.handleBlock,
    i = b.handleComplete;
    return a.createElement('div', {
      className: 'flagging__blocking-form'
    }, a.createElement('div', {
      className: 'flagging__title text-semibold'
    }, e('Thanks for your feedback!')), c.isFeatureActive('sso_less_branding', {
      forum: g
    }) ? a.createElement('div', {
      className: 'admin-modal__footer -mobile clearfix'
    }, a.createElement('button', {
      className: 'button button-fill--brand',
      onClick: i
    }, e('Done'))) : [
      a.createElement('div', {
        key: 'blocking-0',
        className: 'flagging__blocking-content'
      }, a.createElement('p', {
        className: 'flagging__subtitle text-semibold'
      }, e('Other tools for you:')), a.createElement('p', {
        className: 'spacing-bottom'
      }, e('Blocking this user will hide all of their activity and comments from your %(disqus)s content, feeds, and notifications.', {
        disqus: 'Disqus'
      })), a.createElement('p', {
        className: 'spacing-top spacing-bottom-none'
      }, e('Would you like to block %(user)s?', {
        user: a.createElement(d, {
          user: f,
          forumId: g,
          className: 'text-semibold'
        }, f.name)
      }))),
      a.createElement('div', {
        key: 'blocking-1',
        className: 'admin-modal__footer -mobile clearfix'
      }, a.createElement('div', null, a.createElement('button', {
        className: 'button button-fill--red',
        onClick: h
      }, e('Block User')), ' ', a.createElement('button', {
        className: 'button button-fill',
        onClick: i
      }, e('No Thanks'))))
    ])
  };
  return f
}),
define('templates/lounge/flaggingUserBlocked', [
  'react',
  'core/strings'
], function (a, b) {
  'use strict';
  var c = b.gettext,
  d = function (b) {
    var d = b.displayName,
    e = b.handleComplete,
    f = b.error;
    return a.createElement('div', {
      className: 'flagging__blocking-complete'
    }, a.createElement('div', {
      className: 'flagging__title'
    }, c('Blocked User')), a.createElement('div', {
      className: 'flagging__blocking-complete-content'
    }, a.createElement('img', {
      className: 'flagging-pam',
      alt: 'Pam',
      src: 'https://c.disquscdn.com/next/embed/assets/img/PamX.fe88e2955f3d594a6cc13c66569ed7d0.svg'
    }), f ? a.createElement('p', {
      className: 'spacing-top-bottom'
    }, f) : a.createElement('div', null, a.createElement('p', {
      className: 'spacing-top-bottom text-semibold'
    }, c('You\'ve blocked %(user)s.', {
      user: d
    })), a.createElement('p', {
      className: 'spacing-top-bottom'
    }, c('You won\'t see comments from this user on %(disqus)s in discussions, notifications, and more.', {
      disqus: 'Disqus'
    })))), a.createElement('div', {
      className: 'admin-modal__footer -mobile clearfix'
    }, a.createElement('div', null, a.createElement('button', {
      className: 'button button-fill--brand',
      onClick: e
    }, c('Done')), ' ', a.createElement('a', {
      className: 'button button-fill',
      href: 'https://disqus.com/home/settings/blocking/',
      target: '_blank',
      rel: 'noopener noreferrer',
      onClick: e
    }, c('Manage Blocked Users')))))
  };
  return d
}),
define('lounge/views/posts/FlaggingView', [
  'backbone',
  'core/api',
  'core/utils',
  'core/bus',
  'core/strings',
  'templates/lounge/flaggingReasons',
  'templates/lounge/flaggingUserBlocking',
  'templates/lounge/flaggingUserBlocked'
], function (a, b, c, d, e, f, g, h) {
  'use strict';
  var i = c.preventDefaultHandler,
  j = e.gettext,
  k = a.View.extend({
    className: 'moderate',
    render: function () {
      if (this.model.get('isFlaggedByUser')) if (this.blockComplete) {
        var a = this.model.author;
        this.$el.html(h({
          displayName: a.get('name'),
          error: this.blockError,
          handleComplete: this.handleComplete.bind(this)
        }))
      } else {
        var b = this.model.author;
        this.$el.html(g({
          user: b.toJSON(),
          forumId: this.model.get('forum'),
          handleBlock: this.handleBlockUser.bind(this),
          handleComplete: this.handleComplete.bind(this)
        })),
        d.trigger('uiAction:viewBlockUser')
      } else this.$el.html(f({
        updateReason: this.updateFlaggingReason.bind(this),
        handleSubmit: this.submitReason.bind(this),
        handleCancel: this.cancel.bind(this),
        forumId: this.model.get('forum')
      })),
      d.trigger('uiAction:viewFlagPost');
      return this
    },
    updateFlaggingReason: function (a) {
      this.reason = a.target.value
    },
    cancel: i(function () {
      this.trigger('cancel')
    }),
    handleComplete: function () {
      this.trigger('success')
    },
    submitReason: i(function () {
      this.reason && (d.trigger('uiAction:clickFlagPost'), this.model.report(this.reason), this.model.set('isFlaggedByUser', !0), this.render())
    }),
    handleBlockUser: i(function () {
      var a = this,
      c = this.model.author;
      return d.trigger('uiAction:clickBlockUser'),
      c.block().fail(function (c) {
        var d = j('Something went wrong while trying to block this user. Please try again later.'),
        e = c && c.responseJSON && c.responseJSON.code;
        e === b.ERROR_CODES.MAX_ITEMS_REACHED && (d = j('Unfortunately this user could not be blocked; you have reached the limit for number of users blocked.')),
        a.blockError = d
      }).always(function () {
        a.blockComplete = !0,
        a.render()
      })
    })
  });
  return k
}),
define('core/views/Tooltip', [
  'jquery',
  'core/views/common/HoverCard'
], function (a, b) {
  'use strict';
  var c = b.extend({
    className: 'tooltip-outer message-card',
    initialize: function (a) {
      b.prototype.initialize.call(this, a),
      this.template = a.template,
      this.message = a.message
    },
    render: function () {
      if (this.template) this.$el.html(this.template());
       else {
        if (!this.message) return;
        this.$el.html(a('<div>').addClass('tooltip').text(this.message))
      }
      b.prototype.render.call(this)
    },
    moveTo: function (a) {
      if (a) {
        var b = this.constructor.POSITION_OFFSET,
        c = a.offset(),
        d = this.getContainerPosition(),
        e = this.$el.width();
        this.$el.css({
          bottom: d.containerOffset.height - c.top + b,
          top: 'inherit',
          left: c.left - e / 2
        })
      }
    }
  }, {
    create: function (a) {
      return b.create(a.id, a, 'Tooltip', c)
    },
    POSITION_OFFSET: 10
  });
  return c
}),
define('core/views/ClickTooltip', [
  'underscore',
  'core/views/common/HoverCard',
  'core/views/Tooltip'
], function (a, b, c) {
  'use strict';
  var d = c.extend({
    target: function (b) {
      b.on('click', a.bind(this.targetClicked, this, b)),
      b.on('mouseleave', a.bind(this.leave, this))
    },
    targetClicked: function (a) {
      a && (this.$target = a),
      'in' !== this._hoverState && (this._hoverState = 'in', this.show(), c.open[this.uid] = this)
    }
  }, {
    create: function (a) {
      return b.create(a.id, a, 'ClickTooltip', d)
    }
  });
  return d
}),
define('templates/lounge/partials/postVotes', [
  'react',
  'core/constants/voteConstants',
  'core/strings',
  'core/switches',
  'core/utils/object/get'
], function (a, b, c, d, e) {
  'use strict';
  var f = c.gettext,
  g = function (c) {
    var g = d.isFeatureActive('embed_refresh', {
      forum: c.forumId
    }),
    h = a.createElement('span', {
      className: 'control'
    }, g ? null : a.createElement('i', {
      'aria-hidden': 'true',
      className: 'icon icon-arrow-2'
    })),
    i = a.createElement('span', {
      className: 'updatable count',
      'data-role': 'likes'
    }, e(c.post, [
      'likes'
    ], null)),
    j = g ? [
      h,
      ' ',
      i
    ] : [
      i,
      ' ',
      h
    ];
    return c.votingType === b.VOTING_TYPES.DISABLED ? null : a.createElement('div', {
      className: 'post-votes'
    }, a.createElement('a', {
      href: '#',
      className: 'vote-up ' + (e(c.post, [
        'userScore'
      ], 0) > 0 ? 'upvoted' : '') + ' count-' + e(c.post, [
        'likes'
      ], ''),
      'data-action': 'upvote',
      title: e(c.post, [
        'likes'
      ]) ? '' : f('Vote up'),
      name: f('Vote up')
    }, j), c.votingType === b.VOTING_TYPES.DOWNVOTE_DISABLED || g ? null : a.createElement('div', {
      className: 'post-votes__separator'
    }, ''), c.votingType === b.VOTING_TYPES.DOWNVOTE_DISABLED ? null : a.createElement('a', {
      href: '#',
      className: 'vote-down ' + (e(c.post, [
        'userScore'
      ], 0) < 0 ? 'downvoted' : '') + ' count-' + (c.votingType === b.VOTING_TYPES.DOWNVOTE_LIMITED ? 0 : e(c.post, [
        'dislikes'
      ], '')),
      'data-action': 'downvote',
      title: e(c.post, [
        'dislikes'
      ]) ? '' : f('Vote down'),
      name: f('Vote down')
    }, a.createElement('span', {
      className: 'control'
    }, g ? null : a.createElement('i', {
      'aria-hidden': 'true',
      className: 'icon icon-arrow'
    })), ' ', a.createElement('span', {
      className: 'updatable count',
      'data-role': 'dislikes'
    }, c.votingType === b.VOTING_TYPES.DOWNVOTE_LIMITED ? null : e(c.post, [
      'dislikes'
    ], null))))
  };
  return g
}),
define('templates/lounge/partials/postFooter', [
  'react',
  'core/constants/voteConstants',
  'core/strings',
  'core/switches',
  'core/utils/object/get',
  'templates/lounge/partials/postVotes'
], function (a, b, c, d, e, f) {
  'use strict';
  var g = c.gettext,
  h = function (c) {
    var h = (e(c.session, [
      'isRegistered'
    ]) || !d.isFeatureActive('sso_less_branding', {
      forum: c.post.forum
    })) && c.votingType !== b.VOTING_TYPES.DISABLED,
    i = d.isFeatureActive('sso_less_branding', {
      forum: c.post.forum
    }) ? e(c.post, [
      'permalink'
    ], '') : e(c.post, [
      'shortLink'
    ], ''),
    j = d.isFeatureActive('embed_refresh', {
      forum: c.post.forum
    }),
    k = j && d.isFeatureActive('embed_refresh_v2', {
      forum: c.post.forum
    }),
    l = j ? 'realtime-replies realtime-replies--refresh icon icon-pencil' : 'realtime-replies',
    m = j ? 'realtime-button realtime-button--refresh' : 'realtime-button';
    return a.createElement('menu', {
      className: 'comment-footer__menu'
    }, h ? [
      a.createElement('li', {
        key: 'vote-0',
        className: 'voting',
        'data-role': 'voting'
      }, a.createElement(f, {
        post: c.post,
        votingType: c.votingType,
        forumId: c.forumId
      })),
      j && k ? null : a.createElement('li', {
        key: 'vote-1',
        className: 'bullet',
        'aria-hidden': 'true'
      }, '•')
    ] : null, e(c.post, [
      'canBeEdited'
    ]) ? a.createElement('li', {
      key: 'edit-0',
      className: 'edit',
      'data-role': 'edit-link'
    }, a.createElement('a', {
      className: 'comment-footer__action',
      href: '#',
      'data-action': 'edit'
    }, a.createElement('i', {
      className: 'icon icon-pencil-large'
    }), a.createElement('span', {
      className: 'text'
    }, g('Edit')))) : null, e(c.post, [
      'canBeRepliedTo'
    ]) ? a.createElement('li', {
      key: 'reply-0',
      className: 'reply',
      'data-role': 'reply-link'
    }, a.createElement('a', {
      className: 'comment-footer__action',
      href: '#',
      'data-action': 'reply'
    }, a.createElement('span', {
      className: 'text'
    }, g('Reply')))) : null, e(c.post, [
      'isSponsored'
    ]) && !e(c.post, [
      'hideViewAllComments'
    ]) ? [
      a.createElement('li', {
        key: 'sponsored-0',
        className: 'thread-link',
        'data-role': 'thread-link'
      }, a.createElement('a', {
        href: e(c.post, [
          'permalink'
        ], ''),
        target: '_blank',
        rel: 'noopener noreferrer',
        'data-action': 'thread'
      }, a.createElement('i', {
        className: 'icon icon-mobile'
      }), a.createElement('span', {
        className: 'text'
      }, g('View all comments')), a.createElement('span', {
        className: 'mobile-text'
      }, g('All Comments')))),
      a.createElement('li', {
        key: 'sponsored-1',
        className: 'bullet',
        'aria-hidden': 'true'
      }, '•')
    ] : null, e(c.post, [
      'canBeShared'
    ]) ? a.createElement('li', {
      id: 'comment__share-' + e(c.post, [
        'id'
      ], ''),
      className: 'comment__share'
    }, a.createElement('a', {
      className: 'toggle',
      href: '#',
      'data-action': 'expand-share'
    }, a.createElement('i', {
      className: 'icon icon-share'
    }), a.createElement('span', {
      className: 'text'
    }, g('Share'), ' ›')), a.createElement('ul', {
      className: 'comment-share__buttons'
    }, c.disableSocialShare ? null : a.createElement('div', {
      className: 'comment-share__social-share-buttons'
    }, a.createElement('li', {
      className: 'twitter share__button-container'
    }, a.createElement('button', {
      className: 'share__button icon icon-twitter-x',
      'data-action': 'share:twitter',
      'aria-label': 'Share comment on X (Twitter)'
    })), a.createElement('li', {
      className: 'facebook share__button-container'
    }, a.createElement('button', {
      className: 'share__button icon icon-facebook',
      'data-action': 'share:facebook',
      'aria-label': 'Share comment on Facebook'
    }))), a.createElement('li', {
      className: 'link share__button-container'
    }, a.createElement('button', {
      className: 'share__button icon icon-link',
      value: i,
      name: g('Link'),
      title: g('Click to copy post link'),
      'data-action': 'copy-link',
      'aria-label': 'Copy link to comment'
    }), d.isFeatureActive('sso_less_branding', {
      forum: c.post.forum
    }) ? null : a.createElement('input', {
      className: 'share__button link_url',
      value: i,
      name: g('Link'),
      title: g('Click to copy post link'),
      'data-action': 'copy-link',
      readOnly: !0
    })))) : null, e(c.post, [
      'isDeleted'
    ]) ? null : a.createElement('li', {
      className: 'realtime',
      'data-role': 'realtime-notification:' + e(c.post, [
        'id'
      ], '')
    }, a.createElement('span', {
      style: {
        display: 'none'
      },
      className: l
    }), a.createElement('a', {
      style: {
        display: 'none'
      },
      href: '#',
      className: m
    })), e(c.post, [
      'isSponsored'
    ]) ? a.createElement('li', {
      className: 'feedback'
    }, a.createElement('button', {
      'data-action': 'feedback'
    }, g('Leave Feedback'))) : null)
  };
  return h
});
var _extends = Object.assign || function (a) {
  for (var b = 1; b < arguments.length; b++) {
    var c = arguments[b];
    for (var d in c) Object.prototype.hasOwnProperty.call(c, d) && (a[d] = c[d])
  }
  return a
};
define('templates/lounge/partials/postMenu', [
  'react',
  'core/config/urls',
  'core/strings',
  'core/switches',
  'core/utils/object/get'
], function (a, b, c, d, e) {
  'use strict';
  var f = c.gettext,
  g = function (a, c, d, g) {
    var h = [
    ],
    i = e(c, [
      'thread',
      'canModerate'
    ]),
    j = e(c, [
      'isRegistered'
    ]),
    k = j && e(a, [
      'author'
    ]) && e(a, [
      'author',
      'id'
    ]) === e(c, [
      'id'
    ]);
    if (i) {
      if (h = [
        {
          link: '#',
          action: 'spam',
          text: f('Mark as Spam')
        },
        {
          link: '#',
          action: 'delete',
          text: f('Delete')
        },
        {
          link: '#',
          action: 'blacklist',
          text: f('Ban User')
        },
        {
          link: b.moderate + 'approved/search/id:' + e(a, [
            'id'
          ], ''),
          action: 'moderate',
          target: '_blank',
          rel: 'noopener noreferrer',
          text: f('Moderate')
        },
        {
          link: '#',
          action: e(a, [
            'isHighlighted'
          ]) ? 'unhighlight' : 'highlight',
          text: f(e(a, [
            'isHighlighted'
          ]) ? 'Stop featuring' : 'Feature this comment'),
          className: 'highlight-toggle'
        }
      ], d && !a.author.isAnonymous) {
        var l = 4;
        h.splice(l, 0, {
          link: '#',
          action: 'manage-badges',
          text: f('Manage Badges')
        })
      }
      k || g || h.unshift({
        link: '#',
        action: 'block-user',
        text: f('Block User')
      })
    } else k ? h = [
      {
        link: '#',
        action: 'delete',
        text: f('Delete')
      },
      {
        link: '#',
        action: 'flag',
        text: f(e(a, [
          'isFlaggedByUser'
        ]) ? 'Flagged' : 'Flag as inappropriate')
      }
    ] : j && (h = [
      {
        link: '#',
        action: 'block-user',
        text: f('Block User')
      },
      {
        link: '#',
        action: 'flag',
        text: f(e(a, [
          'isFlaggedByUser'
        ]) ? 'Flagged' : 'Flag as inappropriate')
      }
    ]);
    return h
  },
  h = function (b) {
    var c = null,
    h = e(b.session, [
      'thread',
      'canModerate'
    ]),
    i = d.isFeatureActive('sso_less_branding', {
      forum: b.post.forum
    }),
    j = b.forum && b.forum.settings && b.forum.settings.badgesEnabled,
    k = d.isFeatureActive('embed_refresh', {
      forum: b.post.forum
    }),
    l = g(b.post, b.session, j, i);
    return e(b.post, [
      'id'
    ]) && e(b.post, [
      'isMinimized'
    ]) !== !0 && e(b.post, [
      'isDeleted'
    ]) !== !0 && e(b.post, [
      'author',
      'isBlocked'
    ]) !== !0 && e(b.post, [
      'sb'
    ]) !== !0 && (l.length ? c = a.createElement('div', null, a.createElement('a', {
      className: 'dropdown-toggle',
      'data-toggle': 'dropdown',
      href: '#'
    }, k ? a.createElement('span', {
      className: 'dropdown-toggle-icon' + (h ? ' moderator-menu-options' : '')
    }) : a.createElement('b', {
      className: 'caret' + (h ? ' moderator-menu-options' : '')
    })), a.createElement('ul', {
      className: 'dropdown-menu' + (k ? ' dropdown-menu--refresh' : '')
    }, l.map(function (b) {
      var c = {
      };
      return b.rel && (c.rel = b.rel),
      b.target && (c.target = b.target),
      a.createElement('li', {
        key: b.action,
        className: 'dropdown-item ' + (b.className || '')
      }, a.createElement('a', _extends({
        className: 'dropdown-link',
        href: b.link,
        'data-action': b.action,
        role: 'menuitem'
      }, c), b.text))
    }))) : i || (c = a.createElement('a', {
      className: 'dropdown-toggle',
      href: '#',
      'data-action': 'flag',
      'data-role': 'flag',
      title: f('Flag as inappropriate')
    }, a.createElement('i', {
      'aria-hidden': 'true',
      className: 'icon icon-flag'
    })))),
    a.createElement('ul', {
      className: 'post-menu dropdown' + (k ? ' post-menu--refresh' : ''),
      'data-role': 'menu',
      'data-view-id': 'post-menu',
      'data-post-id': e(b.post, [
        'id'
      ])
    }, a.createElement('li', {
      className: 'post-menu-item collapse'
    }, a.createElement('a', {
      href: '#',
      'data-action': 'collapse',
      title: f('Collapse'),
      name: f('Collapse')
    }, a.createElement('span', null, '−'))), a.createElement('li', {
      className: 'post-menu-item expand'
    }, a.createElement('a', {
      href: '#',
      'data-action': 'collapse',
      title: f('Expand'),
      name: f('Collapse')
    }, a.createElement('span', null, '+'))), null === c ? null : a.createElement('li', {
      className: (h ? 'moderator-menu-options' : '') + ' post-menu-item',
      role: 'menuitem'
    }, c))
  };
  return h
}),
define('templates/lounge/partials/postUserAvatar', [
  'react',
  'core/strings',
  'core/switches',
  'core/utils',
  'core/utils/object/get',
  'templates/lounge/partials/userAvatar'
], function (a, b, c, d, e, f) {
  'use strict';
  var g = b.gettext,
  h = d.getInitials,
  i = function (b) {
    var d = c.isFeatureActive('embed_refresh', {
      forum: b.forum && b.forum.id
    }),
    i = d ? 'user user--refresh' : 'user',
    j = d ? 'user image-refresh' : 'user',
    k = void 0;
    return k = e(b.post, [
      'author',
      'isRegistered'
    ]) && e(b.post, [
      'isMinimized'
    ]) !== !0 ? a.createElement('div', {
      className: 'avatar hovercard'
    }, a.createElement(f, {
      defaultAvatarUrl: b.defaultAvatarUrl,
      forum: b.forum,
      user: b.post.author,
      hasForumAvatar: b.hasForumAvatar
    })) : e(b.post, [
      'author',
      'hasSponsoredAvatar'
    ]) ? a.createElement('div', {
      className: 'avatar'
    }, a.createElement('div', {
      className: 'user'
    }, a.createElement('img', {
      src: b.defaultAvatarUrl,
      'data-src': e(b.post, [
        'author',
        'avatar',
        'cache'
      ], ''),
      className: 'user',
      alt: g('Avatar')
    }))) : a.createElement('div', {
      className: 'avatar'
    }, a.createElement('div', {
      className: i
    }, d && !b.hasForumAvatar ? a.createElement('div', null, h(b.post.author.name) || 'G') : a.createElement('img', {
      src: b.defaultAvatarUrl,
      className: j,
      alt: g('Avatar')
    })))
  };
  return i
}),
define('templates/lounge/partials/postWrapper', [
  'react',
  'core/strings',
  'core/switches',
  'core/utils/object/get',
  'templates/lounge/partials/postMenu'
], function (a, b, c, d, e) {
  'use strict';
  var f = b.gettext,
  g = function (b) {
    var g = [
      'post-content',
      d(b.post, [
        'isRealtime'
      ]) && 'new',
      d(b.session, [
        'isRegistered'
      ]) && d(b.post, [
        'author',
        'id'
      ]) === d(b.session, [
        'id'
      ]) && 'authored-by-session-user'
    ].filter(Boolean).join(' ');
    return [a.createElement('div', {
      key: 'post-wrapper-content',
      'data-role': 'post-content',
      className: g,
      tabIndex: 0
    }, a.createElement('div', {
      className: 'indicator'
    }), c.isFeatureActive('embed_refresh', {
      forum: b.forum && b.forum.id
    }) ? a.createElement('span', {
      className: 'pinned-icon'
    }) : null, a.createElement(e, {
      post: b.post,
      session: b.session,
      forum: b.forum
    }), b.children, a.createElement('div', {
      className: 'moderate-form blacklist-form',
      'data-role': 'blacklist-form'
    }), a.createElement('div', {
      className: 'moderate-form flag-form',
      'data-role': 'flagging-form'
    }), a.createElement('div', {
      className: 'badges-form',
      'data-role': 'badges-form'
    }), a.createElement('div', {
      className: 'reply-form-container',
      'data-role': 'reply-form'
    })),
    a.createElement('div', {
      className: 'children',
      key: 'post-wrapper-children'
    }, a.createElement('ul', {
      'data-role': 'children'
    }), a.createElement('div', {
      className: 'show-children-wrapper ' + (b.post.hasMore ? '' : 'hidden')
    }, a.createElement('a', {
      className: 'show-children',
      id: 'post-' + b.post.id + '-show-children',
      'data-action': 'show-children',
      href: '#'
    }, f('Show more replies'))))]
  };
  return g
}),
define('templates/lounge/post', [
  'react',
  'core/constants/voteConstants',
  'core/strings',
  'core/switches',
  'core/utils/object/get',
  'core/utils/threadRatingsHelpers',
  'templates/lounge/partials/postFooter',
  'templates/lounge/partials/postUserAvatar',
  'templates/lounge/partials/postWrapper',
  'templates/lounge/partials/profileLink',
  'templates/lounge/partials/userBadges'
], function (a, b, c, d, e, f, g, h, i, j, k) {
  'use strict';
  var l = c.gettext,
  m = function (a) {
    var b = e(a.parentPost, [
      'author',
      'id'
    ]),
    c = e(a.session, [
      'blockedUserIdSet'
    ]);
    return a.post.hideParent || !(!b || !c) && c.has(b)
  },
  n = function (b) {
    return e(b.post, [
      'author',
      'badge'
    ]) ? a.createElement('span', {
      className: 'badge',
      'data-type': 'tracked-badge'
    }, b.hasEmbedRefreshV2 ? a.createElement('span', {
      className: 'badge-content'
    }, e(b.post, [
      'author',
      'badge'
    ], null)) : e(b.post, [
      'author',
      'badge'
    ], null)) : e(b.post, [
      'author',
      'thread',
      'canModerate'
    ]) ? a.createElement('span', {
      className: 'badge moderator'
    }, b.hasEmbedRefreshV2 ? a.createElement('span', {
      className: 'badge-content'
    }, l('Mod')) : l('Mod')) : b.opBadgeEnabled && e(b.post, [
      'author',
      'thread',
      'isOP'
    ]) ? a.createElement('span', {
      className: 'badge'
    }, b.hasEmbedRefreshV2 ? a.createElement('span', {
      className: 'badge-content'
    }, l('OP')) : l('OP')) : null
  },
  o = function (b) {
    var c = e(b.author, [
      'isFollowing'
    ]),
    f = e(b.author, [
      'id'
    ]),
    g = e(b.session, [
      'id'
    ]);
    return !d.isFeatureActive('embed_refresh', {
      forum: b.forumId
    }) || f === g || e(b.author, [
      'isPrivate'
    ]) ? null : a.createElement('a', {
      'data-action': 'follow',
      'data-user': f,
      className: 'follow-user-container',
      tabIndex: '0'
    }, a.createElement('span', {
      className: 'follow-user' + (c ? ' is-following' : ''),
      'aria-label': l(c ? 'Unfollow' : 'Follow'),
      title: l(c ? 'Unfollow' : 'Follow')
    }))
  },
  p = function (b) {
    return !b.parentPost && f.isThreadRatingsEnabled(b.thread, b.forum) && b.post.author.threadRating ? a.createElement('span', {
      className: 'post-ratings'
    }, b.hasEmbedRefresh ? null : a.createElement('span', {
      className: 'bullet time-ago-bullet',
      'aria-hidden': 'true'
    }, '•'), a.createElement('span', {
      className: 'post-ratings-stars'
    }, a.createElement('div', {
      className: 'post-stars active',
      style: {
        width: Math.round(20 * b.post.author.threadRating) + '%'
      }
    }, a.createElement('div', {
      className: 'rating-star'
    }, '★'), a.createElement('div', {
      className: 'rating-star'
    }, '★'), a.createElement('div', {
      className: 'rating-star'
    }, '★'), a.createElement('div', {
      className: 'rating-star'
    }, '★'), a.createElement('div', {
      className: 'rating-star'
    }, '★')), a.createElement('div', {
      className: 'post-stars inactive'
    }, a.createElement('div', {
      className: 'rating-star'
    }, '★'), a.createElement('div', {
      className: 'rating-star'
    }, '★'), a.createElement('div', {
      className: 'rating-star'
    }, '★'), a.createElement('div', {
      className: 'rating-star'
    }, '★'), a.createElement('div', {
      className: 'rating-star'
    }, '★')))) : null
  },
  q = function (b) {
    return a.createElement('span', {
      className: 'post-meta'
    }, b.hasEmbedRefresh ? null : a.createElement('span', {
      className: 'bullet time-ago-bullet',
      'aria-hidden': 'true'
    }, '•'), ' ', e(b.post, [
      'id'
    ]) ? a.createElement('a', {
      href: e(b.post, [
        'permalink'
      ], ''),
      'data-role': 'relative-time',
      className: 'time-ago' + (b.hasEmbedRefresh && !b.hasEmbedRefreshV2 ? ' icon icon-clock' : ''),
      title: e(b.post, [
        'formattedCreatedAt'
      ], '')
    }, e(b.post, [
      'relativeCreatedAt'
    ], null)) : a.createElement('span', {
      className: 'time-ago' + (b.hasEmbedRefresh && !b.hasEmbedRefreshV2 ? ' icon icon-clock' : ''),
      'data-role': 'relative-time',
      title: e(b.post, [
        'formattedCreatedAt'
      ], '')
    }, e(b.post, [
      'relativeCreatedAt'
    ], null)), ' ', e(b.post, [
      'isEdited'
    ]) ? a.createElement('span', null, b.hasEmbedRefresh ? null : a.createElement('span', {
      className: 'bullet time-ago-bullet',
      'aria-hidden': 'true'
    }, '•'), ' ', a.createElement('span', {
      className: 'has-edit',
      'data-role': 'has-edit'
    }, l('edited'))) : null)
  },
  r = function (c) {
    return [a.createElement('div', {
      key: 'post-alert',
      role: 'alert'
    }),
    a.createElement(i, {
      key: 'post-wrapper',
      post: c.post,
      session: c.session,
      forum: c.forum
    }, a.createElement(h, {
      post: c.post,
      forum: c.forum,
      defaultAvatarUrl: c.defaultAvatarUrl,
      hasForumAvatar: c.hasForumAvatar
    }), a.createElement('div', {
      className: 'post-body'
    }, a.createElement('header', {
      className: 'comment__header'
    }, a.createElement('span', {
      className: 'post-byline'
    }, e(c.post, [
      'author',
      'isRegistered'
    ]) ? a.createElement('span', null, c.isInHome && e(c.post, [
      'author',
      'isPowerContributor'
    ]) ? a.createElement('a', {
      href: '#',
      className: 'icon__position -inline -allstar',
      'data-toggle': 'tooltip',
      'data-role': 'allstar',
      title: l('All-Star')
    }, a.createElement('span', {
      className: 'icon-allstar allstar__icon'
    })) : null, ' ', a.createElement('span', {
      className: 'author publisher-anchor-color'
    }, a.createElement(j, {
      user: e(c.post, [
        'author'
      ]),
      forumId: c.post.forum
    }, e(c.post, [
      'author',
      'name'
    ], null))), ' ', a.createElement(n, {
      post: c.post,
      forumId: c.forum.id,
      hasEmbedRefreshV2: d.isFeatureActive('embed_refresh', {
        forum: c.forum && c.forum.id
      }) && d.isFeatureActive('embed_refresh_v2', {
        forum: c.forum && c.forum.id
      }),
      opBadgeEnabled: c.isOnChannel
    }), d.isFeatureActive('sso_less_branding', {
      forum: c.forum.id
    }) ? null : a.createElement(o, {
      author: e(c.post, [
        'author'
      ]),
      session: c.session,
      forumId: c.forum.id
    }), a.createElement(k, {
      forum: c.forum,
      user: e(c.post, [
        'author'
      ]),
      context: 'post',
      limit: 4,
      postId: e(c.post, [
        'id'
      ])
    })) : a.createElement('span', {
      className: 'author'
    }, e(c.post, [
      'author',
      'name'
    ], null)), c.parentPost && !m(c) ? a.createElement('span', {
      className: 'parent-link-container'
    }, ' ', a.createElement('a', {
      href: e(c.parentPost, [
        'permalink'
      ], ''),
      className: 'parent-link',
      'data-role': 'parent-link'
    }, a.createElement('i', {
      'aria-label': 'in reply to',
      className: 'icon-forward',
      title: 'in reply to'
    }), ' ', e(c.parentPost, [
      'author',
      'name'
    ], null))) : null), ' ', d.isFeatureActive('embed_refresh', {
      forum: c.forum && c.forum.id
    }) ? [
      a.createElement(p, {
        parentPost: e(c, [
          'parentPost'
        ]),
        thread: c.thread,
        forum: c.forum,
        post: c.post,
        key: 'ratings',
        hasEmbedRefresh: !0
      }),
      ' ',
      a.createElement(q, {
        post: c.post,
        key: 'meta',
        hasEmbedRefresh: !0,
        hasEmbedRefreshV2: d.isFeatureActive('embed_refresh_v2', {
          forum: c.forum && c.forum.id
        })
      })
    ] : [
      a.createElement(q, {
        post: c.post,
        key: 'meta'
      }),
      ' ',
      a.createElement(p, {
        parentPost: e(c, [
          'parentPost'
        ]),
        thread: c.thread,
        forum: c.forum,
        post: c.post,
        key: 'ratings'
      })
    ], ' ', c.stateByline ? a.createElement('span', {
      className: 'state-byline state-byline-' + e(c.stateByline, [
        'style'
      ], '')
    }, a.createElement('span', {
      className: 'icon-mobile icon-' + e(c.stateByline, [
        'icon'
      ], ''),
      'aria-hidden': 'true'
    }), ' ', a.createElement('span', {
      className: 'text'
    }, e(c.stateByline, [
      'text'
    ], null))) : null), a.createElement('div', {
      className: 'post-body-inner'
    }, a.createElement('div', {
      className: 'post-message-container',
      'data-role': 'message-container'
    }, a.createElement('div', {
      className: 'publisher-anchor-color',
      'data-role': 'message-content'
    }, a.createElement('div', {
      className: 'post-message ' + (e(c.post, [
        'message'
      ]) ? '' : 'loading'),
      'data-role': 'message',
      dir: 'auto'
    }, '' === e(c.post, [
      'message'
    ]) ? a.createElement('p', null, a.createElement('i', null, l('This comment has no content.'))) : a.createElement('div', {
      dangerouslySetInnerHTML: {
        __html: e(c.post, [
          'message'
        ], '')
      }
    })), a.createElement('span', {
      className: 'post-media'
    }, a.createElement('ul', {
      'data-role': 'post-media-list'
    })))), a.createElement('a', {
      className: 'see-more hidden',
      title: l('see more'),
      'data-action': 'see-more'
    }, l('see more'))), a.createElement('footer', {
      className: 'comment__footer'
    }, a.createElement(g, {
      post: c.post,
      session: c.session,
      disableSocialShare: e(c.forum, [
        'settings',
        'disableSocialShare'
      ], !1),
      votingType: e(c.forum, [
        'votingType'
      ], b.VOTING_TYPES.DEFAULT_VOTING_TYPE),
      forumId: c.forum && c.forum.id
    }))))]
  };
  return r
}),
define('templates/lounge/postDeleted', [
  'react',
  'core/config/urls',
  'core/strings',
  'core/utils/object/get',
  'templates/lounge/partials/postMenu',
  'templates/lounge/partials/postWrapper'
], function (a, b, c, d, e, f) {
  'use strict';
  var g = c.gettext,
  h = function (c) {
    return a.createElement(f, {
      post: c.post,
      session: c.session,
      forum: c.forum
    }, a.createElement('div', {
      className: 'avatar'
    }, a.createElement('img', {
      'data-src': d(b, [
        'avatar',
        'generic'
      ], ''),
      className: 'user',
      alt: g('Avatar')
    })), a.createElement('div', {
      className: 'post-body'
    }, a.createElement('div', {
      className: 'post-message'
    }, a.createElement('p', null, g('This comment was deleted.'))), a.createElement('header', null, a.createElement(e, {
      post: c.post,
      session: c.session,
      forum: c.forum
    }))))
  };
  return h
}),
define('templates/lounge/postBlocked', [
  'react',
  'core/config/urls',
  'core/strings',
  'core/utils/object/get',
  'core/switches',
  'templates/lounge/partials/postWrapper'
], function (a, b, c, d, e, f) {
  'use strict';
  var g = c.gettext,
  h = function (c) {
    return a.createElement(f, {
      post: c.post,
      session: c.session,
      forum: c.forum
    }, a.createElement('div', {
      className: 'avatar'
    }, a.createElement('img', {
      'data-src': d(b, [
        'avatar',
        'generic'
      ], ''),
      className: 'user',
      alt: g('Avatar')
    })), a.createElement('div', {
      className: 'post-body'
    }, a.createElement('div', {
      className: 'post-message'
    }, a.createElement('p', null, g('Content unavailable')))))
  };
  return h
}),
define('templates/lounge/postMinimized', [
  'react',
  'core/strings',
  'core/utils/object/get',
  'templates/lounge/partials/postMenu',
  'templates/lounge/partials/postUserAvatar',
  'templates/lounge/partials/postWrapper'
], function (a, b, c, d, e, f) {
  'use strict';
  var g = b.gettext,
  h = function (b) {
    var d = void 0;
    return d = c(b.post, [
      'isApproved'
    ]) ? a.createElement('p', null, g('Comment score below threshold.'), ' ', a.createElement('a', {
      href: '#',
      'data-action': 'reveal'
    }, g('Show comment.'))) : b.created ? a.createElement('p', null, g('Your comment is awaiting moderation.'), ' ', a.createElement('a', {
      href: '#',
      'data-action': 'reveal'
    }, g('See your comment.')), ' ', a.createElement('a', {
      href: 'https://help.disqus.com/customer/portal/articles/466223',
      className: 'help-icon',
      title: g('Why?'),
      target: '_blank',
      rel: 'noopener noreferrer'
    }), ' ') : a.createElement('p', null, g('This comment is awaiting moderation.'), ' ', a.createElement('a', {
      href: '#',
      'data-action': 'reveal'
    }, g('Show comment.')))
  },
  i = function (b) {
    return a.createElement(f, {
      post: b.post,
      session: b.session,
      forum: b.forum
    }, a.createElement(e, {
      post: b.post,
      forum: b.forum,
      defaultAvatarUrl: b.defaultAvatarUrl
    }), a.createElement('div', {
      className: 'post-body'
    }, a.createElement('div', {
      className: 'post-message publisher-anchor-color'
    }, a.createElement(h, {
      create: b.created,
      post: b.post
    })), a.createElement('header', null, a.createElement('div', {
      className: 'post-meta'
    }, g('This comment is awaiting moderation.')), a.createElement(d, {
      post: b.post,
      session: b.session,
      forum: b.forum
    }))))
  };
  return i
}),
define('templates/lounge/postSpam', [
  'react',
  'core/config/urls',
  'core/strings',
  'core/utils/object/get',
  'templates/lounge/partials/postMenu',
  'templates/lounge/partials/postWrapper'
], function (a, b, c, d, e, f) {
  'use strict';
  var g = c.gettext,
  h = function (c) {
    return a.createElement(f, {
      post: c.post,
      session: c.session,
      forum: c.forum
    }, a.createElement('div', {
      className: 'avatar'
    }, a.createElement('img', {
      'data-src': d(b, [
        'avatar',
        'generic'
      ], ''),
      className: 'user',
      alt: g('Avatar')
    })), a.createElement('div', {
      className: 'post-body'
    }, a.createElement('div', {
      className: 'post-message'
    }, a.createElement('p', null, g('This comment was marked as spam.'))), a.createElement('header', null, a.createElement(e, {
      post: c.post,
      session: c.session,
      forum: c.forum
    }))))
  };
  return h
}),
define('templates/lounge/anonUpvoteCard', [
  'react',
  'core/strings'
], function (a, b) {
  'use strict';
  var c = b.gettext,
  d = function () {
    return a.createElement('div', {
      className: 'vote-action tooltip'
    }, c('You must sign in to up-vote this post.'))
  };
  return d
}),
define('templates/lounge/anonDownvoteCard', [
  'react',
  'core/strings'
], function (a, b) {
  'use strict';
  var c = b.gettext,
  d = function () {
    return a.createElement('div', {
      className: 'vote-action tooltip'
    }, c('You must sign in to down-vote this post.'))
  };
  return d
}),
define('lounge/views/post', [
  'jquery',
  'underscore',
  'backbone',
  'stance',
  'react',
  'react-dom',
  'core/api',
  'core/constants/badgesConstants',
  'core/constants/voteConstants',
  'core/strings',
  'core/switches',
  'core/utils',
  'core/utils/sso',
  'core/mixins/withAlert',
  'core/mixins/withRichMedia',
  'core/WindowBus',
  'core/bus',
  'common/urls',
  'common/views/mixins',
  'common/utils',
  'lounge/common',
  'lounge/mixins',
  'lounge/views/cards',
  'lounge/views/media',
  'lounge/views/posts/BadgesManageView',
  'lounge/views/posts/BlacklistView',
  'lounge/views/posts/PostEditView',
  'lounge/views/posts/PostReplyView',
  'lounge/views/posts/TypingUserView',
  'lounge/views/posts/FlaggingView',
  'core/views/ClickTooltip',
  'core/views/Tooltip',
  'templates/lounge/partials/postFooter',
  'templates/lounge/partials/postMenu',
  'templates/lounge/partials/userBadges',
  'templates/lounge/post',
  'templates/lounge/postDeleted',
  'templates/lounge/postBlocked',
  'templates/lounge/postMinimized',
  'templates/lounge/postSpam',
  'templates/lounge/anonUpvoteCard',
  'templates/lounge/anonDownvoteCard'
], function (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P) {
  'use strict';
  var Q = l.preventDefaultHandler,
  R = j.get,
  S = new p,
  T = h.ACTION_TYPES,
  U = 13,
  V = c.View.extend({
    tagName: 'li',
    className: 'post',
    events: {
      'click > [data-role=post-content] [data-action]': 'performAction',
      'keydown > [data-role=post-content] [data-action]': function (a) {
        a.keyCode && a.keyCode !== U || this.performAction(a)
      },
      'click [data-role=allstar]': function () {
        S.broadcast('click:allstar')
      }
    },
    actions: {
      upvote: Q(function (a) {
        this.handleVote(a, 1)
      }),
      downvote: Q(function (a) {
        this.handleVote(a, - 1)
      }),
      reply: 'handleReply',
      flag: 'handleFlag',
      'block-user': 'handleBlockUser',
      edit: 'handleEdit',
      'delete': 'handleDelete',
      spam: 'handleSpam',
      blacklist: 'handleBlacklist',
      'manage-badges': 'handleManageBadges',
      highlight: 'handleHighlight',
      unhighlight: 'handleUnhighlight',
      collapse: 'handleCollapse',
      reveal: 'handleReveal',
      'expand-share': 'handleExpandShare',
      'share:twitter': '_onShare',
      'share:facebook': '_onShare',
      'copy-link': 'handleCopyLink',
      follow: 'toggleFollow'
    },
    performAction: function (c) {
      var d = this,
      e = a(c.currentTarget).attr('data-action'),
      f = d.actions[e];
      if (f) return (b.isFunction(f) ? f : d[f]).call(d, c)
    },
    initialize: function (a) {
      var b = this;
      this.thread = a.thread,
      this.session = a.session,
      this.created = Boolean(a.created),
      this.options = a,
      this.userSuggestions = a.userSuggestions,
      this.gifPickerEnabled = Boolean(this.thread) && Boolean(this.thread.forum) && this.thread.forum.get('settings').gifPickerEnabled,
      this.config = a.config,
      this.setAlertSelector('> [role=alert]'),
      this.listenTo(this.model, {
        'change:isDeleted spam': this.removeAsDeleted,
        'change:message': this.stopLoading,
        'change:points': this.updateVotePoints,
        'change:userScore': this.updateActiveUserVote,
        'change:isFlaggedByUser': this.updateMenu,
        'change:hasMore': this.handleHasMoreChanged,
        'change:isHighlighted': function () {
          this.redraw()
        },
        'change:hideReplyPreview': this.updateHideReplyPreview,
        change: function () {
          var a = this.model.changedAttributes();
          (a.id || a.message) && (a.media && k.isFeatureActive('embed_v2', {
            forum: this.thread.forum.id
          }) && (this.shouldWaitToRenderMedia = !0, this.listenToOnce(this.model.media, 'reset', function () {
            this.shouldWaitToRenderMedia = !1,
            this.renderMedia()
          })), this.redraw())
        }
      }),
      this.model.author && (this.listenTo(this.model.author, 'change:isBlocked', function (a, c) {
        var d = a.previous('isBlocked') || !1;
        return b.flaggingView ? void b.listenToOnce(b.flaggingView, 'success cancel', b.redraw) : b.manageBadgeView ? void b.listenToOnce(b.manageBadgeView, 'success cancel', b.redraw) : void (c !== d && b.redraw())
      }), this.listenTo(this.model.author, 'change:badges', this.updateBadges), this.listenTo(this.model.author, 'change:isFollowing', this.updateFollowing)),
      this.thread.forum.get('features') || this.listenToOnce(this.thread.forum, 'change:features', this.redraw),
      this.listenTo(this.thread, 'change:ratingsEnabled', this.redraw),
      !this.model.getParent() && this.model.isAuthorSessionUser(this.session) && this.listenTo(this.thread, 'change:userRating', function () {
        this.model.author.set('threadRating', this.thread.get('userRating')),
        this.redraw()
      }),
      this.listenTo(this.model.usersTyping, 'add remove reset change', this.updateTypingCount),
      this.listenTo(this.session, 'change:id', function () {
        this.updateFooter(),
        this.updateMenu(),
        this.updateSessionClass(),
        k.isFeatureActive('embed_refresh', {
          forum: this.thread.forum.id
        }) && this.updateFollowingInitial()
      }),
      this.listenTo(u.getLounge(), 'opened:post-menu', this.positionMenu),
      this.listenTo(this.thread, 'change:ratingsEnabled', this.render),
      this.hasVisibleChildren = !1,
      this.reply = null,
      this.edit = null,
      this.parent = a.parent,
      this.trackPosition = !1,
      this.offset = {
        top: - 1,
        height: - 1
      },
      this.dim = {
        height: - 1,
        width: - 1
      },
      this.listenTo(u.getLounge(), 'domReflow', this.calcRect),
      this.isCollapseAllowed = !0,
      this.haveSubscribedToRichMediaEvents = !1
    },
    calcRect: function () {
      if (!this.trackPosition || !this.visible) return this.offset = {
        top: - 1,
        height: - 1
      },
      void (this.dim = {
        height: - 1,
        width: - 1
      });
      var a = this.contentNode;
      this.offset = a.offset(),
      this.dim = {
        height: a.height(),
        width: a.width()
      }
    },
    updatePostMetaPlacement: function () {
      var a = k.isFeatureActive('embed_refresh', {
        forum: this.thread.forum.id
      });
      if (a && !l.isMobileUserAgent()) {
        var b = a && k.isFeatureActive('embed_refresh_v2', {
          forum: this.thread.forum.id
        }),
        c = this.$el.find('.comment__header').first(),
        d = c.find('.post-meta'),
        e = 32;
        d.css({
          display: '',
          'margin-top': ''
        }),
        c.height() <= e ? d.css({
          display: 'block',
          'margin-top': b ? '' : '6px'
        }) : b && d.css({
          top: '-2px'
        })
      }
    },
    createTypingUserView: function () {
      var a = this.$el.find('[data-role=realtime-notification\\:' + this.model.id + '] .realtime-replies');
      this.typingUserView = new C({
        parentView: this,
        model: this.model,
        el: a
      })
    },
    updateTypingCount: function () {
      this.typingUserView || this.createTypingUserView(),
      this.typingUserView.render()
    },
    stopLoading: function () {
      this.contentNode.find('.loading').removeClass('loading')
    },
    updateRelativeTime: function () {
      this.contentNode.find('[data-role=relative-time]').text(this.model.getRelativeCreatedAt())
    },
    updateSessionClass: function () {
      var a = 'authored-by-session-user';
      this.model.isAuthorSessionUser(this.session) ? this.contentNode.addClass(a) : this.contentNode.removeClass(a)
    },
    updateActiveUserVote: function () {
      var a = this.model,
      b = this.contentNode.find('[data-action=upvote]'),
      c = this.contentNode.find('[data-action=downvote]');
      c.removeClass('downvoted'),
      b.removeClass('upvoted'),
      a.get('userScore') > 0 ? b.addClass('upvoted') : a.get('userScore') < 0 && c.addClass('downvoted')
    },
    updateHideReplyPreview: function () {
      var a = this.contentNode.find('a.parent-link');
      a.removeClass('parent-link'),
      a.addClass('hidden'),
      this.updatePostMetaPlacement()
    },
    updateVotePoints: function () {
      var c = this,
      d = c.model,
      e = c.contentNode.find('[data-role=likes], [data-role=dislikes]'),
      f = c.contentNode.find('[data-action=upvote], [data-action=downvote]'),
      g = function (a) {
        b.delay(function () {
          a.addClass('update'),
          b.delay(function () {
            a.removeClass('update')
          }, 1000)
        }, 500)
      };
      b.each(e, function (b, e) {
        b = a(b);
        var h = b.html(),
        j = d.get(b.attr('data-role')),
        k = a(f[e]);
        if (j = Math.max(j, 0).toString(), h !== j) {
          k.removeClass('count-' + h);
          var l = c.thread.forum.get('votingType'),
          m = l === i.VOTING_TYPES.DOWNVOTE_LIMITED || l === i.VOTING_TYPES.DOWNVOTE_DISABLED;
          l === i.VOTING_TYPES.DISABLED || 'dislikes' === b.attr('data-role') && m ? k.addClass('count-0') : (k.addClass('count-' + j), b.html(j)),
          g(b)
        }
      })
    },
    updateFooter: function () {
      var a = this.contentNode.find('footer'),
      b = G({
        post: this.getPostAttributes(),
        session: this.session.toJSON(),
        disableSocialShare: this.thread.forum.get('settings').disableSocialShare,
        votingType: this.thread.forum.get('votingType'),
        forumId: this.thread.forum.id
      });
      B.open[this.model.cid] && this.toggleReplyLink(!0),
      a.html(b),
      this.initVotersCard()
    },
    updateMenu: function () {
      var a = this.contentNode.find('[data-role=menu]'),
      b = H({
        session: this.session.toJSON(),
        post: this.getPostAttributes(),
        forum: this.thread.forum.toJSON()
      });
      a.replaceWith(b)
    },
    updateBadges: function () {
      var a = this.getPostAttributes().author,
      b = this.contentNode.find('[data-role=badges]'),
      c = I({
        forum: this.thread.forum.toJSON(),
        user: a,
        context: 'post',
        limit: 4
      });
      b.replaceWith(c),
      this.profileCard && this.profileCard.setBadges(a.badges),
      this.updatePostMetaPlacement()
    },
    updateFollowing: function () {
      var a = '[data-user=' + this.model.author.id + '][data-action=follow]';
      if (this.model.author.get('isPrivate') || this.model.author.id === this.session.user.id) return void this.$el.find(a).hide();
      var b = Boolean(this.model.author.get('isFollowing')),
      c = a + ' .follow-user',
      d = R(b ? 'Unfollow' : 'Follow');
      this.$el.find(c).toggleClass('is-following', b),
      this.$el.find(c).attr('aria-label', d),
      this.$el.find(c).attr('title', d)
    },
    updateFollowingInitial: function () {
      (this.session.user.get('followingUserIdSet') && this.session.user.get('followingUserIdSet').has(this.model.author.id) || this.session.user.id === this.model.author.id) && this.updateFollowing()
    },
    updatePostStateClasses: function () {
      var a = this.model,
      b = a.get('isHighlighted') || a.get('isSponsored');
      this.$el.toggleClass('highlighted', Boolean(b)),
      this.contentNode.toggleClass('disabled', !a.id)
    },
    getMessageContent: function () {
      return this.messageContent && this.messageContent.length || (this.messageContent = this.contentNode.find('[data-role=message-content]')),
      this.messageContent
    },
    manageMessageHeight: function (a) {
      var b = this,
      c = b.getMessageContent(),
      d = 1.5 * b.collapsedHeight,
      e = c && c.length && c.height() || 0;
      e += a || 0,
      e > d && !b.$el.hasClass('collapsed') ? b.collapse() : b.expand(!0)
    },
    preventCollapsing: function (a) {
      a.get('deferred') || (this.expand(), this.isCollapseAllowed = !1)
    },
    markSeen: function () {
      function a() {
        c.contentNode.addClass('seen'),
        b.delay(function () {
          c.contentNode.removeClass('seen'),
          c.contentNode.removeClass('new')
        }, 10000),
        c.trackPosition = !1
      }
      var c = this,
      e = d(c);
      e.isVisible() ? a() : this.listenToOnce(e, 'enter', a)
    },
    renderMedia: function () {
      var a = this.model.media;
      if (a && a.length) {
        var c = this.$el.find('[data-role=post-media-list]');
        this.richMediaViews = this.renderRichMedia(a, c, {
          convertLinkToButton: !0,
          beforeRender: function (a) {
            this.listenTo(a.model, 'change:activated', this.preventCollapsing),
            a.relatedPost = this.model.cid
          },
          normalize: function (a) {
            var b = l.bleachFindUrls(a);
            return b.length && (a = b[0].url),
            a
          }
        }),
        !this.haveSubscribedToRichMediaEvents && this.richMediaViews.length && (this.listenTo(x.settings, 'change:collapsed', function (a, c) {
          if (c) this.manageMessageHeight();
           else {
            var d = b.reduce(this.richMediaViews, function (a, b) {
              return a + (b.model.get('deferredHeight') || 0)
            }, 0);
            this.manageMessageHeight(d)
          }
        }), this.haveSubscribedToRichMediaEvents = !0)
      }
    },
    renderSpoilers: function () {
      this.$el.find('spoiler').each(function () {
        a(this).attr('tabindex', '0')
      })
    },
    getStateByline: function () {
      var a,
      b = this.model;
      return b.get('isHighlighted') ? a = {
        icon: 'trophy',
        text: R('Featured by %(forum)s'),
        style: 'default'
      }
       : b.get('isSponsored') ? a = {
        icon: 'trophy',
        text: R('Sponsored on Disqus'),
        style: 'sponsored'
      }
       : b.isAuthorSessionUser(this.session) && (b.get('isApproved') || (a = {
        icon: 'clock',
        text: R('Hold on, this is waiting to be approved by %(forum)s.'),
        style: 'default'
      })),
      a && (a.text = j.interpolate(a.text, {
        forum: this.thread.forum.get('name')
      })),
      a
    },
    getTemplate: function (a) {
      if (a.isDeleted) return K;
      var b = this.model.isAuthorSessionUser(this.session);
      return a.sb && !b ? K : a.isSpam ? N : this.model.author && (this.model.author.get('isBlocked') || this.model.author.get('isBlocking')) ? L : b && !a.isApproved ? J : a.isMinimized ? M : J
    },
    getPostAttributes: function () {
      var a = this.model.toJSON({
        session: this.session,
        thread: this.thread
      }),
      b = this.model.getParent();
      return b && b.get('isSponsored') && (a.canBeRepliedTo = !1, a.hideViewAllComments = b.get('hideViewAllComments')),
      a
    },
    render: function () {
      var a = this.$el,
      b = this.getPostAttributes(),
      c = u.getLounge(),
      d = this.thread.forum.get('avatar'),
      g = this.model.getParent(),
      h = this.getTemplate(b);
      return !b.message && b.raw_message && t.isPlainText(b.raw_message) && (b.message = this.model.constructor.formatMessage(b.raw_message)),
      f.render(e.createElement(h, {
        post: b,
        forumName: this.thread.forum.get('name'),
        session: this.session.toJSON(),
        thread: this.thread.toJSON(),
        forum: this.thread.forum.toJSON(),
        created: this.created,
        parentPost: g && g.toJSON({
          session: this.session,
          thread: this.thread
        }),
        defaultAvatarUrl: d ? d.large.cache : r.avatar.generic,
        hasForumAvatar: Boolean(d && !l.isDefaultAvatar(d.large.cache)),
        stateByline: this.getStateByline(),
        isInHome: c.isInHome(),
        isOnChannel: c.isOnChannel()
      }), this.el),
      h === J ? a.removeClass('minimized') : a.addClass('minimized'),
      b.sb && !this.model.isAuthorSessionUser(this.session) ? this.hasVisibleChildren || a.addClass('banned') : this.parent && this.parent.markHasVisibleChildren(),
      !this.options.excludeAnchor && this.model.id && a.attr('id', 'post-' + this.model.id),
      this.contentNode = a.find('[data-role=post-content]'),
      this.childrenNode = a.find('[data-role=children]'),
      this.messageNode = this.contentNode.find('[data-role=message]'),
      this.highlightSyntax(),
      this.processMentions(),
      this.initCards(),
      this.updatePostStateClasses(),
      this.shouldWaitToRenderMedia || this.renderMedia(),
      this.renderSpoilers(),
      this.model.get('isRealtime') && (this.trackPosition = !0, this.listenToOnce(c.postsView, 'render:end', this.markSeen)),
      this.listenToOnce(c.postsView, 'render:end', function () {
        this.markSeen(),
        this.manageMessageHeight(),
        this.updatePostMetaPlacement()
      }),
      this
    },
    positionMenu: function (b) {
      var c = b.data('postId').toString();
      if (c === this.model.id) {
        var d = this.$('.dropdown-menu', b);
        if (d.css('top', ''), d.height() + d.offset().top > a(window.document).height()) {
          var e = d.css('top') || 0;
          d.css('top', (d.height() + parseInt(e, 10)) * - 1)
        }
      }
    },
    markHasVisibleChildren: function () {
      this.hasVisibleChildren = !0,
      this.model.get('sb') && (this.$el.removeClass('banned'), this.parent && this.parent.markHasVisibleChildren())
    },
    highlightSyntax: function () {
      var a = this.contentNode.find('pre code');
      a.length && a.each(function () {
        t.syntaxHighlighter.highlight(this)
      })
    },
    redraw: function () {
      var a = window.document.createDocumentFragment();
      this.childrenNode.children().appendTo(a),
      this.render(),
      this.childrenNode.append(a),
      this.blacklist && this.contentNode.find('[data-role=blacklist-form]').first().append(this.blacklist.el),
      u.getLounge().postsView.trigger('render:end'),
      u.getLounge().trigger('domReflow')
    },
    handleHasMoreChanged: function () {
      var b = this.$el.find('.show-children-wrapper');
      a(b[b.length - 1]).toggleClass('hidden', !this.model.get('hasMore'))
    },
    processMentions: function () {
      var b = this.session,
      c = m.getProfileUrlTemplate(b && b.get('sso') && b.get('sso').profile_url),
      d = k.isFeatureActive('sso_less_branding', {
        forum: this.thread.forum.id
      }) && !c;
      this.contentNode.find('[data-dsq-mention]').each(function () {
        var b = a(this);
        if (d) {
          var e = a('<span />');
          e.text(b.text()),
          e.addClass('mention'),
          b.replaceWith(e)
        } else {
          if (c) {
            var f = m.getProfileUrl(c, b.text());
            b.attr('href', f),
            b.attr('title', f)
          } else {
            var g = b.attr('data-dsq-mention').split(':') [0];
            b.attr('data-action', 'profile'),
            b.attr('data-username', g)
          }
          b.addClass('mention')
        }
      })
    },
    attachChild: function (a) {
      var b = a.model;
      b.created || !b.id || b.get('isImmediateReply') ? this.childrenNode.prepend(a.el) : this.childrenNode.append(a.el)
    },
    toggleReply: function () {
      this.reply && this.reply.isOpen() ? this.hideReply() : this.showReply()
    },
    toggleReplyLink: function (a) {
      this.contentNode.find('[data-role=reply-link]').toggleClass('active', a),
      this.contentNode.find('[data-role=reply-link]').toggleClass('publisher-anchor-color', a)
    },
    showReply: function () {
      this.reply ? (this.$el.find('[data-role=reply-form]').first().prepend(this.reply.$el), this.reply.show(), this.reply.focus()) : this.getReplyView(),
      this.toggleReplyLink(!0)
    },
    hideReply: function () {
      this.reply && (this.reply.hide(), this.toggleReplyLink(!1))
    },
    toggleEdit: function () {
      return this.contentNode.find('[data-role=edit-link]').toggleClass('active', !this.edit),
      this.edit ? (this.edit.remove(), this.edit = null, void this.messageNode.show()) : void this.showEdit()
    },
    showEdit: function () {
      if (this.session.isLoggedOut()) return void this.listenToOnce(this.session, 'change:id', this.toggleEdit);
      if (this.model.canBeEdited(this.session, this.thread) && !this.edit) {
        this.edit = new A({
          post: this.model,
          session: this.session,
          thread: this.thread
        }),
        this.edit.render(),
        this.listenTo(this.edit, 'submitted cancel', this.toggleEdit),
        this.expand(!0);
        var a = this.messageNode;
        a.parent().prepend(this.edit.$el),
        a.hide(),
        this.edit.resize();
        var b = u.getLounge();
        b && b.scrollToPost(this.model.id),
        q.trigger('uiAction:postStartUpdate', this.model, {
          area: 'main'
        })
      }
    },
    removeAsDeleted: function () {
      this.redraw()
    },
    initCards: function () {
      var a = this;
      a.initProfileCard(),
      a.initContextCard(),
      a.initVotersCard(),
      a.initAnonVoteCards(),
      a.initTooltips()
    },
    initProfileCard: function () {
      if (!l.isMobileUserAgent() && !k.isFeatureActive('sso_less_branding', {
        forum: this.thread.forum.id
      })) {
        var a = this.$el.find('.hovercard');
        a.length && (this.profileCard = w.ProfileCard.create({
          session: this.session,
          user: this.model.author,
          targetElement: a
        }))
      }
    },
    initContextCard: function () {
      if (!l.isMobileUserAgent()) {
        var a = this.parent && this.parent.model;
        a && !a.get('isDeleted') && (this.contextCard = w.ContextCard.create({
          post: a,
          targetElement: this.$el.find('[data-role=parent-link]')
        }))
      }
    },
    initVotersCard: function () {
      if (!l.isMobileUserAgent()) {
        var a = this.$el.find('[data-action=upvote]'),
        b = this.$el.find('[data-action=downvote]'),
        c = this.thread.forum.get('votingType');
        a.length && c !== i.VOTING_TYPES.DISABLED && (this.upvotersCard = w.VotersCard.create({
          session: this.session,
          model: this.model,
          targetElement: a,
          voteType: 1,
          isRefreshEnabled: k.isFeatureActive('embed_refresh', {
            forum: this.thread.forum.id
          })
        })),
        !b.length || null !== c && void 0 !== c && c !== i.VOTING_TYPES.DETAILED || (this.downvotersCard = w.VotersCard.create({
          session: this.session,
          model: this.model,
          targetElement: b,
          voteType: - 1,
          isRefreshEnabled: k.isFeatureActive('embed_refresh', {
            forum: this.thread.forum.id
          })
        }))
      }
    },
    initAnonVoteCards: function () {
      this.session.isLoggedOut() && !this.thread.forum.get('settings').allowAnonVotes && (this.anonVoteCards = this.anonVoteCards || {
      }, b.each({
        upvote: O,
        downvote: P
      }, function (a, b) {
        this.anonVoteCards[b] && (this.anonVoteCards[b].remove(), this.anonVoteCards[b] = null);
        var c = this.$('[data-action=' + b + ']');
        c.length && (this.anonVoteCards[b] = E.create({
          targetElement: c,
          template: a,
          id: 'anon' + b + this.model.id
        }))
      }, this), this.anonVoteCards.upvote && this.listenTo(this.anonVoteCards.upvote, 'show', this.closeUpvotersCard), this.anonVoteCards.downvote && this.listenTo(this.anonVoteCards.upvote, 'show', this.closeDownvotersCard))
    },
    initTooltips: function () {
      if (!l.isMobileUserAgent()) {
        var b = this.$el.find('[data-toggle=tooltip]');
        b.length && b.each(function (b, c) {
          var d = a(c),
          e = d.attr('title');
          d.attr('data-original-title', e).attr('title', ''),
          F.create({
            targetElement: d,
            message: e,
            id: e
          })
        })
      }
    },
    closeUpvotersCard: function () {
      this.upvotersCard && this.upvotersCard.hide()
    },
    closeDownvotersCard: function () {
      this.downvotersCard && this.downvotersCard.hide()
    },
    _onShare: Q(function (a) {
      if (!this.thread.forum.get('settings').disableSocialShare) {
        var b = t.extractService(a.target, 'share');
        b && (u.getLounge().trigger('uiAction:postShare', this.model, b), this.share(b))
      }
    }),
    handleBlacklist: Q(function () {
      if (!this.blacklist) {
        var a = this.blacklist = new z({
          model: this.model,
          forum: this.thread.forum
        });
        a.render(),
        this.listenTo(a, 'success cancel', function () {
          this.blacklist.remove(),
          this.blacklist = null
        }),
        this.contentNode.find('[data-role=blacklist-form]').first().append(a.el)
      }
    }),
    handleManageBadges: Q(function () {
      if (!this.manageBadgeView) {
        var a = this.manageBadgeView = new y({
          model: this.model,
          forum: this.thread.forum
        });
        a.render(),
        q.trigger('uiAction:viewBadgeModal'),
        this.listenTo(a, 'success cancel', function () {
          this.manageBadgeView.remove(),
          this.manageBadgeView = null
        }),
        this.listenTo(a, 'success', function (a) {
          var b = this.model.author;
          b.get('badges') || b.set('badges', [
          ]);
          var c = b.get('badges');
          a.action === T.AWARD ? c.unshift(a.badge) : a.action === T.REMOVE && b.set('badges', c.filter(function (b) {
            return b.id !== a.badge.id
          })),
          this.thread.trigger('change:badgeAction', b)
        }),
        this.contentNode.find('[data-role=badges-form]').first().append(a.el)
      }
    }),
    toggleCollapse: function (a) {
      this.$el.toggleClass('collapsed', a)
    },
    handleCollapse: Q(function () {
      this.toggleCollapse()
    }),
    handleHighlight: Q(function () {
      this.model.highlight();
      var a = R('You\'ve featured a comment! This comment will now also appear at the top of the discussion.');
      this.alert(a, {
        safe: !0,
        type: 'success'
      }),
      this.thread.set('highlightedPost', this.model);
      var b = u.getLounge();
      b && b.scrollToPost(this.model.id)
    }),
    handleUnhighlight: Q(function () {
      this.model.unhighlight(),
      this.dismissAlert(),
      this.thread.unset('highlightedPost')
    }),
    handleVote: function (a, b) {
      if (this.thread.forum.get('votingType') !== i.VOTING_TYPES.DISABLED && (b !== - 1 || this.thread.forum.get('votingType') !== i.VOTING_TYPES.DOWNVOTE_DISABLED)) {
        if (!this.thread.forum.get('settings').allowAnonVotes && this.session.isLoggedOut()) return void this.queueAuthAction(function () {
          this.handleVote(a, b)
        }, this);
        var c = u.getLounge(),
        d = this.model.get('userScore') === b;
        d ? c.trigger('uiAction:postUnvote', this.model, a) : 1 === b ? c.trigger('uiAction:postUpvote', this.model, a) : b === - 1 && c.trigger('uiAction:postDownvote', this.model, a),
        this.model.vote(d ? 0 : b)
      }
    },
    queueAuthAction: function (a, b) {
      this.listenToOnce(this.session, 'change:id', function () {
        this.session.isLoggedIn() && a.call(b)
      }),
      this.session.get('sso') && this.session.get('sso').url ? this.session.authenticate('sso') : this.session.authenticate('disqusDotcom')
    },
    getReplyView: function () {
      return this.reply ? this.reply : (this.reply = new B({
        parentView: this,
        parent: this.model,
        thread: this.thread,
        session: this.options.session,
        userSuggestions: this.userSuggestions,
        gifPickerEnabled: this.gifPickerEnabled,
        shouldShowEmailAlertInForm: !0
      }), this.reply.render(), this.showReply(), this.reply)
    },
    handleReply: Q(function () {
      this.toggleReply()
    }),
    handleFlag: Q(function () {
      if (!this.model.get('isFlaggedByUser') && !this.flaggingView) {
        if (this.session.isLoggedOut()) {
          var a = this;
          return a._pendingFlagComplete = !1,
          void a.queueAuthAction(function () {
            a._pendingFlagComplete || (a._pendingFlagComplete = !0, setTimeout(function () {
              a.handleFlag()
            }, 400))
          })
        }
        var b = this.flaggingView = new D({
          model: this.model
        });
        b.render(),
        this.listenTo(b, 'cancel success', function () {
          b.remove(),
          this.flaggingView = null,
          this.updateMenu()
        }),
        this.contentNode.find('[data-role=flagging-form]').first().append(b.el),
        q.frame.sendHostMessage('scrollTo', {
          top: b.$el.offset().top - 80
        })
      }
    }),
    handleBlockUser: Q(function () {
      this.dismissAlert(function (a) {
        return a.options && a.options.isBlockError
      });
      var a = this;
      this.model.author.block().fail(function (b) {
        var c = R('Something went wrong while trying to block this user. Please try again later.'),
        d = b && b.responseJSON && b.responseJSON.code;
        d === g.ERROR_CODES.MAX_ITEMS_REACHED && (c = R('Unfortunately this user could not be blocked; you have reached the limit for number of users blocked.')),
        a.alert(c, {
          type: 'error',
          isBlockError: !0
        })
      })
    }),
    handleEdit: Q(function () {
      this.toggleEdit()
    }),
    handleDelete: Q(function () {
      this.model.get('isHighlighted') && (this.model.set('isHighlighted', !1), this.thread.unset('highlightedPost')),
      this.model._delete()
    }),
    handleSpam: Q(function () {
      this.model.spam()
    }),
    handleReveal: Q(function () {
      this.model.set('isMinimized', !1),
      this.redraw()
    }),
    handleExpandMessage: Q(function () {
      return this.expand()
    }),
    handleExpandShare: Q(function () {
      var a = this.$('#comment__share-' + this.model.id + ' .comment-share__buttons');
      a.toggleClass('comment-share__buttons-visible')
    }),
    handleCopyLink: function () {
      k.isFeatureActive('sso_less_branding', {
        forum: this.thread.forum.id
      }) ? l.copyToClipboard(this.model.permalink(this.thread)) : l.copyToClipboard(this.model.shortLink())
    }
  });
  return b.extend(V.prototype, v.ShareMixin),
  b.extend(V.prototype, s.FollowButtonMixin),
  n.call(V.prototype),
  v.asCollapsible.call(V.prototype, {
    collapsedHeight: 374,
    collapseTargetSelector: '[data-role=message-container]',
    collapseScope: 'contentNode'
  }),
  o.call(V.prototype),
  V
}),
define('lounge/views/posts/collection', [
  'jquery',
  'underscore',
  'backbone',
  'moment',
  'core/bus',
  'core/strings',
  'core/switches',
  'common/models',
  'common/utils',
  'lounge/views/posts/PostReplyView',
  'lounge/views/post'
], function (a, b, c, d, e, f, g, h, i, j, k) {
  'use strict';
  var l = f.get,
  m = c.View.extend({
    events: {
      'click [data-action=more-posts]': 'handleLoadMore',
      'click [data-action=show-children]': 'handleLoadMoreChildPosts'
    },
    STREAMING_MAX_VISIBLE: 250,
    initialize: function (a) {
      this.lounge = a.lounge,
      this.thread = a.thread,
      this.userSuggestions = a.userSuggestions,
      this.posts = a.posts,
      this.postsToAppend = [
      ],
      this.postsToPrepend = [
      ],
      this.session = a.session,
      this.subViews = {
      },
      this.state = {
        nextPassTimeoutId: null,
        renderedPosts: [
        ],
        clearDomAfterRender: !1,
        totalPostsProcessed: 0,
        totalElapsedTime: 0
      },
      this.addPostsIncremental = b.bind(this.addPostsIncremental, this),
      this.listenTo(this.posts, {
        reset: this.redrawPosts,
        add: this.addPosts,
        remove: this.removePost
      }),
      this.listenTo(this.thread, 'change:badgeAction', this.handleBadgeAction),
      this.listenTo(this.thread, 'change:highlightedPost', this.handleHasHighlightedState),
      this.listenToOnce(this.lounge, 'threadView:init', function () {
        this.listenTo(this.thread, 'change:isClosed', this.toggleNoPosts),
        this.listenTo(this.session, 'change:id', this.toggleNoPosts),
        this.listenTo(this.posts, 'reset add', this.toggleNoPosts)
      }),
      this.listenTo(this.posts, 'reset add', this.enableTimestampUpdates),
      this.listenTo(this, 'render:end', this.toggleLoadMorePosts),
      this.listenTo(this, 'render:end', this.handleHasHighlightedState),
      g.isFeatureActive('limit_rendered_posts', {
        forum: this.thread.forum.id
      }) && this.listenTo(this.lounge, 'scroll', b.throttle(this.hideOffscreenPosts, 200))
    },
    handleHasHighlightedState: function () {
      this.$el.toggleClass('has-highlighted-post', this.thread.has('highlightedPost'))
    },
    handleBadgeAction: function (a) {
      var b = this;
      Object.keys(this.subViews).forEach(function (c) {
        var d = b.subViews[c];
        d.model.author.id === a.id && d.updateBadges()
      })
    },
    getPostView: function (a) {
      return this.subViews[a]
    },
    bootstrap: function (a, c) {
      this.permalinkOptions = c,
      this.listenTo(this.posts, 'reset', b.bind(this.posts.restoreFromCache, this.posts)),
      this.listenTo(this.posts, 'change:isDeleted', b.bind(this.posts.removeFromCache, this.posts)),
      this.handleInitialCommentCount(a.posts)
    },
    handleInitialCommentCount: function (a) {
      var c = this.thread.forum.get('initialCommentCount');
      if (!c) {
        var d = g.getSwitchContext('customCommentCounts') || {
        };
        c = d[this.thread.forum.id]
      }
      this.posts.reset(a, {
        customThreadLength: c
      }),
      b.invoke(this.subViews, 'manageMessageHeight')
    },
    bindUIUpdateHandlers: function () {
      var c = this,
      d = a(window),
      e = a(window.document.body),
      f = e.width(),
      g = b.debounce(function () {
        var a = e.width();
        f !== a && c.subViews && (f = a, b.each(c.subViews, function (a) {
          a.manageMessageHeight()
        }))
      }, 50);
      d.on('resize', g)
    },
    updateTimestamps: function () {
      return !(!this.subViews || b.size(this.subViews) < 1) && (b.invoke(this.subViews, 'updateRelativeTime'), !0)
    },
    enableTimestampUpdates: function () {
      var a = this,
      c = 60000;
      if (!a.timestampUpdateTimer) {
        var d = function e() {
          return a.updateTimestamps() ? void (a.timestampUpdateTimer = b.delay(e, c)) : void (a.timestampUpdateTimer = null)
        };
        a.timestampUpdateTimer = b.delay(d, c)
      }
    },
    openReply: function (a) {
      var b = this.posts.get(a);
      if (b) {
        var c = this.subViews[b.cid];
        c.showReply()
      }
    },
    openEdit: function (a) {
      var b = this.posts.get(a);
      if (b) {
        var c = this.subViews[b.cid];
        c.showEdit()
      }
    },
    toggleLoadMorePosts: function () {
      var a = this.lounge.threadView.$el.find('#posts [data-role=more]'),
      b = this.posts.hasNext();
      b ? a.show() : a.hide()
    },
    handleLoadMore: function (a) {
      var b = this.posts.currentPage();
      this._loadMore(a),
      this.lounge.trigger('uiAction:seeMore', b + 1)
    },
    handleLoadMoreChildPosts: function (a) {
      var b = a.currentTarget.id.split('-') [1],
      c = this.posts.get(b);
      this._loadMore(a, c),
      this.lounge.trigger('uiAction:seeMoreChildren', a)
    },
    _loadMore: function (b, c) {
      b.preventDefault();
      var d = this,
      f = a(b.currentTarget);
      f.addClass('busy'),
      d.posts.more({
        post: c,
        success: function () {
          d.posts.restoreFromCache(),
          d.once('render:end', function () {
            f.removeClass('busy')
          })
        },
        error: function () {
          f.removeClass('busy')
        }
      }),
      e.frame.sendHostMessage('posts.paginate')
    },
    renderLayout: a.noop,
    toggleNoPosts: function () {
      var a,
      b = this.lounge.threadView.$el.find('#no-posts');
      this.posts.models.length ? b.hide() : (a = l(this.thread.get('isClosed') ? 'This discussion has been closed.' : this.session.get('canReply') ? 'Be the first to comment.' : 'Nothing in this discussion yet.'), b.text(a), b.show())
    },
    handleSort: function () {
      a('#posts [data-role=more]').hide(),
      a('#no-posts').hide(),
      a('#post-list').addClass('loading').empty()
    },
    redrawPosts: function () {
      var a = this;
      a.subViews = {
      },
      a.once('render:end', function () {
        b.each(j.open, function (b, c) {
          var d = a.subViews[c];
          if (d) {
            var e = d.getReplyView();
            e.textarea.set(b.textarea.get()),
            b.isOpen() ? e.show() : e.hide()
          }
        })
      }),
      a.posts.setPageFor && a.permalinkOptions && a.permalinkOptions.postId && a.posts.setPageFor(a.permalinkOptions.postId, {
        silent: !0
      }),
      a.addPosts(a.posts, {
        clearDom: !0
      })
    },
    hideOffscreenPosts: function (a) {
      var c = a.pageOffset,
      d = this.lounge.position.frameOffset.top,
      e = 2 * a.height,
      f = c - e,
      g = c + a.height + e;
      b.isNumber(c) && b.isNumber(e) && b.each(this.subViews, function (a) {
        var b = a.$el,
        c = b.offset().top + d,
        e = c + b.outerHeight();
        e < f || c > g ? b.addClass('invisible') : b.removeClass('invisible')
      })
    },
    postsShouldBePrepended: function (a) {
      var b = a.length && a[0];
      return Boolean(b && (b.created || !b.id || b.get('isRealtime') || b.get('isCached') || b.requestedByPermalink))
    },
    hasQueuedPosts: function () {
      return this.postsToAppend.length || this.postsToPrepend.length
    },
    addPosts: i.decorate(c.collectionAddNormalizer(c.Collection, h.Post), function (a, c, d) {
      var e = this;
      if (d.clearDom && (e.postsToAppend = [
      ], e.postsToPrepend = [
      ], e.postsShouldClearDom = !0), e.postsShouldBePrepended(a)) {
        var f = [
        ];
        b.each(a, function (a) {
          var b = a.get('parent');
          b && e.posts.get(b) ? e.postsToPrepend.push(a) : f.push(a)
        }),
        e.postsToPrepend = f.concat(e.postsToPrepend)
      } else e.postsToAppend = e.postsToAppend.concat(a);
      e.state.nextPassTimeoutId || (e.state.nextPassTimeoutId = b.defer(function () {
        e.trigger('render:start'),
        e.addPostsIncremental(!0)
      }))
    }),
    onDeferredViewReady: function (a) {
      var b = this.subViews;
      b.hasOwnProperty(a) && b[a].manageMessageHeight()
    },
    removePost: function (a) {
      if (this.hasQueuedPosts()) return void this.once('render:end', b.bind(this.removePost, this, a));
      var c = this.subViews[a.cid];
      c && (c.remove(), delete this.subViews[a.cid])
    },
    addPostsIncremental: function (a) {
      this.state.nextPassTimeoutId = null,
      this.discardRenderProgressIfClearDomRequested();
      var b = this.getPostModelsForThePass();
      b.length && this.renderPass(b, a ? m.FIRST_ATTEMPT_TIME_SCALE : void 0),
      this.finishPass(b),
      this.scheduleNextPass()
    },
    discardRenderProgressIfClearDomRequested: function () {
      this.postsShouldClearDom && (this.state.clearDomAfterRender = !0, this.postsShouldClearDom = !1, this.state.renderedPosts = [
      ])
    },
    getPostModelsForThePass: function () {
      return this.postsToAppend.length ? this.postsToAppend : this.postsToPrepend
    },
    renderPass: function (a, b) {
      var c = m.TARGET_PROCESS_TIME;
      b && (c *= b);
      for (var d = this.calculatePostsForNextRun(c) || m.MINIMUM_POSTS_PER_RUN; d > 0; ) {
        var e = a.splice(0, d),
        f = this.timedRenderPosts(e);
        if (null === f) break;
        c -= f,
        d = this.calculatePostsForNextRun(c)
      }
    },
    timedRenderPosts: function (a) {
      if (!a.length) return null;
      var c = Number(new Date);
      this.state.renderedPosts = this.state.renderedPosts.concat(b.map(a, this.createPostView, this));
      var d = Number(new Date) - c;
      return d < 0 && (d = 0),
      this.state.totalElapsedTime += d,
      this.state.totalPostsProcessed += a.length,
      d || null
    },
    createPostView: function (a) {
      var b,
      c = a.get('parent');
      c && (c = this.posts.get(c), b = c && this.getPostView(c.cid));
      var d = new k({
        parent: b,
        model: a,
        thread: this.thread,
        session: this.session,
        created: a.created,
        userSuggestions: this.userSuggestions,
        config: this.lounge.config
      });
      return this.subViews[a.cid] = d,
      d.render(),
      d
    },
    calculatePostsForNextRun: function (a) {
      return a <= 0 ? 0 : this.state.totalElapsedTime <= 0 ? this.state.totalPostsProcessed : Math.floor(a * this.state.totalPostsProcessed / this.state.totalElapsedTime)
    },
    finishPass: function (a) {
      if (!a.length) {
        if (this.$postList = this.lounge.threadView.$el.find('#post-list'), this.state.clearDomAfterRender && (this.$postList.empty(), this.state.clearDomAfterRender = !1), this.state.renderedPosts.length) {
          this.removeOldPostsIfRealtime(),
          this.enablePostTracking(this.state.renderedPosts);
          var b = a === this.postsToAppend;
          this.insertPostElements(this.state.renderedPosts, b),
          this.state.renderedPosts = [
          ]
        }
        this.$postList.removeClass('loading'),
        this.postsToPrepend.length || this.postsToAppend.length || this.trigger('render:end')
      }
    },
    removeOldPostsIfRealtime: function () {
      var a = b.any(this.state.renderedPosts, function (a) {
        return a.model.get('isRealtime')
      });
      a && this.removeOldPosts()
    },
    removeOldPosts: function () {
      var a = b.size(this.subViews) - this.STREAMING_MAX_VISIBLE;
      if (!(a <= 0)) for (var c, e = this.posts.sortBy(function (a) {
        return d(a.get('createdAt')).valueOf()
      }), f = 0, g = 0; g < e.length && f <= a; g++) c = this.getPostView(e[g].cid),
      c && 0 === c.childrenNode.children().length && (this.posts.remove(e[g]), f += 1)
    },
    enablePostTracking: function (a) {
      b.each(a, function (a) {
        a.visible = !0
      })
    },
    insertPostElements: function (a, c) {
      var d = b.groupBy(a, function (a) {
        return Boolean(a.parent)
      });
      b.each(d['true'], function (a) {
        a.parent.attachChild(a)
      });
      var e = b.pluck(d['false'], '$el');
      c ? this.$postList.append(e) : this.$postList.prepend(e)
    },
    scheduleNextPass: function () {
      (this.postsToPrepend.length || this.postsToAppend.length) && (this.state.nextPassTimeoutId = b.defer(this.addPostsIncremental))
    }
  });
  m.TARGET_PROCESS_TIME = 30,
  m.FIRST_ATTEMPT_TIME_SCALE = 0.8,
  m.MINIMUM_POSTS_PER_RUN = 2;
  var n = c.View.extend({
    initialize: function (a) {
      this.lounge = a.lounge,
      this.thread = a.thread,
      this.userSuggestions = a.userSuggestions,
      this.posts = a.posts,
      this.postsToAppend = [
      ],
      this.postsToPrepend = [
      ],
      this.session = a.session,
      this.subViews = {
      },
      this.state = {
        nextPassTimeoutId: null,
        renderedPosts: [
        ],
        clearDomAfterRender: !1,
        totalPostsProcessed: 0,
        totalElapsedTime: 0
      },
      this.listenTo(this.posts, {
        reset: this.addPosts,
        add: this.addPosts
      })
    },
    handleHasHighlightedState: function () {
    },
    handleBadgeAction: function () {
    },
    getPostView: function () {
    },
    bootstrap: function (a) {
      this.posts.reset(a.posts)
    },
    handleInitialCommentCount: function () {
    },
    bindUIUpdateHandlers: function () {
    },
    enableTimestampUpdates: function () {
    },
    openReply: function () {
    },
    openEdit: function () {
    },
    toggleLoadMorePosts: function () {
    },
    handleLoadMore: function () {
    },
    handleLoadMoreChildPosts: function () {
    },
    _loadMore: function () {
    },
    renderLayout: function () {
    },
    toggleNoPosts: function () {
    },
    handleSort: function () {
    },
    redrawPosts: function () {
    },
    hideOffscreenPosts: function () {
    },
    postsShouldBePrepended: function () {
    },
    hasQueuedPosts: function () {
    },
    addPosts: function () {
      this.trigger('render:end')
    },
    onDeferredViewReady: function () {
    },
    removePost: function () {
    },
    addPostsIncremental: function () {
    },
    discardRenderProgressIfClearDomRequested: function () {
    },
    getPostModelsForThePass: function () {
    },
    renderPass: function () {
    },
    timedRenderPosts: function () {
    },
    createPostView: function () {
    },
    calculatePostsForNextRun: function () {
    },
    finishPass: function () {
    },
    removeOldPostsIfRealtime: function () {
    },
    removeOldPosts: function () {
    },
    enablePostTracking: function () {
    },
    insertPostElements: function () {
    },
    scheduleNextPass: function () {
    }
  });
  return {
    PostCollectionView: m,
    DummyPostCollectionView: n
  }
}),
define('templates/lounge/onboard', [
  'react',
  'core/config/urls',
  'core/strings',
  'core/utils/object/get'
], function (a, b, c, d) {
  'use strict';
  var e = c.gettext,
  f = function (c) {
    return [a.createElement('div', {
      key: 'onboard-notice',
      className: 'notice ' + (c.showHome ? 'notice--brand' : '')
    }, a.createElement('div', {
      className: 'notice-wrapper'
    }, a.createElement('span', {
      className: 'notice__icon icon icon-disqus'
    }), a.createElement('a', {
      'data-action': 'show-home',
      href: (b.home || '') + 'explore/?utm_source=embed&utm_medium=onboard_message&utm_content=see_home_msg&forum_id=' + d(c.forum, [
        'id'
      ], ''),
      target: '_blank',
      className: 'notice__message'
    }, e('Welcome to %(Disqus)s! Discover more great discussions just like this one. We\'re a lot more than comments.', {
      Disqus: 'Disqus'
    })), a.createElement('a', {
      'data-action': 'show-home',
      href: (b.home || '') + 'explore/?utm_source=embed&utm_medium=onboard_message&utm_content=see_home_btn&forum_id=' + d(c.forum, [
        'id'
      ], ''),
      target: '_blank',
      className: 'btn btn-primary notice__button'
    }, e('Get Started')))),
    a.createElement('a', {
      key: 'onboard-link',
      className: 'dismiss',
      'data-action': 'close',
      href: '#',
      title: e('Dismiss')
    }, 'Dismiss ', a.createElement('span', {
      'aria-label': 'Dismiss',
      className: 'cross'
    }, '×'))]
  };
  return f
}),
define('lounge/views/onboard-alert', [
  'backbone',
  'react',
  'react-dom',
  'common/utils',
  'templates/lounge/onboard'
], function (a, b, c, d, e) {
  'use strict';
  var f = a.View.extend({
    events: {
      'click [data-action=close]': 'handleClose',
      'click [data-action=show-home]': 'handleShowHome'
    },
    initialize: function (a) {
      this.session = a.session,
      this.forum = a.forum
    },
    render: function () {
      return this.session.isLoggedIn() && this.shouldShow() && (c.render(b.createElement(e, {
        forum: this.forum.toJSON()
      }), this.el), this.trigger('uiAction:onboardAlertShow')),
      this
    },
    shouldShow: function () {
      return !1
    },
    getCookie: function () {
      return d.cookies.read(f.COOKIE_NAME)
    },
    setInitialCookie: function () {
      this.session.user.get('joinedRecently') && this.createCookie(f.COOKIE_NEW_USER)
    },
    createCookie: function (a) {
      d.cookies.create(f.COOKIE_NAME, a, {
        expiresIn: 2592000000
      })
    },
    eraseCookie: function () {
      d.cookies.erase(f.COOKIE_NAME)
    },
    handleShowHome: function () {
      this.remove()
    },
    handleClose: function (a) {
      a.preventDefault(),
      this.remove(),
      this.trigger('uiAction:onboardAlertDismiss')
    },
    remove: function () {
      this.eraseCookie(),
      this.session = null,
      a.View.prototype.remove.call(this)
    }
  }, {
    COOKIE_NAME: 'disqus.onboarding',
    COOKIE_NEW_USER: 'newUser'
  });
  return {
    OnboardAlert: f
  }
}),
define('templates/lounge/notificationMenu', [
  'react',
  'core/config/urls',
  'core/switches'
], function (a, b, c) {
  'use strict';
  var d = function (d) {
    var e = c.isFeatureActive('embed_refresh', {
      forum: d.forumId
    }),
    f = e ? 'notification-icon notification-icon--refresh' : 'notification-icon',
    g = e ? 'notification-count notification-count--refresh' : 'notification-count';
    return a.createElement('a', {
      href: b.homeInbox || '',
      className: 'notification-container',
      'data-action': 'home',
      'data-home-path': 'home/notifications/'
    }, a.createElement('span', {
      className: f + ' icon-comment',
      'aria-hidden': !0
    }), a.createElement('span', {
      className: g,
      'data-role': 'notification-count'
    }))
  };
  return d
}),
define('lounge/views/notification-menu', [
  'jquery',
  'underscore',
  'backbone',
  'stance',
  'core/bus',
  'core/switches',
  'core/utils',
  'templates/lounge/notificationMenu'
], function (a, b, c, d, e, f, g, h) {
  'use strict';
  var i = c.View.extend({
    events: {
      'click [data-action=home]': 'handleShowHome'
    },
    initialize: function (c) {
      var e = a.Deferred();
      this.listenToOnce(d(this), 'enter', function () {
        e.resolveWith(this)
      });
      var f = this.session = c.session;
      this.forum = c.forum,
      this.language = window.document.documentElement.lang,
      this.listenTo(f, 'change:id', this.render),
      this.listenTo(f, 'change:notificationCount', this.updateCount),
      this.listenTo(f, 'change:id', function () {
        e.done(b.bind(f.fetchNotificationCount, f)),
        e.done(this.preloadSidebar)
      }),
      this.listenTo(this, {
        'sidebar:open:start': this.startLoadingAnimation,
        'sidebar:open:done': this.stopLoadingAnimation
      })
    },
    startLoadingAnimation: function () {
      this.$el.addClass('notification-loading')
    },
    stopLoadingAnimation: function () {
      this.$el.removeClass('notification-loading')
    },
    preloadSidebar: function () {
      e.trigger('sidebar:preload')
    },
    render: function () {
      return this.forum.get('settings').ssoRequired && this.session.isLoggedOut() || f.isFeatureActive('sso_less_branding', {
        forum: this.forum.id
      }) && !this.forum.get('settings').sidebarEnabled ? void this.$el.hide() : (this.$el.html(h({
        forumId: this.forum.id
      })), this.updateCount(), this.$el.show(), this)
    },
    handleShowHome: function (b) {
      if (this.session.set('notificationCount', 0), !g.willOpenNewWindow(b)) {
        b.preventDefault();
        var c = a(b.currentTarget).attr('data-home-path');
        e.trigger('sidebar:open', c, this)
      }
    },
    updateCount: function () {
      var a = this.session.get('notificationCount') || 0;
      a > 0 ? (this.$('[data-role=notification-count]').html(a > 9 ? '9<i class="icon icon-plus"></i>' : a), this.$el.addClass('unread')) : (this.$('[data-role=notification-count]').html(''), this.$el.removeClass('unread'))
    }
  });
  return {
    NotificationMenuView: i
  }
}),
define('templates/lounge/highlightedPost', [
  'react',
  'core/strings'
], function (a, b) {
  'use strict';
  var c = b.gettext,
  d = function (b) {
    return a.createElement('div', null, b.isRefreshEnabled ? null : a.createElement('h2', {
      className: 'highlighted-comment-header'
    }, c('Featured Comment')), a.createElement('ul', {
      className: 'post-list'
    }))
  };
  return d
}),
define('lounge/views/highlighted-post', [
  'backbone',
  'underscore',
  'jquery',
  'core/switches',
  'core/UniqueModel',
  'common/models',
  'lounge/views/post',
  'templates/lounge/highlightedPost'
], function (a, b, c, d, e, f, g, h) {
  'use strict';
  var i = g.extend({
    getPostAttributes: function () {
      var a = g.prototype.getPostAttributes.apply(this, arguments);
      return a.hasMore = !1,
      d.isFeatureActive('embed_refresh', {
        forum: this.thread.forum.id
      }) ? a.hideParent = !0 : a.canBeRepliedTo = !1,
      a
    },
    getStateByline: function () {
      return !1
    }
  }),
  j = a.View.extend({
    template: h,
    itemViewContainer: '.post-list',
    initialize: function (a) {
      b.extend(this, b.pick(a, [
        'thread',
        'session',
        'userSuggestions',
        'config'
      ])),
      this.listenTo(this.thread, 'change:highlightedPost', this.reset)
    },
    getPost: function () {
      return this.post ? c.Deferred().resolve(this.post) : this.getHighlightedPost()
    },
    _getHighlightedPost: function () {
      var a = this.thread.get('highlightedPost');
      return a ? (a instanceof f.Post || (a = new e(f.Post, a)), a.get('isDeleted') ? null : a.get('sb') && !a.isAuthorSessionUser(this.session) ? null : a.get('isHighlighted') ? a : null) : null
    },
    getHighlightedPost: function () {
      var a,
      e = this.post = this._getHighlightedPost(),
      g = c.Deferred();
      return e ? !(a = e.getParent()) || a.author || d.isFeatureActive('embed_refresh', {
        forum: this.thread.forum.id
      }) ? e.sync('read', e, {
        isHighlighted: !0
      }).always(b.bind(g.resolve, g)) : f.Post.fetchContext(e.id, this.thread).always(b.bind(g.resolve, g)) : g.reject(),
      g.promise()
    },
    reset: function () {
      delete this.post,
      this.getPost().always(b.bind(this.render, this))
    },
    createPostView: function () {
      return this.post ? new i({
        model: this.post,
        thread: this.thread,
        session: this.session,
        userSuggestions: this.userSuggestions,
        config: this.config,
        excludeAnchor: !0
      }).stopListening(this.post.usersTyping) : null
    },
    render: function () {
      var a = this.createPostView();
      return a ? (a.render(), this.$el.html(this.template({
        isRefreshEnabled: d.isFeatureActive('embed_refresh', {
          forum: this.thread.forum.id
        })
      })), this.$(this.itemViewContainer).append(a.el), this.$el.show(), this) : (this.$el.hide(), this)
    }
  });
  return {
    HighlightedPostView: j,
    FeaturedPostView: i
  }
}),
define('templates/lounge/realtimeCommentNotification', [
  'core/strings',
  'core/switches'
], function (a, b) {
  'use strict';
  var c = a.gettext,
  d = function (a) {
    var d = b.isFeatureActive('embed_refresh', {
      forum: a.forumId
    });
    return 1 === a.comments ? c(d ? '+1 new comment' : 'Show One New Comment') : d ? c('+%(comments)s new comments', {
      comments: a.comments
    }) : c('Show %(comments)s New Comments', {
      comments: a.comments
    })
  };
  return d
}),
define('templates/lounge/realtimeReplyNotification', [
  'react',
  'core/strings',
  'core/switches'
], function (a, b, c) {
  'use strict';
  var d = b.gettext,
  e = function (b) {
    var e = c.isFeatureActive('embed_refresh', {
      forum: b.forumId
    }),
    f = e ? 'indicator indicator--refresh' : 'indicator';
    return 1 === b.replies ? [
      a.createElement('span', {
        key: 'indicator',
        className: f
      }),
      d(e ? '+1 new reply' : 'Show 1 new reply')
    ] : [
      a.createElement('span', {
        key: 'indicator',
        className: f
      }),
      e ? d('+%(replies)s new replies', {
        replies: b.replies
      }) : d('Show %(replies)s new replies', {
        replies: b.replies
      })
    ]
  };
  return e
}),
define('lounge/views/realtime', [
  'underscore',
  'backbone',
  'react',
  'react-dom',
  'core/bus',
  'core/utils',
  'core/utils/object/get',
  'lounge/common',
  'templates/lounge/realtimeCommentNotification',
  'templates/lounge/realtimeReplyNotification'
], function (a, b, c, d, e, f, g, h, i, j) {
  'use strict';
  var k = f.preventDefaultHandler,
  l = b.View.extend({
    events: {
      click: 'handleDrain'
    },
    initialize: function (a) {
      this.options = a
    },
    getDirection: function (a) {
      if (this.offset && this.dim) {
        var b = a.pageOffset,
        c = b + a.height,
        d = this.offset.top + a.frameOffset.top,
        e = d + this.dim.height;
        return e < b ? 1 : d > c ? - 1 : 0
      }
    },
    setCount: function (a) {
      this.options.count = a
    },
    render: function () {
      return 0 === this.options.count ? void this.$el.hide() : (d.render(c.createElement(i, {
        comments: this.options.count,
        forumId: this.model.get('forum')
      }), this.el), this.listenTo(h.getLounge(), 'domReflow', a.throttle(function () {
        0 !== this.options.count && (this.offset = this.$el.offset(), this.dim = {
          height: this.$el.height(),
          width: this.$el.width()
        })
      }, 400)), this.$el.show(), this)
    },
    handleDrain: k(function () {
      this.model.queue.drain(),
      this.setCount(this.model.queue.counters.comments),
      this.render(),
      e.trigger('uiAction:loadLiveComments')
    })
  }),
  m = l.extend({
    events: {
      click: 'handleDrain'
    },
    getDirection: function (a) {
      if (this.options.postView.visible) {
        this.offset = this.options.postView.offset,
        this.dim = this.options.postView.dim;
        var b = l.prototype.getDirection.call(this, a);
        return delete this.offset,
        delete this.dim,
        b
      }
    },
    render: function () {
      var b = this,
      e = b.options.postView;
      return 0 === b.options.count ? (b.$el.hide(), void (e.trackPosition = !1)) : (e.trackPosition = !0, e.calcRect(), d.render(c.createElement(j, {
        replies: b.options.count,
        forumId: this.model.get('forum')
      }), this.el), b.$el.show(), void a.delay(function () {
        b.$el.addClass('reveal')
      }, 13))
    },
    handleDrain: k(function () {
      var a = this.model.id,
      b = this.options.postView,
      c = this.options.thread.queue;
      c.drain(a),
      this.setCount(c.counters.replies[a]),
      b.trackPosition = !1,
      this.render(),
      e.trigger('uiAction:loadLiveReplies')
    })
  });
  return {
    QueuedPostView: l,
    QueuedReplyView: m
  }
}),
define('lounge/views/posts/UserSuggestionsManager', [
  'underscore',
  'common/collections'
], function (a, b) {
  'use strict';
  function c(a) {
    this.remotes = [
    ],
    this.threadId = a.threadId,
    this.userCollection = new b.UserSuggestionsCollection([], {
      threadId: this.threadId
    })
  }
  return a.extend(c.prototype, {
    fetch: function (a, b) {
      this.userCollection.fetch({
        query: a || '',
        next: b
      })
    },
    addRemote: function (a) {
      this.remotes.push(a)
    },
    all: function () {
      var c = new b.UserCollection;
      return c.add(this.userCollection.models),
      c.add(a.chain(this.remotes).pluck('models').flatten().value()),
      c
    },
    find: function (a, b) {
      a && a.length && this.fetch(a.join(' ').replace(/[^\w\s]/, ''), b)
    },
    get: function (a) {
      return this.userCollection.get(a)
    }
  }),
  c
}),
define('lounge/views/sidebar', [
  'underscore',
  'backbone',
  'modernizr',
  'core/bus',
  'core/switches',
  'core/utils/url/serialize',
  'core/shared/urls',
  'core/utils'
], function (a, b, c, d, e, f, g, h) {
  'use strict';
  var i = b.View.extend({
    initialize: function (a) {
      this.forum = a.forum,
      this.session = a.session,
      this.config = a.config,
      this.language = window.document.documentElement.lang,
      'en' === this.language && (this.language = void 0),
      this.listenTo(this.session, 'change:id', this.destroyHome),
      this.listenTo(d, {
        'sidebar:open': this.open,
        'sidebar:preload': this.preload
      }),
      this.iframeAlive = !0,
      this.iframeReady = !1,
      this.listenToOnce(d.frame, 'home.timeout', this.handleTimeout),
      this.listenToOnce(d.frame, 'home.ready', this.handleReady)
    },
    isIE9: function () {
      return 9 === window.document.documentMode
    },
    shouldUseIframe: function () {
      return !!(this.forum && this.forum.get('settings').sidebarEnabled && e.isFeatureActive('sso_less_branding', {
        forum: this.forum.id
      })) || !!this.iframeAlive && (this.session.isSSO() || this.forum && this.forum.get('settings').sidebarEnabled)
    },
    handleTimeout: function () {
      this.iframeAlive = !1
    },
    handleReady: function () {
      this.iframeReady = !0,
      d.frame.off('home.timeout')
    },
    open: function (b, c) {
      if (this.shouldUseIframe()) {
        if (this.storeHomeSession(), d.frame.sendHostMessage('home.show', {
          path: b,
          language: this.language,
          forum: this.forum
        }), this.iframeReady || this.listenToOnce(d.frame, 'home.timeout', a.bind(this.open, this, b, c)), c) {
          c.trigger('sidebar:open:start');
          var e = a.bind(c.trigger, c, 'sidebar:open:done');
          this.listenToOnce(d.frame, {
            'home.opened': e,
            'home.timeout': e
          })
        }
      } else h.openWindow(f(g.apps.home + b, {
        l: this.language
      }));
      var i = 'unknown';
      0 === b.indexOf('home/forums/') ? i = 'community' : 0 === b.indexOf('by/') ? i = 'profile' : 'home/notifications/' !== b && 'home/inbox/' !== b || (i = 'notifications'),
      d.trigger('uiAction:openHome', i, this.shouldUseIframe())
    },
    destroyHome: function () {
      d.frame.sendHostMessage('home.destroy')
    },
    preload: function () {
      this.session.isLoggedOut() || this.shouldUseIframe() && (this.storeHomeSession(), d.frame.sendHostMessage('home.preload', {
        language: this.language,
        disableMOTD: e.isFeatureActive('sso_less_branding', {
          forum: this.forum.id
        }),
        forum: this.forum
      }))
    },
    storeHomeSession: function () {
      c.sessionstorage && window.sessionStorage.setItem('home.session', JSON.stringify(this.session.user.toJSON()))
    }
  });
  return i
}),
define('core/constants/ratingsConstants', [
  'exports'
], function (a) {
  'use strict';
  a.DEFAULT_RATINGS = {
    average: 0,
    breakdown: {
      1: 0,
      2: 0,
      3: 0,
      4: 0,
      5: 0
    },
    count: 0
  }
});
var _slicedToArray = function () {
  function a(a, b) {
    var c = [
    ],
    d = !0,
    e = !1,
    f = void 0;
    try {
      for (var g, h = a[Symbol.iterator](); !(d = (g = h.next()).done) && (c.push(g.value), !b || c.length !== b); d = !0);
    } catch (i) {
      e = !0,
      f = i
    } finally {
      try {
        !d && h['return'] && h['return']()
      } finally {
        if (e) throw f
      }
    }
    return c
  }
  return function (b, c) {
    if (Array.isArray(b)) return b;
    if (Symbol.iterator in Object(b)) return a(b, c);
    throw new TypeError('Invalid attempt to destructure non-iterable instance')
  }
}();
define('core/templates/react/RatingsScoreTemplate', [
  'react',
  'underscore',
  'core/strings'
], function (a, b, c) {
  'use strict';
  var d = function (b) {
    var c = b.breakdown,
    d = b.totalCount;
    return a.createElement('div', {
      className: 'ratings-breakdown-units align align--stretch'
    }, a.createElement('div', {
      className: 'align__item--flex-1 align align--column'
    }, c.map(function (b, c) {
      var e = b.rating,
      f = b.count,
      g = b.percentage;
      return a.createElement('div', {
        className: 'ratings-breakdown-unit-row align align--middle',
        key: c
      }, a.createElement('div', {
        className: 'ratings-breakdown-text'
      }, e, ' ', a.createElement('div', {
        className: 'rating-star'
      }, '★')), a.createElement('div', {
        className: 'align__item--flex-1 align align--center align--middle'
      }, a.createElement('div', {
        className: 'ratings-breakdown-outer-bar'
      }, a.createElement('div', {
        className: 'ratings-breakdown-inner-bar' + (d && f ? '' : ' no-rating'),
        style: {
          width: g / 2 + 'px'
        }
      }))))
    })), a.createElement('div', {
      className: 'align align--column'
    }, c.map(function (b, c) {
      var d = b.percentage;
      return a.createElement('div', {
        key: c,
        className: 'ratings-breakdown-unit-row ratings-breakdown-percentage align__item--flex-1 align align--center'
      }, a.createElement('div', {
        className: 'align__item--flex-1 text-right'
      }, d, '%'))
    })), a.createElement('div', {
      className: 'align align--column'
    }, c.map(function (b, c) {
      var d = b.count;
      return a.createElement('div', {
        key: c,
        className: 'ratings-breakdown-unit-row ratings-breakdown-percentage align__item--flex-1 align align--center'
      }, a.createElement('div', {
        className: 'align__item--flex-1 text-left'
      }, '(', d, ')'))
    })))
  },
  e = function (e) {
    var f = e.totalCount,
    g = e.average,
    h = e.breakdown,
    i = e.error,
    j = e.expandClass;
    return a.createElement('div', {
      className: 'ratings-score'
    }, a.createElement('div', {
      className: 'spacing-top-small align align--center'
    }, 1 === f ? c.gettext('1 Rating') : c.gettext('%(totalCount)s Ratings', {
      totalCount: f
    })), a.createElement('div', {
      className: 'ratings-items align align--center align--middle',
      tabIndex: '0'
    }, a.createElement('div', {
      className: 'ratings-stars'
    }, a.createElement('div', {
      className: 'stars score-stars',
      style: {
        width: 20 * g + '%'
      }
    }, a.createElement('div', {
      className: 'rating-star'
    }, '★'), a.createElement('div', {
      className: 'rating-star'
    }, '★'), a.createElement('div', {
      className: 'rating-star'
    }, '★'), a.createElement('div', {
      className: 'rating-star'
    }, '★'), a.createElement('div', {
      className: 'rating-star'
    }, '★')), a.createElement('div', {
      className: 'stars base-stars'
    }, a.createElement('div', {
      className: 'rating-star'
    }, '★'), a.createElement('div', {
      className: 'rating-star'
    }, '★'), a.createElement('div', {
      className: 'rating-star'
    }, '★'), a.createElement('div', {
      className: 'rating-star'
    }, '★'), a.createElement('div', {
      className: 'rating-star'
    }, '★'))), a.createElement('div', {
      className: 'ratings-average'
    }, (Math.round(10 * g) / 10).toFixed(1), a.createElement('div', {
      className: 'ratings-breakdown ' + j
    }, a.createElement('div', {
      className: 'ratings-breakdown-notch-border'
    }), a.createElement('div', {
      className: 'ratings-breakdown-notch'
    }), a.createElement(d, {
      breakdown: b.sortBy(b.mapObject(h, function (a, b) {
        return [Number(b),
        a]
      }), function (a) {
        return - a[0]
      }).map(function (a) {
        var b = _slicedToArray(a, 2),
        c = b[0],
        d = b[1];
        return {
          rating: c,
          count: d,
          percentage: f && d ? (100 * d / f).toFixed() : 0
        }
      }),
      totalCount: f
    })))), a.createElement('div', {
      className: 'err text-semibold'
    }, i || ''))
  };
  return e
});
var _extends = Object.assign || function (a) {
  for (var b = 1; b < arguments.length; b++) {
    var c = arguments[b];
    for (var d in c) Object.prototype.hasOwnProperty.call(c, d) && (a[d] = c[d])
  }
  return a
};
define('lounge/views/ratings', [
  'underscore',
  'backbone',
  'react',
  'react-dom',
  'core/constants/ratingsConstants',
  'core/utils/threadRatingsHelpers',
  'core/templates/react/RatingsScoreTemplate'
], function (a, b, c, d, e, f, g) {
  'use strict';
  var h = b.View.extend({
    initialize: function (a) {
      this.session = a.session,
      this.thread = a.thread,
      this.error = null,
      this.listenTo(this.thread, 'change:ratingsEnabled change:ratings', this.render),
      this.thread.forum.get('features') || this.listenToOnce(this.thread.forum, 'change:features', this.render)
    },
    setError: function () {
      var b = this;
      this.error = 'You must be logged in to rate this page',
      this.render(),
      setTimeout(a.bind(function () {
        b.error = null,
        b.render()
      }, this), 5000)
    },
    render: function () {
      if (f.isThreadModelRatingsEnabled(this.thread)) {
        var a = this.thread.get('ratings') || e.DEFAULT_RATINGS;
        d.render(c.createElement(g, _extends({
        }, a, {
          totalCount: a.count || 0,
          error: this.error,
          expandClass: 'expand-below'
        })), this.el)
      } else this.$el.empty();
      return this
    }
  });
  return h
}),
define('core/utils/reactions', [
  'jquery',
  'underscore',
  'core/switches'
], function (a, b, c) {
  'use strict';
  var d = function (b) {
    for (var d, e = c.isFeatureActive('embed_refresh', {
      forum: b
    }), f = e && c.isFeatureActive('embed_refresh_v2', {
      forum: b
    }), g = 24, h = a('#reactions').width(), i = a('.reaction-item').map(function (b, c) {
      return e ? Math.ceil(a(c) [0].getBoundingClientRect().width) : a(c).width()
    }).get(), j = 0, k = [
    ]; !d && j < a('.reaction-item').length; ) {
      j += 1,
      d = !0;
      var l = Math.ceil(i.length / j);
      k = [
      ];
      for (var m = 0; m < j; m++) {
        var n = i.slice(l * m, l * (m + 1)),
        o = (n.length - 1) * g,
        p = n.reduce(function (a, b) {
          return a + b
        }, 0) + (e && !f ? o : 0);
        if (p >= h) {
          d = !1;
          break
        }
        k.push(p)
      }
    }
    if (e) {
      var q = 16;
      a('.reaction-tooltip').each(function (b, c) {
        a(c).height() > q && (c.style.top = '-68px')
      })
    }
    a('.reaction-items__container').width(Math.max.apply(null, k) + 1)
  },
  e = function (b) {
    var c = a('.reaction-items').width();
    c !== b._lastReactionsWidth && (b._lastReactionsWidth = c, d(b.forum))
  },
  f = function (c) {
    c._lastReactionsWidth = a('.reaction-items').width();
    var d = 200;
    c._reactionsResizeListener = b.debounce(b.partial(e, c), d),
    a(window).resize(c._reactionsResizeListener)
  },
  g = function (b) {
    b._reactionsResizeListener && a(window).off('resize', b._reactionsResizeListener)
  };
  return {
    attachReactionsListener: f,
    formatReactionsItems: d,
    detachReactionsListener: g
  }
}),
define('core/constants/reactionConstants', [
  'exports',
  'core/strings'
], function (a, b) {
  'use strict';
  var c = b.get,
  d = '//c.disquscdn.com/next/current/publisher-admin/assets/img/emoji/';
  a.DEFAULT_REACTIONS = [
    {
      text: 'Upvote',
      imageUrl: d + 'upvote-512x512.png'
    },
    {
      text: 'Funny',
      imageUrl: d + 'funny-512x512.png'
    },
    {
      text: 'Love',
      imageUrl: d + 'love-512x512.png'
    },
    {
      text: 'Surprised',
      imageUrl: d + 'surprised-512x512.png'
    },
    {
      text: 'Angry',
      imageUrl: d + 'angry-512x512.png'
    },
    {
      text: 'Sad',
      imageUrl: d + 'sad-512x512.png'
    }
  ],
  a.DEFAULT_PROMPT = c('What do you think?'),
  a.DEFAULT_DESCRIPTIONS = [
    'Upvote',
    'Funny',
    'Love',
    'Surprised',
    'Angry',
    'Sad'
  ],
  a.UPLOAD_IMAGE_ERROR_MESSAGES = {
    'invalid-image-file': 'Unfortunately your image upload failed. Please verify that the file is valid and in a supported format (JPEG, PNG, or GIF).',
    'invalid-content-type': 'Unfortunately your image upload failed. Please verify that the file is in a supported format (JPEG, PNG, or GIF).',
    'file-too-large': 'Unfortunately your image upload failed. Please verify that your image is under 5MB.',
    'not-authenticated': 'You must be logged in to upload an image.',
    'default': 'Unfortunately your image upload failed. Please verify that your image is in a supported format (JPEG, PNG, or GIF) and under 5MB. If you continue seeing this error, please try again later.'
  }
});
var _extends = Object.assign || function (a) {
  for (var b = 1; b < arguments.length; b++) {
    var c = arguments[b];
    for (var d in c) Object.prototype.hasOwnProperty.call(c, d) && (a[d] = c[d])
  }
  return a
};
define('core/templates/react/ReactionItemsPartial', [
  'react',
  'core/constants/reactionConstants'
], function (a, b) {
  'use strict';
  var c = function (c) {
    var d = c.reactionsList,
    e = c.onSubmitReaction,
    f = c.showVoteCount,
    g = c.readonly,
    h = c.isRefreshEnabled,
    i = c.isRefreshV2Enabled,
    j = h ? 'reaction-items__container--refresh' : '',
    k = h ? 'reaction-item reaction-item--refresh' : 'reaction-item align align--column align--middle spacing-bottom-narrow',
    l = h ? 'reaction-item__button reaction-item__button--refresh' : 'align align--middle align--column reaction-item__button',
    m = h ? 'reaction-item__votes reaction-item__votes--refresh' : 'reaction-item__votes',
    n = h ? 'reaction-item__votes-wrapper reaction-item__votes-wrapper--refresh' : 'reaction-item__votes-wrapper',
    o = h ? 'reaction-item__image-wrapper reaction-item__image-wrapper--refresh' : 'reaction-item__image-wrapper',
    p = h ? 'reaction-item__image reaction-item__image--refresh' : 'reaction-item__image',
    q = 'reaction-vote',
    r = function (a, b) {
      e && !g && e(a, b)
    },
    s = function (a, b, c) {
      var d = 13;
      a.keyCode === d && r(b, c)
    },
    t = d.map(function (a) {
      if (!a.imageUrl) return a;
      var c = a.imageUrl.split('/'),
      d = b.DEFAULT_REACTIONS.filter(function (a) {
        var b = a.imageUrl.split('/');
        return b[b.length - 1].split('-') [0].split('.') [0] === c[c.length - 1].split('-') [0].split('.') [0]
      }),
      e = (d.length ? d[0] : a).imageUrl;
      return _extends({
      }, a, {
        imageUrl: e
      })
    }),
    u = function (a) {
      if (a > 999) {
        var b = a.toString();
        return a < 9999 ? b[0] + '.' + b[1] + 'k' : a < 99999 ? b.slice(0, 2) + '.' + b[2] + 'k' : a < 999999 ? b.slice(0, 3) + '.' + b[3] + 'k' : b[0] + '.' + b[1] + 'm'
      }
      return a
    },
    v = function (a) {
      return (!h || i) && a.text && a.text.trim()
    };
    return a.createElement('div', {
      className: 'align align--center align--wrap reaction-items__container ' + j
    }, t.map(function (b, c) {
      return a.createElement('div', {
        key: c,
        className: [
          k,
          e ? 'reaction-item__enabled' : 'reaction-item__disabled',
          b.isSelected ? 'reaction-item__selected' : ''
        ].join(' ').trim()
      }, a.createElement('div', {
        className: l,
        tabIndex: g ? '-1' : '0',
        onKeyPress: function (a) {
          return s(a, c, b)
        },
        onClick: function () {
          return r(c, b)
        }
      }, a.createElement('div', {
        className: o
      }, b.imageUrl ? a.createElement('img', {
        className: p,
        src: b.imageUrl,
        title: b.text || 'reaction ' + c,
        alt: b.text || 'reaction ' + c
      }) : null, !i && f ? a.createElement('div', {
        className: n
      }, void 0 !== b.votes && f ? a.createElement('div', {
        className: m
      }, b.votes || 0) : a.createElement('div', {
        className: m
      }, ' ')) : null), i ? a.createElement('div', {
        className: q
      }, f ? a.createElement('div', {
        className: n
      }, void 0 !== b.votes && f ? a.createElement('div', {
        className: m
      }, u(b.votes) || 0) : a.createElement('div', {
        className: m
      }, ' ')) : null) : null, v(b) ? a.createElement('div', {
        className: 'reaction-item__text'
      }, b.text) : null), h && !i ? a.createElement('div', {
        className: 'reaction-tooltip'
      }, a.createElement('span', {
        className: 'reaction-tooltip__text'
      }, b.text), a.createElement('div', {
        className: 'reaction-tooltip__triangle'
      }, a.createElement('div', {
        className: 'reaction-tooltip__inner-triangle'
      }))) : null)
    }))
  };
  return c
}),
define('core/templates/react/ReactionsTemplate', [
  'react',
  'core/strings',
  'core/templates/react/ReactionItemsPartial',
  'core/constants/reactionConstants',
  'core/switches'
], function (a, b, c, d, e) {
  'use strict';
  var f = function (f) {
    var g = f.reactionsList,
    h = f.prompt,
    i = f.onSubmitReaction,
    j = f.error,
    k = f.readonly,
    l = f.userCanModerate,
    m = f.forum,
    n = e.isFeatureActive('embed_refresh', {
      forum: m
    }),
    o = n && e.isFeatureActive('embed_refresh_v2', {
      forum: m
    }),
    p = n ? 'reactions-refresh' : '',
    q = g.reduce(function (a, b) {
      return a + ('number' == typeof b.votes ? b.votes : 0)
    }, 0),
    r = g.some(function (a) {
      return a.isSelected
    });
    return a.createElement('div', {
      id: 'reactions',
      className: p
    }, a.createElement('div', {
      className: 'text-bold align align--center spacing-bottom-small prompt'
    }, h && h.trim() || d.DEFAULT_PROMPT), a.createElement('div', {
      className: 'align align--center spacing-bottom'
    }, 1 === q ? b.gettext('1 Response') : b.gettext('%(voteCount)s Responses', {
      voteCount: q
    })), a.createElement('div', {
      className: [
        'reaction-items',
        k ? 'readonly' : '',
        r ? 'has-selection' : '',
        l || r || k ? 'counts-visible' : ''
      ].join(' ').trim()
    }, a.createElement(c, {
      reactionsList: g,
      onSubmitReaction: i,
      showVoteCount: l || r || k,
      readonly: k,
      isRefreshEnabled: n,
      isRefreshV2Enabled: o
    })), a.createElement('div', {
      className: 'err text-semibold'
    }, j || ''))
  };
  return f
}),
define('lounge/views/reactions', [
  'backbone',
  'react',
  'react-dom',
  'core/bus',
  'core/utils/reactions',
  'core/switches',
  'core/templates/react/ReactionsTemplate'
], function (a, b, c, d, e, f, g) {
  'use strict';
  var h = a.View.extend({
    initialize: function (a) {
      this.reactions = a.reactions,
      this.readonly = a.readonly,
      this.session = a.session,
      this.forum = a.forum,
      this.userCanModerate = this.session.get('canModerate'),
      this.isRefreshEnabled = f.isFeatureActive('embed_refresh', {
        forum: this.forum
      }),
      this.listenTo(this.reactions, 'sync', this.render),
      this.listenTo(this.reactions, 'vote:start', this.handleSubmitStart),
      this.listenTo(this.reactions, 'vote:end', this.handleSubmitEnd),
      this.listenTo(this.session, 'change:canModerate', this.handleCanModerateChange),
      e.attachReactionsListener(this)
    },
    handleSubmitStart: function () {
      this.isSubmitting = !0,
      this.$('.reaction-items').addClass('is-submitting'),
      this.$('.err').html()
    },
    handleSubmitEnd: function () {
      this.isSubmitting = !1,
      this.$('.reaction-items').removeClass('is-submitting')
    },
    handleCanModerateChange: function () {
      this.userCanModerate = this.session.get('canModerate'),
      this.render()
    },
    vote: function (a) {
      if (!this.isSubmitting && !this.readonly) {
        var b = this;
        this.reactions.vote(a, {
          success: this.render.bind(this),
          error: function () {
            b.$('.err').html('An error has occurred while saving your reaction. Please try again later.')
          }
        }),
        d.trigger('uiAction:reactionsVote', this.reactions.at(a))
      }
    },
    render: function () {
      return this.reactions.length ? (c.render(b.createElement(g, {
        reactionsList: this.reactions.toJSON(),
        prompt: this.reactions.prompt,
        onSubmitReaction: this.vote.bind(this),
        readonly: this.readonly,
        userCanModerate: this.userCanModerate,
        forum: this.forum
      }), this.el), this.isRefreshEnabled && e.formatReactionsItems(this.forum)) : this.$el.html(''),
      this
    }
  });
  return h
}),
define('templates/lounge/reactionsPromotion', [
  'react',
  'core/strings',
  'core/templates/react/ReactionItemsPartial',
  'core/constants/reactionConstants'
], function (a, b, c, d) {
  'use strict';
  var e = b.gettext,
  f = function (b) {
    var f = b.onConfirm,
    g = b.onDefer,
    h = b.forumShortname;
    return a.createElement('div', {
      id: 'reactions-promotion'
    }, a.createElement('div', {
      className: 'striped-bar'
    }), a.createElement('div', {
      className: 'align align--center private'
    }, a.createElement('span', {
      className: 'icon icon-lock'
    }), e('Only you can see this')), a.createElement('div', {
      className: 'promotion-title text-bold align align--center spacing-top-narrow spacing-bottom'
    }, e('Want to increase engagement? Add Reactions to your articles.')), a.createElement('div', {
      className: 'reaction-items'
    }, a.createElement(c, {
      reactionsList: d.DEFAULT_REACTIONS,
      readonly: !0
    })), a.createElement('div', {
      className: 'align align--center'
    }, a.createElement('button', {
      className: 'btn btn-info',
      onClick: g
    }, e('Maybe later')), a.createElement('a', {
      className: 'btn btn-primary spacing-left',
      onClick: f,
      target: '_blank',
      rel: 'noopener noreferrer',
      href: 'https://' + h + '.disqus.com/admin/settings/reactions/'
    }, 'Enable Reactions')))
  };
  return f
}),
define('lounge/views/reactions-promotion', [
  'backbone',
  'stance',
  'react',
  'react-dom',
  'core/api',
  'lounge/common',
  'templates/lounge/reactionsPromotion'
], function (a, b, c, d, e, f, g) {
  'use strict';
  var h = a.View.extend({
    initialize: function (a) {
      this.forum = a.forum,
      this.listenToOnce(b(this), 'visible', this.trackView)
    },
    onConfirm: function () {
      f.getLounge().trigger('uiAction:reactionsEnable'),
      this.onDismiss()
    },
    onDefer: function () {
      f.getLounge().trigger('uiAction:reactionsDefer'),
      this.onDismiss()
    },
    onDismiss: function () {
      this.dismissed = !0,
      this.render(),
      e.call('announcements/messages/view', {
        method: 'POST',
        data: {
          message: 'reactionsEmbedPromotion'
        }
      })
    },
    trackView: function () {
      f.getLounge().trigger('uiAction:viewReactionsPromotion')
    },
    render: function () {
      return this.dismissed ? this.$el.html('') : d.render(c.createElement(g, {
        onDefer: this.onDefer.bind(this),
        onConfirm: this.onConfirm.bind(this),
        forumShortname: this.forum.id
      }), this.el),
      this
    }
  });
  return h
}),
define('templates/lounge/partials/postCount', [
  'react',
  'core/strings'
], function (a, b) {
  'use strict';
  var c = b.gettext,
  d = function (b) {
    return a.createElement('a', {
      className: 'publisher-nav-color'
    }, a.createElement('span', {
      className: 'comment-count'
    }, 1 === b.count ? c('1 comment') : c('%(numPosts)s comments', {
      numPosts: b.count
    })))
  };
  return d
}),
define('templates/lounge/partials/topNavigation', [
  'react',
  'core/utils/object/get',
  'templates/lounge/partials/postCount',
  'core/switches'
], function (a, b, c, d) {
  'use strict';
  var e = function (e) {
    var f = d.isFeatureActive('embed_refresh', {
      forum: e.thread.attributes.forum
    }),
    g = f ? 'nav-primary nav-primary--refresh' : 'nav-primary',
    h = f ? 'tab-conversation tab-conversation--refresh' : 'tab-conversation';
    return a.createElement('nav', {
      className: 'nav ' + g
    }, a.createElement('ul', null, a.createElement('li', {
      className: 'nav-tab nav-tab--primary ' + h + ' active',
      'data-role': 'post-count'
    }, e.inHome ? null : a.createElement(c, {
      count: b(e.thread, [
        'attributes',
        'posts'
      ], null)
    })), a.createElement('li', {
      className: 'nav-tab nav-tab--primary tab-user'
    }, a.createElement('ul', null, a.createElement('li', {
      className: 'nav-tab nav-tab--primary notification-menu',
      'data-role': 'notification-menu'
    }), a.createElement('li', {
      className: 'nav-tab nav-tab--primary dropdown user-menu',
      'data-role': 'logout'
    })))))
  };
  return e
}),
define('lounge/views/top-navigation', [
  'backbone',
  'templates/lounge/partials/topNavigation'
], function (a, b) {
  'use strict';
  var c = a.View.extend({
    initialize: function (a) {
      this.inHome = a.inHome,
      this.thread = a.thread
    },
    render: function () {
      return this.$el.html(b({
        inHome: this.inHome,
        thread: this.thread
      })),
      this
    }
  });
  return c
}),
define('templates/lounge/partials/threadFooter', [
  'react',
  'core/strings',
  'core/switches',
  'core/utils/object/get'
], function (a, b, c, d) {
  'use strict';
  var e = b.gettext,
  f = function (b) {
    var f = c.isFeatureActive('embed_refresh', {
      forum: b.forum.id
    }),
    g = f ? 'disqus-footer__link disqus-footer__link--refresh' : 'disqus-footer__link',
    h = f ? 'disqus-footer__item disqus-footer__item--refresh' : 'disqus-footer__item',
    i = f ? 'text-item' : 'clip',
    j = f ? 'disqus-footer disqus-footer--refresh' : 'disqus-footer';
    return a.createElement('div', {
      className: j
    }, a.createElement('ul', {
      className: 'disqus-footer__list'
    }, c.isFeatureActive('sso_less_branding', {
      forum: b.forum.id
    }) ? null : a.createElement('li', {
      id: 'thread-subscribe-button',
      className: 'email ' + h
    }, a.createElement('div', {
      className: 'default'
    }, a.createElement('a', {
      href: '#',
      rel: 'nofollow',
      'data-action': 'subscribe',
      title: e('Subscribe and get email updates from this discussion'),
      className: g
    }, f ? a.createElement('div', {
      className: 'icon-wrapper'
    }, a.createElement('i', {
      'aria-hidden': 'true',
      className: 'icon-subscribe-refresh'
    })) : a.createElement('i', {
      'aria-hidden': 'true',
      className: 'icon icon-mail'
    }), a.createElement('i', {
      'aria-hidden': 'true',
      className: 'icon icon-checkmark'
    }), a.createElement('span', {
      id: 'thread-subscribe-text-default',
      className: i
    }, e('Subscribe')), a.createElement('span', {
      id: 'thread-subscribe-text-subscribed',
      className: i
    }, e('Subscribed'))))), c.isFeatureActive('removePrivacyPolicy', {
      forum: b.forum.id
    }) ? null : a.createElement('li', {
      className: 'privacy ' + h
    }, a.createElement('a', {
      href: 'https://disqus.com/privacy-policy',
      rel: 'nofollow noopener noreferrer',
      target: '_blank',
      className: g,
      title: 'Privacy'
    }, f ? a.createElement('div', {
      className: 'icon-wrapper'
    }, a.createElement('i', {
      'aria-hidden': 'true',
      className: 'icon-privacy-refresh'
    })) : a.createElement('i', {
      'aria-hidden': 'true',
      className: 'icon icon-lock'
    }), a.createElement('span', {
      className: i
    }, e('Privacy')))), c.isFeatureActive('removePrivacyPolicy', {
      forum: b.forum.id
    }) ? '' : a.createElement('li', {
      className: 'do-not-sell ' + h
    }, a.createElement('a', {
      href: 'https://disqus.com/data-sharing-settings/',
      rel: 'nofollow noopener noreferrer',
      target: '_blank',
      className: g
    }, f ? a.createElement('div', {
      className: 'icon-wrapper'
    }, a.createElement('i', {
      'aria-hidden': 'true',
      className: 'icon-warning-refresh'
    })) : a.createElement('i', {
      'aria-hidden': 'true',
      className: 'icon icon-warning'
    }), a.createElement('span', {
      className: i
    }, e('Do Not Sell My Data'))))), d(b.forum, [
      'attributes',
      'disableDisqusBranding'
    ], null) ? null : a.createElement('span', {
      className: 'disqus-footer__logo'
    }, a.createElement('a', {
      href: 'https://disqus.com',
      rel: 'nofollow',
      title: e('Powered by Disqus'),
      className: g
    }, e('Powered by Disqus'))))
  };
  return f
}),
define('lounge/views/thread-footer', [
  'backbone',
  'templates/lounge/partials/threadFooter'
], function (a, b) {
  'use strict';
  var c = a.View.extend({
    initialize: function (a) {
      this.forum = a.forum
    },
    render: function () {
      return this.$el.html(b({
        forum: this.forum
      })),
      this
    }
  });
  return c
}),
define('templates/lounge/partials/postSort', [
  'react',
  'core/strings',
  'core/switches'
], function (a, b, c) {
  'use strict';
  var d = b.gettext,
  e = function (b) {
    var e = b.votingDisabled && 'popular' === b.order ? 'desc' : b.order,
    f = c.isFeatureActive('embed_refresh', {
      forum: b.forum
    }),
    g = f ? '' : 'nav-tab nav-tab--secondary dropdown sorting pull-left spacing-right-large',
    h = f ? 'sort-menu-refresh' : 'dropdown-menu',
    i = f ? 'sort-menu-refresh__item' : '';
    return a.createElement('li', {
      'data-role': 'post-sort',
      className: g
    }, f ? null : a.createElement('a', {
      href: '#',
      className: 'dropdown-toggle',
      'data-toggle': 'dropdown'
    }, 'popular' === e ? d('Sort by Best') : null, 'desc' === e ? d('Sort by Newest') : null, 'asc' === e ? d('Sort by Oldest') : null, a.createElement('span', {
      className: 'caret'
    })), a.createElement('ul', {
      className: h
    }, a.createElement('li', {
      className: i + ' ' + ('popular' === e ? 'selected' : '')
    }, b.votingDisabled ? null : a.createElement('a', {
      href: '#',
      'data-action': 'sort',
      'data-sort': 'popular'
    }, d('Best'), f ? null : a.createElement('i', {
      'aria-hidden': 'true',
      className: 'icon-checkmark'
    }))), a.createElement('li', {
      className: i + ' ' + ('desc' === e ? 'selected' : '')
    }, a.createElement('a', {
      href: '#',
      'data-action': 'sort',
      'data-sort': 'desc'
    }, d('Newest'), f ? null : a.createElement('i', {
      'aria-hidden': 'true',
      className: 'icon-checkmark'
    }))), a.createElement('li', {
      className: i + ' ' + ('asc' === e ? 'selected' : '')
    }, a.createElement('a', {
      href: '#',
      'data-action': 'sort',
      'data-sort': 'asc'
    }, d('Oldest'), f ? null : a.createElement('i', {
      'aria-hidden': 'true',
      className: 'icon-checkmark'
    })))))
  };
  return e
}),
define('templates/lounge/partials/secondaryNavigation', [
  'react',
  'templates/lounge/partials/postSort',
  'core/switches'
], function (a, b, c) {
  'use strict';
  var d = function (d) {
    var e = d.forum,
    f = c.isFeatureActive('embed_refresh', {
      forum: e
    }),
    g = f ? 'nav-secondary-refresh__list' : '',
    h = d.inHome ? null : a.createElement(b, {
      order: d.order,
      votingDisabled: d.votingDisabled,
      forum: e
    }),
    i = a.createElement('li', {
      id: 'thread-share-bar',
      className: 'nav-tab nav-tab--secondary share-bar pull-left'
    }),
    j = a.createElement('li', {
      id: 'favorite-button',
      className: 'nav-tab nav-tab--secondary favorite dropdown pull-left',
      'aria-label': 'Favorite this discussion'
    }),
    k = a.createElement('li', {
      className: 'nav-secondary-refresh__list-item'
    }, a.createElement('div', {
      id: 'favorite-button'
    }), a.createElement('div', {
      id: 'thread-share-bar',
      className: 'share-bar-refresh'
    })),
    l = f ? [
      k,
      h
    ] : [
      h,
      j,
      i
    ];
    return a.createElement('ul', {
      className: g
    }, l)
  };
  return d
}),
define('lounge/views/secondary-navigation', [
  'backbone',
  'core/utils/storage',
  'core/switches',
  'templates/lounge/partials/secondaryNavigation'
], function (a, b, c, d) {
  'use strict';
  var e = a.View.extend({
    attributes: {
      'data-tracking-area': 'secondary-nav'
    },
    initialize: function (a) {
      this.inHome = a.inHome,
      this.order = a.order,
      this.votingDisabled = a.votingDisabled,
      this.forum = a.forum,
      this.isRefreshEnabled = c.isFeatureActive('embed_refresh', {
        forum: this.forum
      }),
      this.$el.addClass(this.isRefreshEnabled ? 'nav-secondary-refresh' : 'nav nav-secondary')
    },
    render: function () {
      return this.$el.html(d({
        inHome: this.inHome,
        order: this.order,
        votingDisabled: this.votingDisabled,
        forum: this.forum
      })),
      this
    }
  });
  return e
}),
define('templates/lounge/userMenu', [
  'react',
  'core/config/urls',
  'core/strings',
  'core/switches',
  'core/utils/object/get',
  'core/utils/threadRatingsHelpers',
  'core/utils/storage',
  'templates/lounge/partials/profileLink'
], function (a, b, c, d, e, f, g, h) {
  'use strict';
  var i = c.gettext,
  j = function (c) {
    var j = d.isFeatureActive('embed_refresh', {
      forum: c.forum.id
    }),
    k = d.isFeatureActive('embed_refresh_v2', {
      forum: c.forum.id
    }),
    l = j ? 'username username--refresh' : 'username',
    m = j ? 'avatar avatar--refresh' : 'avatar',
    n = j ? 'dropdown-toggle dropdown-toggle--refresh' : 'dropdown-toggle',
    o = j ? 'dropdown-menu dropdown-menu--refresh' : 'dropdown-menu',
    p = j ? 'caret caret--refresh' : 'caret',
    q = i(null === g.get('switch:embed_refresh') || g.get('switch:embed_refresh') === !0 ? 'Classic Disqus' : 'New Disqus');
    return [!e(c.user, [
      'thread',
      'canReply'
    ]) || !e(c.user, [
      'thread',
      'canModerate'
    ]) && d.isFeatureActive('sso_less_branding', {
      forum: c.thread.forum
    }) ? null : a.createElement('a', {
      key: 'user-menu-dropdown',
      href: '#',
      className: n,
      'data-toggle': 'dropdown',
      role: 'menuitem',
      name: e(c.user, [
        'isRegistered'
      ]) ? 'User Menu' : i('Login')
    }, a.createElement('span', {
      className: 'dropdown-toggle-wrapper'
    }, e(c.user, [
      'isRegistered'
    ]) ? a.createElement('span', null, a.createElement('span', {
      className: m
    }, a.createElement('img', {
      'data-role': 'user-avatar',
      'data-user': e(c.user, [
        'id'
      ], ''),
      'data-src': e(c.user, [
        'avatar',
        'cache'
      ], ''),
      alt: i('Avatar')
    })), a.createElement('span', {
      className: l,
      'data-role': 'username',
      'data-username': e(c.user, [
        'username'
      ], '')
    }, e(c.user, [
      'name'
    ]) || e(c.user, [
      'username'
    ]) || null)) : a.createElement('span', {
      className: l
    }, i('Login')), ' '), ' ', a.createElement('span', {
      className: p
    })),
    a.createElement('ul', {
      key: 'user-menu-menu',
      className: o
    }, e(c.user, [
      'isRegistered'
    ]) ? [
      e(c.user, [
        'thread',
        'canModerate'
      ]) && d.isFeatureActive('sso_less_branding', {
        forum: c.thread.forum
      }) ? null : a.createElement('li', {
        key: 'menu-profile'
      }, a.createElement(h, {
        user: c.user,
        forum: c.forum
      }, i('Your Profile'))),
      d.isFeatureActive('sso_less_branding', {
        forum: c.thread.forum
      }) || e(c.forum, [
        'disableDisqusBranding'
      ], null) ? null : a.createElement('li', {
        key: 'menu-channels'
      }, a.createElement('a', {
        href: '/channels/',
        target: '_blank',
        rel: 'noopener noreferrer'
      }, i('Channels'))),
      j && k && !c.isInHome && !d.isFeatureActive('sso_less_branding', {
        forum: c.thread.forum
      }) ? a.createElement('li', {
        key: 'menu-community'
      }, a.createElement('a', {
        href: e(c.forum, [
          'homeUrl'
        ], ''),
        'data-action': 'community-sidebar',
        'data-forum': e(c.forum, [
          'id'
        ], ''),
        id: 'community-tab',
        name: e(c.forum, [
          'name'
        ], null)
      }, i('Community'))) : null,
      a.createElement('li', {
        key: 'menu-media'
      }, a.createElement('a', {
        href: '#',
        className: 'media-toggle-on',
        'data-action': 'toggle-media'
      }, i('Display Media')), a.createElement('a', {
        href: '#',
        className: 'media-toggle-off',
        'data-action': 'toggle-media'
      }, i('Hide Media'))),
      e(c.user, [
        'remote'
      ]) ? null : a.createElement('li', {
        key: 'menu-settings'
      }, a.createElement('a', {
        href: e(b, [
          'editProfile'
        ], '')
      }, i('Edit Settings')))
    ] : [
      e(c.sso, [
        'url'
      ]) ? a.createElement('li', {
        key: 'menu-auth-sso',
        className: 'sso'
      }, a.createElement('a', {
        href: '#',
        'data-action': 'auth:sso'
      }, e(c.sso, [
        'name'
      ], null))) : null,
      a.createElement('li', {
        key: 'menu-auth-disqus'
      }, a.createElement('a', {
        href: '#',
        'data-action': 'auth:disqus'
      }, 'Disqus')),
      a.createElement('li', {
        key: 'menu-auth-facebook'
      }, a.createElement('a', {
        href: '#',
        'data-action': 'auth:facebook'
      }, 'Facebook')),
      a.createElement('li', {
        key: 'menu-auth-twitter'
      }, a.createElement('a', {
        href: '#',
        'data-action': 'auth:twitter'
      }, 'X (Twitter)')),
      a.createElement('li', {
        key: 'menu-auth-google'
      }, a.createElement('a', {
        href: '#',
        'data-action': 'auth:google'
      }, 'Google')),
      a.createElement('li', {
        key: 'menu-auth-microsoft'
      }, a.createElement('a', {
        href: '#',
        'data-action': 'auth:microsoft'
      }, 'Microsoft')),
      a.createElement('li', {
        key: 'menu-auth-apple'
      }, a.createElement('a', {
        href: '#',
        'data-action': 'auth:apple'
      }, 'Apple'))
    ], e(c.user, [
      'thread',
      'canModerate'
    ]) ? [
      c.forum.settings.validateAllPosts ? null : a.createElement('li', {
        key: 'menu-toggle-thread-premoderate'
      }, a.createElement('a', {
        href: '#',
        'data-action': 'toggle-thread-premoderate'
      }, i(c.thread.validateAllPosts ? 'Don\'t Premoderate Thread' : 'Premoderate Thread'))),
      a.createElement('li', {
        key: 'menu-toggle-thread'
      }, a.createElement('a', {
        href: '#',
        'data-action': 'toggle-thread'
      }, i(e(c.thread, [
        'isClosed'
      ]) ? 'Open Thread' : 'Close Thread'))),
      e(c.forum, [
        'settings',
        'threadReactionsEnabled'
      ]) && e(c.user, [
        'thread',
        'canModerate'
      ]) && c.thread.reactions.eligible ? a.createElement('li', {
        key: 'menu-toggle-reactions'
      }, a.createElement('a', {
        href: '#',
        'data-action': 'toggle-reactions'
      }, i(c.thread.reactions && c.thread.reactions.enabled ? 'Remove Reactions' : 'Restore Reactions'))) : null,
      f.isForumRatingsEnabled(c.forum) ? a.createElement('li', {
        key: 'menu-toggle-thread-ratings'
      }, a.createElement('a', {
        href: '#',
        'data-action': 'toggle-thread-ratings'
      }, i(c.thread.ratingsEnabled ? 'Disable Ratings' : 'Enable Ratings'))) : null,
      e(c.user, [
        'isGlobalAdmin'
      ]) ? null : a.createElement('li', {
        key: 'menu-help'
      }, a.createElement('a', {
        href: 'https://help.disqus.com/customer/portal/articles/2538045-commenter-launch-pad'
      }, i('Help')))
    ] : null, e(c.user, [
      'isGlobalAdmin'
    ]) ? [
      a.createElement('li', {
        key: 'menu-debug'
      }, a.createElement('a', {
        href: '#',
        'data-action': 'debug'
      }, i('Debug'))),
      a.createElement('li', {
        key: 'menu-repair'
      }, a.createElement('a', {
        href: '#',
        'data-action': 'repair'
      }, i('Repair')))
    ] : null, e(c.user, [
      'isRegistered'
    ]) && e(c.user, [
      'thread',
      'canReply'
    ]) ? [
      a.createElement('li', {
        key: 'menu-toggle-embed-refresh'
      }, d.isFeatureActive('toggle_embed_refresh') && !d.isFeatureActive('sso_less_branding', {
        forum: c.thread.forum
      }) ? a.createElement('a', {
        href: '#',
        'data-action': 'toggle-embed-refresh'
      }, q) : null),
      a.createElement('li', {
        key: 'menu-logout'
      }, a.createElement('a', {
        href: '#',
        'data-action': 'logout'
      }, i('Logout')))
    ] : null)]
  };
  return j
}),
define('templates/lounge/threadShareBar', [
  'react',
  'core/strings',
  'core/switches'
], function (a, b, c) {
  'use strict';
  var d = b.gettext,
  e = function (b) {
    var e = b.forum,
    f = c.isFeatureActive('embed_refresh', {
      forum: e
    }),
    g = f && c.isFeatureActive('embed_refresh_v2', {
      forum: e
    }),
    h = f ? 'thread-share-bar-buttons-refresh' : 'thread-share-bar-buttons dropdown',
    i = f ? 'share-dropdown-refresh' : 'dropdown-menu pull-right',
    j = f ? 'share-button-toggle' : 'dropdown-toggle icon icon-share',
    k = f ? 'share-dropdown-refresh__item' : 'thread-share__item';
    return a.createElement('div', {
      className: 'thread-share-wrapper'
    }, f ? a.createElement('div', {
      className: 'round-delimiter'
    }) : null, a.createElement('span', {
      'data-role': 'thread-share',
      className: h
    }, a.createElement('a', {
      href: '#',
      className: j + ' ' + (g ? j + '--v2' : ''),
      'data-toggle': 'dropdown',
      'aria-label': d('Share')
    }, f ? d('Share') : ''), a.createElement('ul', {
      className: i
    }, f ? null : a.createElement('div', {
      className: 'thread-share__text'
    }, 'Share this discussion'), a.createElement('li', {
      className: k
    }, f ? a.createElement('div', {
      className: 'share-icons-wrapper share-icons-wrapper--twitter',
      'data-action': 'share:twitter'
    }, a.createElement('span', {
      className: 'icon-twitter-x',
      'aria-hidden': 'true'
    }), a.createElement('span', {
      className: 'visually-hidden'
    }, d('Tweet this discussion'))) : a.createElement('span', {
      className: 'share-twitter',
      'data-action': 'share:twitter',
      tabIndex: '0'
    }, a.createElement('span', {
      className: 'icon-twitter-circle',
      'aria-hidden': 'true'
    }), a.createElement('span', {
      className: 'visually-hidden'
    }, d('Tweet this discussion')))), a.createElement('li', {
      className: k
    }, f ? a.createElement('div', {
      className: 'share-icons-wrapper share-icons-wrapper--facebook',
      'data-action': 'share:facebook'
    }, a.createElement('span', {
      className: 'icon-facebook',
      'aria-hidden': 'true'
    }), a.createElement('span', {
      className: 'visually-hidden'
    }, d('Share this discussion on Facebook'))) : a.createElement('span', {
      className: 'share-facebook',
      'data-action': 'share:facebook',
      tabIndex: '0'
    }, a.createElement('span', {
      className: 'icon-facebook-circle',
      'aria-hidden': 'true'
    }), a.createElement('span', {
      className: 'visually-hidden'
    }, d('Share this discussion on Facebook')))), a.createElement('li', {
      className: k
    }, f ? a.createElement('div', {
      className: 'share-icons-wrapper share-icons-wrapper--email',
      'data-action': 'share:email'
    }, a.createElement('span', {
      className: 'icon-mail',
      'aria-hidden': 'true'
    }), a.createElement('span', {
      className: 'visually-hidden'
    }, d('Share this discussion via email'))) : a.createElement('span', {
      className: 'share-email',
      'data-action': 'share:email',
      tabIndex: '0'
    }, a.createElement('span', {
      className: 'icon-mail',
      'aria-hidden': 'true'
    }), a.createElement('span', {
      className: 'visually-hidden'
    }, d('Share this discussion via email')))), a.createElement('li', {
      className: k
    }, f ? a.createElement('div', {
      className: 'share-icons-wrapper share-icons-wrapper--link',
      'data-action': 'copy-link',
      title: d('Click to copy discussion link')
    }, a.createElement('span', {
      className: 'icon-link',
      'aria-hidden': 'true'
    }), a.createElement('span', {
      className: 'visually-hidden'
    }, d('Copy link to discussion'))) : a.createElement('span', {
      className: 'share-link',
      'data-action': 'copy-link',
      title: d('Click to copy discussion link'),
      tabIndex: '0'
    }, a.createElement('span', {
      className: 'icon-link',
      'aria-hidden': 'true'
    }), a.createElement('span', {
      className: 'visually-hidden'
    }, d('Copy link to discussion')))))))
  };
  return e
}),
define('templates/lounge/layout', [
  'react'
], function (a) {
  'use strict';
  var b = function (b) {
    var c = b.forum;
    return a.createElement('div', {
      id: 'layout',
      'data-tracking-area': 'layout'
    }, c.settings.behindClickEnabled ? a.createElement('div', {
      id: 'behindclick__container'
    }) : null, a.createElement('div', {
      id: 'thread__container'
    }), a.createElement('div', {
      id: 'embed_v2-root'
    }))
  };
  return b
}),
define('templates/lounge/inEmbedAd', [
  'react'
], function (a) {
  'use strict';
  return function () {
    return a.createElement('div', {
      className: 'ad-content',
      role: 'ad-content'
    })
  }
}),
define('templates/lounge/inthreadAd', [
  'react'
], function (a) {
  'use strict';
  var b = function () {
    return a.createElement('li', {
      className: 'post advertisement'
    }, a.createElement('div', {
      className: 'post-content',
      'data-role': 'post-content'
    }))
  };
  return b
}),
define('templates/lounge/termsOfService', [
  'react',
  'core/strings'
], function (a, b) {
  'use strict';
  var c = b.gettext,
  d = function () {
    return a.createElement('div', null, a.createElement('div', {
      className: 'checkbox-wrapper'
    }, a.createElement('p', null, a.createElement('label', null, a.createElement('input', {
      type: 'checkbox',
      name: 'tos'
    }), a.createElement('span', {
      className: 'spacing-left-small'
    }, c('I agree to Disqus\' %(terms)s', {
      terms: a.createElement('a', {
        href: 'https://help.disqus.com/customer/portal/articles/466260-terms-of-service',
        target: '_blank',
        rel: 'noopener noreferrer'
      }, c('Terms of Service'))
    })))), a.createElement('p', null, a.createElement('label', null, a.createElement('input', {
      type: 'checkbox',
      name: 'privacy-policy'
    }), a.createElement('span', {
      className: 'spacing-left-small'
    }, c('I agree to Disqus\' processing of email and IP address, and the use of cookies, to facilitate my authentication and posting of comments, explained further in the %(policy)s', {
      policy: a.createElement('a', {
        href: 'https://disqus.com/privacy-policy',
        target: '_blank',
        rel: 'noopener noreferrer'
      }, c('Privacy Policy'))
    })))), a.createElement('p', null, a.createElement('label', null, a.createElement('input', {
      type: 'checkbox',
      name: 'data-sharing'
    }), a.createElement('span', {
      className: 'spacing-left-small'
    }, c('I agree to additional processing of my information, including first and third party cookies, for personalized content and advertising as outlined in our %(policy)s', {
      policy: a.createElement('a', {
        href: 'https://disqus.com/data-sharing-settings/'
      }, c('Data Sharing Policy'))
    }))))))
  },
  e = function (b) {
    var e = b.onAccept,
    f = b.isPrivate;
    return a.createElement('div', {
      id: 'tos__message',
      className: 'align align--column align--middle'
    }, a.createElement('h1', null, c('Important Update')), a.createElement('p', null, c('When you log in with Disqus, we process personal data to facilitate your authentication and posting of comments. We also store the comments you post and those comments are immediately viewable and searchable by anyone around the world.')), f ? a.createElement(d, null) : a.createElement('p', null, a.createElement('label', null, a.createElement('span', null, c('Please access our %(policy)s to learn what personal data Disqus collects and your choices about how it is used.  All users of our service are also subject to our %(terms)s.', {
      policy: a.createElement('a', {
        href: 'https://disqus.com/privacy-policy',
        target: '_blank',
        rel: 'noopener noreferrer'
      }, c('Privacy Policy')),
      terms: a.createElement('a', {
        href: 'https://help.disqus.com/customer/portal/articles/466260-terms-of-service',
        target: '_blank',
        rel: 'noopener noreferrer'
      }, c('Terms of Service'))
    })))), a.createElement('p', {
      className: 'align'
    }, a.createElement('button', {
      className: 'button button-large',
      onClick: e,
      id: 'accept_tos'
    }, c('Proceed'))))
  };
  return e
}),
define('common/collections/profile', [
  'core/api',
  'common/models',
  'common/collections'
], function (a, b, c) {
  'use strict';
  var d = c.PaginatedCollection.extend({
    initialize: function (a, b) {
      this.user = b.user,
      c.PaginatedCollection.prototype.initialize.apply(this, arguments)
    },
    fetch: function (a) {
      return a = a || {
      },
      a.data = a.data || {
      },
      a.data.user = this.user.id,
      c.PaginatedCollection.prototype.fetch.call(this, a)
    }
  }),
  e = d.extend({
    model: b.SyncedUser,
    url: a.getURL('users/listFollowing'),
    PER_PAGE: 20
  });
  return {
    SessionPaginatedCollection: d,
    FollowingCollection: e
  }
});
var _typeof = 'function' == typeof Symbol && 'symbol' == typeof Symbol.iterator ? function (a) {
  return typeof a
}
 : function (a) {
  return a && 'function' == typeof Symbol && a.constructor === Symbol && a !== Symbol.prototype ? 'symbol' : typeof a
};
define('lounge/views', [
  'jquery',
  'underscore',
  'backbone',
  'loglevel',
  'raven',
  'stance',
  'moment',
  'react',
  'react-dom',
  'core/ads/ads',
  'core/analytics/identity',
  'core/api',
  'core/mediaConfig',
  'core/UniqueModel',
  'core/mixins/appliesPublisherClasses',
  'core/mixins/withAlert',
  'core/models/ThreadVote',
  'core/models/Vote',
  'core/constants/voteConstants',
  'core/config',
  'remote/config',
  'common/models',
  'common/collections',
  'common/utils',
  'core/bus',
  'core/strings',
  'common/urls',
  'core/analytics/jester',
  'common/views/mixins',
  'common/Session',
  'common/keys',
  'core/utils',
  'core/utils/isIframed',
  'core/utils/html/toRGBColorString',
  'core/utils/threadRatingsHelpers',
  'core/utils/url/serialize',
  'core/utils/storage',
  'core/utils/isMediaTradecraftAdEnabled',
  'core/switches',
  'core/viglink',
  'core/WindowBus',
  'common/outboundlinkhandler',
  'core/mixins/withEmailVerifyLink',
  'core/templates/react/BehindClickTemplate',
  'core/templates/react/ThreadTemplate',
  'core/shared/urls',
  'lounge/common',
  'lounge/menu-handler',
  'lounge/mixins',
  'lounge/realtime',
  'lounge/views/badges-message',
  'lounge/views/email-signup',
  'lounge/views/posts/PostReplyView',
  'lounge/views/posts/collection',
  'lounge/views/media',
  'lounge/views/onboard-alert',
  'lounge/views/notification-menu',
  'lounge/views/highlighted-post',
  'lounge/views/realtime',
  'lounge/views/posts/UserSuggestionsManager',
  'lounge/views/sidebar',
  'lounge/views/ratings',
  'lounge/views/reactions',
  'lounge/views/reactions-promotion',
  'lounge/views/favorite-button',
  'lounge/views/top-navigation',
  'lounge/views/thread-footer',
  'lounge/views/secondary-navigation',
  'lounge/tracking',
  'templates/lounge/userMenu',
  'templates/lounge/threadShareBar',
  'templates/lounge/layout',
  'templates/lounge/inEmbedAd',
  'templates/lounge/inthreadAd',
  'templates/lounge/termsOfService',
  'templates/lounge/partials/postCount',
  'templates/lounge/partials/postSort',
  'common/main',
  'common/collections/profile'
], function (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z, $, _, aa, ba, ca, da, ea, fa, ga, ha, ia, ja, ka, la, ma, na, oa, pa, qa, ra, sa, ta, ua, va, wa, xa) {
  'use strict';
  var ya = window.document,
  za = z.get,
  Aa = F.preventDefaultHandler,
  Ba = new O,
  Ca = c.View.extend({
    events: {
      'click [data-action=subscribe]': 'subscribe'
    },
    initialize: function (a) {
      this.thread = a.thread,
      this.session = a.session,
      this.listenTo(this.thread, 'change:userSubscription', this.updateStatus),
      this.updateStatus()
    },
    updateStatus: function () {
      this.thread.get('userSubscription') ? (this.$el.addClass('subscribed'), this.$el.find('#thread-subscribe-text-default').addClass('hidden'), this.$el.find('#thread-subscribe-text-subscribed').removeClass('hidden')) : (this.$el.removeClass('subscribed'), this.$el.find('#thread-subscribe-text-default').removeClass('hidden'), this.$el.find('#thread-subscribe-text-subscribed').addClass('hidden'))
    },
    subscribe: Aa(function () {
      var a = this.thread.get('userSubscription');
      this.session.isLoggedOut() ? this.subscribeAfterAuthentication() : this.thread.subscribe(!a)
    }),
    subscribeAfterAuthentication: function () {
      this.listenToOnce(this.session, 'fetchThreadDetails:success', function () {
        this.session.isLoggedIn() && this.thread.subscribe()
      }),
      this.session.get('sso') && this.session.get('sso').url ? this.session.authenticate('sso') : this.session.authenticate('disqusDotcom')
    }
  }),
  Da = c.View.extend({
    topEdgeOffset: function () {
      return - U.getLounge().getPosition().height
    },
    initialize: function (a) {
      this.options = a,
      this.hasLoaded = null,
      this.listenToOnce(f(this), 'enter', this.loadImage)
    },
    loadImage: function () {
      var a = this;
      if (!a.hasLoaded) {
        var b = function (b) {
          return function () {
            a.trigger(b),
            a.$el.off('.deferredMediaView'),
            a.relatedPost && U.getLounge().postsView.onDeferredViewReady(a.relatedPost)
          }
        };
        a.$el.on('load.deferredMediaView', b('load')),
        a.$el.on('error.deferredMediaView', b('error')),
        a.$el.attr('src', a.options.url),
        a.hasLoaded = !0
      }
    }
  }),
  Ea = c.View.extend({
    tagName: 'ul',
    className: 'debug',
    initialize: function (a) {
      this.values = a
    },
    render: function () {
      return this.$el.html(b.reduce(this.values, function (a, b, c) {
        return a + '<li><strong>' + c + '</strong>: ' + b + '</li>'
      }, '')),
      this
    }
  }),
  Fa = c.View.extend({
    initialize: function (a) {
      this.forum = a.forum,
      this.session = a.session,
      this.thread = a.thread,
      this.isInHome = a.isInHome,
      this.listenTo(this.session, 'change:id', this.render),
      this.listenTo(this.thread, 'change', this.render),
      this.listenTo(aa.settings, 'change:collapsed', this.onMediaCollapseChange),
      this.listenToReactions()
    },
    listenToReactions: function () {
      this.thread.get('reactions') ? this.listenTo(this.thread.get('reactions'), 'sync change:enabled', this.render) : this.listenToOnce(this.thread, 'change:reactions', this.listenToReactions)
    },
    render: function () {
      return i.render(h.createElement(pa, {
        user: this.session.toJSON(),
        forum: this.forum.toJSON(),
        thread: this.thread.toJSON(),
        sso: this.session.get('sso'),
        isInHome: this.isInHome
      }), this.el),
      this.onMediaCollapseChange(),
      this
    },
    onMediaCollapseChange: function () {
      aa.settings.get('collapsed') ? this.$el.addClass('media-collapsed') : this.$el.removeClass('media-collapsed')
    }
  }),
  Ga = c.View.extend({
    events: {
      'click [data-action=share\\:twitter]': '_onShare',
      'keyup [data-action=share\\:twitter]': '_onShare',
      'click [data-action=share\\:facebook]': '_onShare',
      'keyup [data-action=share\\:facebook]': '_onShare',
      'click [data-action=share\\:email]': '_onShare',
      'keyup [data-action=share\\:email]': '_onShare',
      'click [data-action=copy-link]': '_onCopyLink',
      'keyup [data-action=copy-link]': '_onCopyLink'
    },
    _onCopyLink: Aa(function () {
      M.isFeatureActive('sso_less_branding', {
        forum: this.model.forum.id
      }) ? F.copyToClipboard(this.model.permalink()) : F.copyToClipboard(this.model.shortLink())
    }),
    _onShare: Aa(function (a) {
      var b = 13;
      if (!a.keyCode || a.keyCode === b) {
        var c = x.extractService(a.target, 'share');
        c && this.sharers[c] && (U.getLounge().trigger('uiAction:threadShare', c), this.share(c))
      }
    }),
    render: function () {
      return i.render(h.createElement(qa, {
        forum: this.model.forum.id
      }), this.el),
      this
    }
  });
  b.extend(Ga.prototype, W.ShareMixin);
  var Ha = c.View.extend({
    events: {
      'change input[name=tos], input[name=privacy-policy]': 'updateEnabled'
    },
    initialize: function (a) {
      this.isPrivate = a.isPrivate,
      this.session = a.session
    },
    updateEnabled: function () {
      this.$('#accept_tos').prop('disabled', !!this.isPrivate && !this.areTosAccepted())
    },
    areTosAccepted: function () {
      return this.$('input[name=tos]').prop('checked') && this.$('input[name=privacy-policy]').prop('checked')
    },
    onAccept: function () {
      if (!this.isPrivate || this.areTosAccepted()) {
        var a = this.$('input[name=data-sharing]');
        a.length && l.call('internal/users/setDNT', {
          method: 'POST',
          data: {
            value: a.prop('checked') ? 0 : 1
          }
        }),
        l.call('users/acceptTerms', {
          method: 'POST'
        }),
        this.close()
      }
    },
    close: function () {
      this.remove()
    },
    render: function () {
      return i.render(h.createElement(ua, {
        onAccept: this.onAccept.bind(this),
        isPrivate: this.isPrivate
      }), this.el),
      this.updateEnabled(),
      this
    }
  }),
  Ia = c.View.extend({
    initialize: function (a) {
      this.thread = a.thread,
      this.postCount = a.thread.get('posts') || 0,
      this.settings = a.settings
    },
    render: function () {
      return i.render(h.createElement(R, {
        postCount: this.postCount,
        titleEnabled: this.settings.title_enabled,
        titleText: this.settings.title_text,
        titleCSS: this.settings.title_css,
        buttonText: this.settings.button_text,
        buttonCSS: this.settings.button_css
      }), this.el),
      this
    }
  }),
  Ja = c.View.extend({
    initialize: function (a) {
      this.thread = a.thread,
      this.forum = a.forum,
      this.inHome = a.inHome,
      this.hideFooter = a.hideFooter,
      this.posts = a.posts
    },
    render: function () {
      return i.render(h.createElement(S, {
        thread: this.thread.toJSON(),
        forum: this.forum.toJSON(),
        inHome: this.inHome,
        hideFooter: this.hideFooter,
        isPolicyAccepted: Boolean(K.get('isPolicyAccepted:' + this.forum.id)),
        posts: this.posts
      }), this.el),
      this
    }
  }),
  Ka = c.View.extend({
    events: {
      'click [data-action^=auth\\:]': 'handleAuth',
      'click [data-action=logout]': 'handleLogout',
      'click [data-action=audiencesync]': 'audienceSync',
      'click [data-action=profile]': 'handleShowProfile',
      'click [data-action=community-sidebar]': 'handleShowCommunitySidebar',
      'click [data-action=sort]': 'handleSort',
      'click [data-action=toggle-thread-premoderate]': 'toggleThreadPremoderate',
      'click [data-action=toggle-thread]': 'toggleThread',
      'click [data-action=toggle-thread-ratings]': 'toggleThreadRatingsEnabled',
      'click [data-action=toggle-thread-visibility]': 'toggleBehindClick',
      'click [data-action=debug]': 'renderDebugInfo',
      'click [data-action=repair]': 'repairThread',
      'click [data-action=toggle-media]': 'toggleMedia',
      'click [data-action=toggle-reactions]': 'toggleReactions',
      'click a': 'handleLinkClick',
      'click [data-action=accept-comment-policy]': 'setPolicyAccepted',
      'click [data-action=toggle-embed-refresh]': 'toggleEmbedRefresh'
    },
    initialize: function (c) {
      U.setLounge(this),
      c = c || {
      };
      var d = c.jsonData || {
      };
      this.language = ya.documentElement.lang,
      this.initialData = d.response || {
      },
      this.cleanInitialData(this.initialData),
      this.onboardWindowName = x.globalUniqueId('disqus_'),
      this.initialData.forum && this.initialData.forum.id && (A.moderate = x.updateURL(A.moderate, {
        hostname: this.initialData.forum.id + '.'
      })),
      this.deferredViews = [
      ],
      this.unsortedDeferredViews = [
      ],
      this.inthreadAdApps = [
      ],
      this.adPromise = a.Deferred().resolve(),
      D.setDefaults(this.initialData.session),
      this.session = D.get(),
      this.forum = new v.Forum,
      this.forum.set(this.initialData.forum),
      this.thread = new v.Thread(this.initialData.thread, {
        forum: this.forum,
        postCursor: d.cursor,
        moderators: (this.initialData.thread || {
        }).moderators,
        order: d.order
      }),
      this.initUserSuggestionsManager();
      this.postsView = new _.PostCollectionView({
        posts: this.thread.posts,
        thread: this.thread,
        lounge: this,
        session: this.session,
        el: this.el,
        userSuggestions: this.userSuggestions
      }),
      this.states = {
        fullyVisible: !1,
        realtimeIndicatorsCreated: !1,
        streamingPaused: !1,
        inViewport: !1,
        behindClick: !1
      },
      this.meta = {
        topics: null
      },
      xa.timings.loungeStart = Number(new Date);
      var e = b.bind(this.bootstrap, this);
      G(window) ? (this.listenTo(y.frame, 'init', e), this.initThreadView()) : b.defer(e),
      this.setAlertSelector('#layout'),
      this.initResizeHandler(),
      this.initAlertListeners(),
      this.initTopics()
    },
    setPolicyAccepted: function () {
      K.set('isPolicyAccepted:' + this.forum.id, !0),
      this.$el.find('#comment-policy').addClass('hidden')
    },
    cleanInitialData: function (a) {
      var c = a.thread && a.thread.highlightedPost;
      c && (c.isHighlighted = !0),
      b.each(a.posts, function (a) {
        c ? a.isHighlighted = a.id === c.id : a.isHighlighted = !1
      })
    },
    initAlertListeners: function () {
      this.listenTo(this.session, 'alert', this.alert)
    },
    initOnboardAlert: function () {
      var a = this.onboardAlert = new ba.OnboardAlert({
        session: this.session,
        forum: this.forum
      });
      this.proxyViewEvents(this.onboardAlert),
      this.listenTo(this.session, 'change:id', function () {
        a.setInitialCookie(),
        a.render().$el.appendTo('#onboard')
      })
    },
    bootstrap: function (a) {
      var c,
      d = this,
      e = {
      };
      d.config = a = a || x.getConfigFromHash(window),
      a.forceSwitch && M.forceFeature(a.forceSwitch),
      a.loaderVersion = xa.version,
      d.states.fullyVisible = a.startedFullyVisible,
      k.init({
        isPrivate: a.isPrivate
      });
      var f = a.experiment;
      if (f) {
        if (f.experiment && f.variant) {
          var g = f,
          h = g.experiment,
          i = g.variant;
          h = h.replace(/_hidden$/, ''),
          M.forceFeature(['experiment',
          h,
          i].join(':'))
        }
      } else a.experiment = f = {
      };
      a.apiKey && (e['X-Disqus-Publisher-API-Key'] = a.apiKey),
      b.isObject(a.remoteAuthS3) && b.isEmpty(a.remoteAuthS3) ? a.remoteAuthS3 = null : e['X-Disqus-Remote-Auth'] = a.remoteAuthS3,
      b.isEmpty(e) || l.headers(e),
      a.anchorColor && (c = H(a.anchorColor), x.setPublisherColor(c), x.addStylesheetRules([['.publisher-anchor-color a',
      [
        'color',
        c,
        !0
      ]],
      [
        'a.publisher-anchor-color',
        [
          'color',
          c,
          !0
        ]
      ],
      [
        '.publisher-anchor-hover a:hover',
        [
          'color',
          c,
          !0
        ]
      ],
      [
        'a.publisher-anchor-hover:hover',
        [
          'color',
          c,
          !0
        ]
      ],
      [
        '.active .publisher-nav-color:after',
        [
          'background',
          c,
          !0
        ]
      ],
      [
        '.media-preview .active.publisher-border-color',
        [
          'border-color',
          c,
          !0
        ]
      ],
      [
        '.publisher-color',
        [
          'color',
          c,
          !1
        ]
      ],
      [
        '.publisher-color:hover',
        [
          'color',
          c,
          !1
        ]
      ],
      [
        '.publisher-background-color',
        [
          'background-color',
          c,
          !1
        ]
      ],
      [
        '.publisher-border-color',
        [
          'border-color',
          c,
          !1
        ]
      ],
      [
        '.publisher-color-refresh',
        [
          'color',
          c,
          !0
        ]
      ],
      [
        '.publisher-color-refresh:hover',
        [
          'color',
          c,
          !0
        ]
      ],
      [
        '.publisher-background-color-refresh',
        [
          'background-color',
          c,
          !0
        ]
      ],
      [
        '.publisher-background-color-hover-refresh:hover',
        [
          'background-color',
          c,
          !0
        ]
      ],
      [
        '.publisher-border-color-refresh',
        [
          'border-color',
          c,
          !0
        ]
      ]])),
      a.impressionId && k.impression.setImpressionId(a.impressionId),
      x.injectBaseElement(),
      a.referrer && (d.thread.currentUrl = a.referrer),
      this.config.inthreadLeadingCommentCount && (this.config.inthreadLeadingCommentCount = Number(this.config.inthreadLeadingCommentCount), this.config.inthreadRepeatCommentCount = Number(this.config.inthreadRepeatCommentCount), this.config.inthreadTrailingCommentCount = Number(this.config.inthreadTrailingCommentCount));
      var j = this.getPermalinkOptions(a.parentWindowHash);
      j && y.frame.once('embed.rendered', b.bind(d.scrollToPost, d, j.postId, j.options)),
      a.sso && d.session.set('sso', a.sso),
      M.isFeatureActive('embed_v2', {
        forum: this.forum.id
      }) && (window.embedv2 = window.embedv2 || {
      }, window.embedv2.embedConfig = a, window.embedv2.TLDS = t.TLDS),
      a.initialPosition ? d.position = a.initialPosition : d.position = x.calculatePositionFullscreen(),
      d.initPrivacySettings(),
      d.initLinkAffiliation(),
      d.initLiveRamp(),
      d.updateModeratorBadgeText(),
      d.bindBusListeners();
      var m = xa.timings;
      m.hostStart = a.timestamp || m.initStart,
      m.embedLoadTime = a.loadTime,
      this.once('threadView:prep', function () {
        d.listenToOnce(d.postsView, 'render:start', function () {
          m.renderStart = Number(new Date)
        }),
        d.listenToOnce(d.postsView, 'render:end', d.sendTelemetry),
        m.bootstrapStart = Number(new Date),
        d.postsView.bootstrap(d.initialData, j),
        d.initAfterPostCreateHandler(),
        d.initSession()
      }),
      d.initUI(),
      d.initLinkHandler(),
      d.initialized = !0,
      d.trigger('bootstrap:complete', d)
    },
    _isInHome: function (a, b) {
      var c = /^(?:https?:)?\/\/(?:www.)?/;
      return a = a.replace(c, ''),
      b = b.replace(c, ''),
      0 === a.indexOf(b)
    },
    isInHome: function () {
      return !(!this.config || !this.config.referrer) && this._isInHome(this.config.referrer, T.apps.home + 'home/')
    },
    isOnChannel: function () {
      return !(!this.forum || !this.forum.id) && 0 === this.forum.id.indexOf('channel-')
    },
    initSession: function () {
      var a = this.config,
      b = this.session,
      c = this.thread;
      b.start({
        remoteAuthS3: a.remoteAuthS3,
        sso: a.sso,
        apiKey: a.apiKey,
        thread: c
      })
    },
    initPrivacySettings: function () {
      this.listenToOnce(this.session, 'change:id', function (a) {
        oa.isPrivate(a) && m.set({
          collapsed: {
            value: !0,
            persist: !1
          }
        })
      })
    },
    initLiveRamp: function () {
      var a = this.forum.get('settings') || {
      };
      a.userIdentityDisabled || this.listenTo(this.session, 'change:id', function (a) {
        var b = a.get('email');
        b && y.frame.sendHostMessage('liveramp:init', {
          email: a.get('email'),
          launchpad: A.liveRampAtsV2
        })
      })
    },
    initLinkAffiliation: function () {
      var a = N.getVersion();
      if (M.isFeatureActive('viglink_experiment', {
        forum: this.forum.id,
        forumPercent: this.forum.id
      }) && (a = N.getExperimentVersion()), this.isLinkAffiliatorEnabled() && !this.initLinkAffiliatorCalled && 'none' !== a) {
        this.initLinkAffiliatorCalled = !0;
        var b = A.linkAffiliatorClientV4;
        oa.shouldTrack(this.forum, this.session.user) && 'v5' === a && (b = A.linkAffiliatorClientV5),
        y.frame.sendHostMessage('viglink:init', {
          clientUrl: b,
          apiUrl: A.linkAffiliatorAPI,
          key: E.viglinkAPI,
          id: this.forum.get('pk')
        })
      }
    },
    initAfterPostCreateHandler: function () {
      this.listenTo(this.thread, 'create', function (a) {
        var c = a.toJSON();
        y.frame.sendHostMessage('posts.create', c),
        Ba.broadcast('posts.create', b.pick(c, 'forum', 'parent', 'id'))
      })
    },
    sendTelemetry: function () {
      if (x.shouldSample(u.lounge.telemetry_sample_percent)) {
        var c = a.now(),
        d = xa.timings,
        e = {
          embed: d.embedLoadTime,
          frame: d.initStart - d.hostStart,
          asset: d.downloadEnd - d.initStart,
          render: c - d.renderStart,
          total: c - d.hostStart - (d.renderStart - d.bootstrapStart)
        },
        f = window.performance;
        if (f) {
          var g = f.timing;
          g.responseStart && (e.frame_rtt = g.responseStart - g.navigationStart);
          var h = b.find(f.getEntries && f.getEntries() || [
          ], function (a) {
            return a.name.indexOf('/next/config.js') > - 1
          });
          h && h.responseStart && (e.config_rtt = h.responseStart - h.startTime)
        }
        var i = 'lounge_' + ('static' === this.config.experiment.service ? 'static' : 'dynamic');
        return B.telemetry(i, e)
      }
    },
    initUI: function () {
      this.applyPublisherClasses(),
      this.renderLayout(),
      this.setAlertSelector('#global-alert'),
      this.bindUIUpdateHandlers(),
      this.initDeferredViews(),
      this.postsView.once('render:end', function () {
        var a = x.getPageHeight();
        y.frame.sendHostMessage('rendered', {
          height: a
        }),
        this._lastHeight = a,
        this.initRealtime()
      }, this),
      this.once('threadView:prep', this.initUIComponents),
      this.initThreadView()
    },
    initUIComponents: function () {
      this.initMainPostBox(),
      this.initTermsOfService(),
      this.initReactions(),
      this.initStarRatings(),
      this.initThreadFooter(),
      this.initSecondaryNavigation(),
      this.isInHome() || (this.initTopNavigation(), this.initUserMenu(), this.initOnboardAlert(), this.initNotificationMenu(), this.initFavoriteButton(), this.initThreadShareBar()),
      M.isFeatureActive('embed_refresh_v2', {
        forum: this.forum.id
      }) || this.initBadgesMessage(),
      this.initHighlightedPost(),
      this.initEmailSignup(),
      this.initThreadSubscribe(),
      this.bindProfileUIListeners(this.session),
      this.updatePostCount(),
      this.trigger('threadView:render')
    },
    initHighlightedPost: function () {
      var a = this.thread.get('highlightedPost');
      a && !M.isFeatureActive('embed_refresh', {
        forum: this.forum.id
      }) && this.thread.posts.add(a),
      this.highlightedPostView = new da.HighlightedPostView({
        el: this.threadView.$el.find('#highlighted-post'),
        thread: this.thread,
        session: this.session,
        userSuggestions: this.userSuggestions,
        config: this.config
      }),
      this.highlightedPostView.reset()
    },
    initReactions: function () {
      if (this.forum.get('settings')) {
        if (!this.forum.get('settings').threadReactionsEnabled && !this.forum.channel) return void this.initReactionsPromotion();
        var a = new w.ReactionsCollection([], {
          thread: this.thread,
          userIsAnonymous: this.session.user.isAnonymous()
        });
        this.listenTo(a, 'sync', function () {
          a.length ? this.showReactions(a) : this.removeReactions()
        }),
        this.listenTo(a, 'change:enabled', function () {
          a.enabled ? this.showReactions(a) : this.removeReactions()
        }),
        this.thread.set('reactions', a),
        a.fetch()
      }
    },
    showReactions: function (a) {
      if (!this.reactionsView) {
        var b = this.reactionsView = new ia({
          reactions: a,
          readonly: this.thread.get('isClosed'),
          session: this.session,
          forum: this.thread.forum.id
        });
        b.render(),
        this.threadView.$el.find('#reactions__container').prepend(b.$el)
      }
    },
    removeReactions: function () {
      this.reactionsView && (this.reactionsView.remove(), this.reactionsView = null)
    },
    initReactionsPromotion: function () {
      if (!this.thread.isModerator(this.session.user)) return void this.listenToOnce(this.session, 'change:id', this.initReactionsPromotion);
      var b = 'reactionsEmbedPromotion',
      c = this;
      l.call('announcements/messages/checkViewed', {
        data: {
          message: b
        }
      }).success(function (d) {
        var e = d.response;
        if (!e[b]) {
          var f = c.reactionsPromotionView = new ja({
            forum: c.forum
          });
          f.render(),
          a('#reactions__container').prepend(f.$el)
        }
      })
    },
    initStarRatings: function () {
      this.forum.get('features') ? I.isForumModelRatingsEnabled(this.forum) && (this.thread.get('ratingsEnabled') && this.thread.fetchRatings(), this.listenTo(this.thread, 'change', this.showRatings), this.showRatings()) : this.listenToOnce(this.thread.forum, 'change:features', this.initStarRatings)
    },
    showRatings: function () {
      var a = M.isFeatureActive('star_ratings_total_hidden', {
        forum: this.forum.id
      });
      if (!this.ratingsView && this.thread && this.session && !a) {
        var b = this.ratingsView = new ha({
          thread: this.thread,
          session: this.session
        });
        b.render(),
        this.threadView.$el.find('#ratings__container').html(b.$el)
      }
    },
    bindUIUpdateHandlers: function () {
      var a = this,
      b = a.thread,
      c = a.session;
      a.listenTo(b, {
        'change:posts': a.updatePostCount
      }),
      a.listenTo(b.queue, 'add reset', a.toggleRealtimeNotifications),
      a.postsView.bindUIUpdateHandlers(),
      a.listenTo(c, 'change:id', a.updateThreadSessionData),
      a.listenTo(a, 'scrollOffViewport', function () {
        this.states.realtimeIndicatorsCreated && y.frame.sendHostMessage('indicator:hide')
      }),
      a.listenTo(a, 'scroll', function (a) {
        this.position = a
      }),
      a.listenTo(a, 'scroll', a.handleRealtimeScroll),
      a.listenTo(a.postsView, 'render:end', function () {
        a.toggleRealtimeNotifications(),
        a.config.inthreadPlacementUrl && a.loadInthreadAd()
      }),
      a.listenToOnce(a, 'threadView:render', function () {
        a.loadInEmbedAd()
      })
    },
    whenFullyVisible: function () {
      var b = a.Deferred();
      return this.states.fullyVisible ? b.resolve() : this.listenTo(this, 'frame.visible', function () {
        b.resolve()
      }),
      b.promise()
    },
    canShowInthreadAd: function (a, b) {
      if (!this.config.inthreadMultipleAds && a > 0) return !1;
      var c = this.config.inthreadLeadingCommentCount + this.config.inthreadRepeatCommentCount * a,
      d = c + this.config.inthreadTrailingCommentCount;
      return b >= d
    },
    inthreadAdInit: function (b, c) {
      var d = a.Deferred();
      return this.inthreadAdApps[b].init(),
      this.listenToOnce(this.inthreadAdApps[b], 'frame:ready', function () {
        c.css({
          height: 'auto',
          'margin-bottom': '24px'
        }),
        d.resolve()
      }),
      this.listenToOnce(this.inthreadAdApps[b], 'ad-placement-empty', function () {
        c.css({
          height: '',
          'margin-bottom': ''
        })
      }),
      d.promise()
    },
    loadInEmbedAd: function () {
      var c = this.config.topInEmbedPlacementUrl;
      if (c) {
        var d = a(sa());
        d.prependTo(this.postsView.$el);
        var e = j.Ads(b.extend({
          adUrl: c,
          placement: 'top_in_embed',
          container: d[0],
          isInHome: !1,
          isOnHostPage: !1,
          forumId: this.forum.get('pk'),
          version: this.config.version
        }, this.config));
        e.init()
      }
      var f = this.config.bottomInEmbedPlacementUrl;
      if (f) {
        var g = a(sa());
        g.appendTo(this.postsView.$el);
        var h = j.Ads(b.extend({
          adUrl: f,
          placement: 'bottom_in_embed',
          container: g[0],
          isInHome: !1,
          isOnHostPage: !1,
          forumId: this.forum.get('pk'),
          version: this.config.version
        }, this.config));
        h.init()
      }
    },
    loadInthreadAd: function () {
      var c = this.postsView.$el.find('#post-list');
      if (!(this.config.adBlockEnabled && !this.config.defaultPlacementUrl || c.hasClass('loading'))) {
        var d = this.config.inthreadCountChildren ? c.find('.post:not(.advertisement)') : c.children(':not(.advertisement)'),
        e = {
        };
        0 === this.config.experiment.experiment.indexOf('googlewidemargins') && 'fallthrough' !== this.config.experiment.variant && (e.margin = '0 ' + this.config.experiment.variant, e['min-width'] = 'calc(100% - ' + 2 * parseInt(this.config.experiment.variant, 10) + 'px)');
        var f;
        f = this.config.adBlockEnabled && this.config.defaultPlacementUrl ? J(this.config.defaultPlacementUrl, {
          position: 'inthread'
        }) : this.config.inthreadPlacementUrl;
        for (var g = this.inthreadAdApps.length; this.canShowInthreadAd(g, d.length); g++) {
          var h = this.config.inthreadLeadingCommentCount + this.config.inthreadRepeatCommentCount * g,
          i = a(ta());
          d && d.length && d[h] ? i.insertBefore(d[h]) : i.appendTo(a('#post-list')),
          this.inthreadAdApps[g] = j.Ads(b.extend({
            adUrl: f,
            placement: 'inthread',
            container: i.find('[data-role=post-content]') [0],
            isInHome: this.isInHome(),
            isOnHostPage: !1,
            forumId: this.forum.get('pk'),
            version: this.config.version,
            styles: e
          }, this.config));
          var k = this.inthreadAdInit.bind(this, g, i);
          0 === g ? this.adPromise = this.whenFullyVisible().then(k) : this.adPromise = this.adPromise.then(k)
        }
      }
    },
    relayScrollToStance: function (a) {
      f.scroll({
        top: a.pageOffset - a.frameOffset.top,
        height: a.height
      })
    },
    initDeferredViews: function () {
      this.listenTo(this, 'scroll', this.createDeferredViewsForImages),
      this.listenTo(this, 'domReflow', function () {
        f.invalidate(),
        this.position && (this.createDeferredViewsForImages(), this.relayScrollToStance(this.position))
      })
    },
    bindBusListeners: function () {
      this.listenTo(y.frame, {
        'window.hashchange': function (a) {
          var b = this.getPermalinkOptions(a);
          b && this.scrollToPost(b.postId, b.options)
        },
        'window.scroll': function (a) {
          this.trigger('scroll', a),
          this.relayScrollToStance(a)
        },
        'window.inViewport': function () {
          this.states.behindClick || (this.states.inViewport = !0, this.trigger('inViewport'))
        },
        'window.scrollOffViewport': function () {
          this.states.inViewport = !1,
          this.trigger('scrollOffViewport')
        },
        'frame.visible': function () {
          this.states.fullyVisible = !0,
          this.trigger('frame.visible')
        },
        error: function (a) {
          a = JSON.parse(a),
          e.captureException(a.error, {
            extra: {
              details: a.details
            },
            culprit: a.culprit
          })
        },
        'window.resize': this.resize,
        'indicator:click': this.handleRealtimeClick
      }),
      this.listenToOnce(this.session, 'change:id', this.initSidebar)
    },
    isLinkAffiliatorEnabled: function () {
      return this.forum.get('settings').linkAffiliationEnabled && !this.isInHome()
    },
    initLinkHandler: function () {
      this.outboundLinkHandler = new P,
      this.outboundLinkHandler.registerBeforeNavigationHandler(this.logLinkClick, this)
    },
    handleLinkClick: function (a) {
      this.outboundLinkHandler.handleClick(a)
    },
    initRealtimeIndicators: function () {
      var a = this;
      if (!a.states.realtimeIndicatorsCreated) {
        var c = [
          'north',
          'south'
        ].reduce(function (c, d) {
          return c[d] = {
            contents: '\n<!DOCTYPE html>\n<html lang="' + b.escape(a.language) + '">\n    <head>\n        <meta charset="utf-8">\n        <title>Disqus Realtime Notification</title>\n    </head>\n    <body>\n        <link rel="stylesheet" href="' + b.escape('https://c.disquscdn.com/next/embed/styles/realtime.b23ff3c36dd0169627f8e54ca1621eca.css') + '">\n        <div class="' + b.escape(d) + '" id="message">-</div>\n    </body>\n</html>\n'
          },
          c
        }, {
        });
        y.frame.sendHostMessage('indicator:init', c),
        a.states.realtimeIndicatorsCreated = !0
      }
    },
    insertStreamingComments: b.throttle(function () {
      var a = this.thread.queue;
      a.drain(),
      b.each(a.counters.replies, function (b, c) {
        a.drain(c)
      })
    }, 1000),
    updateModeratorBadgeText: function () {
      var a = this.forum.get('moderatorBadgeText');
      a && (z.translations.Mod = a)
    },
    logLinkClick: function (b) {
      var c = a(b.currentTarget);
      if (F.clickShouldBeLogged(b, c)) return B.client.emit({
        verb: 'click',
        object_type: 'link',
        object_id: c[0].href,
        area: oa.getEventTrackingArea(b)
      })
    },
    handleRealtimeScroll: function (a) {
      if (this.states.inViewport && this.states.realtimeIndicatorsCreated) {
        var c = b.union([this.queueView], b.values(this.postsView.subViews)),
        d = 0,
        e = 0;
        b.each(c, function (b) {
          if (b && !b.getDirection && (b = b.queueView), b && !(b.options.count <= 0)) {
            var c = b.getDirection(a);
            1 === c ? d += b.options.count : c === - 1 && (e += b.options.count)
          }
        });
        var f,
        g,
        h = function (a) {
          var c = a.orientation,
          d = a.num,
          e = void 0;
          return e = 'north' === c ? 1 === d ? za('One new comment above.') : z.interpolate(za('%(num)s new comments above.'), {
            num: d
          }) : 1 === d ? za('One new comment below.') : z.interpolate(za('%(num)s new comments below.'), {
            num: d
          }),
          '<p>' + b.escape(e) + '</p>'
        };
        g = {
          type: 'north'
        },
        d > 0 ? (f = 'indicator:show', g.content = h({
          num: d,
          orientation: 'north'
        })) : f = 'indicator:hide',
        y.frame.sendHostMessage(f, g),
        g = {
          type: 'south'
        },
        e > 0 ? (g.content = h({
          num: e,
          orientation: 'south'
        }), f = 'indicator:show') : f = 'indicator:hide',
        y.frame.sendHostMessage(f, g)
      }
    },
    handleRealtimeClick: function (a) {
      var c = this;
      y.frame.sendHostMessage('indicator:hide', {
        type: a
      });
      var d,
      e,
      f,
      g = b.union([c], b.toArray(c.postsView.subViews));
      g = b.filter(g, function (b) {
        if (b = b.queueView, !b || b.options.count <= 0) return !1;
        var d = 'north' === a ? 1 : - 1;
        return b.getDirection(c.position) === d
      }),
      g = b.sortBy(g, function (a) {
        return a === c ? 0 : a.offset.top
      }),
      d = 'north' === a ? b.last(g) : b.first(g),
      e = d.queueView,
      d === c ? (f = 0, e.handleDrain()) : (f = d.offset.top - 100, e.handleDrain()),
      U.getLounge().once('domReflow', b.bind(y.frame.sendHostMessage, y.frame, 'scrollTo', {
        top: f
      }))
    },
    toggleRealtimeNotifications: function () {
      var a = this,
      c = a.thread.queue;
      if (b.defer(function () {
        y.frame.sendHostMessage('fakeScroll')
      }), !c.length) return void a.$el.find('[data-role=realtime-notification]').hide();
      if (a.thread.get('hasStreaming')) return void a.insertStreamingComments();
      if (c.counters.comments) {
        var d = a.queueView || new ea.QueuedPostView({
          model: a.thread,
          el: a.$el.find('button[data-role=realtime-notification]')
        });
        a.queueView = d,
        d.setCount(c.counters.comments),
        d.render()
      }
      b.each(c.counters.replies, function (b, c) {
        var d = a.thread.posts.get(c);
        if (d) {
          var e = a.postsView.getPostView(d.cid);
          if (e) {
            var f = e.queueView;
            f || (f = new ea.QueuedReplyView({
              thread: a.thread,
              postView: e,
              model: d,
              el: e.$el.find('[data-role=realtime-notification\\:' + c + '] a')
            }), e.queueView = f),
            f.setCount(b),
            f.render()
          }
        }
      })
    },
    initBehindClick: function () {
      var c = this;
      if (!c.behindClickView && c.thread && a('#behindclick__container').length) {
        var d = {
          title_enabled: !1,
          title_text: null,
          title_css: null,
          button_text: null,
          button_css: null
        };
        l.call('forums/behindClick/details', {
          data: {
            forum: this.forum.id
          }
        }).success(function (a) {
          var e = a.response;
          c.showBehindClick(b.defaults({
          }, e, d))
        })
      }
    },
    showBehindClick: function (b) {
      var c = a('#behindclick__container'),
      d = new Ia({
        thread: this.thread,
        settings: b
      });
      d.render(),
      c.html(d.$el),
      y.frame.sendHostMessage('rendered', {
        height: x.getPageHeight()
      })
    },
    toggleBehindClick: function () {
      this.$('#behindclick__container').hide(),
      this.states.behindClick = !1,
      y.frame.trigger('window.inViewport'),
      y.trigger('uiAction:behindClickButton'),
      this.trigger('threadView:prep')
    },
    initThreadView: function () {
      this.createThreadView(),
      this.forum.get('settings').behindClickEnabled ? (this.initBehindClick(), this.states.behindClick = !0) : this.trigger('threadView:prep')
    },
    createThreadView: function () {
      if (!this.threadView && this.thread && this.session) {
        var a,
        b = this.isInHome();
        this.thread.posts.buffer && (a = this.thread.posts.getOrder());
        var c = this.threadView = new Ja({
          thread: this.thread,
          forum: this.forum,
          order: a,
          inHome: b,
          hideFooter: b,
          posts: this.initialData.posts
        });
        c.render(),
        this.trigger('threadView:init'),
        this.once('threadView:render', function () {
          this.$('#thread__container').html(this.threadView.$el)
        })
      }
    },
    renderDebugInfo: Aa(function () {
      if (this.session.user.get('isGlobalAdmin')) {
        var a = this.thread.forum.get('settings', {
        }),
        b = new Ea({
          Shortname: this.thread.get('forum'),
          'Thread ID': this.thread.get('id'),
          'Org ID': this.forum.get('organizationId'),
          'Thread slug': this.thread.get('slug'),
          'Anchor color': H(this.config.anchorColor),
          Language: this.thread.forum.get('language'),
          Recommendations: a.organicDiscoveryEnabled,
          'Ads enabled': a.adsEnabled,
          'Ads top enabled': a.adsPositionTopEnabled,
          'Ads bottom enabled': a.adsPositionBottomEnabled,
          'Ads in-thread enabled': a.adsPositionInthreadEnabled,
          'Ads recommendations enabled': a.adsPositionRecommendationsEnabled,
          'Ads Product Display enabled': a.adsProductDisplayEnabled,
          'Ads Product Links enabled': a.adsProductLinksEnabled,
          'Ads Product Video enabled': a.adsProductVideoEnabled,
          'In iframe': this.config.isHostIframed,
          'Behind click': this.config.isBehindClick,
          'Height restricted': this.config.isHeightRestricted
        });
        b.render();
        var c = ya.body;
        c.insertBefore(b.el, c.firstChild)
      }
    }),
    repairThread: Aa(function () {
      this.session.user.get('isGlobalAdmin') && l.call('internal/threads/repair.json', {
        method: 'GET',
        data: {
          thread: this.thread.get('id')
        },
        success: b.bind(this.alert, this, 'Thread repair has been queued. Refresh in a few seconds.'),
        error: b.bind(this.alert, this, 'An error occurred while repairing thread. Please try again.', {
          type: 'error'
        })
      })
    }),
    getPermalinkOptions: function (a) {
      var b = a && a.match(/(comment|reply|edit)-([0-9]+)/);
      if (b) return {
        postId: b[2],
        options: {
          highlight: !0,
          openReply: 'reply' === b[1],
          openEdit: 'edit' === b[1]
        }
      }
    },
    scrollToPost: function (a, c) {
      c = c || {
      },
      c.padding = c.padding || 90;
      var d = this,
      e = d.$el.find('#post-' + a);
      if (M.isFeatureActive('embed_refresh', {
        forum: this.forum.id
      }) && !e.length && d.highlightedPostView && d.highlightedPostView.post && d.highlightedPostView.post.id === a) e = d.highlightedPostView.$el.find('.post');
       else if (!e.length) return void v.Post.fetchContext(a, d.thread, {
        requestedByPermalink: !0
      }).done(function () {
        d.postsView.once('render:end', b.bind(d.scrollToPost, d, a, c)),
        y.frame.once('embed.resized', b.bind(d.scrollToPost, d, a, c))
      });
      c.highlight && (d.$el.find('.post-content.target').removeClass('target'), e.find('.post-content').first().addClass('target')),
      c.openReply && d.postsView.openReply(a),
      c.openEdit && d.postsView.openEdit(a),
      y.frame.sendHostMessage('scrollTo', {
        top: e.offset().top - c.padding,
        force: c.force || null
      })
    },
    updateThreadSessionData: function (a) {
      if (a) {
        a.get('thread') && this.thread.set(a.get('thread'));
        var c = a.get('votes');
        c && 'object' === ('undefined' == typeof c ? 'undefined' : _typeof(c)) && b.each(c, function (a, b) {
          var c = this.postsView.posts.get(b);
          c && c.set('userScore', a)
        }, this);
        var d = a.get('blockedUserIdSet');
        if (d && 0 !== d.size) {
          var e = this.postsView.posts.models;
          if (e && 'object' === ('undefined' == typeof e ? 'undefined' : _typeof(e))) {
            var f = {
            };
            b.each(e, function (a) {
              var b = a.attributes.id,
              c = a.author.id;
              if (f[b] = c, a.attributes.parent) {
                var e = a.attributes.parent,
                g = f[e];
                d.has(g) && a.set('hideReplyPreview', !0)
              }
            }, this)
          }
        }
      }
    },
    initSidebar: function () {
      this.sidebar = new ga({
        session: this.session,
        forum: this.forum,
        config: this.config
      })
    },
    initNotificationMenu: function () {
      var a = this.notificationMenu = new ca.NotificationMenuView({
        el: this.threadView.$el.find('[data-role=notification-menu]') [0],
        session: this.session,
        forum: this.forum
      });
      a.render()
    },
    initUserMenu: function () {
      var a = this.userMenu = new Fa({
        el: this.threadView.$el.find('[data-role=logout]') [0],
        forum: this.forum,
        session: this.session,
        thread: this.thread,
        isInHome: this.isInHome()
      });
      a.render()
    },
    initThreadShareBar: function () {
      if (!this.thread.forum.get('settings').disableSocialShare) {
        var a = this.threadShareBar = new Ga({
          el: this.threadView.$el.find('#thread-share-bar') [0],
          model: this.thread
        });
        a.render()
      }
    },
    isRealtimeEnabled: function () {
      var a = u.lounge.REALTIME || {
      },
      b = a.THREAD_STALE_DAYS || 7,
      c = g.unix(this.initialData.lastModified);
      return !this.thread.get('isClosed') && g().diff(c, 'days') <= b
    },
    realtimeHandlers: {
      Post: function (a) {
        var b = a.data,
        c = this.thread;
        if (!this.thread.get('hasStreaming') || !this.states.streamingPaused) {
          if (!b.id) return void d.warn('RT: no post ID');
          if (!b.author || !b.author.id) return void d.warn('RT: no author or author ID');
          if (!b.author.name) return void d.warn('RT: no author name or email hash');
          if (!b.author.username) return void d.warn('RT: no author username');
          if (!b.post || !b.post.message) return void d.warn('RT: no post message');
          if (c.posts.get(b.id) || c.queue.get(b.id)) return void d.info('RT: duplicate: ', b.id);
          if ('approved' !== b.type) return void d.info('RT: unapproved: ', b.id);
          if (b.sb) return void d.info('RT: shadowbanned: ', b.id);
          if (b.type === b.type_prev) return void d.info('RT: Post change message, ignoring for now ', b.id);
          this.thread.incrementPostCount(1);
          var e = b.post.parent_post.id;
          if ('0' === e && (e = null), e && !c.posts.get(e) && !c.queue.get(e)) return void d.info('RT: parent is not on this page: ', b.id);
          var f = b.author.name,
          g = b.author.username,
          h = b.author.avatar,
          i = b.author.id,
          j = b.author.is_private;
          '0' === i && (i = void 0);
          var k = new n(v.User, {
            id: i,
            name: f,
            username: g,
            profileUrl: A.root + '/by/' + g + '/',
            isAnonymous: !i,
            isPrivate: j,
            avatar: {
              cache: h,
              permalink: h
            }
          });
          if (k.get('isBlocked')) return void d.info('RT: blocked: ', b.id);
          c.users.add(k, {
            merge: !0
          }),
          c.queue.add({
            id: b.id,
            user: k,
            parentId: e,
            message: b.post.message,
            createdAt: b.date,
            media: b.post.media
          })
        }
      },
      Vote: function (a) {
        var b = a.data;
        if (b.id && b.vote) {
          var c = this.thread,
          e = c.posts.get(b.vote.recipient_post_id);
          if (e) {
            d.debug('RT: Vote for post ', e.id);
            var f = e.votes.get(b.id);
            f || (d.debug('RT: Creating new vote with id ', b.id), f = new r({
              id: b.id
            }), e.votes.add(f));
            var g = e._vote(b.vote.vote, f.get('score'), b.voter);
            0 !== g && f.set('score', g)
          }
        }
      },
      ThreadVote: function (a) {
        var b = a.data,
        c = this.thread;
        if (b.id && b.vote && (!this.session.user.id || b.vote.voter_id !== this.session.user.id)) {
          var d = c.votes.get(b.id);
          if (d || (d = new q({
            id: b.id
          }), c.votes.add(d)), !d.get('currentUser')) {
            var e = c._vote(b.vote.vote, d.get('score'));
            0 !== e && d.set('score', e)
          }
        }
      },
      typing: function (a) {
        var c = a.data,
        d = this.thread,
        e = c.typing,
        f = c.post;
        if (c.thread === d.id && f) {
          var g = d.posts.get(f);
          g && (g.usersTyping.count() <= 0 && !e || g.usersTyping.add(v.TypingUser.make(b.extend({
            client_context: a.lastEventId
          }, c))))
        }
      }
    },
    initRealtime: function () {
      var a = X.Manager;
      if (!a.pipe && this.isRealtimeEnabled()) {
        this.initRealtimeIndicators(),
        a.initialize('thread/' + this.thread.id, this.realtimeHandlers, this);
        var b = function (a) {
          return 'POST' === a.method
        },
        c = 0;
        this.listenTo(l, 'call', function (d) {
          b(d) && (c += 1, a.pause())
        }),
        this.listenTo(l, 'complete', function (d) {
          !b(d) || c <= 0 || (c -= 1, c || a.resume())
        })
      }
    },
    initTopNavigation: function () {
      var a = this.topNavigation = new la({
        inHome: this.isInHome(),
        thread: this.thread
      });
      a.render(),
      this.threadView.$el.find('#main-nav').append(a.el)
    },
    initThreadFooter: function () {
      var a = this.threadFooter = new ma({
        forum: this.forum
      });
      a.render(),
      this.threadView.$el.find('#footer').append(a.el)
    },
    initSecondaryNavigation: function () {
      var a,
      b = this.forum.get('votingType') || s.VOTING_TYPES.DEFAULT_VOTING_TYPE,
      c = b === s.VOTING_TYPES.DISABLED;
      this.thread.posts.buffer && (a = this.thread.posts.getOrder());
      var d = this.secondaryNavigation = new na({
        inHome: this.isInHome(),
        order: a,
        votingDisabled: c,
        forum: this.thread.forum.id
      });
      d.render(),
      this.threadView.$el.find('#secondary-navigation').append(d.el)
    },
    initFavoriteButton: function () {
      if (this.favoriteButton && this.favoriteButton.remove(), !M.isFeatureActive('sso_less_branding', {
        forum: this.forum.id
      })) {
        var a = this.favoriteButton = new ka({
          thread: this.thread,
          session: this.session
        });
        this.listenTo(a, {
          'vote:like': b.bind(this.trigger, this, 'uiAction:threadLike'),
          'vote:unlike': b.bind(this.trigger, this, 'uiAction:threadUnlike')
        }),
        a.render(),
        this.threadView.$el.find('#favorite-button').append(a.el)
      }
    },
    initThreadSubscribe: function () {
      this.threadSubscribeButton = new Ca({
        session: this.session,
        thread: this.thread,
        el: this.threadView.$el.find('#thread-subscribe-button') [0]
      })
    },
    initBadgesMessage: function () {
      this.badgesMessageView = new Y({
        forum: this.forum,
        session: this.session,
        el: this.threadView.$el.find('#badges-message__container') [0]
      }).render()
    },
    initEmailSignup: function () {
      this.emailSignupForm = new Z({
        forum: this.forum,
        session: this.session,
        el: this.threadView.$el.find('#email-signup') [0]
      }).render()
    },
    updatePostCount: function () {
      var a = this.thread.get('posts');
      this.isInHome() || (this.$postCountContainer = this.$postCountContainer || this.threadView.$el.find('li[data-role=post-count]'), this.$postCountContainer.html(va({
        count: a
      }))),
      y.frame.sendHostMessage('posts.count', a)
    },
    renderLayout: function () {
      this.addFeatureDetectionClasses(),
      V.init(this);
      var b = a(ra({
        forum: this.forum.toJSON(),
        thread: this.thread.toJSON()
      }));
      b.appendTo(this.$el),
      this.postsView.renderLayout(),
      u.readonly ? this.alert(za('The Disqus comment system is temporarily in maintenance mode. You can still read comments during this time, however posting comments and other actions are temporarily delayed.'), {
        type: 'info'
      }) : this.listenToOnce(this.session, 'change:id', this.showPremoderationAlert)
    },
    showPremoderationAlert: function () {
      this.thread.isModerator(this.session.user) && !this.getAlert() && (this.forum.get('settings').validateAllPosts ? this.alert(b.escape(za('Comments on this entire site are premoderated (only moderators can see this message).')) + (' <a href="' + b.escape('https://' + this.forum.id + '.disqus.com/admin/settings/community/') + '" target="_blank" rel="noopener noreferrer">' + b.escape(za('Change site settings.')) + '</a>'), {
        safe: !0,
        isPremoderateStatus: !0
      }) : this.thread.get('validateAllPosts') && this.alert(za('Comments on this thread are premoderated (only moderators can see this message).'), {
        isPremoderateStatus: !0
      }))
    },
    dismissPremoderationAlert: function () {
      this.dismissAlert(function (a) {
        return a.options && a.options.isPremoderateStatus
      })
    },
    addFeatureDetectionClasses: function () {
      var b = a(ya.documentElement);
      (this.config.forceMobile || F.isMobileUserAgent()) && b.addClass('mobile'),
      F.isMobileUserAgent() || b.addClass('use-opacity-transitions'),
      M.isFeatureActive('embed_refresh', {
        forum: this.forum.id
      }) && (b.addClass('embed-refresh'), M.isFeatureActive('embed_refresh_v2', {
        forum: this.forum.id
      }) && b.addClass('embed-refresh-v2'))
    },
    initMainPostBox: function () {
      if (this.form && (this.form.remove(), this.form = null), this.thread.get('isClosed')) return this.threadView.$el.find('#secondary-navigation').addClass('no-postbox'),
      void this.showClosedAlert();
      if (!this.session.get('canReply')) return this.threadView.$el.find('#secondary-navigation').addClass('no-postbox'),
      void this.session.once('change:id', this.initMainPostBox, this);
      this.threadView.$el.find('#secondary-navigation').removeClass('no-postbox');
      var a = this.form = new $({
        thread: this.thread,
        userSuggestions: this.userSuggestions,
        session: this.session
      });
      a.render(),
      this.threadView.$el.find('#form').prepend(a.$el),
      a.resize()
    },
    showClosedAlert: function () {
      if (this.thread.get('isClosed')) {
        var a = this.thread.get('reactions');
        a ? (this.listenToOnce(a, 'sync change:enabled', this.showClosedAlert), this.alert(za(a.enabled ? 'Comments and reactions for this thread are now closed.' : 'Comments for this thread are now closed'))) : (this.listenToOnce(this.thread, 'change:reactions', this.showClosedAlert), this.alert(za('Comments for this thread are now closed')))
      }
    },
    initTermsOfService: function () {
      if (this.tos && (this.tos.remove(), this.tos = null), this.listenToOnce(this.session, 'change:id', this.initTermsOfService), !(this.session.user.isAnonymous() || this.session.user.get('hasAcceptedGdprTerms') || !this.config.isPrivate && this.session.isSSO() || u.tos_exempt_forums_shortnames.includes(this.forum.id))) {
        var a = this.tos = new Ha({
          isPrivate: this.config.isPrivate,
          session: this.session
        });
        a.render(),
        this.threadView.$el.find('#tos__container').prepend(a.$el)
      }
    },
    initUserSuggestionsManager: function () {
      this.userSuggestions = new fa({
        threadId: this.thread.id
      }),
      this.userSuggestions.addRemote(this.thread.users),
      this.listenTo(this.session, 'change:id', function () {
        this.session.isLoggedIn() && (this.session.user.getFollowing(), this.session.user.following.PER_PAGE = 100, this.userSuggestions.addRemote(this.session.user.following))
      })
    },
    handleShowProfile: function (b) {
      if (!(b.ctrlKey || b.metaKey || b.shiftKey || b.altKey || !this.isInHome() && !this.sidebar)) {
        b.preventDefault();
        var c = a(b.currentTarget).attr('data-username'),
        d = a(b.currentTarget).attr('data-tab') || '';
        this.isInHome() ? y.frame.sendHostMessage('home.open', T.apps.home + 'by/' + c + '/' + d) : this.showProfileSidebar(c, d)
      }
    },
    handleShowCommunitySidebar: function (b) {
      if (!F.willOpenNewWindow(b)) {
        b.preventDefault();
        var c = a(b.currentTarget).attr('data-forum');
        y.trigger('sidebar:open', 'home/forums/' + c + '/')
      }
    },
    handleSort: Aa(function (b) {
      var c = a(b.currentTarget).attr('data-sort'),
      d = this.forum.get('votingType') === s.VOTING_TYPES.DISABLED;
      'popular' === c && d && (c = 'desc'),
      this.$el.find('[data-role="post-sort"]').replaceWith(wa({
        order: c,
        votingDisabled: d,
        forum: this.thread.forum.id
      })),
      this.thread.posts.setOrder(c),
      this.thread.posts.fetch({
        reset: !0
      }),
      y.frame.sendHostMessage('change:sort', c),
      this.inthreadAdApps = [
      ],
      this.postsView.handleSort()
    }),
    toggleThread: Aa(function () {
      var a = this.thread.get('isClosed'),
      c = za(a ? 'An error occurred while opening the thread. Please try again.' : 'An error occurred while closing the thread. Please try again.'),
      d = {
        success: function () {
          window.location.reload(!0)
        },
        error: b.bind(this.alert, this, c, {
          type: 'error'
        })
      };
      a ? this.thread.open(d) : this.thread.close(d)
    }),
    toggleThreadPremoderate: Aa(function () {
      var a = this;
      this.dismissAlert(function (a) {
        return a.options && a.options.isPremoderateError
      });
      var b = this.thread.get('validateAllPosts');
      this.thread.premoderate(!b).then(function () {
        b ? a.dismissPremoderationAlert() : a.showPremoderationAlert()
      }, function () {
        a.alert(za('An error occurred while updating the thread. Please try again.'), {
          type: 'error',
          isPremoderateError: !0
        }),
        a.thread.set('validateAllPosts', b)
      }),
      y.trigger('uiAction:clickThreadPremoderate')
    }),
    toggleThreadRatingsEnabled: Aa(function () {
      var a = this;
      I.isForumModelRatingsEnabled(this.forum) && this.thread.toggleRatingsEnabled().then(function () {
        I.isThreadModelRatingsEnabled(a.thread) && (a.session.fetchThreadDetails({
          thread: a.thread
        }), a.thread.fetchRatings())
      })
    }),
    createDeferredViewsForImages: function () {
      a('img[data-src]').each(function (b, c) {
        var d = a(c),
        e = new Da({
          el: c,
          url: d.attr('data-src')
        });
        e.relatedPost = d.attr('data-post'),
        d.removeAttr('data-src')
      })
    },
    getPosition: function () {
      return this.position
    },
    showProfileSidebar: function (a, b) {
      y.trigger('sidebar:open', 'by/' + a + '/' + b)
    },
    initResizeHandler: function () {
      var a,
      b = this;
      if (window.MutationObserver) new window.MutationObserver(function () {
        a || (a = window.requestAnimationFrame(function () {
          a = null,
          b.resize()
        }))
      }).observe(ya.body, {
        attributes: !0,
        characterData: !0,
        childList: !0,
        subtree: !0,
        attributeFilter: [
          'class',
          'style'
        ]
      });
       else {
        var c = function d() {
          b.resize(),
          window.requestAnimationFrame(d)
        };
        window.requestAnimationFrame(c)
      }
    },
    resize: function () {
      var a = x.getPageHeight();
      this._lastHeight !== a && (this._lastHeight = a, this.trigger('domReflow'), y.frame.sendHostMessage('resize', {
        height: a
      }))
    },
    handleAuth: Aa(function (a) {
      this.session.authenticate(x.extractService(a.target, 'auth'))
    }),
    handleLogout: Aa(function () {
      this.session.logout()
    }),
    audienceSync: Aa(function () {
      this.session.audienceSync()
    }),
    toggleMedia: Aa(function () {
      var a = aa.settings,
      b = !a.get('collapsed');
      a.set('collapsed', b)
    }),
    toggleReactions: Aa(function () {
      this.thread.get('reactions').toggleEnabled()
    }),
    toggleEmbedRefresh: Aa(function () {
      null === K.get('switch:embed_refresh') || K.get('switch:embed_refresh') === !0 ? (K.set('switch:embed_refresh', !1), y.trigger('uiAction:toggleClassicDisqus', !0)) : (K.remove('switch:embed_refresh'), y.trigger('uiAction:toggleClassicDisqus', !1)),
      y.frame.sendHostMessage('reset', {
        reload: !0
      })
    }),
    initTopics: function () {
      var a = this;
      if ('browsingTopics' in ya && ya.featurePolicy && ya.featurePolicy.allowsFeature && ya.featurePolicy.allowsFeature('browsing-topics')) try {
        ya.browsingTopics().then(function (b) {
          a.meta.topics = b
        })
      } catch (b) {
      }
    }
  });
  return b.extend(Ka.prototype, W.ShareMixin),
  p.call(Ka.prototype),
  x.mixin(Ka, C.UiActionEventProxy),
  o.call(Ka.prototype),
  x.mixin(Ka, C.ProfileHtmlHelpers),
  Q.call(Ka.prototype),
  {
    Lounge: Ka,
    UserMenuView: Fa,
    ThreadSubscribeButton: Ca,
    RatingsView: ha,
    ReactionsView: ia,
    BehindClickView: Ia,
    ThreadView: Ja,
    DeferredMediaView: Da,
    DebugInfoView: Ea
  }
}),
define('lounge/main', [
  'jquery',
  'core/utils/getEmbeddedData',
  'lounge/tracking',
  'lounge/views'
], function (a, b, c, d) {
  'use strict';
  return {
    init: function () {
      var e = b('threadData');
      if (!e) return {
        code: 'no_thread_data'
      };
      if (e.code) return 2 === e.code ? 'Endpoint resource not valid.' === e.response && (e.code = 'invalid_endpoint_resource') : 15 === e.code && 'Thread creations from embed disabled.' === e.response && (e.code = 'thread_creations_disabled'),
      e;
      a.extend(e.response, b('forumData')),
      a('#postCompatContainer').remove();
      var f = new d.Lounge({
        jsonData: e,
        el: window.document.body
      });
      c.init(f)
    }
  }
}),
define('lounge.bundle', function () {
});
 
Invalid Email or Password