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"> — ' + 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)) + ' – ' }, 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 () { });