framework/js/dist/forum.js.map
David Sevilla Martin 81b2f4a74e
Build JS
2020-04-18 09:18:59 -04:00

1 line
1.1 MiB

{"version":3,"sources":["webpack://@flarum/core/webpack/bootstrap","webpack://@flarum/core/./src/common/Component.ts","webpack://@flarum/core/./node_modules/@babel/runtime/helpers/esm/extends.js","webpack://@flarum/core/(webpack)/buildin/global.js","webpack://@flarum/core/./node_modules/mithril/render/vnode.js","webpack://@flarum/core/external \"m\"","webpack://@flarum/core/./node_modules/mithril/mount-redraw.js","webpack://@flarum/core/./node_modules/mithril/pathname/build.js","webpack://@flarum/core/./node_modules/mithril/pathname/parse.js","webpack://@flarum/core/./src/common/utils/patchMithril.ts","webpack://@flarum/core/./node_modules/mithril/render/hyperscript.js","webpack://@flarum/core/./node_modules/mithril/render/hyperscriptVnode.js","webpack://@flarum/core/./node_modules/mithril/promise/promise.js","webpack://@flarum/core/./node_modules/mithril/promise/polyfill.js","webpack://@flarum/core/./node_modules/timers-browserify/main.js","webpack://@flarum/core/./node_modules/mithril/render.js","webpack://@flarum/core/./node_modules/mithril/querystring/build.js","webpack://@flarum/core/./node_modules/mithril/pathname/assign.js","webpack://@flarum/core/./node_modules/mithril/querystring/parse.js","webpack://@flarum/core/./node_modules/jump.js/dist/jump.module.js","webpack://@flarum/core/../../src/index.js","webpack://@flarum/core/../../../popper/src/utils/isFunction.js","webpack://@flarum/core/./src/common/utils/patchZepto.ts","webpack://@flarum/core/./src/common/index.ts","webpack://@flarum/core/../../src/utils/isBrowser.js","webpack://@flarum/core/../../src/utils/debounce.js","webpack://@flarum/core/../../src/utils/isFunction.js","webpack://@flarum/core/../../src/utils/getStyleComputedProperty.js","webpack://@flarum/core/../../src/utils/getParentNode.js","webpack://@flarum/core/../../src/utils/getScrollParent.js","webpack://@flarum/core/../../src/utils/getReferenceNode.js","webpack://@flarum/core/../../src/utils/isIE.js","webpack://@flarum/core/../../src/utils/getOffsetParent.js","webpack://@flarum/core/../../src/utils/getRoot.js","webpack://@flarum/core/../../src/utils/findCommonOffsetParent.js","webpack://@flarum/core/../../src/utils/isOffsetContainer.js","webpack://@flarum/core/../../src/utils/getScroll.js","webpack://@flarum/core/../../src/utils/includeScroll.js","webpack://@flarum/core/../../src/utils/getBordersSize.js","webpack://@flarum/core/../../src/utils/getWindowSizes.js","webpack://@flarum/core/../../src/utils/getClientRect.js","webpack://@flarum/core/../../src/utils/getBoundingClientRect.js","webpack://@flarum/core/../../src/utils/getOffsetRectRelativeToArbitraryNode.js","webpack://@flarum/core/../../src/utils/getViewportOffsetRectRelativeToArtbitraryNode.js","webpack://@flarum/core/../../src/utils/isFixed.js","webpack://@flarum/core/../../src/utils/getFixedPositionOffsetParent.js","webpack://@flarum/core/../../src/utils/getBoundaries.js","webpack://@flarum/core/../../src/utils/computeAutoPlacement.js","webpack://@flarum/core/../../src/utils/getReferenceOffsets.js","webpack://@flarum/core/../../src/utils/getOuterSizes.js","webpack://@flarum/core/../../src/utils/getOppositePlacement.js","webpack://@flarum/core/../../src/utils/getPopperOffsets.js","webpack://@flarum/core/../../src/utils/find.js","webpack://@flarum/core/../../src/utils/runModifiers.js","webpack://@flarum/core/../../src/utils/findIndex.js","webpack://@flarum/core/../../src/methods/update.js","webpack://@flarum/core/../../src/utils/isModifierEnabled.js","webpack://@flarum/core/../../src/utils/getSupportedPropertyName.js","webpack://@flarum/core/../../src/methods/destroy.js","webpack://@flarum/core/../../src/utils/getWindow.js","webpack://@flarum/core/../../src/utils/setupEventListeners.js","webpack://@flarum/core/../../src/methods/enableEventListeners.js","webpack://@flarum/core/../../src/methods/disableEventListeners.js","webpack://@flarum/core/../../src/utils/removeEventListeners.js","webpack://@flarum/core/../../src/utils/isNumeric.js","webpack://@flarum/core/../../src/utils/setStyles.js","webpack://@flarum/core/../../src/modifiers/computeStyle.js","webpack://@flarum/core/../../src/utils/isModifierRequired.js","webpack://@flarum/core/../../src/methods/placements.js","webpack://@flarum/core/../../src/utils/clockwise.js","webpack://@flarum/core/../../src/modifiers/flip.js","webpack://@flarum/core/../../src/modifiers/offset.js","webpack://@flarum/core/../../src/modifiers/index.js","webpack://@flarum/core/../../src/methods/defaults.js","webpack://@flarum/core/../../src/modifiers/shift.js","webpack://@flarum/core/../../src/modifiers/preventOverflow.js","webpack://@flarum/core/../../src/modifiers/keepTogether.js","webpack://@flarum/core/../../src/modifiers/arrow.js","webpack://@flarum/core/../../src/utils/getOppositeVariation.js","webpack://@flarum/core/../../src/modifiers/inner.js","webpack://@flarum/core/../../src/modifiers/hide.js","webpack://@flarum/core/../../src/utils/getRoundedOffsets.js","webpack://@flarum/core/../../src/modifiers/applyStyle.js","webpack://@flarum/core/../../src/utils/setAttributes.js","webpack://@flarum/core/./node_modules/dayjs/plugin/relativeTime.js","webpack://@flarum/core/./node_modules/dayjs/plugin/localizedFormat.js","webpack://@flarum/core/./node_modules/mithril/stream.js","webpack://@flarum/core/./node_modules/zepto/dist/zepto.js-exposed","webpack://@flarum/core/./node_modules/zepto/dist/zepto.js","webpack://@flarum/core/./node_modules/dayjs/dayjs.min.js-exposed?da0f","webpack://@flarum/core/./node_modules/dayjs/dayjs.min.js-exposed","webpack://@flarum/core/./node_modules/dayjs/dayjs.min.js","webpack://@flarum/core/./node_modules/mithril/index.js-exposed","webpack://@flarum/core/./node_modules/mithril/index.js","webpack://@flarum/core/./node_modules/mithril/hyperscript.js","webpack://@flarum/core/./node_modules/mithril/render/trust.js","webpack://@flarum/core/./node_modules/mithril/render/fragment.js","webpack://@flarum/core/./node_modules/mithril/request.js","webpack://@flarum/core/./node_modules/setimmediate/setImmediate.js","webpack://@flarum/core/./node_modules/process/browser.js","webpack://@flarum/core/./node_modules/mithril/render/render.js","webpack://@flarum/core/./node_modules/mithril/api/mount-redraw.js","webpack://@flarum/core/./node_modules/mithril/request/request.js","webpack://@flarum/core/./node_modules/mithril/route.js","webpack://@flarum/core/./node_modules/mithril/api/router.js","webpack://@flarum/core/./node_modules/mithril/pathname/compileTemplate.js","webpack://@flarum/core/./node_modules/m.attrs.bidi/bidi.js-exposed","webpack://@flarum/core/./node_modules/m.attrs.bidi/bidi.js","webpack://@flarum/core/./node_modules/mousetrap/mousetrap.js-exposed","webpack://@flarum/core/./node_modules/mousetrap/mousetrap.js","webpack://@flarum/core/./node_modules/classnames/index.js-exposed","webpack://@flarum/core/./node_modules/classnames/index.js","webpack://@flarum/core/./node_modules/zepto/src/selector.js","webpack://@flarum/core/./node_modules/zepto/src/data.js","webpack://@flarum/core/./node_modules/zepto/src/fx.js","webpack://@flarum/core/./node_modules/zepto/src/fx_methods.js","webpack://@flarum/core/./node_modules/hc-sticky/dist/hc-sticky.js","webpack://@flarum/core/(webpack)/buildin/harmony-module.js","webpack://@flarum/core/(webpack)/buildin/amd-options.js","webpack://@flarum/core/./node_modules/bootstrap/js/dropdown.js","webpack://@flarum/core/./node_modules/bootstrap/js/transition.js","webpack://@flarum/core/./node_modules/mithril/stream/stream.js","webpack://@flarum/core/./node_modules/lodash/_Symbol.js","webpack://@flarum/core/./node_modules/lodash/isObjectLike.js","webpack://@flarum/core/./node_modules/lodash/flattenDeep.js","webpack://@flarum/core/./node_modules/colorthief/dist/color-thief.umd.js-exposed","webpack://@flarum/core/./node_modules/colorthief/dist/color-thief.umd.js","webpack://@flarum/core/./node_modules/lodash/_baseFlatten.js","webpack://@flarum/core/./node_modules/lodash/_arrayPush.js","webpack://@flarum/core/./node_modules/lodash/_isFlattenable.js","webpack://@flarum/core/./node_modules/lodash/_root.js","webpack://@flarum/core/./node_modules/lodash/_freeGlobal.js","webpack://@flarum/core/./node_modules/lodash/isArguments.js","webpack://@flarum/core/./node_modules/lodash/_baseIsArguments.js","webpack://@flarum/core/./node_modules/lodash/_baseGetTag.js","webpack://@flarum/core/./node_modules/lodash/_getRawTag.js","webpack://@flarum/core/./node_modules/lodash/_objectToString.js","webpack://@flarum/core/./node_modules/lodash/isArray.js","webpack://@flarum/core/./node_modules/@babel/runtime/helpers/esm/assertThisInitialized.js","webpack://@flarum/core/./node_modules/@babel/runtime/helpers/esm/inheritsLoose.js","webpack://@flarum/core/./src/common/utils/extract.ts","webpack://@flarum/core/./src/common/utils/extractText.ts","webpack://@flarum/core/./src/common/helpers/username.tsx","webpack://@flarum/core/./src/common/Translator.ts","webpack://@flarum/core/./src/common/Session.ts","webpack://@flarum/core/./src/common/Store.ts","webpack://@flarum/core/./src/common/extend.ts","webpack://@flarum/core/./src/common/utils/mapRoutes.ts","webpack://@flarum/core/./src/common/utils/Drawer.ts","webpack://@flarum/core/./src/common/utils/RequestError.ts","webpack://@flarum/core/./src/common/utils/ItemList.ts","webpack://@flarum/core/./src/common/utils/ScrollListener.ts","webpack://@flarum/core/./src/common/Model.ts","webpack://@flarum/core/./src/common/models/Forum.ts","webpack://@flarum/core/./src/common/utils/computed.ts","webpack://@flarum/core/./src/common/helpers/icon.tsx","webpack://@flarum/core/./src/common/components/Badge.tsx","webpack://@flarum/core/./src/common/models/Discussion.tsx","webpack://@flarum/core/./src/common/utils/stringToColor.ts","webpack://@flarum/core/./src/common/components/GroupBadge.ts","webpack://@flarum/core/./src/common/models/User.ts","webpack://@flarum/core/./src/common/utils/string.ts","webpack://@flarum/core/./src/common/models/Post.ts","webpack://@flarum/core/./src/common/models/Group.ts","webpack://@flarum/core/./src/common/models/Notification.ts","webpack://@flarum/core/./node_modules/spin.js/spin.js","webpack://@flarum/core/./src/common/components/LoadingIndicator.tsx","webpack://@flarum/core/./src/common/components/Button.tsx","webpack://@flarum/core/./node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js","webpack://@flarum/core/./src/common/components/Separator.tsx","webpack://@flarum/core/./src/common/helpers/listItems.tsx","webpack://@flarum/core/./src/common/components/Alert.tsx","webpack://@flarum/core/./node_modules/micromodal/dist/micromodal.es.js","webpack://@flarum/core/./src/common/components/ModalManager.tsx","webpack://@flarum/core/./src/common/components/Modal.tsx","webpack://@flarum/core/./src/common/components/RequestErrorModal.tsx","webpack://@flarum/core/./src/common/components/AlertManager.tsx","webpack://@flarum/core/./src/common/Application.ts","webpack://@flarum/core/./src/forum/utils/History.ts","webpack://@flarum/core/./src/forum/utils/Pane.ts","webpack://@flarum/core/./src/common/components/LinkButton.tsx","webpack://@flarum/core/./src/common/components/Navigation.tsx","webpack://@flarum/core/./src/forum/components/HeaderPrimary.tsx","webpack://@flarum/core/./src/forum/components/LogInButtons.tsx","webpack://@flarum/core/./src/forum/components/SignUpModal.tsx","webpack://@flarum/core/./src/forum/components/LogInModal.tsx","webpack://@flarum/core/./src/common/helpers/avatar.tsx","webpack://@flarum/core/./src/common/components/Dropdown.tsx","webpack://@flarum/core/./src/forum/components/SessionDropdown.tsx","webpack://@flarum/core/./src/common/components/SelectDropdown.tsx","webpack://@flarum/core/./src/forum/components/NotificationList.tsx","webpack://@flarum/core/./src/forum/components/NotificationsDropdown.tsx","webpack://@flarum/core/./src/forum/utils/KeyboardNavigatable.ts","webpack://@flarum/core/./src/common/helpers/highlight.ts","webpack://@flarum/core/./src/forum/components/SearchSource.ts","webpack://@flarum/core/./src/forum/components/DiscussionsSearchSource.tsx","webpack://@flarum/core/./src/forum/components/UsersSearchSource.tsx","webpack://@flarum/core/./src/forum/components/Search.tsx","webpack://@flarum/core/./src/forum/components/HeaderSecondary.tsx","webpack://@flarum/core/./src/forum/utils/PostControls.tsx","webpack://@flarum/core/./src/common/utils/SubtreeRetainer.ts","webpack://@flarum/core/./src/forum/components/Post.tsx","webpack://@flarum/core/./src/common/utils/humanTime.ts","webpack://@flarum/core/./src/forum/components/EditUserModal.tsx","webpack://@flarum/core/./src/forum/components/Page.tsx","webpack://@flarum/core/./src/forum/utils/affixSidebar.ts","webpack://@flarum/core/./src/forum/components/UserPage.tsx","webpack://@flarum/core/./src/forum/utils/UserControls.ts","webpack://@flarum/core/./src/forum/components/AvatarEditor.tsx","webpack://@flarum/core/./src/forum/components/UserCard.tsx","webpack://@flarum/core/./src/common/helpers/userOnline.tsx","webpack://@flarum/core/./src/forum/components/PostUser.tsx","webpack://@flarum/core/./src/common/helpers/humanTime.tsx","webpack://@flarum/core/./src/common/helpers/fullTime.tsx","webpack://@flarum/core/./src/forum/components/PostMeta.tsx","webpack://@flarum/core/./src/forum/components/PostEdited.tsx","webpack://@flarum/core/./src/forum/components/CommentPost.tsx","webpack://@flarum/core/./src/forum/components/DiscussionRenamedPost.tsx","webpack://@flarum/core/./src/forum/components/EventPost.tsx","webpack://@flarum/core/./src/common/utils/abbreviateNumber.tsx","webpack://@flarum/core/./src/forum/components/TerminalPost.tsx","webpack://@flarum/core/./src/forum/components/DiscussionHero.tsx","webpack://@flarum/core/./src/forum/components/LoadingPost.tsx","webpack://@flarum/core/./src/common/utils/anchorScroll.ts","webpack://@flarum/core/./src/forum/components/ReplyPlaceholder.tsx","webpack://@flarum/core/./src/common/utils/Evented.ts","webpack://@flarum/core/./src/forum/components/PostStream.tsx","webpack://@flarum/core/./src/common/utils/formatNumber.ts","webpack://@flarum/core/./src/forum/components/PostStreamScrubber.tsx","webpack://@flarum/core/./src/common/components/SplitDropdown.tsx","webpack://@flarum/core/./src/forum/components/DiscussionPage.tsx","webpack://@flarum/core/./src/forum/components/RenameDiscussionModal.tsx","webpack://@flarum/core/./src/forum/utils/DiscussionControls.tsx","webpack://@flarum/core/./src/forum/components/DiscussionListItem.tsx","webpack://@flarum/core/./src/common/components/Placeholder.tsx","webpack://@flarum/core/./src/forum/components/DiscussionList.tsx","webpack://@flarum/core/./src/forum/components/WelcomeHero.tsx","webpack://@flarum/core/./src/forum/components/IndexPage.tsx","webpack://@flarum/core/./src/forum/components/PostsUserPage.tsx","webpack://@flarum/core/./src/forum/components/DiscussionsUserPage.tsx","webpack://@flarum/core/./src/common/components/FieldSet.tsx","webpack://@flarum/core/./src/common/components/Checkbox.tsx","webpack://@flarum/core/./src/common/components/Switch.tsx","webpack://@flarum/core/./src/forum/components/NotificationGrid.tsx","webpack://@flarum/core/./src/forum/components/ChangePasswordModal.tsx","webpack://@flarum/core/./src/forum/components/ChangeEmailModal.tsx","webpack://@flarum/core/./src/forum/components/SettingsPage.tsx","webpack://@flarum/core/./src/forum/components/NotificationsPage.tsx","webpack://@flarum/core/./src/forum/Forum.ts","webpack://@flarum/core/./src/forum/routes.ts","webpack://@flarum/core/./src/forum/app.ts","webpack://@flarum/core/./src/common/components/Select.tsx","webpack://@flarum/core/./src/common/compat.ts","webpack://@flarum/core/./src/forum/compat.ts","webpack://@flarum/core/./src/forum/index.ts"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","Component","props","element","this","tag","view","vnode","Error","oninit","setProps","oncreate","dom","onbeforeupdate","onupdate","onbeforeremove","onremove","$","selector","$element","find","render","constructor","component","children","componentProps","initProps","attrs","_extends","assign","target","arguments","length","source","apply","g","Function","e","window","Vnode","text","domSize","undefined","state","events","instance","normalize","node","Array","isArray","normalizeChildren","String","input","isKeyed","TypeError","require","requestAnimationFrame","console","buildQueryString","template","params","test","SyntaxError","queryIndex","indexOf","hashIndex","queryEnd","pathEnd","path","slice","query","resolved","replace","variadic","encodeURIComponent","newQueryIndex","newHashIndex","newQueryEnd","newPathEnd","result","querystring","parseQueryString","url","mo","_m","comp","args","writable","bidi","route","href","Link","keys","forEach","withAttr","cb","getAttribute","prop","hyperscriptVnode","selectorParser","selectorCache","hasOwn","isEmpty","compileSelector","match","classes","exec","type","id","push","attrValue","className","join","execSelector","hasClass","class","newAttrs","start","PromisePolyfill","Promise","finally","global","executor","self","resolvers","rejectors","resolveCurrent","handler","rejectCurrent","_instance","callAsync","setImmediate","setTimeout","list","shouldAbsorb","execute","then","error","retry","executeOnce","runs","run","fn","onerror","onFulfilled","onRejection","resolveNext","rejectNext","handle","callback","next","promise","resolve","reject","catch","reason","all","total","count","values","consume","race","scope","Timeout","clearFn","_id","_clearFn","clearTimeout","setInterval","clearInterval","timeout","close","unref","ref","enroll","item","msecs","_idleTimeoutId","_idleTimeout","unenroll","_unrefActive","active","_onTimeout","clearImmediate","toString","destructure","string","charAt","entries","split","counters","data","entry","decodeURIComponent","levels","cursor","pop","j","level","nextLevel","isNumber","isNaN","parseInt","desc","getOwnPropertyDescriptor","easeInOutQuad","b","_typeof","iterator","obj","singleton","stop","offset","easing","a11y","distance","duration","timeStart","timeElapsed","location","scrollY","pageYOffset","top","getBoundingClientRect","loop","timeCurrent","scrollTo","setAttribute","focus","done","options","document","querySelector","jumper","DEFAULT_OPTIONS","Tooltip","reference","title","allowHtml","tooltipGenerator","tooltipNode","Math","titleNode","functionToCheck","getType","container","placement","arrowSelector","boundariesElement","func","event","directEvents","oppositeEvents","evt","popper","delay","computedDelay","lastTitle","show","hide","dispose","toggle","updateTitleContent","_events","_setTooltipNodeEvent","relatedreference","relatedreference2","evt2","tooltip","option","each","$this","attr","removeAttr","includes","dimension","Dimension","toUpperCase","margin","elem","size","width","height","side","css","expr","tagName","hover","leave","on","animateScrollTop","to","fx","speeds","_default","jump","slideUp","overflow","animate","extend","special","bindBeforeSpecialEvents","eventName","el","specialEvent","_init","originalHandler","$target","trigger","setup","dayjs","relativeTime","localizedFormat","patchMithril","navigator","timeoutDuration","longerTimeoutBrowsers","isBrowser","called","scheduled","isFunction","getStyleComputedProperty","getParentNode","getScrollParent","overflowX","overflowY","getReferenceNode","isIE11","isIE10","isIE","version","getOffsetParent","noOffsetParent","offsetParent","nodeName","getRoot","findCommonOffsetParent","element1","element2","order","Node","end","range","commonAncestorContainer","element1root","getScroll","upperSide","html","scrollingElement","includeScroll","rect","subtract","scrollTop","scrollLeft","modifier","getBordersSize","styles","axis","sideA","sideB","parseFloat","getSize","body","computedStyle","getWindowSizes","getComputedStyle","getClientRect","offsets","sizes","horizScrollbar","vertScrollbar","getOffsetRectRelativeToArbitraryNode","parent","fixedPosition","runIsIE","isHTML","childrenRect","parentRect","scrollParent","borderTopWidth","borderLeftWidth","marginTop","marginLeft","getViewportOffsetRectRelativeToArtbitraryNode","excludeScroll","relativeOffset","isFixed","parentNode","getFixedPositionOffsetParent","getBoundaries","boundaries","left","boundariesNode","isPaddingNumber","padding","getArea","computeAutoPlacement","rects","refRect","bottom","sortedAreas","a","filteredAreas","filter","computedPlacement","variation","getReferenceOffsets","commonOffsetParent","getOuterSizes","x","y","getOppositePlacement","hash","right","matched","getPopperOffsets","referenceOffsets","popperRect","popperOffsets","isHoriz","mainSide","secondarySide","measurement","secondaryMeasurement","arr","check","runModifiers","modifiers","ends","findIndex","cur","update","flip","positionFixed","isModifierEnabled","modifierName","some","getSupportedPropertyName","prefixes","upperProp","prefix","toCheck","destroy","getWindow","ownerDocument","setupEventListeners","passive","scrollElement","attachToScrollParents","scrollParents","isBody","enableEventListeners","disableEventListeners","removeEventListeners","isNumeric","isFinite","setStyles","unit","isFirefox","isModifierRequired","requesting","isRequired","requested","validPlacements","placements","clockwise","counter","index","BEHAVIORS","parseOffset","useHeight","basePlacement","fragments","map","frag","divider","splitRegex","ops","mergeWithPrevious","op","str","toValue","index2","shiftvariation","isVertical","shiftOffsets","transformProp","popperStyles","transform","floor","opSide","arrowElement","len","sideCapitalized","altSide","arrowElementSize","center","popperMarginSide","popperBorderSide","sideValue","placementOpposite","flipOrder","refOffsets","overlapsRef","overflowsLeft","overflowsRight","overflowsTop","overflowsBottom","overflowsBoundaries","flippedVariationByRef","flippedVariationByContent","flippedVariation","getOppositeVariation","subtractLength","bound","legacyGpuAccelerationOption","gpuAcceleration","offsetParentRect","position","shouldRound","round","noRound","v","referenceWidth","popperWidth","isVariation","horizontalToInteger","verticalToInteger","bothOddWidth","getRoundedOffsets","prefixedProperty","invertTop","invertLeft","attributes","Popper","debounce","modifierOptions","eventsEnabled","Utils","PopperUtils","Defaults","en","future","past","mm","h","hh","dd","M","MM","yy","u","$locale","f","diff","abs","from","$u","utc","toNow","fromNow","format","LTS","LT","L","LL","LLL","LLLL","formats","define","Zepto","classList","camelize","uniq","emptyArray","concat","elementDisplay","classCache","cssNumber","fragmentRE","singleTagRE","tagExpanderRE","rootNodeRE","capitalRE","methodAttributes","table","createElement","tableRow","containers","readyRE","simpleSelectorRE","class2type","zepto","tempParent","propMap","isWindow","isDocument","nodeType","DOCUMENT_NODE","isObject","isPlainObject","getPrototypeOf","likeArray","dasherize","toLowerCase","classRE","RegExp","maybeAddPx","childNodes","Z","deep","filtered","nodes","funcArg","context","arg","idx","payload","removeAttribute","klass","svg","baseVal","deserializeValue","parseJSON","traverseNode","fun","matches","matchesSelector","webkitMatchesSelector","mozMatchesSelector","oMatchesSelector","temp","appendChild","qsa","removeChild","chr","array","fragment","properties","$1","innerHTML","isZ","init","trim","ready","shift","found","maybeID","maybeClass","nameOnly","isSimple","getElementById","getElementsByClassName","getElementsByTagName","querySelectorAll","contains","documentElement","isEmptyObject","val","num","Number","inArray","camelCase","uuid","support","noop","elements","grep","JSON","parse","reduce","sort","splice","toArray","readyState","addEventListener","remove","every","not","add","is","excludes","has","eq","first","last","closest","collection","_","parents","ancestors","pluck","contents","contentDocument","siblings","child","empty","display","style","getPropertyValue","replaceWith","newContent","before","wrap","structure","clone","wrapAll","cloneNode","append","wrapInner","unwrap","setting","prev","originHtml","newText","textContent","attribute","removeProp","attrName","multiple","selected","coordinates","coords","parentOffset","pageXOffset","removeProperty","cssText","addClass","cls","removeClass","toggleClass","when","hasScrollTop","scrollX","hasScrollLeft","detach","dimensionProperty","operator","operatorIndex","inside","argType","copyByClone","nextSibling","firstChild","parentInDocument","insertBefore","src","defaultView","_zid","isString","handlers","specialEvents","focusinSupported","blur","mouseenter","mouseleave","zid","findHandlers","matcher","sel","parts","eventCapture","captureSetting","del","realEvent","delegator","capture","set","related","relatedTarget","proxy","compatible","isImmediatePropagationStopped","_args","preventDefault","stopPropagation","removeEventListener","click","mousedown","mouseup","mousemove","proxyFn","unshift","unbind","off","one","returnTrue","returnFalse","ignoreProperties","eventMethods","stopImmediatePropagation","isDefaultPrevented","predicate","sourceMethod","timeStamp","Date","now","defaultPrevented","returnValue","getPreventDefault","createProxy","originalEvent","delegate","undelegate","live","die","autoRemove","currentTarget","liveFired","Event","dispatchEvent","triggerHandler","createEvent","bubbles","initEvent","jsonpID","rscript","scriptTypeRE","xmlTypeRE","blankRE","originAnchor","triggerGlobal","settings","triggerAndReturn","ajaxBeforeSend","xhr","beforeSend","ajaxSuccess","deferred","success","resolveWith","ajaxComplete","ajaxError","rejectWith","status","complete","ajaxStop","appendQuery","parseArguments","dataType","ajaxJSONP","ajax","responseData","abortTimeout","_callbackName","jsonpCallback","callbackName","script","originalCallback","abort","errorType","head","ajaxSettings","XMLHttpRequest","accepts","json","xml","crossDomain","processData","cache","dataFilter","urlAnchor","Deferred","ajaxStart","protocol","host","param","traditional","serializeData","hasPlaceholder","jsonp","mime","headers","setHeader","nativeSetHeader","setRequestHeader","mimeType","overrideMimeType","contentType","onreadystatechange","mimeToDataType","getResponseHeader","responseType","response","responseText","ajaxDataFilter","eval","responseXML","statusText","async","open","username","password","xhrFields","send","post","getJSON","load","escape","serialize","serializeArray","field","disabled","checked","elm","submit","nativeGetComputedStyle","pseudoElement","factory","z","utcOffset","year","month","ceil","w","D","ms","Q","weekdays","months","pl","date","locale","$L","$offset","$d","NaN","UTC","$y","getFullYear","$M","getMonth","$D","getDate","$W","getDay","$H","getHours","$m","getMinutes","$s","getSeconds","$ms","getMilliseconds","$utils","isValid","isSame","startOf","endOf","isAfter","isBefore","$g","day","hour","minute","second","millisecond","unix","valueOf","getTime","toDate","weekStart","$set","min","daysInMonth","substr","meridiem","YY","YYYY","MMM","monthsShort","MMMM","DD","weekdaysMin","ddd","weekdaysShort","dddd","H","HH","A","ss","SSS","getTimezoneOffset","toJSON","toISOString","toUTCString","isDayjs","Ls","hyperscript","request","mountRedraw","trust","mount","redraw","parsePathname","buildPathname","registerImmediate","channel","messagePrefix","onGlobalMessage","nextHandle","tasksByHandle","currentlyRunningATask","doc","attachTo","process","nextTick","runIfPresent","postMessage","importScripts","postMessageIsAsynchronous","oldOnMessage","onmessage","canUsePostMessage","MessageChannel","port1","port2","random","attachEvent","task","cachedSetTimeout","cachedClearTimeout","defaultSetTimout","defaultClearTimeout","runTimeout","currentQueue","queue","draining","queueIndex","cleanUpNextTick","drainQueue","marker","runClearTimeout","Item","browser","env","argv","versions","addListener","once","removeListener","removeAllListeners","emit","prependListener","prependOnceListener","listeners","binding","cwd","chdir","dir","umask","$window","currentRedraw","$doc","nameSpace","math","getNameSpace","xmlns","checkState","original","callHook","activeElement","createNodes","vnodes","hooks","createNode","initLifecycle","createTextNode","insertNode","createText","createHTML","createDocumentFragment","createFragment","createElementNS","setAttr","setAttrs","maybeSetContentEditable","selectedIndex","normalized","setLateSelectAttrs","sentinel","$$reentrantLock$$","initComponent","createComponent","possibleParents","caption","thead","tbody","tfoot","tr","th","td","colgroup","col","updateNodes","old","removeNodes","isOldKeyed","oldStart","oe","ve","topSibling","oldEnd","updateNode","getNextSibling","moveNodes","lisIndices","originalNextSibling","vnodesLength","oldIndices","li","pos","getKeyMap","oldIndex","il","lisTemp","makeLisIndices","commonLength","removeNode","oldTag","force","shouldNotUpdate","updateLifecycle","nodeValue","updateText","removeHTML","updateHTML","updateFragment","updateAttrs","updateElement","updateComponent","moveChildToFrag","contenteditable","contentEditable","content","stateResult","attrsResult","mask","reallyRemove","isLifecycleMethod","isFormAttribute","updateEvent","setAttributeNS","updateStyle","hasPropertyKey","nsLastIndex","uppercaseRegex","capital","normalizeKey","setProperty","EventDict","handleEvent","ev","namespace","namespaceURI","prevRedraw","schedule","subscriptions","rendering","pending","sync","root","oncompletion","callbackCount","PromiseProxy","makeRequest","background","hasHeader","__proto__","replacedAbort","method","assumeJSON","FormData","extract","aborted","user","deserialize","withCredentials","message","code","config","stringify","callbackKey","compileTemplate","fireAsync","setPath","history","replaceState","pushState","currentPath","lastUpdate","currentResolver","SKIP","defaultRoute","routes","compiled","defaultData","ReferenceError","resolveRoute","search","pathname","fail","matchedRoute","localComp","onmatch","onclick","Boolean","button","which","ctrlKey","metaKey","shiftKey","altKey","templateData","templateKeys","regexp","extra","k","multi","onchange","selectedOptions","oninput","ctrl","_REVERSE_MAP","_MAP","8","9","13","16","17","18","20","27","32","33","34","35","36","37","38","39","40","45","46","91","93","224","_KEYCODE_MAP","106","107","109","110","111","186","187","188","189","190","191","192","219","220","221","222","_SHIFT_MAP","_SPECIAL_ALIASES","platform","Mousetrap","action","_bindMultiple","_directMap","reset","_callbacks","stopCallback","_belongsTo","ancestor","composedPath","initialEventTarget","isContentEditable","handleKey","_handleKey","addKeycodes","documentMousetrap","_addEvent","_characterFromEvent","character","fromCharCode","_isModifier","_pickBestAction","_getReverseMap","_getKeyInfo","combination","_keysFromString","targetElement","_resetTimer","_sequenceLevels","_ignoreNextKeyup","_ignoreNextKeypress","_nextExpectedAction","_resetSequences","doNotReset","activeSequences","_getMatches","sequenceName","modifiers1","modifiers2","seq","deleteCombo","combo","deleteSequence","_fireCallback","sequence","srcElement","_preventDefault","cancelBubble","_stopPropagation","_handleKeyEvent","keyCode","_eventModifiers","_bindSequence","_increaseSequence","nextAction","_callbackAndReset","wrappedCallback","_bindSingle","info","callbacks","maxLevel","processedSequenceCallback","max","ignoreThisKeypress","combinations","classNames","inner","default","oldQsa","oldMatches","visible","filters","hidden","filterRe","childRe","classTag","taggedParent","dataAttr","exp","expando","setData","store","attributeData","camelName","getData","hasData","removeData","names","methodName","origFn","eventPrefix","transitionProperty","transitionDuration","transitionTiming","transitionDelay","animationName","animationDuration","animationTiming","animationDelay","testEl","supportedTransforms","cssReset","normalizeEvent","Webkit","Moz","O","vendor","fast","slow","cssPrefix","transitionEnd","animationEnd","ease","anim","cssProperties","cssValues","transforms","that","endEvent","fired","clientLeft","origShow","origHide","origToggle","speed","opacity","scale","fadeTo","fadeIn","fadeOut","fadeToggle","U","Y","bottomEnd","innerTop","innerSticker","stickyClass","stickTo","followScroll","responsive","mobileFirst","onStart","onStop","onBeforeResize","onResize","resizeDebounce","disable","queries","queryFlow","log","X","Helpers","getStyle","innerWidth","stick","isAttached","attach","offsetLeft","release","positionLeft","S","E","T","C","N","R","offsetHeight","B","I","q","getCascadedStyle","verticalAlign","boxSizing","marginRight","marginBottom","paddingLeft","paddingRight","float","cssFloat","MozBoxSizing","offsetWidth","HTMLDocument","Document","clientHeight","scrollHeight","innerHeight","offsetTop","F","P","W","V","refresh","triggerMethod","reinit","jQuery","hcSticky","configurable","detachEvent","currentStyle","originalModule","webpackPolyfill","__webpack_amd_options__","Dropdown","getParent","$parent","clearMenus","VERSION","isActive","insertAfter","keydown","$items","dropdown","Constructor","noConflict","emulateTransitionEnd","$el","transition","transEndEventNames","WebkitTransition","MozTransition","OTransition","bsTransitionEnd","bindType","delegateType","handleObj","Stream","lift","streams","merge","scan","acc","origin","stream","combine","scanMerge","tuples","seed","tuple","changed","warnedHalt","dependentStreams","dependentFns","_changing","_state","createEnd","_parents","_unregisterChild","_map","ignoreInitial","s1","s2","childIndex","mappers","endStream","mapper","baseFlatten","naturalOrder","sum","peek","debug","r1","r2","g1","g2","b1","b2","histo","vboxes","vbox","volume","copy","_volume","_count_set","_count","avg","_avg","gval","bval","color","palette","nearest","sqrt","pow","forcebw","quantize","canvas","getContext","drawImage","getImageData","getColor","getPalette","colorCount","quality","isInteger","getColorFromUrl","onload","Uint8Array","btoa","getColorAsync","arrayPush","isFlattenable","depth","isStrict","isArguments","spreadableSymbol","isConcatSpreadable","freeGlobal","freeSelf","baseIsArguments","isObjectLike","objectProto","propertyIsEnumerable","baseGetTag","getRawTag","objectToString","symToStringTag","nativeObjectToString","isOwn","unmasked","_assertThisInitialized","_inheritsLoose","subClass","superClass","extractText","vdom","displayName","app","translator","trans","Translator","translations","addTranslations","parameters","translation","transText","transChoice","number","pluralize","hydrated","part","sPluralRegex","cPluralRegex","iPluralRegex","standardRules","explicitRules","rule","leftNumber","convertNumber","rightNumber","pluralPosition","NEGATIVE_INFINITY","POSITIVE_INFINITY","Session","csrfToken","login","forum","logout","Store","models","pushPayload","included","pushObject","pushData","createRecord","exists","getById","getBy","model","records","override","newMethod","mapRoutes","basePath","routeName","Drawer","$backdrop","isOpen","appendTo","RequestError","alert","priority","ItemList","items","itemName","later","webkitRequestAnimationFrame","mozRequestAnimationFrame","msRequestAnimationFrame","oRequestAnimationFrame","ScrollListener","ticking","Model","freshness","innerKey","getIdentifier","pushAttributes","save","relationships","oldData","copyData","meta","apiEndpoint","delete","hasOne","relationship","hasMany","transformDate","Forum","computed","dependentKeys","compute","computedValue","dependentValues","recompute","icon","fontClass","Badge","iconName","label","Discussion","slug","createdAt","firstPost","lastPostedAt","lastPostedUser","lastPost","lastPostNumber","commentCount","replyCount","posts","mostRelevantPost","lastReadAt","lastReadPostNumber","isUnread","unreadCount","isRead","session","hiddenAt","hiddenUser","isHidden","canReply","canRename","canHide","canDelete","removePost","markedAllAsReadAt","badges","postIds","link","stringToColor","charCodeAt","rgb","hsvToRgb","GroupBadge","group","backgroundColor","nameSingular","User","email","isEmailConfirmed","avatarUrl","preferences","groups","joinTime","lastSeenAt","unreadNotificationCount","newNotificationCount","discussionCount","canEdit","avatarColor","calculateAvatarColor","isOnline","image","Image","colorThief","ColorThief","crossOrigin","savePreferences","newPreferences","truncate","substring","getPlainContent","removeSelectors","ucfirst","Post","discussion","contentHtml","contentPlain","editedAt","editedUser","isEdited","Group","namePlural","ADMINISTRATOR_ID","GUEST_ID","MEMBER_ID","Notification","fromUser","subject","__assign","defaults","lines","radius","corners","fadeColor","animation","rotate","direction","zIndex","shadow","Spinner","opts","spin","borderRadius","shadows","boxShadow","regex","_i","_a","xUnits","yUnits","parseBoxShadow","degrees","backgroundLine","transformOrigin","line","normalizeShadow","drawLines","cancelAnimationFrame","animateId","shadows_1","xy","convertOffset","radians","PI","sin","cos","LoadingIndicator","sizeOptions","Button","excluded","sourceKeys","loading","getButtonContent","Separator","isSeparator","listItems","prevItem","newItems","withoutUnnecessarySeparators","isListItem","itemClassName","Alert","controls","dismissible","ondismiss","dismissControl","_defineProperties","descriptor","_toConsumableArray","_arrayLikeToArray","_arrayWithoutHoles","iter","_iterableToArray","minLen","_unsupportedIterableToArray","_nonIterableSpread","arr2","FOCUSABLE_ELEMENTS","Modal","activeModal","validateModalPresence","validateArgs","MicroModal","_ref","targetModal","_ref$triggers","triggers","_ref$onShow","onShow","_ref$onClose","onClose","_ref$openTrigger","openTrigger","_ref$closeTrigger","closeTrigger","_ref$openClass","openClass","_ref$disableScroll","disableScroll","_ref$disableFocus","disableFocus","_ref$awaitCloseAnimat","awaitCloseAnimation","_ref$awaitOpenAnimati","awaitOpenAnimation","_ref$debugMode","debugMode","_classCallCheck","modal","registerTriggers","onClick","onKeydown","protoProps","staticProps","_this","_len","_key","showModal","_this2","scrollBehaviour","addEventListeners","setFocusToFirstNode","closeModal","hasAttribute","retainFocus","_this3","focusableNodes","getFocusableNodes","nodesWhichAreNotCloseTargets","focusedItemIndex","warn","triggerMap","validateTriggerPresence","triggerAttr","generateTriggerMap","closeModalById","ModalManager","showing","hideTimeout","modalProps","backdrop","clear","onready","onhide","isDismissible","onsubmit","select","loaded","errors","pointer","RequestErrorModal","AlertManager","components","dismiss","Application","initializers","forums","users","discussions","notifications","booted","requestError","titleCount","drawer","alerts","boot","initializer","resources","userId","bootExtensions","extensions","extension","flattenDeep","$modal","$alerts","$content","$app","preloadedApiDocument","apiDocument","results","setTitle","updateTitle","setTitleCount","queryString","originalOptions","errorHandler","res","detail","isDebug","showDebug","History","stack","getCurrent","getPrevious","secondTop","canGoBack","back","home","backUrl","Pane","pinnedKey","pinned","localStorage","getItem","enable","onmouseleave","togglePinned","setItem","LinkButton","Navigation","pane","onmouseenter","getBackButton","getPaneButton","getDrawerButton","previous","HeaderPrimary","LogInButtons","SignUpModal","footer","isProvided","provided","token","fields","placeholder","logIn","identification","LogInModal","submitData","reload","remember","forgotPassword","signUp","ForgotPasswordModal","avatar","hasTitle","buttonClassName","menuClassName","caretIcon","getButton","getMenu","onshow","$menu","isRight","data-toggle","SessionDropdown","SelectDropdown","activeChild","defaultLabel","NotificationList","moreResults","$scrollParent","scrollHandler","pages","markAllAsRead","notification","NotificationComponent","notificationComponents","$notifications","viewportHeight","contentTop","contentHeight","loadMore","page","parseResults","links","NotificationsDropdown","newNotifications","getNewCount","unread","getUnreadCount","menuClick","goToRoute","KeyboardNavigatable","whenCallback","onUp","onDown","onSelect","onCancel","onRemove","selectionStart","selectionEnd","bindTo","navigate","keyCallback","highlight","phrase","highlighted","SearchSource","DiscussionsSearchSource","limit","include","data-index","UsersSearchSource","lastIndexOf","localeCompare","Search","hasFocus","sources","loadingSources","searched","searchTimeout","currentSearch","getCurrentSearch","sourceItems","onfocus","onblur","setIndex","getCurrentNumericIndex","selectableItems","$input","selectResult","current","searching","clearSearch","$item","scrollToItem","$dropdown","fixedIndex","dropdownScroll","dropdownTop","dropdownBottom","outerHeight","itemTop","itemBottom","HeaderSecondary","locales","cookie","section","moderation","editAction","destructive","restoreAction","deleteAction","hideAction","EditPostComposer","composer","discussionList","removeDiscussion","viewingDiscussion","SubtreeRetainer","controlsOpen","subtree","PostControls","actionItems","footerItems","$actions","$controls","existing","humanTime","time","EditUserModal","setPassword","activate","Page","bodyClass","affixSidebar","$sidebar","$header","$affixElement","UserPage","UserCard","editable","controlsButtonClassName","sidebarItems","lassName","loadUser","lowercaseUsername","navItems","confirm","showDeletionAlert","AvatarEditor","isDraggedOver","quickUpload","ondragover","enableDragover","ondragenter","ondragleave","disableDragover","ondragend","ondrop","dropUpload","controlItems","openPicker","upload","dataTransfer","files","file","raw","failure","UserControls","infoItems","online","ago","userOnline","PostUser","cardVisible","card","showCard","hideCard","datetime","full","humanTimeUtil","pubdate","data-humantime","fullTime","PostMeta","permalink","getPermalink","touch","ipAddress","PostEdited","shouldUpdateTooltip","oldEditedInfo","editedInfo","CommentPost","revealContent","postUser","isEditing","headerItems","configPreview","isInitialized","preview","updatePreview","s9e","TextFormatter","updateInterval","onunload","toggleContent","DiscussionRenamedPost","description","renamed","oldName","descriptionData","oldTitle","newTitle","new","usernameHelper","descriptionKey","TerminalPost","DiscussionHero","LoadingPost","anchorScroll","relativeScroll","ReplyPlaceholder","DiscussionControls","replyAction","oncreatePreview","anchorToBottom","Evented","getHandlers","wrapper","PostStream","paused","scrollListener","onscroll","loadPageTimeouts","pagesLoading","calculatePositionTimeout","visibleStart","visibleEnd","viewingEnd","includedPosts","goToNumber","noAnimation","goToLast","flashItem","loadNearNumber","scrollToNumber","unpause","goToIndex","backwards","loadNearIndex","scrollToIndex","goToFirst","loadRange","sanitizeIndex","loadCount","lastTime","fadedIn","PostComponent","postComponents","period","loadNext","getMarginTop","viewportTop","loadPrevious","calculatePosition","twoPagesAway","loadPage","loadIds","near","startNumber","endNumber","$container","scrollBottom","formatNumber","maximumSignificantDigits","toLocaleString","PostStreamScrubber","dragging","mouseStart","indexStart","unreadPercent","viewing","styleUnread","newStyle","oldStyle","renderScrollbar","streamWasUnpaused","visibleTop","visiblePost","ondestroy","onresize","resize","onmousedown","onmousemove","onmouseup","percentPerPost","$scrubber","heights","after","$part","minPercentVisible","percentPerVisiblePost","scrubber","scrollbar","TouchEvent","touches","clientY","deltaIndex","newIndex","intIndex","$scrollbar","offsetPercent","offsetIndex","SplitDropdown","getFirstChild","buttonProps","DiscussionPage","idParam","postStream","positionChanged","oncreatePane","preloadedDiscussion","requestParams","discussionId","record","$list","$discussion","listTop","listBottom","discussionTop","discussionBottom","RenameDiscussionModal","currentTitle","renameAction","forceRefresh","composingReplyTo","ReplyComposer","isFullScreen","DiscussionListItem","highlightRegExp","showUnread","showRepliesCount","jumpTo","markAsRead","abbreviateNumber","slidableInstance","slidable","showFirstPost","excerpt","Placeholder","DiscussionList","data-id","sortMap","relevance","latest","newest","oldest","loadResults","preloadedDiscussions","addDiscussion","WelcomeHero","IndexPage","lastDiscussion","hero","viewItems","oldHeroHeight","heroHeight","scroll","indexTop","indexBottom","canStartDiscussion","newDiscussionAction","stickyParams","sortOptions","changeSort","PostsUserPage","loadLimit","DiscussionsUserPage","FieldSet","Checkbox","getDisplay","Switch","NotificationGrid","methods","notificationMethods","inputs","types","notificationTypes","preferenceKey","preference","toggleMethod","toggleType","enabled","control","ChangePasswordModal","ChangeEmailModal","SettingsPage","settingsItems","accountItems","notificationsItems","privacyItems","preferenceSaver","discloseOnline","NotificationsPage","comment","discussionRenamed","hasNear","defaultAction","Select","humanTimeHelper","compat"],"mappings":"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","file":"forum.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"/dist/\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 76);\n","import Mithril, { ClassComponent, Vnode } from 'mithril';\r\n\r\nexport type ComponentProps = {\r\n children?: Mithril.Children;\r\n\r\n className?: string;\r\n\r\n [key: string]: any;\r\n};\r\n\r\nexport default class Component<T extends ComponentProps = any> implements ClassComponent {\r\n element!: HTMLElement;\r\n\r\n props: T;\r\n\r\n constructor(props: T = <T>{}) {\r\n this.props = props.tag ? <T>{} : props;\r\n }\r\n\r\n view(vnode) {\r\n throw new Error('Component#view must be implemented by subclass');\r\n }\r\n\r\n oninit(vnode) {\r\n this.setProps(vnode);\r\n }\r\n\r\n oncreate(vnode) {\r\n this.setProps(vnode);\r\n this.element = vnode.dom;\r\n }\r\n\r\n onbeforeupdate(vnode) {\r\n this.setProps(vnode);\r\n }\r\n\r\n onupdate(vnode) {\r\n this.setProps(vnode);\r\n }\r\n\r\n onbeforeremove(vnode) {\r\n this.setProps(vnode);\r\n }\r\n\r\n onremove(vnode) {\r\n this.setProps(vnode);\r\n }\r\n\r\n /**\r\n * Returns a jQuery object for this component's element. If you pass in a\r\n * selector string, this method will return a jQuery object, using the current\r\n * element as its buffer.\r\n *\r\n * For example, calling `component.$('li')` will return a jQuery object\r\n * containing all of the `li` elements inside the DOM element of this\r\n * component.\r\n *\r\n * @param selector a jQuery-compatible selector string\r\n * @final\r\n */\r\n $(selector?: string): ZeptoCollection {\r\n const $element = $(this.element);\r\n\r\n return selector ? $element.find(selector) : $element;\r\n }\r\n\r\n render() {\r\n return m(this.constructor as typeof Component, this.props);\r\n }\r\n\r\n static component(props: ComponentProps | any = {}, children?: Mithril.Children) {\r\n const componentProps: ComponentProps = Object.assign({}, props);\r\n\r\n if (children) componentProps.children = children;\r\n\r\n return m(this, componentProps);\r\n }\r\n\r\n static initProps(props: ComponentProps = {}) {}\r\n\r\n private setProps(vnode: Vnode<T, this>) {\r\n const props = vnode.attrs || {};\r\n\r\n (this.constructor as typeof Component).initProps(props);\r\n\r\n if (!props.children) props.children = vnode.children;\r\n\r\n this.props = props;\r\n }\r\n}\r\n","export default function _extends() {\n _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n\n return target;\n };\n\n return _extends.apply(this, arguments);\n}","var g;\n\n// This works in non-strict mode\ng = (function() {\n\treturn this;\n})();\n\ntry {\n\t// This works if eval is allowed (see CSP)\n\tg = g || new Function(\"return this\")();\n} catch (e) {\n\t// This works if the window reference is available\n\tif (typeof window === \"object\") g = window;\n}\n\n// g can still be undefined, but nothing to do about it...\n// We return undefined, instead of nothing here, so it's\n// easier to handle this case. if(!global) { ...}\n\nmodule.exports = g;\n","\"use strict\"\n\nfunction Vnode(tag, key, attrs, children, text, dom) {\n\treturn {tag: tag, key: key, attrs: attrs, children: children, text: text, dom: dom, domSize: undefined, state: undefined, events: undefined, instance: undefined}\n}\nVnode.normalize = function(node) {\n\tif (Array.isArray(node)) return Vnode(\"[\", undefined, undefined, Vnode.normalizeChildren(node), undefined, undefined)\n\tif (node == null || typeof node === \"boolean\") return null\n\tif (typeof node === \"object\") return node\n\treturn Vnode(\"#\", undefined, undefined, String(node), undefined, undefined)\n}\nVnode.normalizeChildren = function(input) {\n\tvar children = []\n\tif (input.length) {\n\t\tvar isKeyed = input[0] != null && input[0].key != null\n\t\t// Note: this is a *very* perf-sensitive check.\n\t\t// Fun fact: merging the loop like this is somehow faster than splitting\n\t\t// it, noticeably so.\n\t\tfor (var i = 1; i < input.length; i++) {\n\t\t\tif ((input[i] != null && input[i].key != null) !== isKeyed) {\n\t\t\t\tthrow new TypeError(\"Vnodes must either always have keys or never have keys!\")\n\t\t\t}\n\t\t}\n\t\tfor (var i = 0; i < input.length; i++) {\n\t\t\tchildren[i] = Vnode.normalize(input[i])\n\t\t}\n\t}\n\treturn children\n}\n\nmodule.exports = Vnode\n","module.exports = m;","\"use strict\"\n\nvar render = require(\"./render\")\n\nmodule.exports = require(\"./api/mount-redraw\")(render, requestAnimationFrame, console)\n","\"use strict\"\n\nvar buildQueryString = require(\"../querystring/build\")\nvar assign = require(\"./assign\")\n\n// Returns `path` from `template` + `params`\nmodule.exports = function(template, params) {\n\tif ((/:([^\\/\\.-]+)(\\.{3})?:/).test(template)) {\n\t\tthrow new SyntaxError(\"Template parameter names *must* be separated\")\n\t}\n\tif (params == null) return template\n\tvar queryIndex = template.indexOf(\"?\")\n\tvar hashIndex = template.indexOf(\"#\")\n\tvar queryEnd = hashIndex < 0 ? template.length : hashIndex\n\tvar pathEnd = queryIndex < 0 ? queryEnd : queryIndex\n\tvar path = template.slice(0, pathEnd)\n\tvar query = {}\n\n\tassign(query, params)\n\n\tvar resolved = path.replace(/:([^\\/\\.-]+)(\\.{3})?/g, function(m, key, variadic) {\n\t\tdelete query[key]\n\t\t// If no such parameter exists, don't interpolate it.\n\t\tif (params[key] == null) return m\n\t\t// Escape normal parameters, but not variadic ones.\n\t\treturn variadic ? params[key] : encodeURIComponent(String(params[key]))\n\t})\n\n\t// In case the template substitution adds new query/hash parameters.\n\tvar newQueryIndex = resolved.indexOf(\"?\")\n\tvar newHashIndex = resolved.indexOf(\"#\")\n\tvar newQueryEnd = newHashIndex < 0 ? resolved.length : newHashIndex\n\tvar newPathEnd = newQueryIndex < 0 ? newQueryEnd : newQueryIndex\n\tvar result = resolved.slice(0, newPathEnd)\n\n\tif (queryIndex >= 0) result += template.slice(queryIndex, queryEnd)\n\tif (newQueryIndex >= 0) result += (queryIndex < 0 ? \"?\" : \"&\") + resolved.slice(newQueryIndex, newQueryEnd)\n\tvar querystring = buildQueryString(query)\n\tif (querystring) result += (queryIndex < 0 && newQueryIndex < 0 ? \"?\" : \"&\") + querystring\n\tif (hashIndex >= 0) result += template.slice(hashIndex)\n\tif (newHashIndex >= 0) result += (hashIndex < 0 ? \"\" : \"&\") + resolved.slice(newHashIndex)\n\treturn result\n}\n","\"use strict\"\n\nvar parseQueryString = require(\"../querystring/parse\")\n\n// Returns `{path, params}` from `url`\nmodule.exports = function(url) {\n\tvar queryIndex = url.indexOf(\"?\")\n\tvar hashIndex = url.indexOf(\"#\")\n\tvar queryEnd = hashIndex < 0 ? url.length : hashIndex\n\tvar pathEnd = queryIndex < 0 ? queryEnd : queryIndex\n\tvar path = url.slice(0, pathEnd).replace(/\\/{2,}/g, \"/\")\n\n\tif (!path) path = \"/\"\n\telse {\n\t\tif (path[0] !== \"/\") path = \"/\" + path\n\t\tif (path.length > 1 && path[path.length - 1] === \"/\") path = path.slice(0, -1)\n\t}\n\treturn {\n\t\tpath: path,\n\t\tparams: queryIndex < 0\n\t\t\t? {}\n\t\t\t: parseQueryString(url.slice(queryIndex + 1, queryEnd)),\n\t}\n}\n","import m from 'mithril';\r\nimport prop from 'mithril/stream';\r\n\r\nimport Component from '../Component';\r\n\r\nexport default () => {\r\n const mo = window['m'];\r\n\r\n const _m = function (comp, ...args) {\r\n if (!arguments[1]) arguments[1] = {};\r\n\r\n if (comp.prototype && comp.prototype instanceof Component) {\r\n // allow writing to children attribute\r\n Object.defineProperty(arguments[1], 'children', {\r\n writable: true,\r\n });\r\n }\r\n\r\n const node = mo.apply(this, arguments);\r\n\r\n if (!node.attrs) node.attrs = {};\r\n\r\n if (node.attrs.bidi) {\r\n m.bidi(node, node.attrs.bidi);\r\n }\r\n\r\n if (node.attrs.route) {\r\n node.attrs.href = node.attrs.route;\r\n node.attrs.tag = m.route.Link;\r\n\r\n delete node.attrs.route;\r\n }\r\n\r\n return node;\r\n };\r\n\r\n Object.keys(mo).forEach((key) => (_m[key] = mo[key]));\r\n\r\n _m.withAttr = (key: string, cb: Function) =>\r\n function () {\r\n cb(this.getAttribute(key) || this[key]);\r\n };\r\n\r\n _m.prop = prop;\r\n\r\n window['m'] = _m;\r\n};\r\n","\"use strict\"\n\nvar Vnode = require(\"../render/vnode\")\nvar hyperscriptVnode = require(\"./hyperscriptVnode\")\n\nvar selectorParser = /(?:(^|#|\\.)([^#\\.\\[\\]]+))|(\\[(.+?)(?:\\s*=\\s*(\"|'|)((?:\\\\[\"'\\]]|.)*?)\\5)?\\])/g\nvar selectorCache = {}\nvar hasOwn = {}.hasOwnProperty\n\nfunction isEmpty(object) {\n\tfor (var key in object) if (hasOwn.call(object, key)) return false\n\treturn true\n}\n\nfunction compileSelector(selector) {\n\tvar match, tag = \"div\", classes = [], attrs = {}\n\twhile (match = selectorParser.exec(selector)) {\n\t\tvar type = match[1], value = match[2]\n\t\tif (type === \"\" && value !== \"\") tag = value\n\t\telse if (type === \"#\") attrs.id = value\n\t\telse if (type === \".\") classes.push(value)\n\t\telse if (match[3][0] === \"[\") {\n\t\t\tvar attrValue = match[6]\n\t\t\tif (attrValue) attrValue = attrValue.replace(/\\\\([\"'])/g, \"$1\").replace(/\\\\\\\\/g, \"\\\\\")\n\t\t\tif (match[4] === \"class\") classes.push(attrValue)\n\t\t\telse attrs[match[4]] = attrValue === \"\" ? attrValue : attrValue || true\n\t\t}\n\t}\n\tif (classes.length > 0) attrs.className = classes.join(\" \")\n\treturn selectorCache[selector] = {tag: tag, attrs: attrs}\n}\n\nfunction execSelector(state, vnode) {\n\tvar attrs = vnode.attrs\n\tvar children = Vnode.normalizeChildren(vnode.children)\n\tvar hasClass = hasOwn.call(attrs, \"class\")\n\tvar className = hasClass ? attrs.class : attrs.className\n\n\tvnode.tag = state.tag\n\tvnode.attrs = null\n\tvnode.children = undefined\n\n\tif (!isEmpty(state.attrs) && !isEmpty(attrs)) {\n\t\tvar newAttrs = {}\n\n\t\tfor (var key in attrs) {\n\t\t\tif (hasOwn.call(attrs, key)) newAttrs[key] = attrs[key]\n\t\t}\n\n\t\tattrs = newAttrs\n\t}\n\n\tfor (var key in state.attrs) {\n\t\tif (hasOwn.call(state.attrs, key) && key !== \"className\" && !hasOwn.call(attrs, key)){\n\t\t\tattrs[key] = state.attrs[key]\n\t\t}\n\t}\n\tif (className != null || state.attrs.className != null) attrs.className =\n\t\tclassName != null\n\t\t\t? state.attrs.className != null\n\t\t\t\t? String(state.attrs.className) + \" \" + String(className)\n\t\t\t\t: className\n\t\t\t: state.attrs.className != null\n\t\t\t\t? state.attrs.className\n\t\t\t\t: null\n\n\tif (hasClass) attrs.class = null\n\n\tfor (var key in attrs) {\n\t\tif (hasOwn.call(attrs, key) && key !== \"key\") {\n\t\t\tvnode.attrs = attrs\n\t\t\tbreak\n\t\t}\n\t}\n\n\tif (Array.isArray(children) && children.length === 1 && children[0] != null && children[0].tag === \"#\") {\n\t\tvnode.text = children[0].children\n\t} else {\n\t\tvnode.children = children\n\t}\n\n\treturn vnode\n}\n\nfunction hyperscript(selector) {\n\tif (selector == null || typeof selector !== \"string\" && typeof selector !== \"function\" && typeof selector.view !== \"function\") {\n\t\tthrow Error(\"The selector must be either a string or a component.\");\n\t}\n\n\tvar vnode = hyperscriptVnode.apply(1, arguments)\n\n\tif (typeof selector === \"string\") {\n\t\tvnode.children = Vnode.normalizeChildren(vnode.children)\n\t\tif (selector !== \"[\") return execSelector(selectorCache[selector] || compileSelector(selector), vnode)\n\t}\n\n\tvnode.tag = selector\n\treturn vnode\n}\n\nmodule.exports = hyperscript\n","\"use strict\"\n\nvar Vnode = require(\"../render/vnode\")\n\n// Call via `hyperscriptVnode.apply(startOffset, arguments)`\n//\n// The reason I do it this way, forwarding the arguments and passing the start\n// offset in `this`, is so I don't have to create a temporary array in a\n// performance-critical path.\n//\n// In native ES6, I'd instead add a final `...args` parameter to the\n// `hyperscript` and `fragment` factories and define this as\n// `hyperscriptVnode(...args)`, since modern engines do optimize that away. But\n// ES5 (what Mithril requires thanks to IE support) doesn't give me that luxury,\n// and engines aren't nearly intelligent enough to do either of these:\n//\n// 1. Elide the allocation for `[].slice.call(arguments, 1)` when it's passed to\n// another function only to be indexed.\n// 2. Elide an `arguments` allocation when it's passed to any function other\n// than `Function.prototype.apply` or `Reflect.apply`.\n//\n// In ES6, it'd probably look closer to this (I'd need to profile it, though):\n// module.exports = function(attrs, ...children) {\n// if (attrs == null || typeof attrs === \"object\" && attrs.tag == null && !Array.isArray(attrs)) {\n// if (children.length === 1 && Array.isArray(children[0])) children = children[0]\n// } else {\n// children = children.length === 0 && Array.isArray(attrs) ? attrs : [attrs, ...children]\n// attrs = undefined\n// }\n//\n// if (attrs == null) attrs = {}\n// return Vnode(\"\", attrs.key, attrs, children)\n// }\nmodule.exports = function() {\n\tvar attrs = arguments[this], start = this + 1, children\n\n\tif (attrs == null) {\n\t\tattrs = {}\n\t} else if (typeof attrs !== \"object\" || attrs.tag != null || Array.isArray(attrs)) {\n\t\tattrs = {}\n\t\tstart = this\n\t}\n\n\tif (arguments.length === start + 1) {\n\t\tchildren = arguments[start]\n\t\tif (!Array.isArray(children)) children = [children]\n\t} else {\n\t\tchildren = []\n\t\twhile (start < arguments.length) children.push(arguments[start++])\n\t}\n\n\treturn Vnode(\"\", attrs.key, attrs, children)\n}\n","\"use strict\"\n\nvar PromisePolyfill = require(\"./polyfill\")\n\nif (typeof window !== \"undefined\") {\n\tif (typeof window.Promise === \"undefined\") {\n\t\twindow.Promise = PromisePolyfill\n\t} else if (!window.Promise.prototype.finally) {\n\t\twindow.Promise.prototype.finally = PromisePolyfill.prototype.finally\n\t}\n\tmodule.exports = window.Promise\n} else if (typeof global !== \"undefined\") {\n\tif (typeof global.Promise === \"undefined\") {\n\t\tglobal.Promise = PromisePolyfill\n\t} else if (!global.Promise.prototype.finally) {\n\t\tglobal.Promise.prototype.finally = PromisePolyfill.prototype.finally\n\t}\n\tmodule.exports = global.Promise\n} else {\n\tmodule.exports = PromisePolyfill\n}\n","\"use strict\"\n/** @constructor */\nvar PromisePolyfill = function(executor) {\n\tif (!(this instanceof PromisePolyfill)) throw new Error(\"Promise must be called with `new`\")\n\tif (typeof executor !== \"function\") throw new TypeError(\"executor must be a function\")\n\n\tvar self = this, resolvers = [], rejectors = [], resolveCurrent = handler(resolvers, true), rejectCurrent = handler(rejectors, false)\n\tvar instance = self._instance = {resolvers: resolvers, rejectors: rejectors}\n\tvar callAsync = typeof setImmediate === \"function\" ? setImmediate : setTimeout\n\tfunction handler(list, shouldAbsorb) {\n\t\treturn function execute(value) {\n\t\t\tvar then\n\t\t\ttry {\n\t\t\t\tif (shouldAbsorb && value != null && (typeof value === \"object\" || typeof value === \"function\") && typeof (then = value.then) === \"function\") {\n\t\t\t\t\tif (value === self) throw new TypeError(\"Promise can't be resolved w/ itself\")\n\t\t\t\t\texecuteOnce(then.bind(value))\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tcallAsync(function() {\n\t\t\t\t\t\tif (!shouldAbsorb && list.length === 0) console.error(\"Possible unhandled promise rejection:\", value)\n\t\t\t\t\t\tfor (var i = 0; i < list.length; i++) list[i](value)\n\t\t\t\t\t\tresolvers.length = 0, rejectors.length = 0\n\t\t\t\t\t\tinstance.state = shouldAbsorb\n\t\t\t\t\t\tinstance.retry = function() {execute(value)}\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t}\n\t\t\tcatch (e) {\n\t\t\t\trejectCurrent(e)\n\t\t\t}\n\t\t}\n\t}\n\tfunction executeOnce(then) {\n\t\tvar runs = 0\n\t\tfunction run(fn) {\n\t\t\treturn function(value) {\n\t\t\t\tif (runs++ > 0) return\n\t\t\t\tfn(value)\n\t\t\t}\n\t\t}\n\t\tvar onerror = run(rejectCurrent)\n\t\ttry {then(run(resolveCurrent), onerror)} catch (e) {onerror(e)}\n\t}\n\n\texecuteOnce(executor)\n}\nPromisePolyfill.prototype.then = function(onFulfilled, onRejection) {\n\tvar self = this, instance = self._instance\n\tfunction handle(callback, list, next, state) {\n\t\tlist.push(function(value) {\n\t\t\tif (typeof callback !== \"function\") next(value)\n\t\t\telse try {resolveNext(callback(value))} catch (e) {if (rejectNext) rejectNext(e)}\n\t\t})\n\t\tif (typeof instance.retry === \"function\" && state === instance.state) instance.retry()\n\t}\n\tvar resolveNext, rejectNext\n\tvar promise = new PromisePolyfill(function(resolve, reject) {resolveNext = resolve, rejectNext = reject})\n\thandle(onFulfilled, instance.resolvers, resolveNext, true), handle(onRejection, instance.rejectors, rejectNext, false)\n\treturn promise\n}\nPromisePolyfill.prototype.catch = function(onRejection) {\n\treturn this.then(null, onRejection)\n}\nPromisePolyfill.prototype.finally = function(callback) {\n\treturn this.then(\n\t\tfunction(value) {\n\t\t\treturn PromisePolyfill.resolve(callback()).then(function() {\n\t\t\t\treturn value\n\t\t\t})\n\t\t},\n\t\tfunction(reason) {\n\t\t\treturn PromisePolyfill.resolve(callback()).then(function() {\n\t\t\t\treturn PromisePolyfill.reject(reason);\n\t\t\t})\n\t\t}\n\t)\n}\nPromisePolyfill.resolve = function(value) {\n\tif (value instanceof PromisePolyfill) return value\n\treturn new PromisePolyfill(function(resolve) {resolve(value)})\n}\nPromisePolyfill.reject = function(value) {\n\treturn new PromisePolyfill(function(resolve, reject) {reject(value)})\n}\nPromisePolyfill.all = function(list) {\n\treturn new PromisePolyfill(function(resolve, reject) {\n\t\tvar total = list.length, count = 0, values = []\n\t\tif (list.length === 0) resolve([])\n\t\telse for (var i = 0; i < list.length; i++) {\n\t\t\t(function(i) {\n\t\t\t\tfunction consume(value) {\n\t\t\t\t\tcount++\n\t\t\t\t\tvalues[i] = value\n\t\t\t\t\tif (count === total) resolve(values)\n\t\t\t\t}\n\t\t\t\tif (list[i] != null && (typeof list[i] === \"object\" || typeof list[i] === \"function\") && typeof list[i].then === \"function\") {\n\t\t\t\t\tlist[i].then(consume, reject)\n\t\t\t\t}\n\t\t\t\telse consume(list[i])\n\t\t\t})(i)\n\t\t}\n\t})\n}\nPromisePolyfill.race = function(list) {\n\treturn new PromisePolyfill(function(resolve, reject) {\n\t\tfor (var i = 0; i < list.length; i++) {\n\t\t\tlist[i].then(resolve, reject)\n\t\t}\n\t})\n}\n\nmodule.exports = PromisePolyfill\n","var scope = (typeof global !== \"undefined\" && global) ||\n (typeof self !== \"undefined\" && self) ||\n window;\nvar apply = Function.prototype.apply;\n\n// DOM APIs, for completeness\n\nexports.setTimeout = function() {\n return new Timeout(apply.call(setTimeout, scope, arguments), clearTimeout);\n};\nexports.setInterval = function() {\n return new Timeout(apply.call(setInterval, scope, arguments), clearInterval);\n};\nexports.clearTimeout =\nexports.clearInterval = function(timeout) {\n if (timeout) {\n timeout.close();\n }\n};\n\nfunction Timeout(id, clearFn) {\n this._id = id;\n this._clearFn = clearFn;\n}\nTimeout.prototype.unref = Timeout.prototype.ref = function() {};\nTimeout.prototype.close = function() {\n this._clearFn.call(scope, this._id);\n};\n\n// Does not start the time, just sets up the members needed.\nexports.enroll = function(item, msecs) {\n clearTimeout(item._idleTimeoutId);\n item._idleTimeout = msecs;\n};\n\nexports.unenroll = function(item) {\n clearTimeout(item._idleTimeoutId);\n item._idleTimeout = -1;\n};\n\nexports._unrefActive = exports.active = function(item) {\n clearTimeout(item._idleTimeoutId);\n\n var msecs = item._idleTimeout;\n if (msecs >= 0) {\n item._idleTimeoutId = setTimeout(function onTimeout() {\n if (item._onTimeout)\n item._onTimeout();\n }, msecs);\n }\n};\n\n// setimmediate attaches itself to the global object\nrequire(\"setimmediate\");\n// On some exotic environments, it's not clear which object `setimmediate` was\n// able to install onto. Search each possibility in the same order as the\n// `setimmediate` library.\nexports.setImmediate = (typeof self !== \"undefined\" && self.setImmediate) ||\n (typeof global !== \"undefined\" && global.setImmediate) ||\n (this && this.setImmediate);\nexports.clearImmediate = (typeof self !== \"undefined\" && self.clearImmediate) ||\n (typeof global !== \"undefined\" && global.clearImmediate) ||\n (this && this.clearImmediate);\n","\"use strict\"\n\nmodule.exports = require(\"./render/render\")(window)\n","\"use strict\"\n\nmodule.exports = function(object) {\n\tif (Object.prototype.toString.call(object) !== \"[object Object]\") return \"\"\n\n\tvar args = []\n\tfor (var key in object) {\n\t\tdestructure(key, object[key])\n\t}\n\n\treturn args.join(\"&\")\n\n\tfunction destructure(key, value) {\n\t\tif (Array.isArray(value)) {\n\t\t\tfor (var i = 0; i < value.length; i++) {\n\t\t\t\tdestructure(key + \"[\" + i + \"]\", value[i])\n\t\t\t}\n\t\t}\n\t\telse if (Object.prototype.toString.call(value) === \"[object Object]\") {\n\t\t\tfor (var i in value) {\n\t\t\t\tdestructure(key + \"[\" + i + \"]\", value[i])\n\t\t\t}\n\t\t}\n\t\telse args.push(encodeURIComponent(key) + (value != null && value !== \"\" ? \"=\" + encodeURIComponent(value) : \"\"))\n\t}\n}\n","\"use strict\"\n\nmodule.exports = Object.assign || function(target, source) {\n\tif(source) Object.keys(source).forEach(function(key) { target[key] = source[key] })\n}\n","\"use strict\"\n\nmodule.exports = function(string) {\n\tif (string === \"\" || string == null) return {}\n\tif (string.charAt(0) === \"?\") string = string.slice(1)\n\n\tvar entries = string.split(\"&\"), counters = {}, data = {}\n\tfor (var i = 0; i < entries.length; i++) {\n\t\tvar entry = entries[i].split(\"=\")\n\t\tvar key = decodeURIComponent(entry[0])\n\t\tvar value = entry.length === 2 ? decodeURIComponent(entry[1]) : \"\"\n\n\t\tif (value === \"true\") value = true\n\t\telse if (value === \"false\") value = false\n\n\t\tvar levels = key.split(/\\]\\[?|\\[/)\n\t\tvar cursor = data\n\t\tif (key.indexOf(\"[\") > -1) levels.pop()\n\t\tfor (var j = 0; j < levels.length; j++) {\n\t\t\tvar level = levels[j], nextLevel = levels[j + 1]\n\t\t\tvar isNumber = nextLevel == \"\" || !isNaN(parseInt(nextLevel, 10))\n\t\t\tif (level === \"\") {\n\t\t\t\tvar key = levels.slice(0, j).join()\n\t\t\t\tif (counters[key] == null) {\n\t\t\t\t\tcounters[key] = Array.isArray(cursor) ? cursor.length : 0\n\t\t\t\t}\n\t\t\t\tlevel = counters[key]++\n\t\t\t}\n\t\t\t// Disallow direct prototype pollution\n\t\t\telse if (level === \"__proto__\") break\n\t\t\tif (j === levels.length - 1) cursor[level] = value\n\t\t\telse {\n\t\t\t\t// Read own properties exclusively to disallow indirect\n\t\t\t\t// prototype pollution\n\t\t\t\tvar desc = Object.getOwnPropertyDescriptor(cursor, level)\n\t\t\t\tif (desc != null) desc = desc.value\n\t\t\t\tif (desc == null) cursor[level] = desc = isNumber ? [] : {}\n\t\t\t\tcursor = desc\n\t\t\t}\n\t\t}\n\t}\n\treturn data\n}\n","// Robert Penner's easeInOutQuad\n\n// find the rest of his easing functions here: http://robertpenner.com/easing/\n// find them exported for ES6 consumption here: https://github.com/jaxgeller/ez.js\n\nvar easeInOutQuad = function easeInOutQuad(t, b, c, d) {\n t /= d / 2;\n if (t < 1) return c / 2 * t * t + b;\n t--;\n return -c / 2 * (t * (t - 2) - 1) + b;\n};\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) {\n return typeof obj;\n} : function (obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n};\n\nvar jumper = function jumper() {\n // private variable cache\n // no variables are created during a jump, preventing memory leaks\n\n var element = void 0; // element to scroll to (node)\n\n var start = void 0; // where scroll starts (px)\n var stop = void 0; // where scroll stops (px)\n\n var offset = void 0; // adjustment from the stop position (px)\n var easing = void 0; // easing function (function)\n var a11y = void 0; // accessibility support flag (boolean)\n\n var distance = void 0; // distance of scroll (px)\n var duration = void 0; // scroll duration (ms)\n\n var timeStart = void 0; // time scroll started (ms)\n var timeElapsed = void 0; // time spent scrolling thus far (ms)\n\n var next = void 0; // next scroll position (px)\n\n var callback = void 0; // to call when done scrolling (function)\n\n // scroll position helper\n\n function location() {\n return window.scrollY || window.pageYOffset;\n }\n\n // element offset helper\n\n function top(element) {\n return element.getBoundingClientRect().top + start;\n }\n\n // rAF loop helper\n\n function loop(timeCurrent) {\n // store time scroll started, if not started already\n if (!timeStart) {\n timeStart = timeCurrent;\n }\n\n // determine time spent scrolling so far\n timeElapsed = timeCurrent - timeStart;\n\n // calculate next scroll position\n next = easing(timeElapsed, start, distance, duration);\n\n // scroll to it\n window.scrollTo(0, next);\n\n // check progress\n timeElapsed < duration ? window.requestAnimationFrame(loop) // continue scroll loop\n : done(); // scrolling is done\n }\n\n // scroll finished helper\n\n function done() {\n // account for rAF time rounding inaccuracies\n window.scrollTo(0, start + distance);\n\n // if scrolling to an element, and accessibility is enabled\n if (element && a11y) {\n // add tabindex indicating programmatic focus\n element.setAttribute('tabindex', '-1');\n\n // focus the element\n element.focus();\n }\n\n // if it exists, fire the callback\n if (typeof callback === 'function') {\n callback();\n }\n\n // reset time for next jump\n timeStart = false;\n }\n\n // API\n\n function jump(target) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n // resolve options, or use defaults\n duration = options.duration || 1000;\n offset = options.offset || 0;\n callback = options.callback; // \"undefined\" is a suitable default, and won't be called\n easing = options.easing || easeInOutQuad;\n a11y = options.a11y || false;\n\n // cache starting position\n start = location();\n\n // resolve target\n switch (typeof target === 'undefined' ? 'undefined' : _typeof(target)) {\n // scroll from current position\n case 'number':\n element = undefined; // no element to scroll to\n a11y = false; // make sure accessibility is off\n stop = start + target;\n break;\n\n // scroll to element (node)\n // bounding rect is relative to the viewport\n case 'object':\n element = target;\n stop = top(element);\n break;\n\n // scroll to element (selector)\n // bounding rect is relative to the viewport\n case 'string':\n element = document.querySelector(target);\n stop = top(element);\n break;\n }\n\n // resolve scroll distance, accounting for offset\n distance = stop - start + offset;\n\n // resolve duration\n switch (_typeof(options.duration)) {\n // number in ms\n case 'number':\n duration = options.duration;\n break;\n\n // function passed the distance of the scroll\n case 'function':\n duration = options.duration(distance);\n break;\n }\n\n // start the loop\n window.requestAnimationFrame(loop);\n }\n\n // expose only the jump method\n return jump;\n};\n\n// export singleton\n\nvar singleton = jumper();\n\nexport default singleton;\n","// Utils\nimport debounce from './utils/debounce';\nimport isFunction from './utils/isFunction';\n\n// Methods\nimport update from './methods/update';\nimport destroy from './methods/destroy';\nimport enableEventListeners from './methods/enableEventListeners';\nimport disableEventListeners from './methods/disableEventListeners';\nimport Defaults from './methods/defaults';\nimport placements from './methods/placements';\n\nexport default class Popper {\n /**\n * Creates a new Popper.js instance.\n * @class Popper\n * @param {Element|referenceObject} reference - The reference element used to position the popper\n * @param {Element} popper - The HTML / XML element used as the popper\n * @param {Object} options - Your custom options to override the ones defined in [Defaults](#defaults)\n * @return {Object} instance - The generated Popper.js instance\n */\n constructor(reference, popper, options = {}) {\n // make update() debounced, so that it only runs at most once-per-tick\n this.update = debounce(this.update.bind(this));\n\n // with {} we create a new object with the options inside it\n this.options = { ...Popper.Defaults, ...options };\n\n // init state\n this.state = {\n isDestroyed: false,\n isCreated: false,\n scrollParents: [],\n };\n\n // get reference and popper elements (allow jQuery wrappers)\n this.reference = reference && reference.jquery ? reference[0] : reference;\n this.popper = popper && popper.jquery ? popper[0] : popper;\n\n // Deep merge modifiers options\n this.options.modifiers = {};\n Object.keys({\n ...Popper.Defaults.modifiers,\n ...options.modifiers,\n }).forEach(name => {\n this.options.modifiers[name] = {\n // If it's a built-in modifier, use it as base\n ...(Popper.Defaults.modifiers[name] || {}),\n // If there are custom options, override and merge with default ones\n ...(options.modifiers ? options.modifiers[name] : {}),\n };\n });\n\n // Refactoring modifiers' list (Object => Array)\n this.modifiers = Object.keys(this.options.modifiers)\n .map(name => ({\n name,\n ...this.options.modifiers[name],\n }))\n // sort the modifiers by order\n .sort((a, b) => a.order - b.order);\n\n // modifiers have the ability to execute arbitrary code when Popper.js get inited\n // such code is executed in the same order of its modifier\n // they could add new properties to their options configuration\n // BE AWARE: don't add options to `options.modifiers.name` but to `modifierOptions`!\n this.modifiers.forEach(modifierOptions => {\n if (modifierOptions.enabled && isFunction(modifierOptions.onLoad)) {\n modifierOptions.onLoad(\n this.reference,\n this.popper,\n this.options,\n modifierOptions,\n this.state\n );\n }\n });\n\n // fire the first update to position the popper in the right place\n this.update();\n\n const eventsEnabled = this.options.eventsEnabled;\n if (eventsEnabled) {\n // setup event listeners, they will take care of update the position in specific situations\n this.enableEventListeners();\n }\n\n this.state.eventsEnabled = eventsEnabled;\n }\n\n // We can't use class properties because they don't get listed in the\n // class prototype and break stuff like Sinon stubs\n update() {\n return update.call(this);\n }\n destroy() {\n return destroy.call(this);\n }\n enableEventListeners() {\n return enableEventListeners.call(this);\n }\n disableEventListeners() {\n return disableEventListeners.call(this);\n }\n\n /**\n * Schedules an update. It will run on the next UI update available.\n * @method scheduleUpdate\n * @memberof Popper\n */\n scheduleUpdate = () => requestAnimationFrame(this.update);\n\n /**\n * Collection of utilities useful when writing custom modifiers.\n * Starting from version 1.7, this method is available only if you\n * include `popper-utils.js` before `popper.js`.\n *\n * **DEPRECATION**: This way to access PopperUtils is deprecated\n * and will be removed in v2! Use the PopperUtils module directly instead.\n * Due to the high instability of the methods contained in Utils, we can't\n * guarantee them to follow semver. Use them at your own risk!\n * @static\n * @private\n * @type {Object}\n * @deprecated since version 1.8\n * @member Utils\n * @memberof Popper\n */\n static Utils = (typeof window !== 'undefined' ? window : global).PopperUtils;\n\n static placements = placements;\n\n static Defaults = Defaults;\n}\n\n/**\n * The `referenceObject` is an object that provides an interface compatible with Popper.js\n * and lets you use it as replacement of a real DOM node.<br />\n * You can use this method to position a popper relatively to a set of coordinates\n * in case you don't have a DOM node to use as reference.\n *\n * ```\n * new Popper(referenceObject, popperNode);\n * ```\n *\n * NB: This feature isn't supported in Internet Explorer 10.\n * @name referenceObject\n * @property {Function} data.getBoundingClientRect\n * A function that returns a set of coordinates compatible with the native `getBoundingClientRect` method.\n * @property {number} data.clientWidth\n * An ES6 getter that will return the width of the virtual reference element.\n * @property {number} data.clientHeight\n * An ES6 getter that will return the height of the virtual reference element.\n */\n","/**\n * Check if the given variable is a function\n * @method\n * @memberof Popper.Utils\n * @argument {Any} functionToCheck - variable to check\n * @returns {Boolean} answer to: is a function?\n */\nexport default function isFunction(functionToCheck) {\n const getType = {};\n return (\n functionToCheck &&\n getType.toString.call(functionToCheck) === '[object Function]'\n );\n}\n","import jump from 'jump.js';\r\nimport Tooltip from 'tooltip.js';\r\n\r\n// add $.fn.tooltip\r\n$.fn.tooltip = function (option) {\r\n return this.each(function (this: HTMLElement) {\r\n const $this = $(this);\r\n let data = $this.data('bs.tooltip');\r\n const options = (typeof option === 'object' && option) || {};\r\n\r\n if ($this.attr('title')) {\r\n options.title = $this.attr('title');\r\n $this.removeAttr('title');\r\n $this.attr('data-original-title', options.title);\r\n }\r\n\r\n if (option === 'destroy') option = 'dispose';\r\n\r\n if (!data && ['dispose', 'hide'].includes(option)) return;\r\n\r\n if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options)));\r\n if (typeof option === 'string' && data[option]) data[option]();\r\n });\r\n};\r\n\r\n// add $.fn.outerWidth and $.fn.outerHeight\r\n['width', 'height'].forEach(function (dimension) {\r\n const Dimension = dimension.replace(/./, function (m) {\r\n return m[0].toUpperCase();\r\n });\r\n\r\n $.fn[`outer${Dimension}`] = function (margin) {\r\n const elem = this;\r\n\r\n if (elem) {\r\n const sides = { width: ['left', 'right'], height: ['top', 'bottom'] };\r\n let size = elem[dimension]();\r\n\r\n sides[dimension].forEach(function (side) {\r\n if (margin) size += parseInt(elem.css('margin-' + side), 10);\r\n });\r\n\r\n return size;\r\n } else {\r\n return null;\r\n }\r\n };\r\n});\r\n\r\n// allow use of $(':input')\r\n// @ts-ignore\r\n$.expr[':']['input'] = function () {\r\n if ('disabled' in this || ['INPUT', 'SELECT', 'TEXTAREA', 'BUTTON'].includes(this.tagName)) return this;\r\n};\r\n\r\n// add $().hover() method\r\n$.fn.hover = function (hover, leave) {\r\n return this.on('mouseenter', hover).on('mouseleave', leave || hover);\r\n};\r\n\r\n// add animated scroll\r\n$.fn.animateScrollTop = function (to, duration = $.fx.speeds._default, callback) {\r\n if (typeof to === 'number') to -= window.scrollY || window.pageYOffset;\r\n\r\n jump(to, {\r\n duration: $.fx.speeds[duration] || duration,\r\n callback,\r\n });\r\n\r\n return this;\r\n};\r\n\r\n// add basic $().slideUp() function\r\n$.fn.slideUp = function (duration = $.fx.speeds._default, easing?, callback?) {\r\n this.css({ overflow: 'hidden', height: this.height() });\r\n\r\n this.animate(\r\n {\r\n height: 0,\r\n },\r\n duration,\r\n easing,\r\n callback\r\n );\r\n\r\n return this;\r\n};\r\n\r\n// required for compatibility with jquery plugins\r\n// ex: bootstrap plugins\r\n$.fn.extend = $.extend.bind($);\r\n\r\n/**\r\n * Enable special events on Zepto\r\n * @license Original Copyright 2013 Enideo. Released under dual MIT and GPL licenses.\r\n */\r\n$.event.special = $.event.special || {};\r\n\r\nconst bindBeforeSpecialEvents = $.fn.bind;\r\n\r\n$.fn.bind = function (eventName, data, callback) {\r\n const el = this;\r\n\r\n if (!callback) {\r\n callback = data;\r\n data = null;\r\n }\r\n\r\n $.each(eventName.split(/\\s/), (key: string, value: any): boolean => {\r\n value = value.split(/\\./)[0];\r\n\r\n if (value in $.event.special) {\r\n let specialEvent = $.event.special[value];\r\n\r\n /// init enable special events on Zepto\r\n if (!specialEvent._init) {\r\n specialEvent._init = true;\r\n\r\n /// intercept and replace the special event handler to add functionality\r\n specialEvent.originalHandler = specialEvent.handler;\r\n specialEvent.handler = function () {\r\n /// make event argument writable, like on jQuery\r\n const args = Array.prototype.slice.call(arguments);\r\n\r\n args[0] = $.extend({}, args[0]);\r\n\r\n /// define the event handle, $.event.dispatch is only for newer versions of jQuery\r\n $.event.handle = function () {\r\n /// make context of trigger the event element\r\n const args = Array.prototype.slice.call(arguments);\r\n const event = args[0];\r\n const $target = $(event.target);\r\n\r\n $target.trigger.apply($target, arguments);\r\n };\r\n\r\n specialEvent.originalHandler.apply(this, args);\r\n };\r\n }\r\n\r\n /// setup special events on Zepto\r\n specialEvent.setup.apply(el, [data]);\r\n }\r\n\r\n return true;\r\n });\r\n\r\n return bindBeforeSpecialEvents.apply(this, [eventName, callback]);\r\n};\r\n","import 'expose-loader?jQuery!zepto';\r\nimport 'expose-loader?moment!expose-loader?dayjs!dayjs';\r\nimport 'expose-loader?m!mithril';\r\nimport 'expose-loader?m.bidi!m.attrs.bidi';\r\nimport 'expose-loader?Mousetrap!mousetrap';\r\nimport 'expose-loader?classNames!classnames';\r\n\r\nimport 'zepto/src/selector';\r\nimport 'zepto/src/data';\r\nimport 'zepto/src/fx';\r\nimport 'zepto/src/fx_methods';\r\n\r\nimport './utils/patchZepto';\r\n\r\nimport 'hc-sticky';\r\nimport 'bootstrap/js/dropdown';\r\nimport 'bootstrap/js/transition';\r\n\r\nimport relativeTime from 'dayjs/plugin/relativeTime';\r\nimport localizedFormat from 'dayjs/plugin/localizedFormat';\r\n\r\ndayjs.extend(relativeTime);\r\ndayjs.extend(localizedFormat);\r\n\r\nimport patchMithril from './utils/patchMithril';\r\n\r\npatchMithril();\r\n\r\n// import * as Extend from './extend/index';\r\n\r\n// export { Extend };\r\n","export default typeof window !== 'undefined' && typeof document !== 'undefined' && typeof navigator !== 'undefined';\n","import isBrowser from './isBrowser';\n\nconst timeoutDuration = (function(){\n const longerTimeoutBrowsers = ['Edge', 'Trident', 'Firefox'];\n for (let i = 0; i < longerTimeoutBrowsers.length; i += 1) {\n if (isBrowser && navigator.userAgent.indexOf(longerTimeoutBrowsers[i]) >= 0) {\n return 1;\n }\n }\n return 0;\n}());\n\nexport function microtaskDebounce(fn) {\n let called = false\n return () => {\n if (called) {\n return\n }\n called = true\n window.Promise.resolve().then(() => {\n called = false\n fn()\n })\n }\n}\n\nexport function taskDebounce(fn) {\n let scheduled = false;\n return () => {\n if (!scheduled) {\n scheduled = true;\n setTimeout(() => {\n scheduled = false;\n fn();\n }, timeoutDuration);\n }\n };\n}\n\nconst supportsMicroTasks = isBrowser && window.Promise\n\n\n/**\n* Create a debounced version of a method, that's asynchronously deferred\n* but called in the minimum time possible.\n*\n* @method\n* @memberof Popper.Utils\n* @argument {Function} fn\n* @returns {Function}\n*/\nexport default (supportsMicroTasks\n ? microtaskDebounce\n : taskDebounce);\n","/**\n * Check if the given variable is a function\n * @method\n * @memberof Popper.Utils\n * @argument {Any} functionToCheck - variable to check\n * @returns {Boolean} answer to: is a function?\n */\nexport default function isFunction(functionToCheck) {\n const getType = {};\n return (\n functionToCheck &&\n getType.toString.call(functionToCheck) === '[object Function]'\n );\n}\n","/**\n * Get CSS computed property of the given element\n * @method\n * @memberof Popper.Utils\n * @argument {Eement} element\n * @argument {String} property\n */\nexport default function getStyleComputedProperty(element, property) {\n if (element.nodeType !== 1) {\n return [];\n }\n // NOTE: 1 DOM access here\n const window = element.ownerDocument.defaultView;\n const css = window.getComputedStyle(element, null);\n return property ? css[property] : css;\n}\n","/**\n * Returns the parentNode or the host of the element\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @returns {Element} parent\n */\nexport default function getParentNode(element) {\n if (element.nodeName === 'HTML') {\n return element;\n }\n return element.parentNode || element.host;\n}\n","import getStyleComputedProperty from './getStyleComputedProperty';\nimport getParentNode from './getParentNode';\n\n/**\n * Returns the scrolling parent of the given element\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @returns {Element} scroll parent\n */\nexport default function getScrollParent(element) {\n // Return body, `getScroll` will take care to get the correct `scrollTop` from it\n if (!element) {\n return document.body\n }\n\n switch (element.nodeName) {\n case 'HTML':\n case 'BODY':\n return element.ownerDocument.body\n case '#document':\n return element.body\n }\n\n // Firefox want us to check `-x` and `-y` variations as well\n const { overflow, overflowX, overflowY } = getStyleComputedProperty(element);\n if (/(auto|scroll|overlay)/.test(overflow + overflowY + overflowX)) {\n return element;\n }\n\n return getScrollParent(getParentNode(element));\n}\n","/**\n * Returns the reference node of the reference object, or the reference object itself.\n * @method\n * @memberof Popper.Utils\n * @param {Element|Object} reference - the reference element (the popper will be relative to this)\n * @returns {Element} parent\n */\nexport default function getReferenceNode(reference) {\n return reference && reference.referenceNode ? reference.referenceNode : reference;\n}\n","import isBrowser from './isBrowser';\n\nconst isIE11 = isBrowser && !!(window.MSInputMethodContext && document.documentMode);\nconst isIE10 = isBrowser && /MSIE 10/.test(navigator.userAgent);\n\n/**\n * Determines if the browser is Internet Explorer\n * @method\n * @memberof Popper.Utils\n * @param {Number} version to check\n * @returns {Boolean} isIE\n */\nexport default function isIE(version) {\n if (version === 11) {\n return isIE11;\n }\n if (version === 10) {\n return isIE10;\n }\n return isIE11 || isIE10;\n}\n","import getStyleComputedProperty from './getStyleComputedProperty';\nimport isIE from './isIE';\n/**\n * Returns the offset parent of the given element\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @returns {Element} offset parent\n */\nexport default function getOffsetParent(element) {\n if (!element) {\n return document.documentElement;\n }\n\n const noOffsetParent = isIE(10) ? document.body : null;\n\n // NOTE: 1 DOM access here\n let offsetParent = element.offsetParent || null;\n // Skip hidden elements which don't have an offsetParent\n while (offsetParent === noOffsetParent && element.nextElementSibling) {\n offsetParent = (element = element.nextElementSibling).offsetParent;\n }\n\n const nodeName = offsetParent && offsetParent.nodeName;\n\n if (!nodeName || nodeName === 'BODY' || nodeName === 'HTML') {\n return element ? element.ownerDocument.documentElement : document.documentElement;\n }\n\n // .offsetParent will return the closest TH, TD or TABLE in case\n // no offsetParent is present, I hate this job...\n if (\n ['TH', 'TD', 'TABLE'].indexOf(offsetParent.nodeName) !== -1 &&\n getStyleComputedProperty(offsetParent, 'position') === 'static'\n ) {\n return getOffsetParent(offsetParent);\n }\n\n return offsetParent;\n}\n","/**\n * Finds the root node (document, shadowDOM root) of the given element\n * @method\n * @memberof Popper.Utils\n * @argument {Element} node\n * @returns {Element} root node\n */\nexport default function getRoot(node) {\n if (node.parentNode !== null) {\n return getRoot(node.parentNode);\n }\n\n return node;\n}\n","import isOffsetContainer from './isOffsetContainer';\nimport getRoot from './getRoot';\nimport getOffsetParent from './getOffsetParent';\n\n/**\n * Finds the offset parent common to the two provided nodes\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element1\n * @argument {Element} element2\n * @returns {Element} common offset parent\n */\nexport default function findCommonOffsetParent(element1, element2) {\n // This check is needed to avoid errors in case one of the elements isn't defined for any reason\n if (!element1 || !element1.nodeType || !element2 || !element2.nodeType) {\n return document.documentElement;\n }\n\n // Here we make sure to give as \"start\" the element that comes first in the DOM\n const order =\n element1.compareDocumentPosition(element2) &\n Node.DOCUMENT_POSITION_FOLLOWING;\n const start = order ? element1 : element2;\n const end = order ? element2 : element1;\n\n // Get common ancestor container\n const range = document.createRange();\n range.setStart(start, 0);\n range.setEnd(end, 0);\n const { commonAncestorContainer } = range;\n\n // Both nodes are inside #document\n if (\n (element1 !== commonAncestorContainer &&\n element2 !== commonAncestorContainer) ||\n start.contains(end)\n ) {\n if (isOffsetContainer(commonAncestorContainer)) {\n return commonAncestorContainer;\n }\n\n return getOffsetParent(commonAncestorContainer);\n }\n\n // one of the nodes is inside shadowDOM, find which one\n const element1root = getRoot(element1);\n if (element1root.host) {\n return findCommonOffsetParent(element1root.host, element2);\n } else {\n return findCommonOffsetParent(element1, getRoot(element2).host);\n }\n}\n","import getOffsetParent from './getOffsetParent';\n\nexport default function isOffsetContainer(element) {\n const { nodeName } = element;\n if (nodeName === 'BODY') {\n return false;\n }\n return (\n nodeName === 'HTML' || getOffsetParent(element.firstElementChild) === element\n );\n}\n","/**\n * Gets the scroll value of the given element in the given side (top and left)\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @argument {String} side `top` or `left`\n * @returns {number} amount of scrolled pixels\n */\nexport default function getScroll(element, side = 'top') {\n const upperSide = side === 'top' ? 'scrollTop' : 'scrollLeft';\n const nodeName = element.nodeName;\n\n if (nodeName === 'BODY' || nodeName === 'HTML') {\n const html = element.ownerDocument.documentElement;\n const scrollingElement = element.ownerDocument.scrollingElement || html;\n return scrollingElement[upperSide];\n }\n\n return element[upperSide];\n}\n","import getScroll from './getScroll';\n\n/*\n * Sum or subtract the element scroll values (left and top) from a given rect object\n * @method\n * @memberof Popper.Utils\n * @param {Object} rect - Rect object you want to change\n * @param {HTMLElement} element - The element from the function reads the scroll values\n * @param {Boolean} subtract - set to true if you want to subtract the scroll values\n * @return {Object} rect - The modifier rect object\n */\nexport default function includeScroll(rect, element, subtract = false) {\n const scrollTop = getScroll(element, 'top');\n const scrollLeft = getScroll(element, 'left');\n const modifier = subtract ? -1 : 1;\n rect.top += scrollTop * modifier;\n rect.bottom += scrollTop * modifier;\n rect.left += scrollLeft * modifier;\n rect.right += scrollLeft * modifier;\n return rect;\n}\n","/*\n * Helper to detect borders of a given element\n * @method\n * @memberof Popper.Utils\n * @param {CSSStyleDeclaration} styles\n * Result of `getStyleComputedProperty` on the given element\n * @param {String} axis - `x` or `y`\n * @return {number} borders - The borders size of the given axis\n */\n\nexport default function getBordersSize(styles, axis) {\n const sideA = axis === 'x' ? 'Left' : 'Top';\n const sideB = sideA === 'Left' ? 'Right' : 'Bottom';\n\n return (\n parseFloat(styles[`border${sideA}Width`]) +\n parseFloat(styles[`border${sideB}Width`])\n );\n}\n","import isIE from './isIE';\n\nfunction getSize(axis, body, html, computedStyle) {\n return Math.max(\n body[`offset${axis}`],\n body[`scroll${axis}`],\n html[`client${axis}`],\n html[`offset${axis}`],\n html[`scroll${axis}`],\n isIE(10)\n ? (parseInt(html[`offset${axis}`]) + \n parseInt(computedStyle[`margin${axis === 'Height' ? 'Top' : 'Left'}`]) + \n parseInt(computedStyle[`margin${axis === 'Height' ? 'Bottom' : 'Right'}`]))\n : 0 \n );\n}\n\nexport default function getWindowSizes(document) {\n const body = document.body;\n const html = document.documentElement;\n const computedStyle = isIE(10) && getComputedStyle(html);\n\n return {\n height: getSize('Height', body, html, computedStyle),\n width: getSize('Width', body, html, computedStyle),\n };\n}\n","/**\n * Given element offsets, generate an output similar to getBoundingClientRect\n * @method\n * @memberof Popper.Utils\n * @argument {Object} offsets\n * @returns {Object} ClientRect like output\n */\nexport default function getClientRect(offsets) {\n return {\n ...offsets,\n right: offsets.left + offsets.width,\n bottom: offsets.top + offsets.height,\n };\n}\n","import getStyleComputedProperty from './getStyleComputedProperty';\nimport getBordersSize from './getBordersSize';\nimport getWindowSizes from './getWindowSizes';\nimport getScroll from './getScroll';\nimport getClientRect from './getClientRect';\nimport isIE from './isIE';\n\n/**\n * Get bounding client rect of given element\n * @method\n * @memberof Popper.Utils\n * @param {HTMLElement} element\n * @return {Object} client rect\n */\nexport default function getBoundingClientRect(element) {\n let rect = {};\n\n // IE10 10 FIX: Please, don't ask, the element isn't\n // considered in DOM in some circumstances...\n // This isn't reproducible in IE10 compatibility mode of IE11\n try {\n if (isIE(10)) {\n rect = element.getBoundingClientRect();\n const scrollTop = getScroll(element, 'top');\n const scrollLeft = getScroll(element, 'left');\n rect.top += scrollTop;\n rect.left += scrollLeft;\n rect.bottom += scrollTop;\n rect.right += scrollLeft;\n }\n else {\n rect = element.getBoundingClientRect();\n }\n }\n catch(e){}\n\n const result = {\n left: rect.left,\n top: rect.top,\n width: rect.right - rect.left,\n height: rect.bottom - rect.top,\n };\n\n // subtract scrollbar size from sizes\n const sizes = element.nodeName === 'HTML' ? getWindowSizes(element.ownerDocument) : {};\n const width =\n sizes.width || element.clientWidth || result.width;\n const height =\n sizes.height || element.clientHeight || result.height;\n\n let horizScrollbar = element.offsetWidth - width;\n let vertScrollbar = element.offsetHeight - height;\n\n // if an hypothetical scrollbar is detected, we must be sure it's not a `border`\n // we make this check conditional for performance reasons\n if (horizScrollbar || vertScrollbar) {\n const styles = getStyleComputedProperty(element);\n horizScrollbar -= getBordersSize(styles, 'x');\n vertScrollbar -= getBordersSize(styles, 'y');\n\n result.width -= horizScrollbar;\n result.height -= vertScrollbar;\n }\n\n return getClientRect(result);\n}\n","import getStyleComputedProperty from './getStyleComputedProperty';\nimport includeScroll from './includeScroll';\nimport getScrollParent from './getScrollParent';\nimport getBoundingClientRect from './getBoundingClientRect';\nimport runIsIE from './isIE';\nimport getClientRect from './getClientRect';\n\nexport default function getOffsetRectRelativeToArbitraryNode(children, parent, fixedPosition = false) {\n const isIE10 = runIsIE(10);\n const isHTML = parent.nodeName === 'HTML';\n const childrenRect = getBoundingClientRect(children);\n const parentRect = getBoundingClientRect(parent);\n const scrollParent = getScrollParent(children);\n\n const styles = getStyleComputedProperty(parent);\n const borderTopWidth = parseFloat(styles.borderTopWidth);\n const borderLeftWidth = parseFloat(styles.borderLeftWidth);\n\n // In cases where the parent is fixed, we must ignore negative scroll in offset calc\n if(fixedPosition && isHTML) {\n parentRect.top = Math.max(parentRect.top, 0);\n parentRect.left = Math.max(parentRect.left, 0);\n }\n let offsets = getClientRect({\n top: childrenRect.top - parentRect.top - borderTopWidth,\n left: childrenRect.left - parentRect.left - borderLeftWidth,\n width: childrenRect.width,\n height: childrenRect.height,\n });\n offsets.marginTop = 0;\n offsets.marginLeft = 0;\n\n // Subtract margins of documentElement in case it's being used as parent\n // we do this only on HTML because it's the only element that behaves\n // differently when margins are applied to it. The margins are included in\n // the box of the documentElement, in the other cases not.\n if (!isIE10 && isHTML) {\n const marginTop = parseFloat(styles.marginTop);\n const marginLeft = parseFloat(styles.marginLeft);\n\n offsets.top -= borderTopWidth - marginTop;\n offsets.bottom -= borderTopWidth - marginTop;\n offsets.left -= borderLeftWidth - marginLeft;\n offsets.right -= borderLeftWidth - marginLeft;\n\n // Attach marginTop and marginLeft because in some circumstances we may need them\n offsets.marginTop = marginTop;\n offsets.marginLeft = marginLeft;\n }\n\n if (\n isIE10 && !fixedPosition\n ? parent.contains(scrollParent)\n : parent === scrollParent && scrollParent.nodeName !== 'BODY'\n ) {\n offsets = includeScroll(offsets, parent);\n }\n\n return offsets;\n}\n","import getOffsetRectRelativeToArbitraryNode from './getOffsetRectRelativeToArbitraryNode';\nimport getScroll from './getScroll';\nimport getClientRect from './getClientRect';\n\nexport default function getViewportOffsetRectRelativeToArtbitraryNode(element, excludeScroll = false) {\n const html = element.ownerDocument.documentElement;\n const relativeOffset = getOffsetRectRelativeToArbitraryNode(element, html);\n const width = Math.max(html.clientWidth, window.innerWidth || 0);\n const height = Math.max(html.clientHeight, window.innerHeight || 0);\n\n const scrollTop = !excludeScroll ? getScroll(html) : 0;\n const scrollLeft = !excludeScroll ? getScroll(html, 'left') : 0;\n\n const offset = {\n top: scrollTop - relativeOffset.top + relativeOffset.marginTop,\n left: scrollLeft - relativeOffset.left + relativeOffset.marginLeft,\n width,\n height,\n };\n\n return getClientRect(offset);\n}\n","import getStyleComputedProperty from './getStyleComputedProperty';\nimport getParentNode from './getParentNode';\n\n/**\n * Check if the given element is fixed or is inside a fixed parent\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @argument {Element} customContainer\n * @returns {Boolean} answer to \"isFixed?\"\n */\nexport default function isFixed(element) {\n const nodeName = element.nodeName;\n if (nodeName === 'BODY' || nodeName === 'HTML') {\n return false;\n }\n if (getStyleComputedProperty(element, 'position') === 'fixed') {\n return true;\n }\n const parentNode = getParentNode(element);\n if (!parentNode) {\n return false;\n }\n return isFixed(parentNode);\n}\n","import getStyleComputedProperty from './getStyleComputedProperty';\nimport isIE from './isIE';\n/**\n * Finds the first parent of an element that has a transformed property defined\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @returns {Element} first transformed parent or documentElement\n */\n\nexport default function getFixedPositionOffsetParent(element) {\n // This check is needed to avoid errors in case one of the elements isn't defined for any reason\n if (!element || !element.parentElement || isIE()) {\n return document.documentElement;\n }\n let el = element.parentElement;\n while (el && getStyleComputedProperty(el, 'transform') === 'none') {\n el = el.parentElement;\n }\n return el || document.documentElement;\n\n}\n","import getScrollParent from './getScrollParent';\nimport getParentNode from './getParentNode';\nimport getReferenceNode from './getReferenceNode';\nimport findCommonOffsetParent from './findCommonOffsetParent';\nimport getOffsetRectRelativeToArbitraryNode from './getOffsetRectRelativeToArbitraryNode';\nimport getViewportOffsetRectRelativeToArtbitraryNode from './getViewportOffsetRectRelativeToArtbitraryNode';\nimport getWindowSizes from './getWindowSizes';\nimport isFixed from './isFixed';\nimport getFixedPositionOffsetParent from './getFixedPositionOffsetParent';\n\n/**\n * Computed the boundaries limits and return them\n * @method\n * @memberof Popper.Utils\n * @param {HTMLElement} popper\n * @param {HTMLElement} reference\n * @param {number} padding\n * @param {HTMLElement} boundariesElement - Element used to define the boundaries\n * @param {Boolean} fixedPosition - Is in fixed position mode\n * @returns {Object} Coordinates of the boundaries\n */\nexport default function getBoundaries(\n popper,\n reference,\n padding,\n boundariesElement,\n fixedPosition = false\n) {\n // NOTE: 1 DOM access here\n\n let boundaries = { top: 0, left: 0 };\n const offsetParent = fixedPosition ? getFixedPositionOffsetParent(popper) : findCommonOffsetParent(popper, getReferenceNode(reference));\n\n // Handle viewport case\n if (boundariesElement === 'viewport' ) {\n boundaries = getViewportOffsetRectRelativeToArtbitraryNode(offsetParent, fixedPosition);\n }\n\n else {\n // Handle other cases based on DOM element used as boundaries\n let boundariesNode;\n if (boundariesElement === 'scrollParent') {\n boundariesNode = getScrollParent(getParentNode(reference));\n if (boundariesNode.nodeName === 'BODY') {\n boundariesNode = popper.ownerDocument.documentElement;\n }\n } else if (boundariesElement === 'window') {\n boundariesNode = popper.ownerDocument.documentElement;\n } else {\n boundariesNode = boundariesElement;\n }\n\n const offsets = getOffsetRectRelativeToArbitraryNode(\n boundariesNode,\n offsetParent,\n fixedPosition\n );\n\n // In case of HTML, we need a different computation\n if (boundariesNode.nodeName === 'HTML' && !isFixed(offsetParent)) {\n const { height, width } = getWindowSizes(popper.ownerDocument);\n boundaries.top += offsets.top - offsets.marginTop;\n boundaries.bottom = height + offsets.top;\n boundaries.left += offsets.left - offsets.marginLeft;\n boundaries.right = width + offsets.left;\n } else {\n // for all the other DOM elements, this one is good\n boundaries = offsets;\n }\n }\n\n // Add paddings\n padding = padding || 0;\n const isPaddingNumber = typeof padding === 'number';\n boundaries.left += isPaddingNumber ? padding : padding.left || 0; \n boundaries.top += isPaddingNumber ? padding : padding.top || 0; \n boundaries.right -= isPaddingNumber ? padding : padding.right || 0; \n boundaries.bottom -= isPaddingNumber ? padding : padding.bottom || 0; \n\n return boundaries;\n}\n","import getBoundaries from '../utils/getBoundaries';\n\nfunction getArea({ width, height }) {\n return width * height;\n}\n\n/**\n * Utility used to transform the `auto` placement to the placement with more\n * available space.\n * @method\n * @memberof Popper.Utils\n * @argument {Object} data - The data object generated by update method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nexport default function computeAutoPlacement(\n placement,\n refRect,\n popper,\n reference,\n boundariesElement,\n padding = 0\n) {\n if (placement.indexOf('auto') === -1) {\n return placement;\n }\n\n const boundaries = getBoundaries(\n popper,\n reference,\n padding,\n boundariesElement\n );\n\n const rects = {\n top: {\n width: boundaries.width,\n height: refRect.top - boundaries.top,\n },\n right: {\n width: boundaries.right - refRect.right,\n height: boundaries.height,\n },\n bottom: {\n width: boundaries.width,\n height: boundaries.bottom - refRect.bottom,\n },\n left: {\n width: refRect.left - boundaries.left,\n height: boundaries.height,\n },\n };\n\n const sortedAreas = Object.keys(rects)\n .map(key => ({\n key,\n ...rects[key],\n area: getArea(rects[key]),\n }))\n .sort((a, b) => b.area - a.area);\n\n const filteredAreas = sortedAreas.filter(\n ({ width, height }) =>\n width >= popper.clientWidth && height >= popper.clientHeight\n );\n\n const computedPlacement = filteredAreas.length > 0\n ? filteredAreas[0].key\n : sortedAreas[0].key;\n\n const variation = placement.split('-')[1];\n\n return computedPlacement + (variation ? `-${variation}` : '');\n}\n","import findCommonOffsetParent from './findCommonOffsetParent';\nimport getOffsetRectRelativeToArbitraryNode from './getOffsetRectRelativeToArbitraryNode';\nimport getFixedPositionOffsetParent from './getFixedPositionOffsetParent';\nimport getReferenceNode from './getReferenceNode';\n\n/**\n * Get offsets to the reference element\n * @method\n * @memberof Popper.Utils\n * @param {Object} state\n * @param {Element} popper - the popper element\n * @param {Element} reference - the reference element (the popper will be relative to this)\n * @param {Element} fixedPosition - is in fixed position mode\n * @returns {Object} An object containing the offsets which will be applied to the popper\n */\nexport default function getReferenceOffsets(state, popper, reference, fixedPosition = null) {\n const commonOffsetParent = fixedPosition ? getFixedPositionOffsetParent(popper) : findCommonOffsetParent(popper, getReferenceNode(reference));\n return getOffsetRectRelativeToArbitraryNode(reference, commonOffsetParent, fixedPosition);\n}\n","/**\n * Get the outer sizes of the given element (offset size + margins)\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @returns {Object} object containing width and height properties\n */\nexport default function getOuterSizes(element) {\n const window = element.ownerDocument.defaultView;\n const styles = window.getComputedStyle(element);\n const x = parseFloat(styles.marginTop || 0) + parseFloat(styles.marginBottom || 0);\n const y = parseFloat(styles.marginLeft || 0) + parseFloat(styles.marginRight || 0);\n const result = {\n width: element.offsetWidth + y,\n height: element.offsetHeight + x,\n };\n return result;\n}\n","/**\n * Get the opposite placement of the given one\n * @method\n * @memberof Popper.Utils\n * @argument {String} placement\n * @returns {String} flipped placement\n */\nexport default function getOppositePlacement(placement) {\n const hash = { left: 'right', right: 'left', bottom: 'top', top: 'bottom' };\n return placement.replace(/left|right|bottom|top/g, matched => hash[matched]);\n}\n","import getOuterSizes from './getOuterSizes';\nimport getOppositePlacement from './getOppositePlacement';\n\n/**\n * Get offsets to the popper\n * @method\n * @memberof Popper.Utils\n * @param {Object} position - CSS position the Popper will get applied\n * @param {HTMLElement} popper - the popper element\n * @param {Object} referenceOffsets - the reference offsets (the popper will be relative to this)\n * @param {String} placement - one of the valid placement options\n * @returns {Object} popperOffsets - An object containing the offsets which will be applied to the popper\n */\nexport default function getPopperOffsets(popper, referenceOffsets, placement) {\n placement = placement.split('-')[0];\n\n // Get popper node sizes\n const popperRect = getOuterSizes(popper);\n\n // Add position, width and height to our offsets object\n const popperOffsets = {\n width: popperRect.width,\n height: popperRect.height,\n };\n\n // depending by the popper placement we have to compute its offsets slightly differently\n const isHoriz = ['right', 'left'].indexOf(placement) !== -1;\n const mainSide = isHoriz ? 'top' : 'left';\n const secondarySide = isHoriz ? 'left' : 'top';\n const measurement = isHoriz ? 'height' : 'width';\n const secondaryMeasurement = !isHoriz ? 'height' : 'width';\n\n popperOffsets[mainSide] =\n referenceOffsets[mainSide] +\n referenceOffsets[measurement] / 2 -\n popperRect[measurement] / 2;\n if (placement === secondarySide) {\n popperOffsets[secondarySide] =\n referenceOffsets[secondarySide] - popperRect[secondaryMeasurement];\n } else {\n popperOffsets[secondarySide] =\n referenceOffsets[getOppositePlacement(secondarySide)];\n }\n\n return popperOffsets;\n}\n","/**\n * Mimics the `find` method of Array\n * @method\n * @memberof Popper.Utils\n * @argument {Array} arr\n * @argument prop\n * @argument value\n * @returns index or -1\n */\nexport default function find(arr, check) {\n // use native find if supported\n if (Array.prototype.find) {\n return arr.find(check);\n }\n\n // use `filter` to obtain the same behavior of `find`\n return arr.filter(check)[0];\n}\n","import isFunction from './isFunction';\nimport findIndex from './findIndex';\nimport getClientRect from '../utils/getClientRect';\n\n/**\n * Loop trough the list of modifiers and run them in order,\n * each of them will then edit the data object.\n * @method\n * @memberof Popper.Utils\n * @param {dataObject} data\n * @param {Array} modifiers\n * @param {String} ends - Optional modifier name used as stopper\n * @returns {dataObject}\n */\nexport default function runModifiers(modifiers, data, ends) {\n const modifiersToRun = ends === undefined\n ? modifiers\n : modifiers.slice(0, findIndex(modifiers, 'name', ends));\n\n modifiersToRun.forEach(modifier => {\n if (modifier['function']) { // eslint-disable-line dot-notation\n console.warn('`modifier.function` is deprecated, use `modifier.fn`!');\n }\n const fn = modifier['function'] || modifier.fn; // eslint-disable-line dot-notation\n if (modifier.enabled && isFunction(fn)) {\n // Add properties to offsets to make them a complete clientRect object\n // we do this before each modifier to make sure the previous one doesn't\n // mess with these values\n data.offsets.popper = getClientRect(data.offsets.popper);\n data.offsets.reference = getClientRect(data.offsets.reference);\n\n data = fn(data, modifier);\n }\n });\n\n return data;\n}\n","import find from './find';\n\n/**\n * Return the index of the matching object\n * @method\n * @memberof Popper.Utils\n * @argument {Array} arr\n * @argument prop\n * @argument value\n * @returns index or -1\n */\nexport default function findIndex(arr, prop, value) {\n // use native findIndex if supported\n if (Array.prototype.findIndex) {\n return arr.findIndex(cur => cur[prop] === value);\n }\n\n // use `find` + `indexOf` if `findIndex` isn't supported\n const match = find(arr, obj => obj[prop] === value);\n return arr.indexOf(match);\n}\n","import computeAutoPlacement from '../utils/computeAutoPlacement';\nimport getReferenceOffsets from '../utils/getReferenceOffsets';\nimport getPopperOffsets from '../utils/getPopperOffsets';\nimport runModifiers from '../utils/runModifiers';\n\n/**\n * Updates the position of the popper, computing the new offsets and applying\n * the new style.<br />\n * Prefer `scheduleUpdate` over `update` because of performance reasons.\n * @method\n * @memberof Popper\n */\nexport default function update() {\n // if popper is destroyed, don't perform any further update\n if (this.state.isDestroyed) {\n return;\n }\n\n let data = {\n instance: this,\n styles: {},\n arrowStyles: {},\n attributes: {},\n flipped: false,\n offsets: {},\n };\n\n // compute reference element offsets\n data.offsets.reference = getReferenceOffsets(\n this.state,\n this.popper,\n this.reference,\n this.options.positionFixed\n );\n\n // compute auto placement, store placement inside the data object,\n // modifiers will be able to edit `placement` if needed\n // and refer to originalPlacement to know the original value\n data.placement = computeAutoPlacement(\n this.options.placement,\n data.offsets.reference,\n this.popper,\n this.reference,\n this.options.modifiers.flip.boundariesElement,\n this.options.modifiers.flip.padding\n );\n\n // store the computed placement inside `originalPlacement`\n data.originalPlacement = data.placement;\n\n data.positionFixed = this.options.positionFixed;\n\n // compute the popper offsets\n data.offsets.popper = getPopperOffsets(\n this.popper,\n data.offsets.reference,\n data.placement\n );\n\n data.offsets.popper.position = this.options.positionFixed\n ? 'fixed'\n : 'absolute';\n\n // run the modifiers\n data = runModifiers(this.modifiers, data);\n\n // the first `update` will call `onCreate` callback\n // the other ones will call `onUpdate` callback\n if (!this.state.isCreated) {\n this.state.isCreated = true;\n this.options.onCreate(data);\n } else {\n this.options.onUpdate(data);\n }\n}\n","/**\n * Helper used to know if the given modifier is enabled.\n * @method\n * @memberof Popper.Utils\n * @returns {Boolean}\n */\nexport default function isModifierEnabled(modifiers, modifierName) {\n return modifiers.some(\n ({ name, enabled }) => enabled && name === modifierName\n );\n}\n","/**\n * Get the prefixed supported property name\n * @method\n * @memberof Popper.Utils\n * @argument {String} property (camelCase)\n * @returns {String} prefixed property (camelCase or PascalCase, depending on the vendor prefix)\n */\nexport default function getSupportedPropertyName(property) {\n const prefixes = [false, 'ms', 'Webkit', 'Moz', 'O'];\n const upperProp = property.charAt(0).toUpperCase() + property.slice(1);\n\n for (let i = 0; i < prefixes.length; i++) {\n const prefix = prefixes[i];\n const toCheck = prefix ? `${prefix}${upperProp}` : property;\n if (typeof document.body.style[toCheck] !== 'undefined') {\n return toCheck;\n }\n }\n return null;\n}\n","import isModifierEnabled from '../utils/isModifierEnabled';\nimport getSupportedPropertyName from '../utils/getSupportedPropertyName';\n\n/**\n * Destroys the popper.\n * @method\n * @memberof Popper\n */\nexport default function destroy() {\n this.state.isDestroyed = true;\n\n // touch DOM only if `applyStyle` modifier is enabled\n if (isModifierEnabled(this.modifiers, 'applyStyle')) {\n this.popper.removeAttribute('x-placement');\n this.popper.style.position = '';\n this.popper.style.top = '';\n this.popper.style.left = '';\n this.popper.style.right = '';\n this.popper.style.bottom = '';\n this.popper.style.willChange = '';\n this.popper.style[getSupportedPropertyName('transform')] = '';\n }\n\n this.disableEventListeners();\n\n // remove the popper if user explicitly asked for the deletion on destroy\n // do not use `remove` because IE11 doesn't support it\n if (this.options.removeOnDestroy) {\n this.popper.parentNode.removeChild(this.popper);\n }\n return this;\n}\n","/**\n * Get the window associated with the element\n * @argument {Element} element\n * @returns {Window}\n */\nexport default function getWindow(element) {\n const ownerDocument = element.ownerDocument;\n return ownerDocument ? ownerDocument.defaultView : window;\n}\n","import getScrollParent from './getScrollParent';\nimport getWindow from './getWindow';\n\nfunction attachToScrollParents(scrollParent, event, callback, scrollParents) {\n const isBody = scrollParent.nodeName === 'BODY';\n const target = isBody ? scrollParent.ownerDocument.defaultView : scrollParent;\n target.addEventListener(event, callback, { passive: true });\n\n if (!isBody) {\n attachToScrollParents(\n getScrollParent(target.parentNode),\n event,\n callback,\n scrollParents\n );\n }\n scrollParents.push(target);\n}\n\n/**\n * Setup needed event listeners used to update the popper position\n * @method\n * @memberof Popper.Utils\n * @private\n */\nexport default function setupEventListeners(\n reference,\n options,\n state,\n updateBound\n) {\n // Resize event listener on window\n state.updateBound = updateBound;\n getWindow(reference).addEventListener('resize', state.updateBound, { passive: true });\n\n // Scroll event listener on scroll parents\n const scrollElement = getScrollParent(reference);\n attachToScrollParents(\n scrollElement,\n 'scroll',\n state.updateBound,\n state.scrollParents\n );\n state.scrollElement = scrollElement;\n state.eventsEnabled = true;\n\n return state;\n}\n","import setupEventListeners from '../utils/setupEventListeners';\n\n/**\n * It will add resize/scroll events and start recalculating\n * position of the popper element when they are triggered.\n * @method\n * @memberof Popper\n */\nexport default function enableEventListeners() {\n if (!this.state.eventsEnabled) {\n this.state = setupEventListeners(\n this.reference,\n this.options,\n this.state,\n this.scheduleUpdate\n );\n }\n}\n","import removeEventListeners from '../utils/removeEventListeners';\n\n/**\n * It will remove resize/scroll events and won't recalculate popper position\n * when they are triggered. It also won't trigger `onUpdate` callback anymore,\n * unless you call `update` method manually.\n * @method\n * @memberof Popper\n */\nexport default function disableEventListeners() {\n if (this.state.eventsEnabled) {\n cancelAnimationFrame(this.scheduleUpdate);\n this.state = removeEventListeners(this.reference, this.state);\n }\n}\n","import getWindow from './getWindow';\n\n/**\n * Remove event listeners used to update the popper position\n * @method\n * @memberof Popper.Utils\n * @private\n */\nexport default function removeEventListeners(reference, state) {\n // Remove resize event listener on window\n getWindow(reference).removeEventListener('resize', state.updateBound);\n\n // Remove scroll event listener on scroll parents\n state.scrollParents.forEach(target => {\n target.removeEventListener('scroll', state.updateBound);\n });\n\n // Reset state\n state.updateBound = null;\n state.scrollParents = [];\n state.scrollElement = null;\n state.eventsEnabled = false;\n return state;\n}\n","/**\n * Tells if a given input is a number\n * @method\n * @memberof Popper.Utils\n * @param {*} input to check\n * @return {Boolean}\n */\nexport default function isNumeric(n) {\n return n !== '' && !isNaN(parseFloat(n)) && isFinite(n);\n}\n","import isNumeric from './isNumeric';\n\n/**\n * Set the style to the given popper\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element - Element to apply the style to\n * @argument {Object} styles\n * Object with a list of properties and values which will be applied to the element\n */\nexport default function setStyles(element, styles) {\n Object.keys(styles).forEach(prop => {\n let unit = '';\n // add unit if the value is numeric and is one of the following\n if (\n ['width', 'height', 'top', 'right', 'bottom', 'left'].indexOf(prop) !==\n -1 &&\n isNumeric(styles[prop])\n ) {\n unit = 'px';\n }\n element.style[prop] = styles[prop] + unit;\n });\n}\n","import getSupportedPropertyName from '../utils/getSupportedPropertyName';\nimport find from '../utils/find';\nimport getOffsetParent from '../utils/getOffsetParent';\nimport getBoundingClientRect from '../utils/getBoundingClientRect';\nimport getRoundedOffsets from '../utils/getRoundedOffsets';\nimport isBrowser from '../utils/isBrowser';\n\nconst isFirefox = isBrowser && /Firefox/i.test(navigator.userAgent);\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by `update` method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nexport default function computeStyle(data, options) {\n const { x, y } = options;\n const { popper } = data.offsets;\n\n // Remove this legacy support in Popper.js v2\n const legacyGpuAccelerationOption = find(\n data.instance.modifiers,\n modifier => modifier.name === 'applyStyle'\n ).gpuAcceleration;\n if (legacyGpuAccelerationOption !== undefined) {\n console.warn(\n 'WARNING: `gpuAcceleration` option moved to `computeStyle` modifier and will not be supported in future versions of Popper.js!'\n );\n }\n const gpuAcceleration =\n legacyGpuAccelerationOption !== undefined\n ? legacyGpuAccelerationOption\n : options.gpuAcceleration;\n\n const offsetParent = getOffsetParent(data.instance.popper);\n const offsetParentRect = getBoundingClientRect(offsetParent);\n\n // Styles\n const styles = {\n position: popper.position,\n };\n\n const offsets = getRoundedOffsets(\n data,\n window.devicePixelRatio < 2 || !isFirefox\n );\n\n const sideA = x === 'bottom' ? 'top' : 'bottom';\n const sideB = y === 'right' ? 'left' : 'right';\n\n // if gpuAcceleration is set to `true` and transform is supported,\n // we use `translate3d` to apply the position to the popper we\n // automatically use the supported prefixed version if needed\n const prefixedProperty = getSupportedPropertyName('transform');\n\n // now, let's make a step back and look at this code closely (wtf?)\n // If the content of the popper grows once it's been positioned, it\n // may happen that the popper gets misplaced because of the new content\n // overflowing its reference element\n // To avoid this problem, we provide two options (x and y), which allow\n // the consumer to define the offset origin.\n // If we position a popper on top of a reference element, we can set\n // `x` to `top` to make the popper grow towards its top instead of\n // its bottom.\n let left, top;\n if (sideA === 'bottom') {\n // when offsetParent is <html> the positioning is relative to the bottom of the screen (excluding the scrollbar)\n // and not the bottom of the html element\n if (offsetParent.nodeName === 'HTML') {\n top = -offsetParent.clientHeight + offsets.bottom;\n } else {\n top = -offsetParentRect.height + offsets.bottom;\n }\n } else {\n top = offsets.top;\n }\n if (sideB === 'right') {\n if (offsetParent.nodeName === 'HTML') {\n left = -offsetParent.clientWidth + offsets.right;\n } else {\n left = -offsetParentRect.width + offsets.right;\n }\n } else {\n left = offsets.left;\n }\n if (gpuAcceleration && prefixedProperty) {\n styles[prefixedProperty] = `translate3d(${left}px, ${top}px, 0)`;\n styles[sideA] = 0;\n styles[sideB] = 0;\n styles.willChange = 'transform';\n } else {\n // othwerise, we use the standard `top`, `left`, `bottom` and `right` properties\n const invertTop = sideA === 'bottom' ? -1 : 1;\n const invertLeft = sideB === 'right' ? -1 : 1;\n styles[sideA] = top * invertTop;\n styles[sideB] = left * invertLeft;\n styles.willChange = `${sideA}, ${sideB}`;\n }\n\n // Attributes\n const attributes = {\n 'x-placement': data.placement,\n };\n\n // Update `data` attributes, styles and arrowStyles\n data.attributes = { ...attributes, ...data.attributes };\n data.styles = { ...styles, ...data.styles };\n data.arrowStyles = { ...data.offsets.arrow, ...data.arrowStyles };\n\n return data;\n}\n","import find from './find';\n\n/**\n * Helper used to know if the given modifier depends from another one.<br />\n * It checks if the needed modifier is listed and enabled.\n * @method\n * @memberof Popper.Utils\n * @param {Array} modifiers - list of modifiers\n * @param {String} requestingName - name of requesting modifier\n * @param {String} requestedName - name of requested modifier\n * @returns {Boolean}\n */\nexport default function isModifierRequired(\n modifiers,\n requestingName,\n requestedName\n) {\n const requesting = find(modifiers, ({ name }) => name === requestingName);\n\n const isRequired =\n !!requesting &&\n modifiers.some(modifier => {\n return (\n modifier.name === requestedName &&\n modifier.enabled &&\n modifier.order < requesting.order\n );\n });\n\n if (!isRequired) {\n const requesting = `\\`${requestingName}\\``;\n const requested = `\\`${requestedName}\\``;\n console.warn(\n `${requested} modifier is required by ${requesting} modifier in order to work, be sure to include it before ${requesting}!`\n );\n }\n return isRequired;\n}\n","/**\n * List of accepted placements to use as values of the `placement` option.<br />\n * Valid placements are:\n * - `auto`\n * - `top`\n * - `right`\n * - `bottom`\n * - `left`\n *\n * Each placement can have a variation from this list:\n * - `-start`\n * - `-end`\n *\n * Variations are interpreted easily if you think of them as the left to right\n * written languages. Horizontally (`top` and `bottom`), `start` is left and `end`\n * is right.<br />\n * Vertically (`left` and `right`), `start` is top and `end` is bottom.\n *\n * Some valid examples are:\n * - `top-end` (on top of reference, right aligned)\n * - `right-start` (on right of reference, top aligned)\n * - `bottom` (on bottom, centered)\n * - `auto-end` (on the side with more space available, alignment depends by placement)\n *\n * @static\n * @type {Array}\n * @enum {String}\n * @readonly\n * @method placements\n * @memberof Popper\n */\nexport default [\n 'auto-start',\n 'auto',\n 'auto-end',\n 'top-start',\n 'top',\n 'top-end',\n 'right-start',\n 'right',\n 'right-end',\n 'bottom-end',\n 'bottom',\n 'bottom-start',\n 'left-end',\n 'left',\n 'left-start',\n];\n","import placements from '../methods/placements';\n\n// Get rid of `auto` `auto-start` and `auto-end`\nconst validPlacements = placements.slice(3);\n\n/**\n * Given an initial placement, returns all the subsequent placements\n * clockwise (or counter-clockwise).\n *\n * @method\n * @memberof Popper.Utils\n * @argument {String} placement - A valid placement (it accepts variations)\n * @argument {Boolean} counter - Set to true to walk the placements counterclockwise\n * @returns {Array} placements including their variations\n */\nexport default function clockwise(placement, counter = false) {\n const index = validPlacements.indexOf(placement);\n const arr = validPlacements\n .slice(index + 1)\n .concat(validPlacements.slice(0, index));\n return counter ? arr.reverse() : arr;\n}\n","import getOppositePlacement from '../utils/getOppositePlacement';\nimport getOppositeVariation from '../utils/getOppositeVariation';\nimport getPopperOffsets from '../utils/getPopperOffsets';\nimport runModifiers from '../utils/runModifiers';\nimport getBoundaries from '../utils/getBoundaries';\nimport isModifierEnabled from '../utils/isModifierEnabled';\nimport clockwise from '../utils/clockwise';\n\nconst BEHAVIORS = {\n FLIP: 'flip',\n CLOCKWISE: 'clockwise',\n COUNTERCLOCKWISE: 'counterclockwise',\n};\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by update method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nexport default function flip(data, options) {\n // if `inner` modifier is enabled, we can't use the `flip` modifier\n if (isModifierEnabled(data.instance.modifiers, 'inner')) {\n return data;\n }\n\n if (data.flipped && data.placement === data.originalPlacement) {\n // seems like flip is trying to loop, probably there's not enough space on any of the flippable sides\n return data;\n }\n\n const boundaries = getBoundaries(\n data.instance.popper,\n data.instance.reference,\n options.padding,\n options.boundariesElement,\n data.positionFixed\n );\n\n let placement = data.placement.split('-')[0];\n let placementOpposite = getOppositePlacement(placement);\n let variation = data.placement.split('-')[1] || '';\n\n let flipOrder = [];\n\n switch (options.behavior) {\n case BEHAVIORS.FLIP:\n flipOrder = [placement, placementOpposite];\n break;\n case BEHAVIORS.CLOCKWISE:\n flipOrder = clockwise(placement);\n break;\n case BEHAVIORS.COUNTERCLOCKWISE:\n flipOrder = clockwise(placement, true);\n break;\n default:\n flipOrder = options.behavior;\n }\n\n flipOrder.forEach((step, index) => {\n if (placement !== step || flipOrder.length === index + 1) {\n return data;\n }\n\n placement = data.placement.split('-')[0];\n placementOpposite = getOppositePlacement(placement);\n\n const popperOffsets = data.offsets.popper;\n const refOffsets = data.offsets.reference;\n\n // using floor because the reference offsets may contain decimals we are not going to consider here\n const floor = Math.floor;\n const overlapsRef =\n (placement === 'left' &&\n floor(popperOffsets.right) > floor(refOffsets.left)) ||\n (placement === 'right' &&\n floor(popperOffsets.left) < floor(refOffsets.right)) ||\n (placement === 'top' &&\n floor(popperOffsets.bottom) > floor(refOffsets.top)) ||\n (placement === 'bottom' &&\n floor(popperOffsets.top) < floor(refOffsets.bottom));\n\n const overflowsLeft = floor(popperOffsets.left) < floor(boundaries.left);\n const overflowsRight = floor(popperOffsets.right) > floor(boundaries.right);\n const overflowsTop = floor(popperOffsets.top) < floor(boundaries.top);\n const overflowsBottom =\n floor(popperOffsets.bottom) > floor(boundaries.bottom);\n\n const overflowsBoundaries =\n (placement === 'left' && overflowsLeft) ||\n (placement === 'right' && overflowsRight) ||\n (placement === 'top' && overflowsTop) ||\n (placement === 'bottom' && overflowsBottom);\n\n // flip the variation if required\n const isVertical = ['top', 'bottom'].indexOf(placement) !== -1;\n\n // flips variation if reference element overflows boundaries\n const flippedVariationByRef =\n !!options.flipVariations &&\n ((isVertical && variation === 'start' && overflowsLeft) ||\n (isVertical && variation === 'end' && overflowsRight) ||\n (!isVertical && variation === 'start' && overflowsTop) ||\n (!isVertical && variation === 'end' && overflowsBottom));\n\n // flips variation if popper content overflows boundaries\n const flippedVariationByContent =\n !!options.flipVariationsByContent &&\n ((isVertical && variation === 'start' && overflowsRight) ||\n (isVertical && variation === 'end' && overflowsLeft) ||\n (!isVertical && variation === 'start' && overflowsBottom) ||\n (!isVertical && variation === 'end' && overflowsTop));\n\n const flippedVariation = flippedVariationByRef || flippedVariationByContent;\n\n if (overlapsRef || overflowsBoundaries || flippedVariation) {\n // this boolean to detect any flip loop\n data.flipped = true;\n\n if (overlapsRef || overflowsBoundaries) {\n placement = flipOrder[index + 1];\n }\n\n if (flippedVariation) {\n variation = getOppositeVariation(variation);\n }\n\n data.placement = placement + (variation ? '-' + variation : '');\n\n // this object contains `position`, we want to preserve it along with\n // any additional property we may add in the future\n data.offsets.popper = {\n ...data.offsets.popper,\n ...getPopperOffsets(\n data.instance.popper,\n data.offsets.reference,\n data.placement\n ),\n };\n\n data = runModifiers(data.instance.modifiers, data, 'flip');\n }\n });\n return data;\n}\n","import isNumeric from '../utils/isNumeric';\nimport getClientRect from '../utils/getClientRect';\nimport find from '../utils/find';\n\n/**\n * Converts a string containing value + unit into a px value number\n * @function\n * @memberof {modifiers~offset}\n * @private\n * @argument {String} str - Value + unit string\n * @argument {String} measurement - `height` or `width`\n * @argument {Object} popperOffsets\n * @argument {Object} referenceOffsets\n * @returns {Number|String}\n * Value in pixels, or original string if no values were extracted\n */\nexport function toValue(str, measurement, popperOffsets, referenceOffsets) {\n // separate value from unit\n const split = str.match(/((?:\\-|\\+)?\\d*\\.?\\d*)(.*)/);\n const value = +split[1];\n const unit = split[2];\n\n // If it's not a number it's an operator, I guess\n if (!value) {\n return str;\n }\n\n if (unit.indexOf('%') === 0) {\n let element;\n switch (unit) {\n case '%p':\n element = popperOffsets;\n break;\n case '%':\n case '%r':\n default:\n element = referenceOffsets;\n }\n\n const rect = getClientRect(element);\n return rect[measurement] / 100 * value;\n } else if (unit === 'vh' || unit === 'vw') {\n // if is a vh or vw, we calculate the size based on the viewport\n let size;\n if (unit === 'vh') {\n size = Math.max(\n document.documentElement.clientHeight,\n window.innerHeight || 0\n );\n } else {\n size = Math.max(\n document.documentElement.clientWidth,\n window.innerWidth || 0\n );\n }\n return size / 100 * value;\n } else {\n // if is an explicit pixel unit, we get rid of the unit and keep the value\n // if is an implicit unit, it's px, and we return just the value\n return value;\n }\n}\n\n/**\n * Parse an `offset` string to extrapolate `x` and `y` numeric offsets.\n * @function\n * @memberof {modifiers~offset}\n * @private\n * @argument {String} offset\n * @argument {Object} popperOffsets\n * @argument {Object} referenceOffsets\n * @argument {String} basePlacement\n * @returns {Array} a two cells array with x and y offsets in numbers\n */\nexport function parseOffset(\n offset,\n popperOffsets,\n referenceOffsets,\n basePlacement\n) {\n const offsets = [0, 0];\n\n // Use height if placement is left or right and index is 0 otherwise use width\n // in this way the first offset will use an axis and the second one\n // will use the other one\n const useHeight = ['right', 'left'].indexOf(basePlacement) !== -1;\n\n // Split the offset string to obtain a list of values and operands\n // The regex addresses values with the plus or minus sign in front (+10, -20, etc)\n const fragments = offset.split(/(\\+|\\-)/).map(frag => frag.trim());\n\n // Detect if the offset string contains a pair of values or a single one\n // they could be separated by comma or space\n const divider = fragments.indexOf(\n find(fragments, frag => frag.search(/,|\\s/) !== -1)\n );\n\n if (fragments[divider] && fragments[divider].indexOf(',') === -1) {\n console.warn(\n 'Offsets separated by white space(s) are deprecated, use a comma (,) instead.'\n );\n }\n\n // If divider is found, we divide the list of values and operands to divide\n // them by ofset X and Y.\n const splitRegex = /\\s*,\\s*|\\s+/;\n let ops = divider !== -1\n ? [\n fragments\n .slice(0, divider)\n .concat([fragments[divider].split(splitRegex)[0]]),\n [fragments[divider].split(splitRegex)[1]].concat(\n fragments.slice(divider + 1)\n ),\n ]\n : [fragments];\n\n // Convert the values with units to absolute pixels to allow our computations\n ops = ops.map((op, index) => {\n // Most of the units rely on the orientation of the popper\n const measurement = (index === 1 ? !useHeight : useHeight)\n ? 'height'\n : 'width';\n let mergeWithPrevious = false;\n return (\n op\n // This aggregates any `+` or `-` sign that aren't considered operators\n // e.g.: 10 + +5 => [10, +, +5]\n .reduce((a, b) => {\n if (a[a.length - 1] === '' && ['+', '-'].indexOf(b) !== -1) {\n a[a.length - 1] = b;\n mergeWithPrevious = true;\n return a;\n } else if (mergeWithPrevious) {\n a[a.length - 1] += b;\n mergeWithPrevious = false;\n return a;\n } else {\n return a.concat(b);\n }\n }, [])\n // Here we convert the string values into number values (in px)\n .map(str => toValue(str, measurement, popperOffsets, referenceOffsets))\n );\n });\n\n // Loop trough the offsets arrays and execute the operations\n ops.forEach((op, index) => {\n op.forEach((frag, index2) => {\n if (isNumeric(frag)) {\n offsets[index] += frag * (op[index2 - 1] === '-' ? -1 : 1);\n }\n });\n });\n return offsets;\n}\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by update method\n * @argument {Object} options - Modifiers configuration and options\n * @argument {Number|String} options.offset=0\n * The offset value as described in the modifier description\n * @returns {Object} The data object, properly modified\n */\nexport default function offset(data, { offset }) {\n const { placement, offsets: { popper, reference } } = data;\n const basePlacement = placement.split('-')[0];\n\n let offsets;\n if (isNumeric(+offset)) {\n offsets = [+offset, 0];\n } else {\n offsets = parseOffset(offset, popper, reference, basePlacement);\n }\n\n if (basePlacement === 'left') {\n popper.top += offsets[0];\n popper.left -= offsets[1];\n } else if (basePlacement === 'right') {\n popper.top += offsets[0];\n popper.left += offsets[1];\n } else if (basePlacement === 'top') {\n popper.left += offsets[0];\n popper.top -= offsets[1];\n } else if (basePlacement === 'bottom') {\n popper.left += offsets[0];\n popper.top += offsets[1];\n }\n\n data.popper = popper;\n return data;\n}\n","import applyStyle, { applyStyleOnLoad } from './applyStyle';\nimport computeStyle from './computeStyle';\nimport arrow from './arrow';\nimport flip from './flip';\nimport keepTogether from './keepTogether';\nimport offset from './offset';\nimport preventOverflow from './preventOverflow';\nimport shift from './shift';\nimport hide from './hide';\nimport inner from './inner';\n\n/**\n * Modifier function, each modifier can have a function of this type assigned\n * to its `fn` property.<br />\n * These functions will be called on each update, this means that you must\n * make sure they are performant enough to avoid performance bottlenecks.\n *\n * @function ModifierFn\n * @argument {dataObject} data - The data object generated by `update` method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {dataObject} The data object, properly modified\n */\n\n/**\n * Modifiers are plugins used to alter the behavior of your poppers.<br />\n * Popper.js uses a set of 9 modifiers to provide all the basic functionalities\n * needed by the library.\n *\n * Usually you don't want to override the `order`, `fn` and `onLoad` props.\n * All the other properties are configurations that could be tweaked.\n * @namespace modifiers\n */\nexport default {\n /**\n * Modifier used to shift the popper on the start or end of its reference\n * element.<br />\n * It will read the variation of the `placement` property.<br />\n * It can be one either `-end` or `-start`.\n * @memberof modifiers\n * @inner\n */\n shift: {\n /** @prop {number} order=100 - Index used to define the order of execution */\n order: 100,\n /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n enabled: true,\n /** @prop {ModifierFn} */\n fn: shift,\n },\n\n /**\n * The `offset` modifier can shift your popper on both its axis.\n *\n * It accepts the following units:\n * - `px` or unit-less, interpreted as pixels\n * - `%` or `%r`, percentage relative to the length of the reference element\n * - `%p`, percentage relative to the length of the popper element\n * - `vw`, CSS viewport width unit\n * - `vh`, CSS viewport height unit\n *\n * For length is intended the main axis relative to the placement of the popper.<br />\n * This means that if the placement is `top` or `bottom`, the length will be the\n * `width`. In case of `left` or `right`, it will be the `height`.\n *\n * You can provide a single value (as `Number` or `String`), or a pair of values\n * as `String` divided by a comma or one (or more) white spaces.<br />\n * The latter is a deprecated method because it leads to confusion and will be\n * removed in v2.<br />\n * Additionally, it accepts additions and subtractions between different units.\n * Note that multiplications and divisions aren't supported.\n *\n * Valid examples are:\n * ```\n * 10\n * '10%'\n * '10, 10'\n * '10%, 10'\n * '10 + 10%'\n * '10 - 5vh + 3%'\n * '-10px + 5vh, 5px - 6%'\n * ```\n * > **NB**: If you desire to apply offsets to your poppers in a way that may make them overlap\n * > with their reference element, unfortunately, you will have to disable the `flip` modifier.\n * > You can read more on this at this [issue](https://github.com/FezVrasta/popper.js/issues/373).\n *\n * @memberof modifiers\n * @inner\n */\n offset: {\n /** @prop {number} order=200 - Index used to define the order of execution */\n order: 200,\n /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n enabled: true,\n /** @prop {ModifierFn} */\n fn: offset,\n /** @prop {Number|String} offset=0\n * The offset value as described in the modifier description\n */\n offset: 0,\n },\n\n /**\n * Modifier used to prevent the popper from being positioned outside the boundary.\n *\n * A scenario exists where the reference itself is not within the boundaries.<br />\n * We can say it has \"escaped the boundaries\" — or just \"escaped\".<br />\n * In this case we need to decide whether the popper should either:\n *\n * - detach from the reference and remain \"trapped\" in the boundaries, or\n * - if it should ignore the boundary and \"escape with its reference\"\n *\n * When `escapeWithReference` is set to`true` and reference is completely\n * outside its boundaries, the popper will overflow (or completely leave)\n * the boundaries in order to remain attached to the edge of the reference.\n *\n * @memberof modifiers\n * @inner\n */\n preventOverflow: {\n /** @prop {number} order=300 - Index used to define the order of execution */\n order: 300,\n /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n enabled: true,\n /** @prop {ModifierFn} */\n fn: preventOverflow,\n /**\n * @prop {Array} [priority=['left','right','top','bottom']]\n * Popper will try to prevent overflow following these priorities by default,\n * then, it could overflow on the left and on top of the `boundariesElement`\n */\n priority: ['left', 'right', 'top', 'bottom'],\n /**\n * @prop {number} padding=5\n * Amount of pixel used to define a minimum distance between the boundaries\n * and the popper. This makes sure the popper always has a little padding\n * between the edges of its container\n */\n padding: 5,\n /**\n * @prop {String|HTMLElement} boundariesElement='scrollParent'\n * Boundaries used by the modifier. Can be `scrollParent`, `window`,\n * `viewport` or any DOM element.\n */\n boundariesElement: 'scrollParent',\n },\n\n /**\n * Modifier used to make sure the reference and its popper stay near each other\n * without leaving any gap between the two. Especially useful when the arrow is\n * enabled and you want to ensure that it points to its reference element.\n * It cares only about the first axis. You can still have poppers with margin\n * between the popper and its reference element.\n * @memberof modifiers\n * @inner\n */\n keepTogether: {\n /** @prop {number} order=400 - Index used to define the order of execution */\n order: 400,\n /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n enabled: true,\n /** @prop {ModifierFn} */\n fn: keepTogether,\n },\n\n /**\n * This modifier is used to move the `arrowElement` of the popper to make\n * sure it is positioned between the reference element and its popper element.\n * It will read the outer size of the `arrowElement` node to detect how many\n * pixels of conjunction are needed.\n *\n * It has no effect if no `arrowElement` is provided.\n * @memberof modifiers\n * @inner\n */\n arrow: {\n /** @prop {number} order=500 - Index used to define the order of execution */\n order: 500,\n /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n enabled: true,\n /** @prop {ModifierFn} */\n fn: arrow,\n /** @prop {String|HTMLElement} element='[x-arrow]' - Selector or node used as arrow */\n element: '[x-arrow]',\n },\n\n /**\n * Modifier used to flip the popper's placement when it starts to overlap its\n * reference element.\n *\n * Requires the `preventOverflow` modifier before it in order to work.\n *\n * **NOTE:** this modifier will interrupt the current update cycle and will\n * restart it if it detects the need to flip the placement.\n * @memberof modifiers\n * @inner\n */\n flip: {\n /** @prop {number} order=600 - Index used to define the order of execution */\n order: 600,\n /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n enabled: true,\n /** @prop {ModifierFn} */\n fn: flip,\n /**\n * @prop {String|Array} behavior='flip'\n * The behavior used to change the popper's placement. It can be one of\n * `flip`, `clockwise`, `counterclockwise` or an array with a list of valid\n * placements (with optional variations)\n */\n behavior: 'flip',\n /**\n * @prop {number} padding=5\n * The popper will flip if it hits the edges of the `boundariesElement`\n */\n padding: 5,\n /**\n * @prop {String|HTMLElement} boundariesElement='viewport'\n * The element which will define the boundaries of the popper position.\n * The popper will never be placed outside of the defined boundaries\n * (except if `keepTogether` is enabled)\n */\n boundariesElement: 'viewport',\n /**\n * @prop {Boolean} flipVariations=false\n * The popper will switch placement variation between `-start` and `-end` when\n * the reference element overlaps its boundaries.\n *\n * The original placement should have a set variation.\n */\n flipVariations: false,\n /**\n * @prop {Boolean} flipVariationsByContent=false\n * The popper will switch placement variation between `-start` and `-end` when\n * the popper element overlaps its reference boundaries.\n *\n * The original placement should have a set variation.\n */\n flipVariationsByContent: false,\n },\n\n /**\n * Modifier used to make the popper flow toward the inner of the reference element.\n * By default, when this modifier is disabled, the popper will be placed outside\n * the reference element.\n * @memberof modifiers\n * @inner\n */\n inner: {\n /** @prop {number} order=700 - Index used to define the order of execution */\n order: 700,\n /** @prop {Boolean} enabled=false - Whether the modifier is enabled or not */\n enabled: false,\n /** @prop {ModifierFn} */\n fn: inner,\n },\n\n /**\n * Modifier used to hide the popper when its reference element is outside of the\n * popper boundaries. It will set a `x-out-of-boundaries` attribute which can\n * be used to hide with a CSS selector the popper when its reference is\n * out of boundaries.\n *\n * Requires the `preventOverflow` modifier before it in order to work.\n * @memberof modifiers\n * @inner\n */\n hide: {\n /** @prop {number} order=800 - Index used to define the order of execution */\n order: 800,\n /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n enabled: true,\n /** @prop {ModifierFn} */\n fn: hide,\n },\n\n /**\n * Computes the style that will be applied to the popper element to gets\n * properly positioned.\n *\n * Note that this modifier will not touch the DOM, it just prepares the styles\n * so that `applyStyle` modifier can apply it. This separation is useful\n * in case you need to replace `applyStyle` with a custom implementation.\n *\n * This modifier has `850` as `order` value to maintain backward compatibility\n * with previous versions of Popper.js. Expect the modifiers ordering method\n * to change in future major versions of the library.\n *\n * @memberof modifiers\n * @inner\n */\n computeStyle: {\n /** @prop {number} order=850 - Index used to define the order of execution */\n order: 850,\n /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n enabled: true,\n /** @prop {ModifierFn} */\n fn: computeStyle,\n /**\n * @prop {Boolean} gpuAcceleration=true\n * If true, it uses the CSS 3D transformation to position the popper.\n * Otherwise, it will use the `top` and `left` properties\n */\n gpuAcceleration: true,\n /**\n * @prop {string} [x='bottom']\n * Where to anchor the X axis (`bottom` or `top`). AKA X offset origin.\n * Change this if your popper should grow in a direction different from `bottom`\n */\n x: 'bottom',\n /**\n * @prop {string} [x='left']\n * Where to anchor the Y axis (`left` or `right`). AKA Y offset origin.\n * Change this if your popper should grow in a direction different from `right`\n */\n y: 'right',\n },\n\n /**\n * Applies the computed styles to the popper element.\n *\n * All the DOM manipulations are limited to this modifier. This is useful in case\n * you want to integrate Popper.js inside a framework or view library and you\n * want to delegate all the DOM manipulations to it.\n *\n * Note that if you disable this modifier, you must make sure the popper element\n * has its position set to `absolute` before Popper.js can do its work!\n *\n * Just disable this modifier and define your own to achieve the desired effect.\n *\n * @memberof modifiers\n * @inner\n */\n applyStyle: {\n /** @prop {number} order=900 - Index used to define the order of execution */\n order: 900,\n /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n enabled: true,\n /** @prop {ModifierFn} */\n fn: applyStyle,\n /** @prop {Function} */\n onLoad: applyStyleOnLoad,\n /**\n * @deprecated since version 1.10.0, the property moved to `computeStyle` modifier\n * @prop {Boolean} gpuAcceleration=true\n * If true, it uses the CSS 3D transformation to position the popper.\n * Otherwise, it will use the `top` and `left` properties\n */\n gpuAcceleration: undefined,\n },\n};\n\n/**\n * The `dataObject` is an object containing all the information used by Popper.js.\n * This object is passed to modifiers and to the `onCreate` and `onUpdate` callbacks.\n * @name dataObject\n * @property {Object} data.instance The Popper.js instance\n * @property {String} data.placement Placement applied to popper\n * @property {String} data.originalPlacement Placement originally defined on init\n * @property {Boolean} data.flipped True if popper has been flipped by flip modifier\n * @property {Boolean} data.hide True if the reference element is out of boundaries, useful to know when to hide the popper\n * @property {HTMLElement} data.arrowElement Node used as arrow by arrow modifier\n * @property {Object} data.styles Any CSS property defined here will be applied to the popper. It expects the JavaScript nomenclature (eg. `marginBottom`)\n * @property {Object} data.arrowStyles Any CSS property defined here will be applied to the popper arrow. It expects the JavaScript nomenclature (eg. `marginBottom`)\n * @property {Object} data.boundaries Offsets of the popper boundaries\n * @property {Object} data.offsets The measurements of popper, reference and arrow elements\n * @property {Object} data.offsets.popper `top`, `left`, `width`, `height` values\n * @property {Object} data.offsets.reference `top`, `left`, `width`, `height` values\n * @property {Object} data.offsets.arrow] `top` and `left` offsets, only one of them will be different from 0\n */\n","import modifiers from '../modifiers/index';\n\n/**\n * Default options provided to Popper.js constructor.<br />\n * These can be overridden using the `options` argument of Popper.js.<br />\n * To override an option, simply pass an object with the same\n * structure of the `options` object, as the 3rd argument. For example:\n * ```\n * new Popper(ref, pop, {\n * modifiers: {\n * preventOverflow: { enabled: false }\n * }\n * })\n * ```\n * @type {Object}\n * @static\n * @memberof Popper\n */\nexport default {\n /**\n * Popper's placement.\n * @prop {Popper.placements} placement='bottom'\n */\n placement: 'bottom',\n\n /**\n * Set this to true if you want popper to position it self in 'fixed' mode\n * @prop {Boolean} positionFixed=false\n */\n positionFixed: false,\n\n /**\n * Whether events (resize, scroll) are initially enabled.\n * @prop {Boolean} eventsEnabled=true\n */\n eventsEnabled: true,\n\n /**\n * Set to true if you want to automatically remove the popper when\n * you call the `destroy` method.\n * @prop {Boolean} removeOnDestroy=false\n */\n removeOnDestroy: false,\n\n /**\n * Callback called when the popper is created.<br />\n * By default, it is set to no-op.<br />\n * Access Popper.js instance with `data.instance`.\n * @prop {onCreate}\n */\n onCreate: () => {},\n\n /**\n * Callback called when the popper is updated. This callback is not called\n * on the initialization/creation of the popper, but only on subsequent\n * updates.<br />\n * By default, it is set to no-op.<br />\n * Access Popper.js instance with `data.instance`.\n * @prop {onUpdate}\n */\n onUpdate: () => {},\n\n /**\n * List of modifiers used to modify the offsets before they are applied to the popper.\n * They provide most of the functionalities of Popper.js.\n * @prop {modifiers}\n */\n modifiers,\n};\n\n/**\n * @callback onCreate\n * @param {dataObject} data\n */\n\n/**\n * @callback onUpdate\n * @param {dataObject} data\n */\n","/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by `update` method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nexport default function shift(data) {\n const placement = data.placement;\n const basePlacement = placement.split('-')[0];\n const shiftvariation = placement.split('-')[1];\n\n // if shift shiftvariation is specified, run the modifier\n if (shiftvariation) {\n const { reference, popper } = data.offsets;\n const isVertical = ['bottom', 'top'].indexOf(basePlacement) !== -1;\n const side = isVertical ? 'left' : 'top';\n const measurement = isVertical ? 'width' : 'height';\n\n const shiftOffsets = {\n start: { [side]: reference[side] },\n end: {\n [side]: reference[side] + reference[measurement] - popper[measurement],\n },\n };\n\n data.offsets.popper = { ...popper, ...shiftOffsets[shiftvariation] };\n }\n\n return data;\n}\n","import getOffsetParent from '../utils/getOffsetParent';\nimport getBoundaries from '../utils/getBoundaries';\nimport getSupportedPropertyName from '../utils/getSupportedPropertyName';\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by `update` method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nexport default function preventOverflow(data, options) {\n let boundariesElement =\n options.boundariesElement || getOffsetParent(data.instance.popper);\n\n // If offsetParent is the reference element, we really want to\n // go one step up and use the next offsetParent as reference to\n // avoid to make this modifier completely useless and look like broken\n if (data.instance.reference === boundariesElement) {\n boundariesElement = getOffsetParent(boundariesElement);\n }\n\n // NOTE: DOM access here\n // resets the popper's position so that the document size can be calculated excluding\n // the size of the popper element itself\n const transformProp = getSupportedPropertyName('transform');\n const popperStyles = data.instance.popper.style; // assignment to help minification\n const { top, left, [transformProp]: transform } = popperStyles;\n popperStyles.top = '';\n popperStyles.left = '';\n popperStyles[transformProp] = '';\n\n const boundaries = getBoundaries(\n data.instance.popper,\n data.instance.reference,\n options.padding,\n boundariesElement,\n data.positionFixed\n );\n\n // NOTE: DOM access here\n // restores the original style properties after the offsets have been computed\n popperStyles.top = top;\n popperStyles.left = left;\n popperStyles[transformProp] = transform;\n\n options.boundaries = boundaries;\n\n const order = options.priority;\n let popper = data.offsets.popper;\n\n const check = {\n primary(placement) {\n let value = popper[placement];\n if (\n popper[placement] < boundaries[placement] &&\n !options.escapeWithReference\n ) {\n value = Math.max(popper[placement], boundaries[placement]);\n }\n return { [placement]: value };\n },\n secondary(placement) {\n const mainSide = placement === 'right' ? 'left' : 'top';\n let value = popper[mainSide];\n if (\n popper[placement] > boundaries[placement] &&\n !options.escapeWithReference\n ) {\n value = Math.min(\n popper[mainSide],\n boundaries[placement] -\n (placement === 'right' ? popper.width : popper.height)\n );\n }\n return { [mainSide]: value };\n },\n };\n\n order.forEach(placement => {\n const side =\n ['left', 'top'].indexOf(placement) !== -1 ? 'primary' : 'secondary';\n popper = { ...popper, ...check[side](placement) };\n });\n\n data.offsets.popper = popper;\n\n return data;\n}\n","/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by update method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nexport default function keepTogether(data) {\n const { popper, reference } = data.offsets;\n const placement = data.placement.split('-')[0];\n const floor = Math.floor;\n const isVertical = ['top', 'bottom'].indexOf(placement) !== -1;\n const side = isVertical ? 'right' : 'bottom';\n const opSide = isVertical ? 'left' : 'top';\n const measurement = isVertical ? 'width' : 'height';\n\n if (popper[side] < floor(reference[opSide])) {\n data.offsets.popper[opSide] =\n floor(reference[opSide]) - popper[measurement];\n }\n if (popper[opSide] > floor(reference[side])) {\n data.offsets.popper[opSide] = floor(reference[side]);\n }\n\n return data;\n}\n","import getClientRect from '../utils/getClientRect';\nimport getOuterSizes from '../utils/getOuterSizes';\nimport isModifierRequired from '../utils/isModifierRequired';\nimport getStyleComputedProperty from '../utils/getStyleComputedProperty';\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by update method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nexport default function arrow(data, options) {\n // arrow depends on keepTogether in order to work\n if (!isModifierRequired(data.instance.modifiers, 'arrow', 'keepTogether')) {\n return data;\n }\n\n let arrowElement = options.element;\n\n // if arrowElement is a string, suppose it's a CSS selector\n if (typeof arrowElement === 'string') {\n arrowElement = data.instance.popper.querySelector(arrowElement);\n\n // if arrowElement is not found, don't run the modifier\n if (!arrowElement) {\n return data;\n }\n } else {\n // if the arrowElement isn't a query selector we must check that the\n // provided DOM node is child of its popper node\n if (!data.instance.popper.contains(arrowElement)) {\n console.warn(\n 'WARNING: `arrow.element` must be child of its popper element!'\n );\n return data;\n }\n }\n\n const placement = data.placement.split('-')[0];\n const { popper, reference } = data.offsets;\n const isVertical = ['left', 'right'].indexOf(placement) !== -1;\n\n const len = isVertical ? 'height' : 'width';\n const sideCapitalized = isVertical ? 'Top' : 'Left';\n const side = sideCapitalized.toLowerCase();\n const altSide = isVertical ? 'left' : 'top';\n const opSide = isVertical ? 'bottom' : 'right';\n const arrowElementSize = getOuterSizes(arrowElement)[len];\n\n //\n // extends keepTogether behavior making sure the popper and its\n // reference have enough pixels in conjunction\n //\n\n // top/left side\n if (reference[opSide] - arrowElementSize < popper[side]) {\n data.offsets.popper[side] -=\n popper[side] - (reference[opSide] - arrowElementSize);\n }\n // bottom/right side\n if (reference[side] + arrowElementSize > popper[opSide]) {\n data.offsets.popper[side] +=\n reference[side] + arrowElementSize - popper[opSide];\n }\n data.offsets.popper = getClientRect(data.offsets.popper);\n\n // compute center of the popper\n const center = reference[side] + reference[len] / 2 - arrowElementSize / 2;\n\n // Compute the sideValue using the updated popper offsets\n // take popper margin in account because we don't have this info available\n const css = getStyleComputedProperty(data.instance.popper);\n const popperMarginSide = parseFloat(css[`margin${sideCapitalized}`]);\n const popperBorderSide = parseFloat(css[`border${sideCapitalized}Width`]);\n let sideValue =\n center - data.offsets.popper[side] - popperMarginSide - popperBorderSide;\n\n // prevent arrowElement from being placed not contiguously to its popper\n sideValue = Math.max(Math.min(popper[len] - arrowElementSize, sideValue), 0);\n\n data.arrowElement = arrowElement;\n data.offsets.arrow = {\n [side]: Math.round(sideValue),\n [altSide]: '', // make sure to unset any eventual altSide value from the DOM node\n };\n\n return data;\n}\n","/**\n * Get the opposite placement variation of the given one\n * @method\n * @memberof Popper.Utils\n * @argument {String} placement variation\n * @returns {String} flipped placement variation\n */\nexport default function getOppositeVariation(variation) {\n if (variation === 'end') {\n return 'start';\n } else if (variation === 'start') {\n return 'end';\n }\n return variation;\n}\n","import getClientRect from '../utils/getClientRect';\nimport getOppositePlacement from '../utils/getOppositePlacement';\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by `update` method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nexport default function inner(data) {\n const placement = data.placement;\n const basePlacement = placement.split('-')[0];\n const { popper, reference } = data.offsets;\n const isHoriz = ['left', 'right'].indexOf(basePlacement) !== -1;\n\n const subtractLength = ['top', 'left'].indexOf(basePlacement) === -1;\n\n popper[isHoriz ? 'left' : 'top'] =\n reference[basePlacement] -\n (subtractLength ? popper[isHoriz ? 'width' : 'height'] : 0);\n\n data.placement = getOppositePlacement(placement);\n data.offsets.popper = getClientRect(popper);\n\n return data;\n}\n","import isModifierRequired from '../utils/isModifierRequired';\nimport find from '../utils/find';\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by update method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nexport default function hide(data) {\n if (!isModifierRequired(data.instance.modifiers, 'hide', 'preventOverflow')) {\n return data;\n }\n\n const refRect = data.offsets.reference;\n const bound = find(\n data.instance.modifiers,\n modifier => modifier.name === 'preventOverflow'\n ).boundaries;\n\n if (\n refRect.bottom < bound.top ||\n refRect.left > bound.right ||\n refRect.top > bound.bottom ||\n refRect.right < bound.left\n ) {\n // Avoid unnecessary DOM access if visibility hasn't changed\n if (data.hide === true) {\n return data;\n }\n\n data.hide = true;\n data.attributes['x-out-of-boundaries'] = '';\n } else {\n // Avoid unnecessary DOM access if visibility hasn't changed\n if (data.hide === false) {\n return data;\n }\n\n data.hide = false;\n data.attributes['x-out-of-boundaries'] = false;\n }\n\n return data;\n}\n","/**\n * @function\n * @memberof Popper.Utils\n * @argument {Object} data - The data object generated by `update` method\n * @argument {Boolean} shouldRound - If the offsets should be rounded at all\n * @returns {Object} The popper's position offsets rounded\n *\n * The tale of pixel-perfect positioning. It's still not 100% perfect, but as\n * good as it can be within reason.\n * Discussion here: https://github.com/FezVrasta/popper.js/pull/715\n *\n * Low DPI screens cause a popper to be blurry if not using full pixels (Safari\n * as well on High DPI screens).\n *\n * Firefox prefers no rounding for positioning and does not have blurriness on\n * high DPI screens.\n *\n * Only horizontal placement and left/right values need to be considered.\n */\nexport default function getRoundedOffsets(data, shouldRound) {\n const { popper, reference } = data.offsets;\n const { round, floor } = Math;\n const noRound = v => v;\n \n const referenceWidth = round(reference.width);\n const popperWidth = round(popper.width);\n \n const isVertical = ['left', 'right'].indexOf(data.placement) !== -1;\n const isVariation = data.placement.indexOf('-') !== -1;\n const sameWidthParity = referenceWidth % 2 === popperWidth % 2;\n const bothOddWidth = referenceWidth % 2 === 1 && popperWidth % 2 === 1;\n\n const horizontalToInteger = !shouldRound\n ? noRound\n : isVertical || isVariation || sameWidthParity\n ? round\n : floor;\n const verticalToInteger = !shouldRound ? noRound : round;\n\n return {\n left: horizontalToInteger(\n bothOddWidth && !isVariation && shouldRound\n ? popper.left - 1\n : popper.left\n ),\n top: verticalToInteger(popper.top),\n bottom: verticalToInteger(popper.bottom),\n right: horizontalToInteger(popper.right),\n };\n}\n","import setStyles from '../utils/setStyles';\nimport setAttributes from '../utils/setAttributes';\nimport getReferenceOffsets from '../utils/getReferenceOffsets';\nimport computeAutoPlacement from '../utils/computeAutoPlacement';\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by `update` method\n * @argument {Object} data.styles - List of style properties - values to apply to popper element\n * @argument {Object} data.attributes - List of attribute properties - values to apply to popper element\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The same data object\n */\nexport default function applyStyle(data) {\n // any property present in `data.styles` will be applied to the popper,\n // in this way we can make the 3rd party modifiers add custom styles to it\n // Be aware, modifiers could override the properties defined in the previous\n // lines of this modifier!\n setStyles(data.instance.popper, data.styles);\n\n // any property present in `data.attributes` will be applied to the popper,\n // they will be set as HTML attributes of the element\n setAttributes(data.instance.popper, data.attributes);\n\n // if arrowElement is defined and arrowStyles has some properties\n if (data.arrowElement && Object.keys(data.arrowStyles).length) {\n setStyles(data.arrowElement, data.arrowStyles);\n }\n\n return data;\n}\n\n/**\n * Set the x-placement attribute before everything else because it could be used\n * to add margins to the popper margins needs to be calculated to get the\n * correct popper offsets.\n * @method\n * @memberof Popper.modifiers\n * @param {HTMLElement} reference - The reference element used to position the popper\n * @param {HTMLElement} popper - The HTML element used as popper\n * @param {Object} options - Popper.js options\n */\nexport function applyStyleOnLoad(\n reference,\n popper,\n options,\n modifierOptions,\n state\n) {\n // compute reference element offsets\n const referenceOffsets = getReferenceOffsets(state, popper, reference, options.positionFixed);\n\n // compute auto placement, store placement inside the data object,\n // modifiers will be able to edit `placement` if needed\n // and refer to originalPlacement to know the original value\n const placement = computeAutoPlacement(\n options.placement,\n referenceOffsets,\n popper,\n reference,\n options.modifiers.flip.boundariesElement,\n options.modifiers.flip.padding\n );\n\n popper.setAttribute('x-placement', placement);\n\n // Apply `position` to popper before anything else because\n // without the position applied we can't guarantee correct computations\n setStyles(popper, { position: options.positionFixed ? 'fixed' : 'absolute' });\n\n return options;\n}\n","/**\n * Set the attributes to the given popper\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element - Element to apply the attributes to\n * @argument {Object} styles\n * Object with a list of properties and values which will be applied to the element\n */\nexport default function setAttributes(element, attributes) {\n Object.keys(attributes).forEach(function(prop) {\n const value = attributes[prop];\n if (value !== false) {\n element.setAttribute(prop, attributes[prop]);\n } else {\n element.removeAttribute(prop);\n }\n });\n}\n","!function(r,t){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=t():\"function\"==typeof define&&define.amd?define(t):r.dayjs_plugin_relativeTime=t()}(this,function(){\"use strict\";return function(r,t,e){var n=t.prototype;e.en.relativeTime={future:\"in %s\",past:\"%s ago\",s:\"a few 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\"};var o=function(r,t,n,o){for(var d,i,u,a=n.$locale().relativeTime,f=[{l:\"s\",r:44,d:\"second\"},{l:\"m\",r:89},{l:\"mm\",r:44,d:\"minute\"},{l:\"h\",r:89},{l:\"hh\",r:21,d:\"hour\"},{l:\"d\",r:35},{l:\"dd\",r:25,d:\"day\"},{l:\"M\",r:45},{l:\"MM\",r:10,d:\"month\"},{l:\"y\",r:17},{l:\"yy\",d:\"year\"}],s=f.length,l=0;l<s;l+=1){var h=f[l];h.d&&(d=o?e(r).diff(n,h.d,!0):n.diff(r,h.d,!0));var m=Math.round(Math.abs(d));if(u=d>0,m<=h.r||!h.r){1===m&&l>0&&(h=f[l-1]);var c=a[h.l];i=\"string\"==typeof c?c.replace(\"%d\",m):c(m,t,h.l,u);break}}return t?i:(u?a.future:a.past).replace(\"%s\",i)};n.to=function(r,t){return o(r,t,this,!0)},n.from=function(r,t){return o(r,t,this)};var d=function(r){return r.$u?e.utc():e()};n.toNow=function(r){return this.to(d(this),r)},n.fromNow=function(r){return this.from(d(this),r)}}});\n","!function(e,t){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=t():\"function\"==typeof define&&define.amd?define(t):e.dayjs_plugin_localizedFormat=t()}(this,function(){\"use strict\";return function(e,t,o){var n=t.prototype,r=n.format,M={LTS:\"h:mm:ss A\",LT:\"h:mm A\",L:\"MM/DD/YYYY\",LL:\"MMMM D, YYYY\",LLL:\"MMMM D, YYYY h:mm A\",LLLL:\"dddd, MMMM D, YYYY h:mm A\"};o.en.formats=M;n.format=function(e){void 0===e&&(e=\"YYYY-MM-DDTHH:mm:ssZ\");var t=this.$locale().formats,o=void 0===t?{}:t,n=e.replace(/(\\[[^\\]]+])|(LTS?|l{1,4}|L{1,4})/g,function(e,t,n){var r=n&&n.toUpperCase();return t||o[n]||M[n]||o[r].replace(/(\\[[^\\]]+])|(MMMM|MM|DD|dddd)/g,function(e,t,o){return t||o.slice(1)})});return r.call(this,n)}}});\n","\"use strict\"\n\nmodule.exports = require(\"./stream/stream\")\n","module.exports = global[\"jQuery\"] = require(\"-!E:\\\\sites\\\\flarum-new\\\\packages\\\\flarum-core\\\\js\\\\node_modules\\\\babel-loader\\\\lib\\\\index.js??ref--5!E:\\\\sites\\\\flarum-new\\\\packages\\\\flarum-core\\\\js\\\\node_modules\\\\imports-loader\\\\index.js?this=>window!E:\\\\sites\\\\flarum-new\\\\packages\\\\flarum-core\\\\js\\\\node_modules\\\\source-map-loader\\\\index.js!.\\\\zepto.js\");","/*** IMPORTS FROM imports-loader ***/\n(function() {\n\n/* Zepto v1.2.0 - zepto event ajax form ie - zeptojs.com/license */\n(function(global, factory) {\n if (typeof define === 'function' && define.amd)\n define(function() { return factory(global) })\n else\n factory(global)\n}(this, function(window) {\n var Zepto = (function() {\n var undefined, key, $, classList, emptyArray = [], concat = emptyArray.concat, filter = emptyArray.filter, slice = emptyArray.slice,\n document = window.document,\n elementDisplay = {}, classCache = {},\n cssNumber = { 'column-count': 1, 'columns': 1, 'font-weight': 1, 'line-height': 1,'opacity': 1, 'z-index': 1, 'zoom': 1 },\n fragmentRE = /^\\s*<(\\w+|!)[^>]*>/,\n singleTagRE = /^<(\\w+)\\s*\\/?>(?:<\\/\\1>|)$/,\n tagExpanderRE = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\\w:]+)[^>]*)\\/>/ig,\n rootNodeRE = /^(?:body|html)$/i,\n capitalRE = /([A-Z])/g,\n\n // special attributes that should be get/set via method calls\n methodAttributes = ['val', 'css', 'html', 'text', 'data', 'width', 'height', 'offset'],\n\n adjacencyOperators = [ 'after', 'prepend', 'before', 'append' ],\n table = document.createElement('table'),\n tableRow = document.createElement('tr'),\n containers = {\n 'tr': document.createElement('tbody'),\n 'tbody': table, 'thead': table, 'tfoot': table,\n 'td': tableRow, 'th': tableRow,\n '*': document.createElement('div')\n },\n readyRE = /complete|loaded|interactive/,\n simpleSelectorRE = /^[\\w-]*$/,\n class2type = {},\n toString = class2type.toString,\n zepto = {},\n camelize, uniq,\n tempParent = document.createElement('div'),\n propMap = {\n 'tabindex': 'tabIndex',\n 'readonly': 'readOnly',\n 'for': 'htmlFor',\n 'class': 'className',\n 'maxlength': 'maxLength',\n 'cellspacing': 'cellSpacing',\n 'cellpadding': 'cellPadding',\n 'rowspan': 'rowSpan',\n 'colspan': 'colSpan',\n 'usemap': 'useMap',\n 'frameborder': 'frameBorder',\n 'contenteditable': 'contentEditable'\n },\n isArray = Array.isArray ||\n function(object){ return object instanceof Array }\n\n zepto.matches = function(element, selector) {\n if (!selector || !element || element.nodeType !== 1) return false\n var matchesSelector = element.matches || element.webkitMatchesSelector ||\n element.mozMatchesSelector || element.oMatchesSelector ||\n element.matchesSelector\n if (matchesSelector) return matchesSelector.call(element, selector)\n // fall back to performing a selector:\n var match, parent = element.parentNode, temp = !parent\n if (temp) (parent = tempParent).appendChild(element)\n match = ~zepto.qsa(parent, selector).indexOf(element)\n temp && tempParent.removeChild(element)\n return match\n }\n\n function type(obj) {\n return obj == null ? String(obj) :\n class2type[toString.call(obj)] || \"object\"\n }\n\n function isFunction(value) { return type(value) == \"function\" }\n function isWindow(obj) { return obj != null && obj == obj.window }\n function isDocument(obj) { return obj != null && obj.nodeType == obj.DOCUMENT_NODE }\n function isObject(obj) { return type(obj) == \"object\" }\n function isPlainObject(obj) {\n return isObject(obj) && !isWindow(obj) && Object.getPrototypeOf(obj) == Object.prototype\n }\n\n function likeArray(obj) {\n var length = !!obj && 'length' in obj && obj.length,\n type = $.type(obj)\n\n return 'function' != type && !isWindow(obj) && (\n 'array' == type || length === 0 ||\n (typeof length == 'number' && length > 0 && (length - 1) in obj)\n )\n }\n\n function compact(array) { return filter.call(array, function(item){ return item != null }) }\n function flatten(array) { return array.length > 0 ? $.fn.concat.apply([], array) : array }\n camelize = function(str){ return str.replace(/-+(.)?/g, function(match, chr){ return chr ? chr.toUpperCase() : '' }) }\n function dasherize(str) {\n return str.replace(/::/g, '/')\n .replace(/([A-Z]+)([A-Z][a-z])/g, '$1_$2')\n .replace(/([a-z\\d])([A-Z])/g, '$1_$2')\n .replace(/_/g, '-')\n .toLowerCase()\n }\n uniq = function(array){ return filter.call(array, function(item, idx){ return array.indexOf(item) == idx }) }\n\n function classRE(name) {\n return name in classCache ?\n classCache[name] : (classCache[name] = new RegExp('(^|\\\\s)' + name + '(\\\\s|$)'))\n }\n\n function maybeAddPx(name, value) {\n return (typeof value == \"number\" && !cssNumber[dasherize(name)]) ? value + \"px\" : value\n }\n\n function defaultDisplay(nodeName) {\n var element, display\n if (!elementDisplay[nodeName]) {\n element = document.createElement(nodeName)\n document.body.appendChild(element)\n display = getComputedStyle(element, '').getPropertyValue(\"display\")\n element.parentNode.removeChild(element)\n display == \"none\" && (display = \"block\")\n elementDisplay[nodeName] = display\n }\n return elementDisplay[nodeName]\n }\n\n function children(element) {\n return 'children' in element ?\n slice.call(element.children) :\n $.map(element.childNodes, function(node){ if (node.nodeType == 1) return node })\n }\n\n function Z(dom, selector) {\n var i, len = dom ? dom.length : 0\n for (i = 0; i < len; i++) this[i] = dom[i]\n this.length = len\n this.selector = selector || ''\n }\n\n // `$.zepto.fragment` takes a html string and an optional tag name\n // to generate DOM nodes from the given html string.\n // The generated DOM nodes are returned as an array.\n // This function can be overridden in plugins for example to make\n // it compatible with browsers that don't support the DOM fully.\n zepto.fragment = function(html, name, properties) {\n var dom, nodes, container\n\n // A special case optimization for a single tag\n if (singleTagRE.test(html)) dom = $(document.createElement(RegExp.$1))\n\n if (!dom) {\n if (html.replace) html = html.replace(tagExpanderRE, \"<$1></$2>\")\n if (name === undefined) name = fragmentRE.test(html) && RegExp.$1\n if (!(name in containers)) name = '*'\n\n container = containers[name]\n container.innerHTML = '' + html\n dom = $.each(slice.call(container.childNodes), function(){\n container.removeChild(this)\n })\n }\n\n if (isPlainObject(properties)) {\n nodes = $(dom)\n $.each(properties, function(key, value) {\n if (methodAttributes.indexOf(key) > -1) nodes[key](value)\n else nodes.attr(key, value)\n })\n }\n\n return dom\n }\n\n // `$.zepto.Z` swaps out the prototype of the given `dom` array\n // of nodes with `$.fn` and thus supplying all the Zepto functions\n // to the array. This method can be overridden in plugins.\n zepto.Z = function(dom, selector) {\n return new Z(dom, selector)\n }\n\n // `$.zepto.isZ` should return `true` if the given object is a Zepto\n // collection. This method can be overridden in plugins.\n zepto.isZ = function(object) {\n return object instanceof zepto.Z\n }\n\n // `$.zepto.init` is Zepto's counterpart to jQuery's `$.fn.init` and\n // takes a CSS selector and an optional context (and handles various\n // special cases).\n // This method can be overridden in plugins.\n zepto.init = function(selector, context) {\n var dom\n // If nothing given, return an empty Zepto collection\n if (!selector) return zepto.Z()\n // Optimize for string selectors\n else if (typeof selector == 'string') {\n selector = selector.trim()\n // If it's a html fragment, create nodes from it\n // Note: In both Chrome 21 and Firefox 15, DOM error 12\n // is thrown if the fragment doesn't begin with <\n if (selector[0] == '<' && fragmentRE.test(selector))\n dom = zepto.fragment(selector, RegExp.$1, context), selector = null\n // If there's a context, create a collection on that context first, and select\n // nodes from there\n else if (context !== undefined) return $(context).find(selector)\n // If it's a CSS selector, use it to select nodes.\n else dom = zepto.qsa(document, selector)\n }\n // If a function is given, call it when the DOM is ready\n else if (isFunction(selector)) return $(document).ready(selector)\n // If a Zepto collection is given, just return it\n else if (zepto.isZ(selector)) return selector\n else {\n // normalize array if an array of nodes is given\n if (isArray(selector)) dom = compact(selector)\n // Wrap DOM nodes.\n else if (isObject(selector))\n dom = [selector], selector = null\n // If it's a html fragment, create nodes from it\n else if (fragmentRE.test(selector))\n dom = zepto.fragment(selector.trim(), RegExp.$1, context), selector = null\n // If there's a context, create a collection on that context first, and select\n // nodes from there\n else if (context !== undefined) return $(context).find(selector)\n // And last but no least, if it's a CSS selector, use it to select nodes.\n else dom = zepto.qsa(document, selector)\n }\n // create a new Zepto collection from the nodes found\n return zepto.Z(dom, selector)\n }\n\n // `$` will be the base `Zepto` object. When calling this\n // function just call `$.zepto.init, which makes the implementation\n // details of selecting nodes and creating Zepto collections\n // patchable in plugins.\n $ = function(selector, context){\n return zepto.init(selector, context)\n }\n\n function extend(target, source, deep) {\n for (key in source)\n if (deep && (isPlainObject(source[key]) || isArray(source[key]))) {\n if (isPlainObject(source[key]) && !isPlainObject(target[key]))\n target[key] = {}\n if (isArray(source[key]) && !isArray(target[key]))\n target[key] = []\n extend(target[key], source[key], deep)\n }\n else if (source[key] !== undefined) target[key] = source[key]\n }\n\n // Copy all but undefined properties from one or more\n // objects to the `target` object.\n $.extend = function(target){\n var deep, args = slice.call(arguments, 1)\n if (typeof target == 'boolean') {\n deep = target\n target = args.shift()\n }\n args.forEach(function(arg){ extend(target, arg, deep) })\n return target\n }\n\n // `$.zepto.qsa` is Zepto's CSS selector implementation which\n // uses `document.querySelectorAll` and optimizes for some special cases, like `#id`.\n // This method can be overridden in plugins.\n zepto.qsa = function(element, selector){\n var found,\n maybeID = selector[0] == '#',\n maybeClass = !maybeID && selector[0] == '.',\n nameOnly = maybeID || maybeClass ? selector.slice(1) : selector, // Ensure that a 1 char tag name still gets checked\n isSimple = simpleSelectorRE.test(nameOnly)\n return (element.getElementById && isSimple && maybeID) ? // Safari DocumentFragment doesn't have getElementById\n ( (found = element.getElementById(nameOnly)) ? [found] : [] ) :\n (element.nodeType !== 1 && element.nodeType !== 9 && element.nodeType !== 11) ? [] :\n slice.call(\n isSimple && !maybeID && element.getElementsByClassName ? // DocumentFragment doesn't have getElementsByClassName/TagName\n maybeClass ? element.getElementsByClassName(nameOnly) : // If it's simple, it could be a class\n element.getElementsByTagName(selector) : // Or a tag\n element.querySelectorAll(selector) // Or it's not simple, and we need to query all\n )\n }\n\n function filtered(nodes, selector) {\n return selector == null ? $(nodes) : $(nodes).filter(selector)\n }\n\n $.contains = document.documentElement.contains ?\n function(parent, node) {\n return parent !== node && parent.contains(node)\n } :\n function(parent, node) {\n while (node && (node = node.parentNode))\n if (node === parent) return true\n return false\n }\n\n function funcArg(context, arg, idx, payload) {\n return isFunction(arg) ? arg.call(context, idx, payload) : arg\n }\n\n function setAttribute(node, name, value) {\n value == null ? node.removeAttribute(name) : node.setAttribute(name, value)\n }\n\n // access className property while respecting SVGAnimatedString\n function className(node, value){\n var klass = node.className || '',\n svg = klass && klass.baseVal !== undefined\n\n if (value === undefined) return svg ? klass.baseVal : klass\n svg ? (klass.baseVal = value) : (node.className = value)\n }\n\n // \"true\" => true\n // \"false\" => false\n // \"null\" => null\n // \"42\" => 42\n // \"42.5\" => 42.5\n // \"08\" => \"08\"\n // JSON => parse if valid\n // String => self\n function deserializeValue(value) {\n try {\n return value ?\n value == \"true\" ||\n ( value == \"false\" ? false :\n value == \"null\" ? null :\n +value + \"\" == value ? +value :\n /^[\\[\\{]/.test(value) ? $.parseJSON(value) :\n value )\n : value\n } catch(e) {\n return value\n }\n }\n\n $.type = type\n $.isFunction = isFunction\n $.isWindow = isWindow\n $.isArray = isArray\n $.isPlainObject = isPlainObject\n\n $.isEmptyObject = function(obj) {\n var name\n for (name in obj) return false\n return true\n }\n\n $.isNumeric = function(val) {\n var num = Number(val), type = typeof val\n return val != null && type != 'boolean' &&\n (type != 'string' || val.length) &&\n !isNaN(num) && isFinite(num) || false\n }\n\n $.inArray = function(elem, array, i){\n return emptyArray.indexOf.call(array, elem, i)\n }\n\n $.camelCase = camelize\n $.trim = function(str) {\n return str == null ? \"\" : String.prototype.trim.call(str)\n }\n\n // plugin compatibility\n $.uuid = 0\n $.support = { }\n $.expr = { }\n $.noop = function() {}\n\n $.map = function(elements, callback){\n var value, values = [], i, key\n if (likeArray(elements))\n for (i = 0; i < elements.length; i++) {\n value = callback(elements[i], i)\n if (value != null) values.push(value)\n }\n else\n for (key in elements) {\n value = callback(elements[key], key)\n if (value != null) values.push(value)\n }\n return flatten(values)\n }\n\n $.each = function(elements, callback){\n var i, key\n if (likeArray(elements)) {\n for (i = 0; i < elements.length; i++)\n if (callback.call(elements[i], i, elements[i]) === false) return elements\n } else {\n for (key in elements)\n if (callback.call(elements[key], key, elements[key]) === false) return elements\n }\n\n return elements\n }\n\n $.grep = function(elements, callback){\n return filter.call(elements, callback)\n }\n\n if (window.JSON) $.parseJSON = JSON.parse\n\n // Populate the class2type map\n $.each(\"Boolean Number String Function Array Date RegExp Object Error\".split(\" \"), function(i, name) {\n class2type[ \"[object \" + name + \"]\" ] = name.toLowerCase()\n })\n\n // Define methods that will be available on all\n // Zepto collections\n $.fn = {\n constructor: zepto.Z,\n length: 0,\n\n // Because a collection acts like an array\n // copy over these useful array functions.\n forEach: emptyArray.forEach,\n reduce: emptyArray.reduce,\n push: emptyArray.push,\n sort: emptyArray.sort,\n splice: emptyArray.splice,\n indexOf: emptyArray.indexOf,\n concat: function(){\n var i, value, args = []\n for (i = 0; i < arguments.length; i++) {\n value = arguments[i]\n args[i] = zepto.isZ(value) ? value.toArray() : value\n }\n return concat.apply(zepto.isZ(this) ? this.toArray() : this, args)\n },\n\n // `map` and `slice` in the jQuery API work differently\n // from their array counterparts\n map: function(fn){\n return $($.map(this, function(el, i){ return fn.call(el, i, el) }))\n },\n slice: function(){\n return $(slice.apply(this, arguments))\n },\n\n ready: function(callback){\n // need to check if document.body exists for IE as that browser reports\n // document ready when it hasn't yet created the body element\n if (readyRE.test(document.readyState) && document.body) callback($)\n else document.addEventListener('DOMContentLoaded', function(){ callback($) }, false)\n return this\n },\n get: function(idx){\n return idx === undefined ? slice.call(this) : this[idx >= 0 ? idx : idx + this.length]\n },\n toArray: function(){ return this.get() },\n size: function(){\n return this.length\n },\n remove: function(){\n return this.each(function(){\n if (this.parentNode != null)\n this.parentNode.removeChild(this)\n })\n },\n each: function(callback){\n emptyArray.every.call(this, function(el, idx){\n return callback.call(el, idx, el) !== false\n })\n return this\n },\n filter: function(selector){\n if (isFunction(selector)) return this.not(this.not(selector))\n return $(filter.call(this, function(element){\n return zepto.matches(element, selector)\n }))\n },\n add: function(selector,context){\n return $(uniq(this.concat($(selector,context))))\n },\n is: function(selector){\n return this.length > 0 && zepto.matches(this[0], selector)\n },\n not: function(selector){\n var nodes=[]\n if (isFunction(selector) && selector.call !== undefined)\n this.each(function(idx){\n if (!selector.call(this,idx)) nodes.push(this)\n })\n else {\n var excludes = typeof selector == 'string' ? this.filter(selector) :\n (likeArray(selector) && isFunction(selector.item)) ? slice.call(selector) : $(selector)\n this.forEach(function(el){\n if (excludes.indexOf(el) < 0) nodes.push(el)\n })\n }\n return $(nodes)\n },\n has: function(selector){\n return this.filter(function(){\n return isObject(selector) ?\n $.contains(this, selector) :\n $(this).find(selector).size()\n })\n },\n eq: function(idx){\n return idx === -1 ? this.slice(idx) : this.slice(idx, + idx + 1)\n },\n first: function(){\n var el = this[0]\n return el && !isObject(el) ? el : $(el)\n },\n last: function(){\n var el = this[this.length - 1]\n return el && !isObject(el) ? el : $(el)\n },\n find: function(selector){\n var result, $this = this\n if (!selector) result = $()\n else if (typeof selector == 'object')\n result = $(selector).filter(function(){\n var node = this\n return emptyArray.some.call($this, function(parent){\n return $.contains(parent, node)\n })\n })\n else if (this.length == 1) result = $(zepto.qsa(this[0], selector))\n else result = this.map(function(){ return zepto.qsa(this, selector) })\n return result\n },\n closest: function(selector, context){\n var nodes = [], collection = typeof selector == 'object' && $(selector)\n this.each(function(_, node){\n while (node && !(collection ? collection.indexOf(node) >= 0 : zepto.matches(node, selector)))\n node = node !== context && !isDocument(node) && node.parentNode\n if (node && nodes.indexOf(node) < 0) nodes.push(node)\n })\n return $(nodes)\n },\n parents: function(selector){\n var ancestors = [], nodes = this\n while (nodes.length > 0)\n nodes = $.map(nodes, function(node){\n if ((node = node.parentNode) && !isDocument(node) && ancestors.indexOf(node) < 0) {\n ancestors.push(node)\n return node\n }\n })\n return filtered(ancestors, selector)\n },\n parent: function(selector){\n return filtered(uniq(this.pluck('parentNode')), selector)\n },\n children: function(selector){\n return filtered(this.map(function(){ return children(this) }), selector)\n },\n contents: function() {\n return this.map(function() { return this.contentDocument || slice.call(this.childNodes) })\n },\n siblings: function(selector){\n return filtered(this.map(function(i, el){\n return filter.call(children(el.parentNode), function(child){ return child!==el })\n }), selector)\n },\n empty: function(){\n return this.each(function(){ this.innerHTML = '' })\n },\n // `pluck` is borrowed from Prototype.js\n pluck: function(property){\n return $.map(this, function(el){ return el[property] })\n },\n show: function(){\n return this.each(function(){\n this.style.display == \"none\" && (this.style.display = '')\n if (getComputedStyle(this, '').getPropertyValue(\"display\") == \"none\")\n this.style.display = defaultDisplay(this.nodeName)\n })\n },\n replaceWith: function(newContent){\n return this.before(newContent).remove()\n },\n wrap: function(structure){\n var func = isFunction(structure)\n if (this[0] && !func)\n var dom = $(structure).get(0),\n clone = dom.parentNode || this.length > 1\n\n return this.each(function(index){\n $(this).wrapAll(\n func ? structure.call(this, index) :\n clone ? dom.cloneNode(true) : dom\n )\n })\n },\n wrapAll: function(structure){\n if (this[0]) {\n $(this[0]).before(structure = $(structure))\n var children\n // drill down to the inmost element\n while ((children = structure.children()).length) structure = children.first()\n $(structure).append(this)\n }\n return this\n },\n wrapInner: function(structure){\n var func = isFunction(structure)\n return this.each(function(index){\n var self = $(this), contents = self.contents(),\n dom = func ? structure.call(this, index) : structure\n contents.length ? contents.wrapAll(dom) : self.append(dom)\n })\n },\n unwrap: function(){\n this.parent().each(function(){\n $(this).replaceWith($(this).children())\n })\n return this\n },\n clone: function(){\n return this.map(function(){ return this.cloneNode(true) })\n },\n hide: function(){\n return this.css(\"display\", \"none\")\n },\n toggle: function(setting){\n return this.each(function(){\n var el = $(this)\n ;(setting === undefined ? el.css(\"display\") == \"none\" : setting) ? el.show() : el.hide()\n })\n },\n prev: function(selector){ return $(this.pluck('previousElementSibling')).filter(selector || '*') },\n next: function(selector){ return $(this.pluck('nextElementSibling')).filter(selector || '*') },\n html: function(html){\n return 0 in arguments ?\n this.each(function(idx){\n var originHtml = this.innerHTML\n $(this).empty().append( funcArg(this, html, idx, originHtml) )\n }) :\n (0 in this ? this[0].innerHTML : null)\n },\n text: function(text){\n return 0 in arguments ?\n this.each(function(idx){\n var newText = funcArg(this, text, idx, this.textContent)\n this.textContent = newText == null ? '' : ''+newText\n }) :\n (0 in this ? this.pluck('textContent').join(\"\") : null)\n },\n attr: function(name, value){\n var result\n return (typeof name == 'string' && !(1 in arguments)) ?\n (0 in this && this[0].nodeType == 1 && (result = this[0].getAttribute(name)) != null ? result : undefined) :\n this.each(function(idx){\n if (this.nodeType !== 1) return\n if (isObject(name)) for (key in name) setAttribute(this, key, name[key])\n else setAttribute(this, name, funcArg(this, value, idx, this.getAttribute(name)))\n })\n },\n removeAttr: function(name){\n return this.each(function(){ this.nodeType === 1 && name.split(' ').forEach(function(attribute){\n setAttribute(this, attribute)\n }, this)})\n },\n prop: function(name, value){\n name = propMap[name] || name\n return (1 in arguments) ?\n this.each(function(idx){\n this[name] = funcArg(this, value, idx, this[name])\n }) :\n (this[0] && this[0][name])\n },\n removeProp: function(name){\n name = propMap[name] || name\n return this.each(function(){ delete this[name] })\n },\n data: function(name, value){\n var attrName = 'data-' + name.replace(capitalRE, '-$1').toLowerCase()\n\n var data = (1 in arguments) ?\n this.attr(attrName, value) :\n this.attr(attrName)\n\n return data !== null ? deserializeValue(data) : undefined\n },\n val: function(value){\n if (0 in arguments) {\n if (value == null) value = \"\"\n return this.each(function(idx){\n this.value = funcArg(this, value, idx, this.value)\n })\n } else {\n return this[0] && (this[0].multiple ?\n $(this[0]).find('option').filter(function(){ return this.selected }).pluck('value') :\n this[0].value)\n }\n },\n offset: function(coordinates){\n if (coordinates) return this.each(function(index){\n var $this = $(this),\n coords = funcArg(this, coordinates, index, $this.offset()),\n parentOffset = $this.offsetParent().offset(),\n props = {\n top: coords.top - parentOffset.top,\n left: coords.left - parentOffset.left\n }\n\n if ($this.css('position') == 'static') props['position'] = 'relative'\n $this.css(props)\n })\n if (!this.length) return null\n if (document.documentElement !== this[0] && !$.contains(document.documentElement, this[0]))\n return {top: 0, left: 0}\n var obj = this[0].getBoundingClientRect()\n return {\n left: obj.left + window.pageXOffset,\n top: obj.top + window.pageYOffset,\n width: Math.round(obj.width),\n height: Math.round(obj.height)\n }\n },\n css: function(property, value){\n if (arguments.length < 2) {\n var element = this[0]\n if (typeof property == 'string') {\n if (!element) return\n return element.style[camelize(property)] || getComputedStyle(element, '').getPropertyValue(property)\n } else if (isArray(property)) {\n if (!element) return\n var props = {}\n var computedStyle = getComputedStyle(element, '')\n $.each(property, function(_, prop){\n props[prop] = (element.style[camelize(prop)] || computedStyle.getPropertyValue(prop))\n })\n return props\n }\n }\n\n var css = ''\n if (type(property) == 'string') {\n if (!value && value !== 0)\n this.each(function(){ this.style.removeProperty(dasherize(property)) })\n else\n css = dasherize(property) + \":\" + maybeAddPx(property, value)\n } else {\n for (key in property)\n if (!property[key] && property[key] !== 0)\n this.each(function(){ this.style.removeProperty(dasherize(key)) })\n else\n css += dasherize(key) + ':' + maybeAddPx(key, property[key]) + ';'\n }\n\n return this.each(function(){ this.style.cssText += ';' + css })\n },\n index: function(element){\n return element ? this.indexOf($(element)[0]) : this.parent().children().indexOf(this[0])\n },\n hasClass: function(name){\n if (!name) return false\n return emptyArray.some.call(this, function(el){\n return this.test(className(el))\n }, classRE(name))\n },\n addClass: function(name){\n if (!name) return this\n return this.each(function(idx){\n if (!('className' in this)) return\n classList = []\n var cls = className(this), newName = funcArg(this, name, idx, cls)\n newName.split(/\\s+/g).forEach(function(klass){\n if (!$(this).hasClass(klass)) classList.push(klass)\n }, this)\n classList.length && className(this, cls + (cls ? \" \" : \"\") + classList.join(\" \"))\n })\n },\n removeClass: function(name){\n return this.each(function(idx){\n if (!('className' in this)) return\n if (name === undefined) return className(this, '')\n classList = className(this)\n funcArg(this, name, idx, classList).split(/\\s+/g).forEach(function(klass){\n classList = classList.replace(classRE(klass), \" \")\n })\n className(this, classList.trim())\n })\n },\n toggleClass: function(name, when){\n if (!name) return this\n return this.each(function(idx){\n var $this = $(this), names = funcArg(this, name, idx, className(this))\n names.split(/\\s+/g).forEach(function(klass){\n (when === undefined ? !$this.hasClass(klass) : when) ?\n $this.addClass(klass) : $this.removeClass(klass)\n })\n })\n },\n scrollTop: function(value){\n if (!this.length) return\n var hasScrollTop = 'scrollTop' in this[0]\n if (value === undefined) return hasScrollTop ? this[0].scrollTop : this[0].pageYOffset\n return this.each(hasScrollTop ?\n function(){ this.scrollTop = value } :\n function(){ this.scrollTo(this.scrollX, value) })\n },\n scrollLeft: function(value){\n if (!this.length) return\n var hasScrollLeft = 'scrollLeft' in this[0]\n if (value === undefined) return hasScrollLeft ? this[0].scrollLeft : this[0].pageXOffset\n return this.each(hasScrollLeft ?\n function(){ this.scrollLeft = value } :\n function(){ this.scrollTo(value, this.scrollY) })\n },\n position: function() {\n if (!this.length) return\n\n var elem = this[0],\n // Get *real* offsetParent\n offsetParent = this.offsetParent(),\n // Get correct offsets\n offset = this.offset(),\n parentOffset = rootNodeRE.test(offsetParent[0].nodeName) ? { top: 0, left: 0 } : offsetParent.offset()\n\n // Subtract element margins\n // note: when an element has margin: auto the offsetLeft and marginLeft\n // are the same in Safari causing offset.left to incorrectly be 0\n offset.top -= parseFloat( $(elem).css('margin-top') ) || 0\n offset.left -= parseFloat( $(elem).css('margin-left') ) || 0\n\n // Add offsetParent borders\n parentOffset.top += parseFloat( $(offsetParent[0]).css('border-top-width') ) || 0\n parentOffset.left += parseFloat( $(offsetParent[0]).css('border-left-width') ) || 0\n\n // Subtract the two offsets\n return {\n top: offset.top - parentOffset.top,\n left: offset.left - parentOffset.left\n }\n },\n offsetParent: function() {\n return this.map(function(){\n var parent = this.offsetParent || document.body\n while (parent && !rootNodeRE.test(parent.nodeName) && $(parent).css(\"position\") == \"static\")\n parent = parent.offsetParent\n return parent\n })\n }\n }\n\n // for now\n $.fn.detach = $.fn.remove\n\n // Generate the `width` and `height` functions\n ;['width', 'height'].forEach(function(dimension){\n var dimensionProperty =\n dimension.replace(/./, function(m){ return m[0].toUpperCase() })\n\n $.fn[dimension] = function(value){\n var offset, el = this[0]\n if (value === undefined) return isWindow(el) ? el['inner' + dimensionProperty] :\n isDocument(el) ? el.documentElement['scroll' + dimensionProperty] :\n (offset = this.offset()) && offset[dimension]\n else return this.each(function(idx){\n el = $(this)\n el.css(dimension, funcArg(this, value, idx, el[dimension]()))\n })\n }\n })\n\n function traverseNode(node, fun) {\n fun(node)\n for (var i = 0, len = node.childNodes.length; i < len; i++)\n traverseNode(node.childNodes[i], fun)\n }\n\n // Generate the `after`, `prepend`, `before`, `append`,\n // `insertAfter`, `insertBefore`, `appendTo`, and `prependTo` methods.\n adjacencyOperators.forEach(function(operator, operatorIndex) {\n var inside = operatorIndex % 2 //=> prepend, append\n\n $.fn[operator] = function(){\n // arguments can be nodes, arrays of nodes, Zepto objects and HTML strings\n var argType, nodes = $.map(arguments, function(arg) {\n var arr = []\n argType = type(arg)\n if (argType == \"array\") {\n arg.forEach(function(el) {\n if (el.nodeType !== undefined) return arr.push(el)\n else if ($.zepto.isZ(el)) return arr = arr.concat(el.get())\n arr = arr.concat(zepto.fragment(el))\n })\n return arr\n }\n return argType == \"object\" || arg == null ?\n arg : zepto.fragment(arg)\n }),\n parent, copyByClone = this.length > 1\n if (nodes.length < 1) return this\n\n return this.each(function(_, target){\n parent = inside ? target : target.parentNode\n\n // convert all methods to a \"before\" operation\n target = operatorIndex == 0 ? target.nextSibling :\n operatorIndex == 1 ? target.firstChild :\n operatorIndex == 2 ? target :\n null\n\n var parentInDocument = $.contains(document.documentElement, parent)\n\n nodes.forEach(function(node){\n if (copyByClone) node = node.cloneNode(true)\n else if (!parent) return $(node).remove()\n\n parent.insertBefore(node, target)\n if (parentInDocument) traverseNode(node, function(el){\n if (el.nodeName != null && el.nodeName.toUpperCase() === 'SCRIPT' &&\n (!el.type || el.type === 'text/javascript') && !el.src){\n var target = el.ownerDocument ? el.ownerDocument.defaultView : window\n target['eval'].call(target, el.innerHTML)\n }\n })\n })\n })\n }\n\n // after => insertAfter\n // prepend => prependTo\n // before => insertBefore\n // append => appendTo\n $.fn[inside ? operator+'To' : 'insert'+(operatorIndex ? 'Before' : 'After')] = function(html){\n $(html)[operator](this)\n return this\n }\n })\n\n zepto.Z.prototype = Z.prototype = $.fn\n\n // Export internal API functions in the `$.zepto` namespace\n zepto.uniq = uniq\n zepto.deserializeValue = deserializeValue\n $.zepto = zepto\n\n return $\n})()\n\nwindow.Zepto = Zepto\nwindow.$ === undefined && (window.$ = Zepto)\n\n;(function($){\n var _zid = 1, undefined,\n slice = Array.prototype.slice,\n isFunction = $.isFunction,\n isString = function(obj){ return typeof obj == 'string' },\n handlers = {},\n specialEvents={},\n focusinSupported = 'onfocusin' in window,\n focus = { focus: 'focusin', blur: 'focusout' },\n hover = { mouseenter: 'mouseover', mouseleave: 'mouseout' }\n\n specialEvents.click = specialEvents.mousedown = specialEvents.mouseup = specialEvents.mousemove = 'MouseEvents'\n\n function zid(element) {\n return element._zid || (element._zid = _zid++)\n }\n function findHandlers(element, event, fn, selector) {\n event = parse(event)\n if (event.ns) var matcher = matcherFor(event.ns)\n return (handlers[zid(element)] || []).filter(function(handler) {\n return handler\n && (!event.e || handler.e == event.e)\n && (!event.ns || matcher.test(handler.ns))\n && (!fn || zid(handler.fn) === zid(fn))\n && (!selector || handler.sel == selector)\n })\n }\n function parse(event) {\n var parts = ('' + event).split('.')\n return {e: parts[0], ns: parts.slice(1).sort().join(' ')}\n }\n function matcherFor(ns) {\n return new RegExp('(?:^| )' + ns.replace(' ', ' .* ?') + '(?: |$)')\n }\n\n function eventCapture(handler, captureSetting) {\n return handler.del &&\n (!focusinSupported && (handler.e in focus)) ||\n !!captureSetting\n }\n\n function realEvent(type) {\n return hover[type] || (focusinSupported && focus[type]) || type\n }\n\n function add(element, events, fn, data, selector, delegator, capture){\n var id = zid(element), set = (handlers[id] || (handlers[id] = []))\n events.split(/\\s/).forEach(function(event){\n if (event == 'ready') return $(document).ready(fn)\n var handler = parse(event)\n handler.fn = fn\n handler.sel = selector\n // emulate mouseenter, mouseleave\n if (handler.e in hover) fn = function(e){\n var related = e.relatedTarget\n if (!related || (related !== this && !$.contains(this, related)))\n return handler.fn.apply(this, arguments)\n }\n handler.del = delegator\n var callback = delegator || fn\n handler.proxy = function(e){\n e = compatible(e)\n if (e.isImmediatePropagationStopped()) return\n e.data = data\n var result = callback.apply(element, e._args == undefined ? [e] : [e].concat(e._args))\n if (result === false) e.preventDefault(), e.stopPropagation()\n return result\n }\n handler.i = set.length\n set.push(handler)\n if ('addEventListener' in element)\n element.addEventListener(realEvent(handler.e), handler.proxy, eventCapture(handler, capture))\n })\n }\n function remove(element, events, fn, selector, capture){\n var id = zid(element)\n ;(events || '').split(/\\s/).forEach(function(event){\n findHandlers(element, event, fn, selector).forEach(function(handler){\n delete handlers[id][handler.i]\n if ('removeEventListener' in element)\n element.removeEventListener(realEvent(handler.e), handler.proxy, eventCapture(handler, capture))\n })\n })\n }\n\n $.event = { add: add, remove: remove }\n\n $.proxy = function(fn, context) {\n var args = (2 in arguments) && slice.call(arguments, 2)\n if (isFunction(fn)) {\n var proxyFn = function(){ return fn.apply(context, args ? args.concat(slice.call(arguments)) : arguments) }\n proxyFn._zid = zid(fn)\n return proxyFn\n } else if (isString(context)) {\n if (args) {\n args.unshift(fn[context], fn)\n return $.proxy.apply(null, args)\n } else {\n return $.proxy(fn[context], fn)\n }\n } else {\n throw new TypeError(\"expected function\")\n }\n }\n\n $.fn.bind = function(event, data, callback){\n return this.on(event, data, callback)\n }\n $.fn.unbind = function(event, callback){\n return this.off(event, callback)\n }\n $.fn.one = function(event, selector, data, callback){\n return this.on(event, selector, data, callback, 1)\n }\n\n var returnTrue = function(){return true},\n returnFalse = function(){return false},\n ignoreProperties = /^([A-Z]|returnValue$|layer[XY]$|webkitMovement[XY]$)/,\n eventMethods = {\n preventDefault: 'isDefaultPrevented',\n stopImmediatePropagation: 'isImmediatePropagationStopped',\n stopPropagation: 'isPropagationStopped'\n }\n\n function compatible(event, source) {\n if (source || !event.isDefaultPrevented) {\n source || (source = event)\n\n $.each(eventMethods, function(name, predicate) {\n var sourceMethod = source[name]\n event[name] = function(){\n this[predicate] = returnTrue\n return sourceMethod && sourceMethod.apply(source, arguments)\n }\n event[predicate] = returnFalse\n })\n\n event.timeStamp || (event.timeStamp = Date.now())\n\n if (source.defaultPrevented !== undefined ? source.defaultPrevented :\n 'returnValue' in source ? source.returnValue === false :\n source.getPreventDefault && source.getPreventDefault())\n event.isDefaultPrevented = returnTrue\n }\n return event\n }\n\n function createProxy(event) {\n var key, proxy = { originalEvent: event }\n for (key in event)\n if (!ignoreProperties.test(key) && event[key] !== undefined) proxy[key] = event[key]\n\n return compatible(proxy, event)\n }\n\n $.fn.delegate = function(selector, event, callback){\n return this.on(event, selector, callback)\n }\n $.fn.undelegate = function(selector, event, callback){\n return this.off(event, selector, callback)\n }\n\n $.fn.live = function(event, callback){\n $(document.body).delegate(this.selector, event, callback)\n return this\n }\n $.fn.die = function(event, callback){\n $(document.body).undelegate(this.selector, event, callback)\n return this\n }\n\n $.fn.on = function(event, selector, data, callback, one){\n var autoRemove, delegator, $this = this\n if (event && !isString(event)) {\n $.each(event, function(type, fn){\n $this.on(type, selector, data, fn, one)\n })\n return $this\n }\n\n if (!isString(selector) && !isFunction(callback) && callback !== false)\n callback = data, data = selector, selector = undefined\n if (callback === undefined || data === false)\n callback = data, data = undefined\n\n if (callback === false) callback = returnFalse\n\n return $this.each(function(_, element){\n if (one) autoRemove = function(e){\n remove(element, e.type, callback)\n return callback.apply(this, arguments)\n }\n\n if (selector) delegator = function(e){\n var evt, match = $(e.target).closest(selector, element).get(0)\n if (match && match !== element) {\n evt = $.extend(createProxy(e), {currentTarget: match, liveFired: element})\n return (autoRemove || callback).apply(match, [evt].concat(slice.call(arguments, 1)))\n }\n }\n\n add(element, event, callback, data, selector, delegator || autoRemove)\n })\n }\n $.fn.off = function(event, selector, callback){\n var $this = this\n if (event && !isString(event)) {\n $.each(event, function(type, fn){\n $this.off(type, selector, fn)\n })\n return $this\n }\n\n if (!isString(selector) && !isFunction(callback) && callback !== false)\n callback = selector, selector = undefined\n\n if (callback === false) callback = returnFalse\n\n return $this.each(function(){\n remove(this, event, callback, selector)\n })\n }\n\n $.fn.trigger = function(event, args){\n event = (isString(event) || $.isPlainObject(event)) ? $.Event(event) : compatible(event)\n event._args = args\n return this.each(function(){\n // handle focus(), blur() by calling them directly\n if (event.type in focus && typeof this[event.type] == \"function\") this[event.type]()\n // items in the collection might not be DOM elements\n else if ('dispatchEvent' in this) this.dispatchEvent(event)\n else $(this).triggerHandler(event, args)\n })\n }\n\n // triggers event handlers on current element just as if an event occurred,\n // doesn't trigger an actual event, doesn't bubble\n $.fn.triggerHandler = function(event, args){\n var e, result\n this.each(function(i, element){\n e = createProxy(isString(event) ? $.Event(event) : event)\n e._args = args\n e.target = element\n $.each(findHandlers(element, event.type || event), function(i, handler){\n result = handler.proxy(e)\n if (e.isImmediatePropagationStopped()) return false\n })\n })\n return result\n }\n\n // shortcut methods for `.bind(event, fn)` for each event type\n ;('focusin focusout focus blur load resize scroll unload click dblclick '+\n 'mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave '+\n 'change select keydown keypress keyup error').split(' ').forEach(function(event) {\n $.fn[event] = function(callback) {\n return (0 in arguments) ?\n this.bind(event, callback) :\n this.trigger(event)\n }\n })\n\n $.Event = function(type, props) {\n if (!isString(type)) props = type, type = props.type\n var event = document.createEvent(specialEvents[type] || 'Events'), bubbles = true\n if (props) for (var name in props) (name == 'bubbles') ? (bubbles = !!props[name]) : (event[name] = props[name])\n event.initEvent(type, bubbles, true)\n return compatible(event)\n }\n\n})(Zepto)\n\n;(function($){\n var jsonpID = +new Date(),\n document = window.document,\n key,\n name,\n rscript = /<script\\b[^<]*(?:(?!<\\/script>)<[^<]*)*<\\/script>/gi,\n scriptTypeRE = /^(?:text|application)\\/javascript/i,\n xmlTypeRE = /^(?:text|application)\\/xml/i,\n jsonType = 'application/json',\n htmlType = 'text/html',\n blankRE = /^\\s*$/,\n originAnchor = document.createElement('a')\n\n originAnchor.href = window.location.href\n\n // trigger a custom event and return false if it was cancelled\n function triggerAndReturn(context, eventName, data) {\n var event = $.Event(eventName)\n $(context).trigger(event, data)\n return !event.isDefaultPrevented()\n }\n\n // trigger an Ajax \"global\" event\n function triggerGlobal(settings, context, eventName, data) {\n if (settings.global) return triggerAndReturn(context || document, eventName, data)\n }\n\n // Number of active Ajax requests\n $.active = 0\n\n function ajaxStart(settings) {\n if (settings.global && $.active++ === 0) triggerGlobal(settings, null, 'ajaxStart')\n }\n function ajaxStop(settings) {\n if (settings.global && !(--$.active)) triggerGlobal(settings, null, 'ajaxStop')\n }\n\n // triggers an extra global event \"ajaxBeforeSend\" that's like \"ajaxSend\" but cancelable\n function ajaxBeforeSend(xhr, settings) {\n var context = settings.context\n if (settings.beforeSend.call(context, xhr, settings) === false ||\n triggerGlobal(settings, context, 'ajaxBeforeSend', [xhr, settings]) === false)\n return false\n\n triggerGlobal(settings, context, 'ajaxSend', [xhr, settings])\n }\n function ajaxSuccess(data, xhr, settings, deferred) {\n var context = settings.context, status = 'success'\n settings.success.call(context, data, status, xhr)\n if (deferred) deferred.resolveWith(context, [data, status, xhr])\n triggerGlobal(settings, context, 'ajaxSuccess', [xhr, settings, data])\n ajaxComplete(status, xhr, settings)\n }\n // type: \"timeout\", \"error\", \"abort\", \"parsererror\"\n function ajaxError(error, type, xhr, settings, deferred) {\n var context = settings.context\n settings.error.call(context, xhr, type, error)\n if (deferred) deferred.rejectWith(context, [xhr, type, error])\n triggerGlobal(settings, context, 'ajaxError', [xhr, settings, error || type])\n ajaxComplete(type, xhr, settings)\n }\n // status: \"success\", \"notmodified\", \"error\", \"timeout\", \"abort\", \"parsererror\"\n function ajaxComplete(status, xhr, settings) {\n var context = settings.context\n settings.complete.call(context, xhr, status)\n triggerGlobal(settings, context, 'ajaxComplete', [xhr, settings])\n ajaxStop(settings)\n }\n\n function ajaxDataFilter(data, type, settings) {\n if (settings.dataFilter == empty) return data\n var context = settings.context\n return settings.dataFilter.call(context, data, type)\n }\n\n // Empty function, used as default callback\n function empty() {}\n\n $.ajaxJSONP = function(options, deferred){\n if (!('type' in options)) return $.ajax(options)\n\n var _callbackName = options.jsonpCallback,\n callbackName = ($.isFunction(_callbackName) ?\n _callbackName() : _callbackName) || ('Zepto' + (jsonpID++)),\n script = document.createElement('script'),\n originalCallback = window[callbackName],\n responseData,\n abort = function(errorType) {\n $(script).triggerHandler('error', errorType || 'abort')\n },\n xhr = { abort: abort }, abortTimeout\n\n if (deferred) deferred.promise(xhr)\n\n $(script).on('load error', function(e, errorType){\n clearTimeout(abortTimeout)\n $(script).off().remove()\n\n if (e.type == 'error' || !responseData) {\n ajaxError(null, errorType || 'error', xhr, options, deferred)\n } else {\n ajaxSuccess(responseData[0], xhr, options, deferred)\n }\n\n window[callbackName] = originalCallback\n if (responseData && $.isFunction(originalCallback))\n originalCallback(responseData[0])\n\n originalCallback = responseData = undefined\n })\n\n if (ajaxBeforeSend(xhr, options) === false) {\n abort('abort')\n return xhr\n }\n\n window[callbackName] = function(){\n responseData = arguments\n }\n\n script.src = options.url.replace(/\\?(.+)=\\?/, '?$1=' + callbackName)\n document.head.appendChild(script)\n\n if (options.timeout > 0) abortTimeout = setTimeout(function(){\n abort('timeout')\n }, options.timeout)\n\n return xhr\n }\n\n $.ajaxSettings = {\n // Default type of request\n type: 'GET',\n // Callback that is executed before request\n beforeSend: empty,\n // Callback that is executed if the request succeeds\n success: empty,\n // Callback that is executed the the server drops error\n error: empty,\n // Callback that is executed on request complete (both: error and success)\n complete: empty,\n // The context for the callbacks\n context: null,\n // Whether to trigger \"global\" Ajax events\n global: true,\n // Transport\n xhr: function () {\n return new window.XMLHttpRequest()\n },\n // MIME types mapping\n // IIS returns Javascript as \"application/x-javascript\"\n accepts: {\n script: 'text/javascript, application/javascript, application/x-javascript',\n json: jsonType,\n xml: 'application/xml, text/xml',\n html: htmlType,\n text: 'text/plain'\n },\n // Whether the request is to another domain\n crossDomain: false,\n // Default timeout\n timeout: 0,\n // Whether data should be serialized to string\n processData: true,\n // Whether the browser should be allowed to cache GET responses\n cache: true,\n //Used to handle the raw response data of XMLHttpRequest.\n //This is a pre-filtering function to sanitize the response.\n //The sanitized response should be returned\n dataFilter: empty\n }\n\n function mimeToDataType(mime) {\n if (mime) mime = mime.split(';', 2)[0]\n return mime && ( mime == htmlType ? 'html' :\n mime == jsonType ? 'json' :\n scriptTypeRE.test(mime) ? 'script' :\n xmlTypeRE.test(mime) && 'xml' ) || 'text'\n }\n\n function appendQuery(url, query) {\n if (query == '') return url\n return (url + '&' + query).replace(/[&?]{1,2}/, '?')\n }\n\n // serialize payload and append it to the URL for GET requests\n function serializeData(options) {\n if (options.processData && options.data && $.type(options.data) != \"string\")\n options.data = $.param(options.data, options.traditional)\n if (options.data && (!options.type || options.type.toUpperCase() == 'GET' || 'jsonp' == options.dataType))\n options.url = appendQuery(options.url, options.data), options.data = undefined\n }\n\n $.ajax = function(options){\n var settings = $.extend({}, options || {}),\n deferred = $.Deferred && $.Deferred(),\n urlAnchor, hashIndex\n for (key in $.ajaxSettings) if (settings[key] === undefined) settings[key] = $.ajaxSettings[key]\n\n ajaxStart(settings)\n\n if (!settings.crossDomain) {\n urlAnchor = document.createElement('a')\n urlAnchor.href = settings.url\n // cleans up URL for .href (IE only), see https://github.com/madrobby/zepto/pull/1049\n urlAnchor.href = urlAnchor.href\n settings.crossDomain = (originAnchor.protocol + '//' + originAnchor.host) !== (urlAnchor.protocol + '//' + urlAnchor.host)\n }\n\n if (!settings.url) settings.url = window.location.toString()\n if ((hashIndex = settings.url.indexOf('#')) > -1) settings.url = settings.url.slice(0, hashIndex)\n serializeData(settings)\n\n var dataType = settings.dataType, hasPlaceholder = /\\?.+=\\?/.test(settings.url)\n if (hasPlaceholder) dataType = 'jsonp'\n\n if (settings.cache === false || (\n (!options || options.cache !== true) &&\n ('script' == dataType || 'jsonp' == dataType)\n ))\n settings.url = appendQuery(settings.url, '_=' + Date.now())\n\n if ('jsonp' == dataType) {\n if (!hasPlaceholder)\n settings.url = appendQuery(settings.url,\n settings.jsonp ? (settings.jsonp + '=?') : settings.jsonp === false ? '' : 'callback=?')\n return $.ajaxJSONP(settings, deferred)\n }\n\n var mime = settings.accepts[dataType],\n headers = { },\n setHeader = function(name, value) { headers[name.toLowerCase()] = [name, value] },\n protocol = /^([\\w-]+:)\\/\\//.test(settings.url) ? RegExp.$1 : window.location.protocol,\n xhr = settings.xhr(),\n nativeSetHeader = xhr.setRequestHeader,\n abortTimeout\n\n if (deferred) deferred.promise(xhr)\n\n if (!settings.crossDomain) setHeader('X-Requested-With', 'XMLHttpRequest')\n setHeader('Accept', mime || '*/*')\n if (mime = settings.mimeType || mime) {\n if (mime.indexOf(',') > -1) mime = mime.split(',', 2)[0]\n xhr.overrideMimeType && xhr.overrideMimeType(mime)\n }\n if (settings.contentType || (settings.contentType !== false && settings.data && settings.type.toUpperCase() != 'GET'))\n setHeader('Content-Type', settings.contentType || 'application/x-www-form-urlencoded')\n\n if (settings.headers) for (name in settings.headers) setHeader(name, settings.headers[name])\n xhr.setRequestHeader = setHeader\n\n xhr.onreadystatechange = function(){\n if (xhr.readyState == 4) {\n xhr.onreadystatechange = empty\n clearTimeout(abortTimeout)\n var result, error = false\n if ((xhr.status >= 200 && xhr.status < 300) || xhr.status == 304 || (xhr.status == 0 && protocol == 'file:')) {\n dataType = dataType || mimeToDataType(settings.mimeType || xhr.getResponseHeader('content-type'))\n\n if (xhr.responseType == 'arraybuffer' || xhr.responseType == 'blob')\n result = xhr.response\n else {\n result = xhr.responseText\n\n try {\n // http://perfectionkills.com/global-eval-what-are-the-options/\n // sanitize response accordingly if data filter callback provided\n result = ajaxDataFilter(result, dataType, settings)\n if (dataType == 'script') (1,eval)(result)\n else if (dataType == 'xml') result = xhr.responseXML\n else if (dataType == 'json') result = blankRE.test(result) ? null : $.parseJSON(result)\n } catch (e) { error = e }\n\n if (error) return ajaxError(error, 'parsererror', xhr, settings, deferred)\n }\n\n ajaxSuccess(result, xhr, settings, deferred)\n } else {\n ajaxError(xhr.statusText || null, xhr.status ? 'error' : 'abort', xhr, settings, deferred)\n }\n }\n }\n\n if (ajaxBeforeSend(xhr, settings) === false) {\n xhr.abort()\n ajaxError(null, 'abort', xhr, settings, deferred)\n return xhr\n }\n\n var async = 'async' in settings ? settings.async : true\n xhr.open(settings.type, settings.url, async, settings.username, settings.password)\n\n if (settings.xhrFields) for (name in settings.xhrFields) xhr[name] = settings.xhrFields[name]\n\n for (name in headers) nativeSetHeader.apply(xhr, headers[name])\n\n if (settings.timeout > 0) abortTimeout = setTimeout(function(){\n xhr.onreadystatechange = empty\n xhr.abort()\n ajaxError(null, 'timeout', xhr, settings, deferred)\n }, settings.timeout)\n\n // avoid sending empty string (#319)\n xhr.send(settings.data ? settings.data : null)\n return xhr\n }\n\n // handle optional data/success arguments\n function parseArguments(url, data, success, dataType) {\n if ($.isFunction(data)) dataType = success, success = data, data = undefined\n if (!$.isFunction(success)) dataType = success, success = undefined\n return {\n url: url\n , data: data\n , success: success\n , dataType: dataType\n }\n }\n\n $.get = function(/* url, data, success, dataType */){\n return $.ajax(parseArguments.apply(null, arguments))\n }\n\n $.post = function(/* url, data, success, dataType */){\n var options = parseArguments.apply(null, arguments)\n options.type = 'POST'\n return $.ajax(options)\n }\n\n $.getJSON = function(/* url, data, success */){\n var options = parseArguments.apply(null, arguments)\n options.dataType = 'json'\n return $.ajax(options)\n }\n\n $.fn.load = function(url, data, success){\n if (!this.length) return this\n var self = this, parts = url.split(/\\s/), selector,\n options = parseArguments(url, data, success),\n callback = options.success\n if (parts.length > 1) options.url = parts[0], selector = parts[1]\n options.success = function(response){\n self.html(selector ?\n $('<div>').html(response.replace(rscript, \"\")).find(selector)\n : response)\n callback && callback.apply(self, arguments)\n }\n $.ajax(options)\n return this\n }\n\n var escape = encodeURIComponent\n\n function serialize(params, obj, traditional, scope){\n var type, array = $.isArray(obj), hash = $.isPlainObject(obj)\n $.each(obj, function(key, value) {\n type = $.type(value)\n if (scope) key = traditional ? scope :\n scope + '[' + (hash || type == 'object' || type == 'array' ? key : '') + ']'\n // handle data in serializeArray() format\n if (!scope && array) params.add(value.name, value.value)\n // recurse into nested objects\n else if (type == \"array\" || (!traditional && type == \"object\"))\n serialize(params, value, traditional, key)\n else params.add(key, value)\n })\n }\n\n $.param = function(obj, traditional){\n var params = []\n params.add = function(key, value) {\n if ($.isFunction(value)) value = value()\n if (value == null) value = \"\"\n this.push(escape(key) + '=' + escape(value))\n }\n serialize(params, obj, traditional)\n return params.join('&').replace(/%20/g, '+')\n }\n})(Zepto)\n\n;(function($){\n $.fn.serializeArray = function() {\n var name, type, result = [],\n add = function(value) {\n if (value.forEach) return value.forEach(add)\n result.push({ name: name, value: value })\n }\n if (this[0]) $.each(this[0].elements, function(_, field){\n type = field.type, name = field.name\n if (name && field.nodeName.toLowerCase() != 'fieldset' &&\n !field.disabled && type != 'submit' && type != 'reset' && type != 'button' && type != 'file' &&\n ((type != 'radio' && type != 'checkbox') || field.checked))\n add($(field).val())\n })\n return result\n }\n\n $.fn.serialize = function(){\n var result = []\n this.serializeArray().forEach(function(elm){\n result.push(encodeURIComponent(elm.name) + '=' + encodeURIComponent(elm.value))\n })\n return result.join('&')\n }\n\n $.fn.submit = function(callback) {\n if (0 in arguments) this.bind('submit', callback)\n else if (this.length) {\n var event = $.Event('submit')\n this.eq(0).trigger(event)\n if (!event.isDefaultPrevented()) this.get(0).submit()\n }\n return this\n }\n\n})(Zepto)\n\n;(function(){\n // getComputedStyle shouldn't freak out when called\n // without a valid element as argument\n try {\n getComputedStyle(undefined)\n } catch(e) {\n var nativeGetComputedStyle = getComputedStyle\n window.getComputedStyle = function(element, pseudoElement){\n try {\n return nativeGetComputedStyle(element, pseudoElement)\n } catch(e) {\n return null\n }\n }\n }\n})()\n return Zepto\n}))\n\n}.call(window));","module.exports = global[\"moment\"] = require(\"-!E:\\\\sites\\\\flarum-new\\\\packages\\\\flarum-core\\\\js\\\\node_modules\\\\expose-loader\\\\index.js?dayjs!E:\\\\sites\\\\flarum-new\\\\packages\\\\flarum-core\\\\js\\\\node_modules\\\\babel-loader\\\\lib\\\\index.js??ref--5!E:\\\\sites\\\\flarum-new\\\\packages\\\\flarum-core\\\\js\\\\node_modules\\\\source-map-loader\\\\index.js!.\\\\dayjs.min.js\");","module.exports = global[\"dayjs\"] = require(\"-!E:\\\\sites\\\\flarum-new\\\\packages\\\\flarum-core\\\\js\\\\node_modules\\\\babel-loader\\\\lib\\\\index.js??ref--5!E:\\\\sites\\\\flarum-new\\\\packages\\\\flarum-core\\\\js\\\\node_modules\\\\source-map-loader\\\\index.js!.\\\\dayjs.min.js\");","!function(t,n){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=n():\"function\"==typeof define&&define.amd?define(n):t.dayjs=n()}(this,function(){\"use strict\";var t=\"millisecond\",n=\"second\",e=\"minute\",r=\"hour\",i=\"day\",s=\"week\",u=\"month\",o=\"quarter\",a=\"year\",h=/^(\\d{4})-?(\\d{1,2})-?(\\d{0,2})[^0-9]*(\\d{1,2})?:?(\\d{1,2})?:?(\\d{1,2})?.?(\\d{1,3})?$/,f=/\\[([^\\]]+)]|Y{2,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g,c=function(t,n,e){var r=String(t);return!r||r.length>=n?t:\"\"+Array(n+1-r.length).join(e)+t},d={s:c,z:function(t){var n=-t.utcOffset(),e=Math.abs(n),r=Math.floor(e/60),i=e%60;return(n<=0?\"+\":\"-\")+c(r,2,\"0\")+\":\"+c(i,2,\"0\")},m:function(t,n){var e=12*(n.year()-t.year())+(n.month()-t.month()),r=t.clone().add(e,u),i=n-r<0,s=t.clone().add(e+(i?-1:1),u);return Number(-(e+(n-r)/(i?r-s:s-r))||0)},a:function(t){return t<0?Math.ceil(t)||0:Math.floor(t)},p:function(h){return{M:u,y:a,w:s,d:i,D:\"date\",h:r,m:e,s:n,ms:t,Q:o}[h]||String(h||\"\").toLowerCase().replace(/s$/,\"\")},u:function(t){return void 0===t}},$={name:\"en\",weekdays:\"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday\".split(\"_\"),months:\"January_February_March_April_May_June_July_August_September_October_November_December\".split(\"_\")},l=\"en\",m={};m[l]=$;var y=function(t){return t instanceof v},M=function(t,n,e){var r;if(!t)return l;if(\"string\"==typeof t)m[t]&&(r=t),n&&(m[t]=n,r=t);else{var i=t.name;m[i]=t,r=i}return!e&&r&&(l=r),r||!e&&l},g=function(t,n,e){if(y(t))return t.clone();var r=n?\"string\"==typeof n?{format:n,pl:e}:n:{};return r.date=t,new v(r)},D=d;D.l=M,D.i=y,D.w=function(t,n){return g(t,{locale:n.$L,utc:n.$u,$offset:n.$offset})};var v=function(){function c(t){this.$L=this.$L||M(t.locale,null,!0),this.parse(t)}var d=c.prototype;return d.parse=function(t){this.$d=function(t){var n=t.date,e=t.utc;if(null===n)return new Date(NaN);if(D.u(n))return new Date;if(n instanceof Date)return new Date(n);if(\"string\"==typeof n&&!/Z$/i.test(n)){var r=n.match(h);if(r)return e?new Date(Date.UTC(r[1],r[2]-1,r[3]||1,r[4]||0,r[5]||0,r[6]||0,r[7]||0)):new Date(r[1],r[2]-1,r[3]||1,r[4]||0,r[5]||0,r[6]||0,r[7]||0)}return new Date(n)}(t),this.init()},d.init=function(){var t=this.$d;this.$y=t.getFullYear(),this.$M=t.getMonth(),this.$D=t.getDate(),this.$W=t.getDay(),this.$H=t.getHours(),this.$m=t.getMinutes(),this.$s=t.getSeconds(),this.$ms=t.getMilliseconds()},d.$utils=function(){return D},d.isValid=function(){return!(\"Invalid Date\"===this.$d.toString())},d.isSame=function(t,n){var e=g(t);return this.startOf(n)<=e&&e<=this.endOf(n)},d.isAfter=function(t,n){return g(t)<this.startOf(n)},d.isBefore=function(t,n){return this.endOf(n)<g(t)},d.$g=function(t,n,e){return D.u(t)?this[n]:this.set(e,t)},d.year=function(t){return this.$g(t,\"$y\",a)},d.month=function(t){return this.$g(t,\"$M\",u)},d.day=function(t){return this.$g(t,\"$W\",i)},d.date=function(t){return this.$g(t,\"$D\",\"date\")},d.hour=function(t){return this.$g(t,\"$H\",r)},d.minute=function(t){return this.$g(t,\"$m\",e)},d.second=function(t){return this.$g(t,\"$s\",n)},d.millisecond=function(n){return this.$g(n,\"$ms\",t)},d.unix=function(){return Math.floor(this.valueOf()/1e3)},d.valueOf=function(){return this.$d.getTime()},d.startOf=function(t,o){var h=this,f=!!D.u(o)||o,c=D.p(t),d=function(t,n){var e=D.w(h.$u?Date.UTC(h.$y,n,t):new Date(h.$y,n,t),h);return f?e:e.endOf(i)},$=function(t,n){return D.w(h.toDate()[t].apply(h.toDate(),(f?[0,0,0,0]:[23,59,59,999]).slice(n)),h)},l=this.$W,m=this.$M,y=this.$D,M=\"set\"+(this.$u?\"UTC\":\"\");switch(c){case a:return f?d(1,0):d(31,11);case u:return f?d(1,m):d(0,m+1);case s:var g=this.$locale().weekStart||0,v=(l<g?l+7:l)-g;return d(f?y-v:y+(6-v),m);case i:case\"date\":return $(M+\"Hours\",0);case r:return $(M+\"Minutes\",1);case e:return $(M+\"Seconds\",2);case n:return $(M+\"Milliseconds\",3);default:return this.clone()}},d.endOf=function(t){return this.startOf(t,!1)},d.$set=function(s,o){var h,f=D.p(s),c=\"set\"+(this.$u?\"UTC\":\"\"),d=(h={},h[i]=c+\"Date\",h.date=c+\"Date\",h[u]=c+\"Month\",h[a]=c+\"FullYear\",h[r]=c+\"Hours\",h[e]=c+\"Minutes\",h[n]=c+\"Seconds\",h[t]=c+\"Milliseconds\",h)[f],$=f===i?this.$D+(o-this.$W):o;if(f===u||f===a){var l=this.clone().set(\"date\",1);l.$d[d]($),l.init(),this.$d=l.set(\"date\",Math.min(this.$D,l.daysInMonth())).toDate()}else d&&this.$d[d]($);return this.init(),this},d.set=function(t,n){return this.clone().$set(t,n)},d.get=function(t){return this[D.p(t)]()},d.add=function(t,o){var h,f=this;t=Number(t);var c=D.p(o),d=function(n){var e=g(f);return D.w(e.date(e.date()+Math.round(n*t)),f)};if(c===u)return this.set(u,this.$M+t);if(c===a)return this.set(a,this.$y+t);if(c===i)return d(1);if(c===s)return d(7);var $=(h={},h[e]=6e4,h[r]=36e5,h[n]=1e3,h)[c]||1,l=this.$d.getTime()+t*$;return D.w(l,this)},d.subtract=function(t,n){return this.add(-1*t,n)},d.format=function(t){var n=this;if(!this.isValid())return\"Invalid Date\";var e=t||\"YYYY-MM-DDTHH:mm:ssZ\",r=D.z(this),i=this.$locale(),s=this.$H,u=this.$m,o=this.$M,a=i.weekdays,h=i.months,c=function(t,r,i,s){return t&&(t[r]||t(n,e))||i[r].substr(0,s)},d=function(t){return D.s(s%12||12,t,\"0\")},$=i.meridiem||function(t,n,e){var r=t<12?\"AM\":\"PM\";return e?r.toLowerCase():r},l={YY:String(this.$y).slice(-2),YYYY:this.$y,M:o+1,MM:D.s(o+1,2,\"0\"),MMM:c(i.monthsShort,o,h,3),MMMM:h[o]||h(this,e),D:this.$D,DD:D.s(this.$D,2,\"0\"),d:String(this.$W),dd:c(i.weekdaysMin,this.$W,a,2),ddd:c(i.weekdaysShort,this.$W,a,3),dddd:a[this.$W],H:String(s),HH:D.s(s,2,\"0\"),h:d(1),hh:d(2),a:$(s,u,!0),A:$(s,u,!1),m:String(u),mm:D.s(u,2,\"0\"),s:String(this.$s),ss:D.s(this.$s,2,\"0\"),SSS:D.s(this.$ms,3,\"0\"),Z:r};return e.replace(f,function(t,n){return n||l[t]||r.replace(\":\",\"\")})},d.utcOffset=function(){return 15*-Math.round(this.$d.getTimezoneOffset()/15)},d.diff=function(t,h,f){var c,d=D.p(h),$=g(t),l=6e4*($.utcOffset()-this.utcOffset()),m=this-$,y=D.m(this,$);return y=(c={},c[a]=y/12,c[u]=y,c[o]=y/3,c[s]=(m-l)/6048e5,c[i]=(m-l)/864e5,c[r]=m/36e5,c[e]=m/6e4,c[n]=m/1e3,c)[d]||m,f?y:D.a(y)},d.daysInMonth=function(){return this.endOf(u).$D},d.$locale=function(){return m[this.$L]},d.locale=function(t,n){if(!t)return this.$L;var e=this.clone(),r=M(t,n,!0);return r&&(e.$L=r),e},d.clone=function(){return D.w(this.$d,this)},d.toDate=function(){return new Date(this.valueOf())},d.toJSON=function(){return this.isValid()?this.toISOString():null},d.toISOString=function(){return this.$d.toISOString()},d.toString=function(){return this.$d.toUTCString()},c}();return g.prototype=v.prototype,g.extend=function(t,n){return t(n,v,g),g},g.locale=M,g.isDayjs=y,g.unix=function(t){return g(1e3*t)},g.en=m[l],g.Ls=m,g});\n","module.exports = global[\"m\"] = require(\"-!E:\\\\sites\\\\flarum-new\\\\packages\\\\flarum-core\\\\js\\\\node_modules\\\\babel-loader\\\\lib\\\\index.js??ref--5!E:\\\\sites\\\\flarum-new\\\\packages\\\\flarum-core\\\\js\\\\node_modules\\\\source-map-loader\\\\index.js!.\\\\index.js\");","\"use strict\"\n\nvar hyperscript = require(\"./hyperscript\")\nvar request = require(\"./request\")\nvar mountRedraw = require(\"./mount-redraw\")\n\nvar m = function m() { return hyperscript.apply(this, arguments) }\nm.m = hyperscript\nm.trust = hyperscript.trust\nm.fragment = hyperscript.fragment\nm.mount = mountRedraw.mount\nm.route = require(\"./route\")\nm.render = require(\"./render\")\nm.redraw = mountRedraw.redraw\nm.request = request.request\nm.jsonp = request.jsonp\nm.parseQueryString = require(\"./querystring/parse\")\nm.buildQueryString = require(\"./querystring/build\")\nm.parsePathname = require(\"./pathname/parse\")\nm.buildPathname = require(\"./pathname/build\")\nm.vnode = require(\"./render/vnode\")\nm.PromisePolyfill = require(\"./promise/polyfill\")\n\nmodule.exports = m\n","\"use strict\"\n\nvar hyperscript = require(\"./render/hyperscript\")\n\nhyperscript.trust = require(\"./render/trust\")\nhyperscript.fragment = require(\"./render/fragment\")\n\nmodule.exports = hyperscript\n","\"use strict\"\n\nvar Vnode = require(\"../render/vnode\")\n\nmodule.exports = function(html) {\n\tif (html == null) html = \"\"\n\treturn Vnode(\"<\", undefined, undefined, html, undefined, undefined)\n}\n","\"use strict\"\n\nvar Vnode = require(\"../render/vnode\")\nvar hyperscriptVnode = require(\"./hyperscriptVnode\")\n\nmodule.exports = function() {\n\tvar vnode = hyperscriptVnode.apply(0, arguments)\n\n\tvnode.tag = \"[\"\n\tvnode.children = Vnode.normalizeChildren(vnode.children)\n\treturn vnode\n}\n","\"use strict\"\n\nvar PromisePolyfill = require(\"./promise/promise\")\nvar mountRedraw = require(\"./mount-redraw\")\n\nmodule.exports = require(\"./request/request\")(window, PromisePolyfill, mountRedraw.redraw)\n","(function (global, undefined) {\n \"use strict\";\n\n if (global.setImmediate) {\n return;\n }\n\n var nextHandle = 1; // Spec says greater than zero\n var tasksByHandle = {};\n var currentlyRunningATask = false;\n var doc = global.document;\n var registerImmediate;\n\n function setImmediate(callback) {\n // Callback can either be a function or a string\n if (typeof callback !== \"function\") {\n callback = new Function(\"\" + callback);\n }\n // Copy function arguments\n var args = new Array(arguments.length - 1);\n for (var i = 0; i < args.length; i++) {\n args[i] = arguments[i + 1];\n }\n // Store and register the task\n var task = { callback: callback, args: args };\n tasksByHandle[nextHandle] = task;\n registerImmediate(nextHandle);\n return nextHandle++;\n }\n\n function clearImmediate(handle) {\n delete tasksByHandle[handle];\n }\n\n function run(task) {\n var callback = task.callback;\n var args = task.args;\n switch (args.length) {\n case 0:\n callback();\n break;\n case 1:\n callback(args[0]);\n break;\n case 2:\n callback(args[0], args[1]);\n break;\n case 3:\n callback(args[0], args[1], args[2]);\n break;\n default:\n callback.apply(undefined, args);\n break;\n }\n }\n\n function runIfPresent(handle) {\n // From the spec: \"Wait until any invocations of this algorithm started before this one have completed.\"\n // So if we're currently running a task, we'll need to delay this invocation.\n if (currentlyRunningATask) {\n // Delay by doing a setTimeout. setImmediate was tried instead, but in Firefox 7 it generated a\n // \"too much recursion\" error.\n setTimeout(runIfPresent, 0, handle);\n } else {\n var task = tasksByHandle[handle];\n if (task) {\n currentlyRunningATask = true;\n try {\n run(task);\n } finally {\n clearImmediate(handle);\n currentlyRunningATask = false;\n }\n }\n }\n }\n\n function installNextTickImplementation() {\n registerImmediate = function(handle) {\n process.nextTick(function () { runIfPresent(handle); });\n };\n }\n\n function canUsePostMessage() {\n // The test against `importScripts` prevents this implementation from being installed inside a web worker,\n // where `global.postMessage` means something completely different and can't be used for this purpose.\n if (global.postMessage && !global.importScripts) {\n var postMessageIsAsynchronous = true;\n var oldOnMessage = global.onmessage;\n global.onmessage = function() {\n postMessageIsAsynchronous = false;\n };\n global.postMessage(\"\", \"*\");\n global.onmessage = oldOnMessage;\n return postMessageIsAsynchronous;\n }\n }\n\n function installPostMessageImplementation() {\n // Installs an event handler on `global` for the `message` event: see\n // * https://developer.mozilla.org/en/DOM/window.postMessage\n // * http://www.whatwg.org/specs/web-apps/current-work/multipage/comms.html#crossDocumentMessages\n\n var messagePrefix = \"setImmediate$\" + Math.random() + \"$\";\n var onGlobalMessage = function(event) {\n if (event.source === global &&\n typeof event.data === \"string\" &&\n event.data.indexOf(messagePrefix) === 0) {\n runIfPresent(+event.data.slice(messagePrefix.length));\n }\n };\n\n if (global.addEventListener) {\n global.addEventListener(\"message\", onGlobalMessage, false);\n } else {\n global.attachEvent(\"onmessage\", onGlobalMessage);\n }\n\n registerImmediate = function(handle) {\n global.postMessage(messagePrefix + handle, \"*\");\n };\n }\n\n function installMessageChannelImplementation() {\n var channel = new MessageChannel();\n channel.port1.onmessage = function(event) {\n var handle = event.data;\n runIfPresent(handle);\n };\n\n registerImmediate = function(handle) {\n channel.port2.postMessage(handle);\n };\n }\n\n function installReadyStateChangeImplementation() {\n var html = doc.documentElement;\n registerImmediate = function(handle) {\n // Create a <script> element; its readystatechange event will be fired asynchronously once it is inserted\n // into the document. Do so, thus queuing up the task. Remember to clean up once it's been called.\n var script = doc.createElement(\"script\");\n script.onreadystatechange = function () {\n runIfPresent(handle);\n script.onreadystatechange = null;\n html.removeChild(script);\n script = null;\n };\n html.appendChild(script);\n };\n }\n\n function installSetTimeoutImplementation() {\n registerImmediate = function(handle) {\n setTimeout(runIfPresent, 0, handle);\n };\n }\n\n // If supported, we should attach to the prototype of global, since that is where setTimeout et al. live.\n var attachTo = Object.getPrototypeOf && Object.getPrototypeOf(global);\n attachTo = attachTo && attachTo.setTimeout ? attachTo : global;\n\n // Don't get fooled by e.g. browserify environments.\n if ({}.toString.call(global.process) === \"[object process]\") {\n // For Node.js before 0.9\n installNextTickImplementation();\n\n } else if (canUsePostMessage()) {\n // For non-IE10 modern browsers\n installPostMessageImplementation();\n\n } else if (global.MessageChannel) {\n // For web workers, where supported\n installMessageChannelImplementation();\n\n } else if (doc && \"onreadystatechange\" in doc.createElement(\"script\")) {\n // For IE 6–8\n installReadyStateChangeImplementation();\n\n } else {\n // For older browsers\n installSetTimeoutImplementation();\n }\n\n attachTo.setImmediate = setImmediate;\n attachTo.clearImmediate = clearImmediate;\n}(typeof self === \"undefined\" ? typeof global === \"undefined\" ? this : global : self));\n","// shim for using process in browser\nvar process = module.exports = {};\n\n// cached from whatever global is present so that test runners that stub it\n// don't break things. But we need to wrap it in a try catch in case it is\n// wrapped in strict mode code which doesn't define any globals. It's inside a\n// function because try/catches deoptimize in certain engines.\n\nvar cachedSetTimeout;\nvar cachedClearTimeout;\n\nfunction defaultSetTimout() {\n throw new Error('setTimeout has not been defined');\n}\nfunction defaultClearTimeout () {\n throw new Error('clearTimeout has not been defined');\n}\n(function () {\n try {\n if (typeof setTimeout === 'function') {\n cachedSetTimeout = setTimeout;\n } else {\n cachedSetTimeout = defaultSetTimout;\n }\n } catch (e) {\n cachedSetTimeout = defaultSetTimout;\n }\n try {\n if (typeof clearTimeout === 'function') {\n cachedClearTimeout = clearTimeout;\n } else {\n cachedClearTimeout = defaultClearTimeout;\n }\n } catch (e) {\n cachedClearTimeout = defaultClearTimeout;\n }\n} ())\nfunction runTimeout(fun) {\n if (cachedSetTimeout === setTimeout) {\n //normal enviroments in sane situations\n return setTimeout(fun, 0);\n }\n // if setTimeout wasn't available but was latter defined\n if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n cachedSetTimeout = setTimeout;\n return setTimeout(fun, 0);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedSetTimeout(fun, 0);\n } catch(e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedSetTimeout.call(null, fun, 0);\n } catch(e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n return cachedSetTimeout.call(this, fun, 0);\n }\n }\n\n\n}\nfunction runClearTimeout(marker) {\n if (cachedClearTimeout === clearTimeout) {\n //normal enviroments in sane situations\n return clearTimeout(marker);\n }\n // if clearTimeout wasn't available but was latter defined\n if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n cachedClearTimeout = clearTimeout;\n return clearTimeout(marker);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedClearTimeout(marker);\n } catch (e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedClearTimeout.call(null, marker);\n } catch (e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n return cachedClearTimeout.call(this, marker);\n }\n }\n\n\n\n}\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n if (!draining || !currentQueue) {\n return;\n }\n draining = false;\n if (currentQueue.length) {\n queue = currentQueue.concat(queue);\n } else {\n queueIndex = -1;\n }\n if (queue.length) {\n drainQueue();\n }\n}\n\nfunction drainQueue() {\n if (draining) {\n return;\n }\n var timeout = runTimeout(cleanUpNextTick);\n draining = true;\n\n var len = queue.length;\n while(len) {\n currentQueue = queue;\n queue = [];\n while (++queueIndex < len) {\n if (currentQueue) {\n currentQueue[queueIndex].run();\n }\n }\n queueIndex = -1;\n len = queue.length;\n }\n currentQueue = null;\n draining = false;\n runClearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n var args = new Array(arguments.length - 1);\n if (arguments.length > 1) {\n for (var i = 1; i < arguments.length; i++) {\n args[i - 1] = arguments[i];\n }\n }\n queue.push(new Item(fun, args));\n if (queue.length === 1 && !draining) {\n runTimeout(drainQueue);\n }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n this.fun = fun;\n this.array = array;\n}\nItem.prototype.run = function () {\n this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\nprocess.prependListener = noop;\nprocess.prependOnceListener = noop;\n\nprocess.listeners = function (name) { return [] }\n\nprocess.binding = function (name) {\n throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n","\"use strict\"\n\nvar Vnode = require(\"../render/vnode\")\n\nmodule.exports = function($window) {\n\tvar $doc = $window && $window.document\n\tvar currentRedraw\n\n\tvar nameSpace = {\n\t\tsvg: \"http://www.w3.org/2000/svg\",\n\t\tmath: \"http://www.w3.org/1998/Math/MathML\"\n\t}\n\n\tfunction getNameSpace(vnode) {\n\t\treturn vnode.attrs && vnode.attrs.xmlns || nameSpace[vnode.tag]\n\t}\n\n\t//sanity check to discourage people from doing `vnode.state = ...`\n\tfunction checkState(vnode, original) {\n\t\tif (vnode.state !== original) throw new Error(\"`vnode.state` must not be modified\")\n\t}\n\n\t//Note: the hook is passed as the `this` argument to allow proxying the\n\t//arguments without requiring a full array allocation to do so. It also\n\t//takes advantage of the fact the current `vnode` is the first argument in\n\t//all lifecycle methods.\n\tfunction callHook(vnode) {\n\t\tvar original = vnode.state\n\t\ttry {\n\t\t\treturn this.apply(original, arguments)\n\t\t} finally {\n\t\t\tcheckState(vnode, original)\n\t\t}\n\t}\n\n\t// IE11 (at least) throws an UnspecifiedError when accessing document.activeElement when\n\t// inside an iframe. Catch and swallow this error, and heavy-handidly return null.\n\tfunction activeElement() {\n\t\ttry {\n\t\t\treturn $doc.activeElement\n\t\t} catch (e) {\n\t\t\treturn null\n\t\t}\n\t}\n\t//create\n\tfunction createNodes(parent, vnodes, start, end, hooks, nextSibling, ns) {\n\t\tfor (var i = start; i < end; i++) {\n\t\t\tvar vnode = vnodes[i]\n\t\t\tif (vnode != null) {\n\t\t\t\tcreateNode(parent, vnode, hooks, ns, nextSibling)\n\t\t\t}\n\t\t}\n\t}\n\tfunction createNode(parent, vnode, hooks, ns, nextSibling) {\n\t\tvar tag = vnode.tag\n\t\tif (typeof tag === \"string\") {\n\t\t\tvnode.state = {}\n\t\t\tif (vnode.attrs != null) initLifecycle(vnode.attrs, vnode, hooks)\n\t\t\tswitch (tag) {\n\t\t\t\tcase \"#\": createText(parent, vnode, nextSibling); break\n\t\t\t\tcase \"<\": createHTML(parent, vnode, ns, nextSibling); break\n\t\t\t\tcase \"[\": createFragment(parent, vnode, hooks, ns, nextSibling); break\n\t\t\t\tdefault: createElement(parent, vnode, hooks, ns, nextSibling)\n\t\t\t}\n\t\t}\n\t\telse createComponent(parent, vnode, hooks, ns, nextSibling)\n\t}\n\tfunction createText(parent, vnode, nextSibling) {\n\t\tvnode.dom = $doc.createTextNode(vnode.children)\n\t\tinsertNode(parent, vnode.dom, nextSibling)\n\t}\n\tvar possibleParents = {caption: \"table\", thead: \"table\", tbody: \"table\", tfoot: \"table\", tr: \"tbody\", th: \"tr\", td: \"tr\", colgroup: \"table\", col: \"colgroup\"}\n\tfunction createHTML(parent, vnode, ns, nextSibling) {\n\t\tvar match = vnode.children.match(/^\\s*?<(\\w+)/im) || []\n\t\t// not using the proper parent makes the child element(s) vanish.\n\t\t// var div = document.createElement(\"div\")\n\t\t// div.innerHTML = \"<td>i</td><td>j</td>\"\n\t\t// console.log(div.innerHTML)\n\t\t// --> \"ij\", no <td> in sight.\n\t\tvar temp = $doc.createElement(possibleParents[match[1]] || \"div\")\n\t\tif (ns === \"http://www.w3.org/2000/svg\") {\n\t\t\ttemp.innerHTML = \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\">\" + vnode.children + \"</svg>\"\n\t\t\ttemp = temp.firstChild\n\t\t} else {\n\t\t\ttemp.innerHTML = vnode.children\n\t\t}\n\t\tvnode.dom = temp.firstChild\n\t\tvnode.domSize = temp.childNodes.length\n\t\t// Capture nodes to remove, so we don't confuse them.\n\t\tvnode.instance = []\n\t\tvar fragment = $doc.createDocumentFragment()\n\t\tvar child\n\t\twhile (child = temp.firstChild) {\n\t\t\tvnode.instance.push(child)\n\t\t\tfragment.appendChild(child)\n\t\t}\n\t\tinsertNode(parent, fragment, nextSibling)\n\t}\n\tfunction createFragment(parent, vnode, hooks, ns, nextSibling) {\n\t\tvar fragment = $doc.createDocumentFragment()\n\t\tif (vnode.children != null) {\n\t\t\tvar children = vnode.children\n\t\t\tcreateNodes(fragment, children, 0, children.length, hooks, null, ns)\n\t\t}\n\t\tvnode.dom = fragment.firstChild\n\t\tvnode.domSize = fragment.childNodes.length\n\t\tinsertNode(parent, fragment, nextSibling)\n\t}\n\tfunction createElement(parent, vnode, hooks, ns, nextSibling) {\n\t\tvar tag = vnode.tag\n\t\tvar attrs = vnode.attrs\n\t\tvar is = attrs && attrs.is\n\n\t\tns = getNameSpace(vnode) || ns\n\n\t\tvar element = ns ?\n\t\t\tis ? $doc.createElementNS(ns, tag, {is: is}) : $doc.createElementNS(ns, tag) :\n\t\t\tis ? $doc.createElement(tag, {is: is}) : $doc.createElement(tag)\n\t\tvnode.dom = element\n\n\t\tif (attrs != null) {\n\t\t\tsetAttrs(vnode, attrs, ns)\n\t\t}\n\n\t\tinsertNode(parent, element, nextSibling)\n\n\t\tif (!maybeSetContentEditable(vnode)) {\n\t\t\tif (vnode.text != null) {\n\t\t\t\tif (vnode.text !== \"\") element.textContent = vnode.text\n\t\t\t\telse vnode.children = [Vnode(\"#\", undefined, undefined, vnode.text, undefined, undefined)]\n\t\t\t}\n\t\t\tif (vnode.children != null) {\n\t\t\t\tvar children = vnode.children\n\t\t\t\tcreateNodes(element, children, 0, children.length, hooks, null, ns)\n\t\t\t\tif (vnode.tag === \"select\" && attrs != null) setLateSelectAttrs(vnode, attrs)\n\t\t\t}\n\t\t}\n\t}\n\tfunction initComponent(vnode, hooks) {\n\t\tvar sentinel\n\t\tif (typeof vnode.tag.view === \"function\") {\n\t\t\tvnode.state = Object.create(vnode.tag)\n\t\t\tsentinel = vnode.state.view\n\t\t\tif (sentinel.$$reentrantLock$$ != null) return\n\t\t\tsentinel.$$reentrantLock$$ = true\n\t\t} else {\n\t\t\tvnode.state = void 0\n\t\t\tsentinel = vnode.tag\n\t\t\tif (sentinel.$$reentrantLock$$ != null) return\n\t\t\tsentinel.$$reentrantLock$$ = true\n\t\t\tvnode.state = (vnode.tag.prototype != null && typeof vnode.tag.prototype.view === \"function\") ? new vnode.tag(vnode) : vnode.tag(vnode)\n\t\t}\n\t\tinitLifecycle(vnode.state, vnode, hooks)\n\t\tif (vnode.attrs != null) initLifecycle(vnode.attrs, vnode, hooks)\n\t\tvnode.instance = Vnode.normalize(callHook.call(vnode.state.view, vnode))\n\t\tif (vnode.instance === vnode) throw Error(\"A view cannot return the vnode it received as argument\")\n\t\tsentinel.$$reentrantLock$$ = null\n\t}\n\tfunction createComponent(parent, vnode, hooks, ns, nextSibling) {\n\t\tinitComponent(vnode, hooks)\n\t\tif (vnode.instance != null) {\n\t\t\tcreateNode(parent, vnode.instance, hooks, ns, nextSibling)\n\t\t\tvnode.dom = vnode.instance.dom\n\t\t\tvnode.domSize = vnode.dom != null ? vnode.instance.domSize : 0\n\t\t}\n\t\telse {\n\t\t\tvnode.domSize = 0\n\t\t}\n\t}\n\n\t//update\n\t/**\n\t * @param {Element|Fragment} parent - the parent element\n\t * @param {Vnode[] | null} old - the list of vnodes of the last `render()` call for\n\t * this part of the tree\n\t * @param {Vnode[] | null} vnodes - as above, but for the current `render()` call.\n\t * @param {Function[]} hooks - an accumulator of post-render hooks (oncreate/onupdate)\n\t * @param {Element | null} nextSibling - the next DOM node if we're dealing with a\n\t * fragment that is not the last item in its\n\t * parent\n\t * @param {'svg' | 'math' | String | null} ns) - the current XML namespace, if any\n\t * @returns void\n\t */\n\t// This function diffs and patches lists of vnodes, both keyed and unkeyed.\n\t//\n\t// We will:\n\t//\n\t// 1. describe its general structure\n\t// 2. focus on the diff algorithm optimizations\n\t// 3. discuss DOM node operations.\n\n\t// ## Overview:\n\t//\n\t// The updateNodes() function:\n\t// - deals with trivial cases\n\t// - determines whether the lists are keyed or unkeyed based on the first non-null node\n\t// of each list.\n\t// - diffs them and patches the DOM if needed (that's the brunt of the code)\n\t// - manages the leftovers: after diffing, are there:\n\t// - old nodes left to remove?\n\t// \t - new nodes to insert?\n\t// \t deal with them!\n\t//\n\t// The lists are only iterated over once, with an exception for the nodes in `old` that\n\t// are visited in the fourth part of the diff and in the `removeNodes` loop.\n\n\t// ## Diffing\n\t//\n\t// Reading https://github.com/localvoid/ivi/blob/ddc09d06abaef45248e6133f7040d00d3c6be853/packages/ivi/src/vdom/implementation.ts#L617-L837\n\t// may be good for context on longest increasing subsequence-based logic for moving nodes.\n\t//\n\t// In order to diff keyed lists, one has to\n\t//\n\t// 1) match nodes in both lists, per key, and update them accordingly\n\t// 2) create the nodes present in the new list, but absent in the old one\n\t// 3) remove the nodes present in the old list, but absent in the new one\n\t// 4) figure out what nodes in 1) to move in order to minimize the DOM operations.\n\t//\n\t// To achieve 1) one can create a dictionary of keys => index (for the old list), then iterate\n\t// over the new list and for each new vnode, find the corresponding vnode in the old list using\n\t// the map.\n\t// 2) is achieved in the same step: if a new node has no corresponding entry in the map, it is new\n\t// and must be created.\n\t// For the removals, we actually remove the nodes that have been updated from the old list.\n\t// The nodes that remain in that list after 1) and 2) have been performed can be safely removed.\n\t// The fourth step is a bit more complex and relies on the longest increasing subsequence (LIS)\n\t// algorithm.\n\t//\n\t// the longest increasing subsequence is the list of nodes that can remain in place. Imagine going\n\t// from `1,2,3,4,5` to `4,5,1,2,3` where the numbers are not necessarily the keys, but the indices\n\t// corresponding to the keyed nodes in the old list (keyed nodes `e,d,c,b,a` => `b,a,e,d,c` would\n\t// match the above lists, for example).\n\t//\n\t// In there are two increasing subsequences: `4,5` and `1,2,3`, the latter being the longest. We\n\t// can update those nodes without moving them, and only call `insertNode` on `4` and `5`.\n\t//\n\t// @localvoid adapted the algo to also support node deletions and insertions (the `lis` is actually\n\t// the longest increasing subsequence *of old nodes still present in the new list*).\n\t//\n\t// It is a general algorithm that is fireproof in all circumstances, but it requires the allocation\n\t// and the construction of a `key => oldIndex` map, and three arrays (one with `newIndex => oldIndex`,\n\t// the `LIS` and a temporary one to create the LIS).\n\t//\n\t// So we cheat where we can: if the tails of the lists are identical, they are guaranteed to be part of\n\t// the LIS and can be updated without moving them.\n\t//\n\t// If two nodes are swapped, they are guaranteed not to be part of the LIS, and must be moved (with\n\t// the exception of the last node if the list is fully reversed).\n\t//\n\t// ## Finding the next sibling.\n\t//\n\t// `updateNode()` and `createNode()` expect a nextSibling parameter to perform DOM operations.\n\t// When the list is being traversed top-down, at any index, the DOM nodes up to the previous\n\t// vnode reflect the content of the new list, whereas the rest of the DOM nodes reflect the old\n\t// list. The next sibling must be looked for in the old list using `getNextSibling(... oldStart + 1 ...)`.\n\t//\n\t// In the other scenarios (swaps, upwards traversal, map-based diff),\n\t// the new vnodes list is traversed upwards. The DOM nodes at the bottom of the list reflect the\n\t// bottom part of the new vnodes list, and we can use the `v.dom` value of the previous node\n\t// as the next sibling (cached in the `nextSibling` variable).\n\n\n\t// ## DOM node moves\n\t//\n\t// In most scenarios `updateNode()` and `createNode()` perform the DOM operations. However,\n\t// this is not the case if the node moved (second and fourth part of the diff algo). We move\n\t// the old DOM nodes before updateNode runs because it enables us to use the cached `nextSibling`\n\t// variable rather than fetching it using `getNextSibling()`.\n\t//\n\t// The fourth part of the diff currently inserts nodes unconditionally, leading to issues\n\t// like #1791 and #1999. We need to be smarter about those situations where adjascent old\n\t// nodes remain together in the new list in a way that isn't covered by parts one and\n\t// three of the diff algo.\n\n\tfunction updateNodes(parent, old, vnodes, hooks, nextSibling, ns) {\n\t\tif (old === vnodes || old == null && vnodes == null) return\n\t\telse if (old == null || old.length === 0) createNodes(parent, vnodes, 0, vnodes.length, hooks, nextSibling, ns)\n\t\telse if (vnodes == null || vnodes.length === 0) removeNodes(parent, old, 0, old.length)\n\t\telse {\n\t\t\tvar isOldKeyed = old[0] != null && old[0].key != null\n\t\t\tvar isKeyed = vnodes[0] != null && vnodes[0].key != null\n\t\t\tvar start = 0, oldStart = 0\n\t\t\tif (!isOldKeyed) while (oldStart < old.length && old[oldStart] == null) oldStart++\n\t\t\tif (!isKeyed) while (start < vnodes.length && vnodes[start] == null) start++\n\t\t\tif (isKeyed === null && isOldKeyed == null) return // both lists are full of nulls\n\t\t\tif (isOldKeyed !== isKeyed) {\n\t\t\t\tremoveNodes(parent, old, oldStart, old.length)\n\t\t\t\tcreateNodes(parent, vnodes, start, vnodes.length, hooks, nextSibling, ns)\n\t\t\t} else if (!isKeyed) {\n\t\t\t\t// Don't index past the end of either list (causes deopts).\n\t\t\t\tvar commonLength = old.length < vnodes.length ? old.length : vnodes.length\n\t\t\t\t// Rewind if necessary to the first non-null index on either side.\n\t\t\t\t// We could alternatively either explicitly create or remove nodes when `start !== oldStart`\n\t\t\t\t// but that would be optimizing for sparse lists which are more rare than dense ones.\n\t\t\t\tstart = start < oldStart ? start : oldStart\n\t\t\t\tfor (; start < commonLength; start++) {\n\t\t\t\t\to = old[start]\n\t\t\t\t\tv = vnodes[start]\n\t\t\t\t\tif (o === v || o == null && v == null) continue\n\t\t\t\t\telse if (o == null) createNode(parent, v, hooks, ns, getNextSibling(old, start + 1, nextSibling))\n\t\t\t\t\telse if (v == null) removeNode(parent, o)\n\t\t\t\t\telse updateNode(parent, o, v, hooks, getNextSibling(old, start + 1, nextSibling), ns)\n\t\t\t\t}\n\t\t\t\tif (old.length > commonLength) removeNodes(parent, old, start, old.length)\n\t\t\t\tif (vnodes.length > commonLength) createNodes(parent, vnodes, start, vnodes.length, hooks, nextSibling, ns)\n\t\t\t} else {\n\t\t\t\t// keyed diff\n\t\t\t\tvar oldEnd = old.length - 1, end = vnodes.length - 1, map, o, v, oe, ve, topSibling\n\n\t\t\t\t// bottom-up\n\t\t\t\twhile (oldEnd >= oldStart && end >= start) {\n\t\t\t\t\toe = old[oldEnd]\n\t\t\t\t\tve = vnodes[end]\n\t\t\t\t\tif (oe.key !== ve.key) break\n\t\t\t\t\tif (oe !== ve) updateNode(parent, oe, ve, hooks, nextSibling, ns)\n\t\t\t\t\tif (ve.dom != null) nextSibling = ve.dom\n\t\t\t\t\toldEnd--, end--\n\t\t\t\t}\n\t\t\t\t// top-down\n\t\t\t\twhile (oldEnd >= oldStart && end >= start) {\n\t\t\t\t\to = old[oldStart]\n\t\t\t\t\tv = vnodes[start]\n\t\t\t\t\tif (o.key !== v.key) break\n\t\t\t\t\toldStart++, start++\n\t\t\t\t\tif (o !== v) updateNode(parent, o, v, hooks, getNextSibling(old, oldStart, nextSibling), ns)\n\t\t\t\t}\n\t\t\t\t// swaps and list reversals\n\t\t\t\twhile (oldEnd >= oldStart && end >= start) {\n\t\t\t\t\tif (start === end) break\n\t\t\t\t\tif (o.key !== ve.key || oe.key !== v.key) break\n\t\t\t\t\ttopSibling = getNextSibling(old, oldStart, nextSibling)\n\t\t\t\t\tmoveNodes(parent, oe, topSibling)\n\t\t\t\t\tif (oe !== v) updateNode(parent, oe, v, hooks, topSibling, ns)\n\t\t\t\t\tif (++start <= --end) moveNodes(parent, o, nextSibling)\n\t\t\t\t\tif (o !== ve) updateNode(parent, o, ve, hooks, nextSibling, ns)\n\t\t\t\t\tif (ve.dom != null) nextSibling = ve.dom\n\t\t\t\t\toldStart++; oldEnd--\n\t\t\t\t\toe = old[oldEnd]\n\t\t\t\t\tve = vnodes[end]\n\t\t\t\t\to = old[oldStart]\n\t\t\t\t\tv = vnodes[start]\n\t\t\t\t}\n\t\t\t\t// bottom up once again\n\t\t\t\twhile (oldEnd >= oldStart && end >= start) {\n\t\t\t\t\tif (oe.key !== ve.key) break\n\t\t\t\t\tif (oe !== ve) updateNode(parent, oe, ve, hooks, nextSibling, ns)\n\t\t\t\t\tif (ve.dom != null) nextSibling = ve.dom\n\t\t\t\t\toldEnd--, end--\n\t\t\t\t\toe = old[oldEnd]\n\t\t\t\t\tve = vnodes[end]\n\t\t\t\t}\n\t\t\t\tif (start > end) removeNodes(parent, old, oldStart, oldEnd + 1)\n\t\t\t\telse if (oldStart > oldEnd) createNodes(parent, vnodes, start, end + 1, hooks, nextSibling, ns)\n\t\t\t\telse {\n\t\t\t\t\t// inspired by ivi https://github.com/ivijs/ivi/ by Boris Kaul\n\t\t\t\t\tvar originalNextSibling = nextSibling, vnodesLength = end - start + 1, oldIndices = new Array(vnodesLength), li=0, i=0, pos = 2147483647, matched = 0, map, lisIndices\n\t\t\t\t\tfor (i = 0; i < vnodesLength; i++) oldIndices[i] = -1\n\t\t\t\t\tfor (i = end; i >= start; i--) {\n\t\t\t\t\t\tif (map == null) map = getKeyMap(old, oldStart, oldEnd + 1)\n\t\t\t\t\t\tve = vnodes[i]\n\t\t\t\t\t\tvar oldIndex = map[ve.key]\n\t\t\t\t\t\tif (oldIndex != null) {\n\t\t\t\t\t\t\tpos = (oldIndex < pos) ? oldIndex : -1 // becomes -1 if nodes were re-ordered\n\t\t\t\t\t\t\toldIndices[i-start] = oldIndex\n\t\t\t\t\t\t\toe = old[oldIndex]\n\t\t\t\t\t\t\told[oldIndex] = null\n\t\t\t\t\t\t\tif (oe !== ve) updateNode(parent, oe, ve, hooks, nextSibling, ns)\n\t\t\t\t\t\t\tif (ve.dom != null) nextSibling = ve.dom\n\t\t\t\t\t\t\tmatched++\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tnextSibling = originalNextSibling\n\t\t\t\t\tif (matched !== oldEnd - oldStart + 1) removeNodes(parent, old, oldStart, oldEnd + 1)\n\t\t\t\t\tif (matched === 0) createNodes(parent, vnodes, start, end + 1, hooks, nextSibling, ns)\n\t\t\t\t\telse {\n\t\t\t\t\t\tif (pos === -1) {\n\t\t\t\t\t\t\t// the indices of the indices of the items that are part of the\n\t\t\t\t\t\t\t// longest increasing subsequence in the oldIndices list\n\t\t\t\t\t\t\tlisIndices = makeLisIndices(oldIndices)\n\t\t\t\t\t\t\tli = lisIndices.length - 1\n\t\t\t\t\t\t\tfor (i = end; i >= start; i--) {\n\t\t\t\t\t\t\t\tv = vnodes[i]\n\t\t\t\t\t\t\t\tif (oldIndices[i-start] === -1) createNode(parent, v, hooks, ns, nextSibling)\n\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\tif (lisIndices[li] === i - start) li--\n\t\t\t\t\t\t\t\t\telse moveNodes(parent, v, nextSibling)\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif (v.dom != null) nextSibling = vnodes[i].dom\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tfor (i = end; i >= start; i--) {\n\t\t\t\t\t\t\t\tv = vnodes[i]\n\t\t\t\t\t\t\t\tif (oldIndices[i-start] === -1) createNode(parent, v, hooks, ns, nextSibling)\n\t\t\t\t\t\t\t\tif (v.dom != null) nextSibling = vnodes[i].dom\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tfunction updateNode(parent, old, vnode, hooks, nextSibling, ns) {\n\t\tvar oldTag = old.tag, tag = vnode.tag\n\t\tif (oldTag === tag) {\n\t\t\tvnode.state = old.state\n\t\t\tvnode.events = old.events\n\t\t\tif (shouldNotUpdate(vnode, old)) return\n\t\t\tif (typeof oldTag === \"string\") {\n\t\t\t\tif (vnode.attrs != null) {\n\t\t\t\t\tupdateLifecycle(vnode.attrs, vnode, hooks)\n\t\t\t\t}\n\t\t\t\tswitch (oldTag) {\n\t\t\t\t\tcase \"#\": updateText(old, vnode); break\n\t\t\t\t\tcase \"<\": updateHTML(parent, old, vnode, ns, nextSibling); break\n\t\t\t\t\tcase \"[\": updateFragment(parent, old, vnode, hooks, nextSibling, ns); break\n\t\t\t\t\tdefault: updateElement(old, vnode, hooks, ns)\n\t\t\t\t}\n\t\t\t}\n\t\t\telse updateComponent(parent, old, vnode, hooks, nextSibling, ns)\n\t\t}\n\t\telse {\n\t\t\tremoveNode(parent, old)\n\t\t\tcreateNode(parent, vnode, hooks, ns, nextSibling)\n\t\t}\n\t}\n\tfunction updateText(old, vnode) {\n\t\tif (old.children.toString() !== vnode.children.toString()) {\n\t\t\told.dom.nodeValue = vnode.children\n\t\t}\n\t\tvnode.dom = old.dom\n\t}\n\tfunction updateHTML(parent, old, vnode, ns, nextSibling) {\n\t\tif (old.children !== vnode.children) {\n\t\t\tremoveHTML(parent, old)\n\t\t\tcreateHTML(parent, vnode, ns, nextSibling)\n\t\t}\n\t\telse {\n\t\t\tvnode.dom = old.dom\n\t\t\tvnode.domSize = old.domSize\n\t\t\tvnode.instance = old.instance\n\t\t}\n\t}\n\tfunction updateFragment(parent, old, vnode, hooks, nextSibling, ns) {\n\t\tupdateNodes(parent, old.children, vnode.children, hooks, nextSibling, ns)\n\t\tvar domSize = 0, children = vnode.children\n\t\tvnode.dom = null\n\t\tif (children != null) {\n\t\t\tfor (var i = 0; i < children.length; i++) {\n\t\t\t\tvar child = children[i]\n\t\t\t\tif (child != null && child.dom != null) {\n\t\t\t\t\tif (vnode.dom == null) vnode.dom = child.dom\n\t\t\t\t\tdomSize += child.domSize || 1\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (domSize !== 1) vnode.domSize = domSize\n\t\t}\n\t}\n\tfunction updateElement(old, vnode, hooks, ns) {\n\t\tvar element = vnode.dom = old.dom\n\t\tns = getNameSpace(vnode) || ns\n\n\t\tif (vnode.tag === \"textarea\") {\n\t\t\tif (vnode.attrs == null) vnode.attrs = {}\n\t\t\tif (vnode.text != null) {\n\t\t\t\tvnode.attrs.value = vnode.text //FIXME handle multiple children\n\t\t\t\tvnode.text = undefined\n\t\t\t}\n\t\t}\n\t\tupdateAttrs(vnode, old.attrs, vnode.attrs, ns)\n\t\tif (!maybeSetContentEditable(vnode)) {\n\t\t\tif (old.text != null && vnode.text != null && vnode.text !== \"\") {\n\t\t\t\tif (old.text.toString() !== vnode.text.toString()) old.dom.firstChild.nodeValue = vnode.text\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif (old.text != null) old.children = [Vnode(\"#\", undefined, undefined, old.text, undefined, old.dom.firstChild)]\n\t\t\t\tif (vnode.text != null) vnode.children = [Vnode(\"#\", undefined, undefined, vnode.text, undefined, undefined)]\n\t\t\t\tupdateNodes(element, old.children, vnode.children, hooks, null, ns)\n\t\t\t}\n\t\t}\n\t}\n\tfunction updateComponent(parent, old, vnode, hooks, nextSibling, ns) {\n\t\tvnode.instance = Vnode.normalize(callHook.call(vnode.state.view, vnode))\n\t\tif (vnode.instance === vnode) throw Error(\"A view cannot return the vnode it received as argument\")\n\t\tupdateLifecycle(vnode.state, vnode, hooks)\n\t\tif (vnode.attrs != null) updateLifecycle(vnode.attrs, vnode, hooks)\n\t\tif (vnode.instance != null) {\n\t\t\tif (old.instance == null) createNode(parent, vnode.instance, hooks, ns, nextSibling)\n\t\t\telse updateNode(parent, old.instance, vnode.instance, hooks, nextSibling, ns)\n\t\t\tvnode.dom = vnode.instance.dom\n\t\t\tvnode.domSize = vnode.instance.domSize\n\t\t}\n\t\telse if (old.instance != null) {\n\t\t\tremoveNode(parent, old.instance)\n\t\t\tvnode.dom = undefined\n\t\t\tvnode.domSize = 0\n\t\t}\n\t\telse {\n\t\t\tvnode.dom = old.dom\n\t\t\tvnode.domSize = old.domSize\n\t\t}\n\t}\n\tfunction getKeyMap(vnodes, start, end) {\n\t\tvar map = Object.create(null)\n\t\tfor (; start < end; start++) {\n\t\t\tvar vnode = vnodes[start]\n\t\t\tif (vnode != null) {\n\t\t\t\tvar key = vnode.key\n\t\t\t\tif (key != null) map[key] = start\n\t\t\t}\n\t\t}\n\t\treturn map\n\t}\n\t// Lifted from ivi https://github.com/ivijs/ivi/\n\t// takes a list of unique numbers (-1 is special and can\n\t// occur multiple times) and returns an array with the indices\n\t// of the items that are part of the longest increasing\n\t// subsequece\n\tvar lisTemp = []\n\tfunction makeLisIndices(a) {\n\t\tvar result = [0]\n\t\tvar u = 0, v = 0, i = 0\n\t\tvar il = lisTemp.length = a.length\n\t\tfor (var i = 0; i < il; i++) lisTemp[i] = a[i]\n\t\tfor (var i = 0; i < il; ++i) {\n\t\t\tif (a[i] === -1) continue\n\t\t\tvar j = result[result.length - 1]\n\t\t\tif (a[j] < a[i]) {\n\t\t\t\tlisTemp[i] = j\n\t\t\t\tresult.push(i)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tu = 0\n\t\t\tv = result.length - 1\n\t\t\twhile (u < v) {\n\t\t\t\t// Fast integer average without overflow.\n\t\t\t\t// eslint-disable-next-line no-bitwise\n\t\t\t\tvar c = (u >>> 1) + (v >>> 1) + (u & v & 1)\n\t\t\t\tif (a[result[c]] < a[i]) {\n\t\t\t\t\tu = c + 1\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tv = c\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (a[i] < a[result[u]]) {\n\t\t\t\tif (u > 0) lisTemp[i] = result[u - 1]\n\t\t\t\tresult[u] = i\n\t\t\t}\n\t\t}\n\t\tu = result.length\n\t\tv = result[u - 1]\n\t\twhile (u-- > 0) {\n\t\t\tresult[u] = v\n\t\t\tv = lisTemp[v]\n\t\t}\n\t\tlisTemp.length = 0\n\t\treturn result\n\t}\n\n\tfunction getNextSibling(vnodes, i, nextSibling) {\n\t\tfor (; i < vnodes.length; i++) {\n\t\t\tif (vnodes[i] != null && vnodes[i].dom != null) return vnodes[i].dom\n\t\t}\n\t\treturn nextSibling\n\t}\n\n\t// This covers a really specific edge case:\n\t// - Parent node is keyed and contains child\n\t// - Child is removed, returns unresolved promise in `onbeforeremove`\n\t// - Parent node is moved in keyed diff\n\t// - Remaining children still need moved appropriately\n\t//\n\t// Ideally, I'd track removed nodes as well, but that introduces a lot more\n\t// complexity and I'm not exactly interested in doing that.\n\tfunction moveNodes(parent, vnode, nextSibling) {\n\t\tvar frag = $doc.createDocumentFragment()\n\t\tmoveChildToFrag(parent, frag, vnode)\n\t\tinsertNode(parent, frag, nextSibling)\n\t}\n\tfunction moveChildToFrag(parent, frag, vnode) {\n\t\t// Dodge the recursion overhead in a few of the most common cases.\n\t\twhile (vnode.dom != null && vnode.dom.parentNode === parent) {\n\t\t\tif (typeof vnode.tag !== \"string\") {\n\t\t\t\tvnode = vnode.instance\n\t\t\t\tif (vnode != null) continue\n\t\t\t} else if (vnode.tag === \"<\") {\n\t\t\t\tfor (var i = 0; i < vnode.instance.length; i++) {\n\t\t\t\t\tfrag.appendChild(vnode.instance[i])\n\t\t\t\t}\n\t\t\t} else if (vnode.tag !== \"[\") {\n\t\t\t\t// Don't recurse for text nodes *or* elements, just fragments\n\t\t\t\tfrag.appendChild(vnode.dom)\n\t\t\t} else if (vnode.children.length === 1) {\n\t\t\t\tvnode = vnode.children[0]\n\t\t\t\tif (vnode != null) continue\n\t\t\t} else {\n\t\t\t\tfor (var i = 0; i < vnode.children.length; i++) {\n\t\t\t\t\tvar child = vnode.children[i]\n\t\t\t\t\tif (child != null) moveChildToFrag(parent, frag, child)\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak\n\t\t}\n\t}\n\n\tfunction insertNode(parent, dom, nextSibling) {\n\t\tif (nextSibling != null) parent.insertBefore(dom, nextSibling)\n\t\telse parent.appendChild(dom)\n\t}\n\n\tfunction maybeSetContentEditable(vnode) {\n\t\tif (vnode.attrs == null || (\n\t\t\tvnode.attrs.contenteditable == null && // attribute\n\t\t\tvnode.attrs.contentEditable == null // property\n\t\t)) return false\n\t\tvar children = vnode.children\n\t\tif (children != null && children.length === 1 && children[0].tag === \"<\") {\n\t\t\tvar content = children[0].children\n\t\t\tif (vnode.dom.innerHTML !== content) vnode.dom.innerHTML = content\n\t\t}\n\t\telse if (vnode.text != null || children != null && children.length !== 0) throw new Error(\"Child node of a contenteditable must be trusted\")\n\t\treturn true\n\t}\n\n\t//remove\n\tfunction removeNodes(parent, vnodes, start, end) {\n\t\tfor (var i = start; i < end; i++) {\n\t\t\tvar vnode = vnodes[i]\n\t\t\tif (vnode != null) removeNode(parent, vnode)\n\t\t}\n\t}\n\tfunction removeNode(parent, vnode) {\n\t\tvar mask = 0\n\t\tvar original = vnode.state\n\t\tvar stateResult, attrsResult\n\t\tif (typeof vnode.tag !== \"string\" && typeof vnode.state.onbeforeremove === \"function\") {\n\t\t\tvar result = callHook.call(vnode.state.onbeforeremove, vnode)\n\t\t\tif (result != null && typeof result.then === \"function\") {\n\t\t\t\tmask = 1\n\t\t\t\tstateResult = result\n\t\t\t}\n\t\t}\n\t\tif (vnode.attrs && typeof vnode.attrs.onbeforeremove === \"function\") {\n\t\t\tvar result = callHook.call(vnode.attrs.onbeforeremove, vnode)\n\t\t\tif (result != null && typeof result.then === \"function\") {\n\t\t\t\t// eslint-disable-next-line no-bitwise\n\t\t\t\tmask |= 2\n\t\t\t\tattrsResult = result\n\t\t\t}\n\t\t}\n\t\tcheckState(vnode, original)\n\n\t\t// If we can, try to fast-path it and avoid all the overhead of awaiting\n\t\tif (!mask) {\n\t\t\tonremove(vnode)\n\t\t\tremoveChild(parent, vnode)\n\t\t} else {\n\t\t\tif (stateResult != null) {\n\t\t\t\tvar next = function () {\n\t\t\t\t\t// eslint-disable-next-line no-bitwise\n\t\t\t\t\tif (mask & 1) { mask &= 2; if (!mask) reallyRemove() }\n\t\t\t\t}\n\t\t\t\tstateResult.then(next, next)\n\t\t\t}\n\t\t\tif (attrsResult != null) {\n\t\t\t\tvar next = function () {\n\t\t\t\t\t// eslint-disable-next-line no-bitwise\n\t\t\t\t\tif (mask & 2) { mask &= 1; if (!mask) reallyRemove() }\n\t\t\t\t}\n\t\t\t\tattrsResult.then(next, next)\n\t\t\t}\n\t\t}\n\n\t\tfunction reallyRemove() {\n\t\t\tcheckState(vnode, original)\n\t\t\tonremove(vnode)\n\t\t\tremoveChild(parent, vnode)\n\t\t}\n\t}\n\tfunction removeHTML(parent, vnode) {\n\t\tfor (var i = 0; i < vnode.instance.length; i++) {\n\t\t\tparent.removeChild(vnode.instance[i])\n\t\t}\n\t}\n\tfunction removeChild(parent, vnode) {\n\t\t// Dodge the recursion overhead in a few of the most common cases.\n\t\twhile (vnode.dom != null && vnode.dom.parentNode === parent) {\n\t\t\tif (typeof vnode.tag !== \"string\") {\n\t\t\t\tvnode = vnode.instance\n\t\t\t\tif (vnode != null) continue\n\t\t\t} else if (vnode.tag === \"<\") {\n\t\t\t\tremoveHTML(parent, vnode)\n\t\t\t} else {\n\t\t\t\tif (vnode.tag !== \"[\") {\n\t\t\t\t\tparent.removeChild(vnode.dom)\n\t\t\t\t\tif (!Array.isArray(vnode.children)) break\n\t\t\t\t}\n\t\t\t\tif (vnode.children.length === 1) {\n\t\t\t\t\tvnode = vnode.children[0]\n\t\t\t\t\tif (vnode != null) continue\n\t\t\t\t} else {\n\t\t\t\t\tfor (var i = 0; i < vnode.children.length; i++) {\n\t\t\t\t\t\tvar child = vnode.children[i]\n\t\t\t\t\t\tif (child != null) removeChild(parent, child)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak\n\t\t}\n\t}\n\tfunction onremove(vnode) {\n\t\tif (typeof vnode.tag !== \"string\" && typeof vnode.state.onremove === \"function\") callHook.call(vnode.state.onremove, vnode)\n\t\tif (vnode.attrs && typeof vnode.attrs.onremove === \"function\") callHook.call(vnode.attrs.onremove, vnode)\n\t\tif (typeof vnode.tag !== \"string\") {\n\t\t\tif (vnode.instance != null) onremove(vnode.instance)\n\t\t} else {\n\t\t\tvar children = vnode.children\n\t\t\tif (Array.isArray(children)) {\n\t\t\t\tfor (var i = 0; i < children.length; i++) {\n\t\t\t\t\tvar child = children[i]\n\t\t\t\t\tif (child != null) onremove(child)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t//attrs\n\tfunction setAttrs(vnode, attrs, ns) {\n\t\tfor (var key in attrs) {\n\t\t\tsetAttr(vnode, key, null, attrs[key], ns)\n\t\t}\n\t}\n\tfunction setAttr(vnode, key, old, value, ns) {\n\t\tif (key === \"key\" || key === \"is\" || value == null || isLifecycleMethod(key) || (old === value && !isFormAttribute(vnode, key)) && typeof value !== \"object\") return\n\t\tif (key[0] === \"o\" && key[1] === \"n\") return updateEvent(vnode, key, value)\n\t\tif (key.slice(0, 6) === \"xlink:\") vnode.dom.setAttributeNS(\"http://www.w3.org/1999/xlink\", key.slice(6), value)\n\t\telse if (key === \"style\") updateStyle(vnode.dom, old, value)\n\t\telse if (hasPropertyKey(vnode, key, ns)) {\n\t\t\tif (key === \"value\") {\n\t\t\t\t// Only do the coercion if we're actually going to check the value.\n\t\t\t\t/* eslint-disable no-implicit-coercion */\n\t\t\t\t//setting input[value] to same value by typing on focused element moves cursor to end in Chrome\n\t\t\t\tif ((vnode.tag === \"input\" || vnode.tag === \"textarea\") && vnode.dom.value === \"\" + value && vnode.dom === activeElement()) return\n\t\t\t\t//setting select[value] to same value while having select open blinks select dropdown in Chrome\n\t\t\t\tif (vnode.tag === \"select\" && old !== null && vnode.dom.value === \"\" + value) return\n\t\t\t\t//setting option[value] to same value while having select open blinks select dropdown in Chrome\n\t\t\t\tif (vnode.tag === \"option\" && old !== null && vnode.dom.value === \"\" + value) return\n\t\t\t\t/* eslint-enable no-implicit-coercion */\n\t\t\t}\n\t\t\t// If you assign an input type that is not supported by IE 11 with an assignment expression, an error will occur.\n\t\t\tif (vnode.tag === \"input\" && key === \"type\") vnode.dom.setAttribute(key, value)\n\t\t\telse vnode.dom[key] = value\n\t\t} else {\n\t\t\tif (typeof value === \"boolean\") {\n\t\t\t\tif (value) vnode.dom.setAttribute(key, \"\")\n\t\t\t\telse vnode.dom.removeAttribute(key)\n\t\t\t}\n\t\t\telse vnode.dom.setAttribute(key === \"className\" ? \"class\" : key, value)\n\t\t}\n\t}\n\tfunction removeAttr(vnode, key, old, ns) {\n\t\tif (key === \"key\" || key === \"is\" || old == null || isLifecycleMethod(key)) return\n\t\tif (key[0] === \"o\" && key[1] === \"n\" && !isLifecycleMethod(key)) updateEvent(vnode, key, undefined)\n\t\telse if (key === \"style\") updateStyle(vnode.dom, old, null)\n\t\telse if (\n\t\t\thasPropertyKey(vnode, key, ns)\n\t\t\t&& key !== \"className\"\n\t\t\t&& !(key === \"value\" && (\n\t\t\t\tvnode.tag === \"option\"\n\t\t\t\t|| vnode.tag === \"select\" && vnode.dom.selectedIndex === -1 && vnode.dom === activeElement()\n\t\t\t))\n\t\t\t&& !(vnode.tag === \"input\" && key === \"type\")\n\t\t) {\n\t\t\tvnode.dom[key] = null\n\t\t} else {\n\t\t\tvar nsLastIndex = key.indexOf(\":\")\n\t\t\tif (nsLastIndex !== -1) key = key.slice(nsLastIndex + 1)\n\t\t\tif (old !== false) vnode.dom.removeAttribute(key === \"className\" ? \"class\" : key)\n\t\t}\n\t}\n\tfunction setLateSelectAttrs(vnode, attrs) {\n\t\tif (\"value\" in attrs) {\n\t\t\tif(attrs.value === null) {\n\t\t\t\tif (vnode.dom.selectedIndex !== -1) vnode.dom.value = null\n\t\t\t} else {\n\t\t\t\tvar normalized = \"\" + attrs.value // eslint-disable-line no-implicit-coercion\n\t\t\t\tif (vnode.dom.value !== normalized || vnode.dom.selectedIndex === -1) {\n\t\t\t\t\tvnode.dom.value = normalized\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (\"selectedIndex\" in attrs) setAttr(vnode, \"selectedIndex\", null, attrs.selectedIndex, undefined)\n\t}\n\tfunction updateAttrs(vnode, old, attrs, ns) {\n\t\tif (attrs != null) {\n\t\t\tfor (var key in attrs) {\n\t\t\t\tsetAttr(vnode, key, old && old[key], attrs[key], ns)\n\t\t\t}\n\t\t}\n\t\tvar val\n\t\tif (old != null) {\n\t\t\tfor (var key in old) {\n\t\t\t\tif (((val = old[key]) != null) && (attrs == null || attrs[key] == null)) {\n\t\t\t\t\tremoveAttr(vnode, key, val, ns)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tfunction isFormAttribute(vnode, attr) {\n\t\treturn attr === \"value\" || attr === \"checked\" || attr === \"selectedIndex\" || attr === \"selected\" && vnode.dom === activeElement() || vnode.tag === \"option\" && vnode.dom.parentNode === $doc.activeElement\n\t}\n\tfunction isLifecycleMethod(attr) {\n\t\treturn attr === \"oninit\" || attr === \"oncreate\" || attr === \"onupdate\" || attr === \"onremove\" || attr === \"onbeforeremove\" || attr === \"onbeforeupdate\"\n\t}\n\tfunction hasPropertyKey(vnode, key, ns) {\n\t\t// Filter out namespaced keys\n\t\treturn ns === undefined && (\n\t\t\t// If it's a custom element, just keep it.\n\t\t\tvnode.tag.indexOf(\"-\") > -1 || vnode.attrs != null && vnode.attrs.is ||\n\t\t\t// If it's a normal element, let's try to avoid a few browser bugs.\n\t\t\tkey !== \"href\" && key !== \"list\" && key !== \"form\" && key !== \"width\" && key !== \"height\"// && key !== \"type\"\n\t\t\t// Defer the property check until *after* we check everything.\n\t\t) && key in vnode.dom\n\t}\n\n\t//style\n\tvar uppercaseRegex = /[A-Z]/g\n\tfunction toLowerCase(capital) { return \"-\" + capital.toLowerCase() }\n\tfunction normalizeKey(key) {\n\t\treturn key[0] === \"-\" && key[1] === \"-\" ? key :\n\t\t\tkey === \"cssFloat\" ? \"float\" :\n\t\t\t\tkey.replace(uppercaseRegex, toLowerCase)\n\t}\n\tfunction updateStyle(element, old, style) {\n\t\tif (old === style) {\n\t\t\t// Styles are equivalent, do nothing.\n\t\t} else if (style == null) {\n\t\t\t// New style is missing, just clear it.\n\t\t\telement.style.cssText = \"\"\n\t\t} else if (typeof style !== \"object\") {\n\t\t\t// New style is a string, let engine deal with patching.\n\t\t\telement.style.cssText = style\n\t\t} else if (old == null || typeof old !== \"object\") {\n\t\t\t// `old` is missing or a string, `style` is an object.\n\t\t\telement.style.cssText = \"\"\n\t\t\t// Add new style properties\n\t\t\tfor (var key in style) {\n\t\t\t\tvar value = style[key]\n\t\t\t\tif (value != null) element.style.setProperty(normalizeKey(key), String(value))\n\t\t\t}\n\t\t} else {\n\t\t\t// Both old & new are (different) objects.\n\t\t\t// Update style properties that have changed\n\t\t\tfor (var key in style) {\n\t\t\t\tvar value = style[key]\n\t\t\t\tif (value != null && (value = String(value)) !== String(old[key])) {\n\t\t\t\t\telement.style.setProperty(normalizeKey(key), value)\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Remove style properties that no longer exist\n\t\t\tfor (var key in old) {\n\t\t\t\tif (old[key] != null && style[key] == null) {\n\t\t\t\t\telement.style.removeProperty(normalizeKey(key))\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Here's an explanation of how this works:\n\t// 1. The event names are always (by design) prefixed by `on`.\n\t// 2. The EventListener interface accepts either a function or an object\n\t// with a `handleEvent` method.\n\t// 3. The object does not inherit from `Object.prototype`, to avoid\n\t// any potential interference with that (e.g. setters).\n\t// 4. The event name is remapped to the handler before calling it.\n\t// 5. In function-based event handlers, `ev.target === this`. We replicate\n\t// that below.\n\t// 6. In function-based event handlers, `return false` prevents the default\n\t// action and stops event propagation. We replicate that below.\n\tfunction EventDict() {\n\t\t// Save this, so the current redraw is correctly tracked.\n\t\tthis._ = currentRedraw\n\t}\n\tEventDict.prototype = Object.create(null)\n\tEventDict.prototype.handleEvent = function (ev) {\n\t\tvar handler = this[\"on\" + ev.type]\n\t\tvar result\n\t\tif (typeof handler === \"function\") result = handler.call(ev.currentTarget, ev)\n\t\telse if (typeof handler.handleEvent === \"function\") handler.handleEvent(ev)\n\t\tif (this._ && ev.redraw !== false) (0, this._)()\n\t\tif (result === false) {\n\t\t\tev.preventDefault()\n\t\t\tev.stopPropagation()\n\t\t}\n\t}\n\n\t//event\n\tfunction updateEvent(vnode, key, value) {\n\t\tif (vnode.events != null) {\n\t\t\tif (vnode.events[key] === value) return\n\t\t\tif (value != null && (typeof value === \"function\" || typeof value === \"object\")) {\n\t\t\t\tif (vnode.events[key] == null) vnode.dom.addEventListener(key.slice(2), vnode.events, false)\n\t\t\t\tvnode.events[key] = value\n\t\t\t} else {\n\t\t\t\tif (vnode.events[key] != null) vnode.dom.removeEventListener(key.slice(2), vnode.events, false)\n\t\t\t\tvnode.events[key] = undefined\n\t\t\t}\n\t\t} else if (value != null && (typeof value === \"function\" || typeof value === \"object\")) {\n\t\t\tvnode.events = new EventDict()\n\t\t\tvnode.dom.addEventListener(key.slice(2), vnode.events, false)\n\t\t\tvnode.events[key] = value\n\t\t}\n\t}\n\n\t//lifecycle\n\tfunction initLifecycle(source, vnode, hooks) {\n\t\tif (typeof source.oninit === \"function\") callHook.call(source.oninit, vnode)\n\t\tif (typeof source.oncreate === \"function\") hooks.push(callHook.bind(source.oncreate, vnode))\n\t}\n\tfunction updateLifecycle(source, vnode, hooks) {\n\t\tif (typeof source.onupdate === \"function\") hooks.push(callHook.bind(source.onupdate, vnode))\n\t}\n\tfunction shouldNotUpdate(vnode, old) {\n\t\tdo {\n\t\t\tif (vnode.attrs != null && typeof vnode.attrs.onbeforeupdate === \"function\") {\n\t\t\t\tvar force = callHook.call(vnode.attrs.onbeforeupdate, vnode, old)\n\t\t\t\tif (force !== undefined && !force) break\n\t\t\t}\n\t\t\tif (typeof vnode.tag !== \"string\" && typeof vnode.state.onbeforeupdate === \"function\") {\n\t\t\t\tvar force = callHook.call(vnode.state.onbeforeupdate, vnode, old)\n\t\t\t\tif (force !== undefined && !force) break\n\t\t\t}\n\t\t\treturn false\n\t\t} while (false); // eslint-disable-line no-constant-condition\n\t\tvnode.dom = old.dom\n\t\tvnode.domSize = old.domSize\n\t\tvnode.instance = old.instance\n\t\t// One would think having the actual latest attributes would be ideal,\n\t\t// but it doesn't let us properly diff based on our current internal\n\t\t// representation. We have to save not only the old DOM info, but also\n\t\t// the attributes used to create it, as we diff *that*, not against the\n\t\t// DOM directly (with a few exceptions in `setAttr`). And, of course, we\n\t\t// need to save the children and text as they are conceptually not\n\t\t// unlike special \"attributes\" internally.\n\t\tvnode.attrs = old.attrs\n\t\tvnode.children = old.children\n\t\tvnode.text = old.text\n\t\treturn true\n\t}\n\n\treturn function(dom, vnodes, redraw) {\n\t\tif (!dom) throw new TypeError(\"Ensure the DOM element being passed to m.route/m.mount/m.render is not undefined.\")\n\t\tvar hooks = []\n\t\tvar active = activeElement()\n\t\tvar namespace = dom.namespaceURI\n\n\t\t// First time rendering into a node clears it out\n\t\tif (dom.vnodes == null) dom.textContent = \"\"\n\n\t\tvnodes = Vnode.normalizeChildren(Array.isArray(vnodes) ? vnodes : [vnodes])\n\t\tvar prevRedraw = currentRedraw\n\t\ttry {\n\t\t\tcurrentRedraw = typeof redraw === \"function\" ? redraw : undefined\n\t\t\tupdateNodes(dom, dom.vnodes, vnodes, hooks, null, namespace === \"http://www.w3.org/1999/xhtml\" ? undefined : namespace)\n\t\t} finally {\n\t\t\tcurrentRedraw = prevRedraw\n\t\t}\n\t\tdom.vnodes = vnodes\n\t\t// `document.activeElement` can return null: https://html.spec.whatwg.org/multipage/interaction.html#dom-document-activeelement\n\t\tif (active != null && activeElement() !== active && typeof active.focus === \"function\") active.focus()\n\t\tfor (var i = 0; i < hooks.length; i++) hooks[i]()\n\t}\n}\n","\"use strict\"\n\nvar Vnode = require(\"../render/vnode\")\n\nmodule.exports = function(render, schedule, console) {\n\tvar subscriptions = []\n\tvar rendering = false\n\tvar pending = false\n\n\tfunction sync() {\n\t\tif (rendering) throw new Error(\"Nested m.redraw.sync() call\")\n\t\trendering = true\n\t\tfor (var i = 0; i < subscriptions.length; i += 2) {\n\t\t\ttry { render(subscriptions[i], Vnode(subscriptions[i + 1]), redraw) }\n\t\t\tcatch (e) { console.error(e) }\n\t\t}\n\t\trendering = false\n\t}\n\n\tfunction redraw() {\n\t\tif (!pending) {\n\t\t\tpending = true\n\t\t\tschedule(function() {\n\t\t\t\tpending = false\n\t\t\t\tsync()\n\t\t\t})\n\t\t}\n\t}\n\n\tredraw.sync = sync\n\n\tfunction mount(root, component) {\n\t\tif (component != null && component.view == null && typeof component !== \"function\") {\n\t\t\tthrow new TypeError(\"m.mount(element, component) expects a component, not a vnode\")\n\t\t}\n\n\t\tvar index = subscriptions.indexOf(root)\n\t\tif (index >= 0) {\n\t\t\tsubscriptions.splice(index, 2)\n\t\t\trender(root, [], redraw)\n\t\t}\n\n\t\tif (component != null) {\n\t\t\tsubscriptions.push(root, component)\n\t\t\trender(root, Vnode(component), redraw)\n\t\t}\n\t}\n\n\treturn {mount: mount, redraw: redraw}\n}\n","\"use strict\"\n\nvar buildPathname = require(\"../pathname/build\")\n\nmodule.exports = function($window, Promise, oncompletion) {\n\tvar callbackCount = 0\n\n\tfunction PromiseProxy(executor) {\n\t\treturn new Promise(executor)\n\t}\n\n\t// In case the global Promise is some userland library's where they rely on\n\t// `foo instanceof this.constructor`, `this.constructor.resolve(value)`, or\n\t// similar. Let's *not* break them.\n\tPromiseProxy.prototype = Promise.prototype\n\tPromiseProxy.__proto__ = Promise // eslint-disable-line no-proto\n\n\tfunction makeRequest(factory) {\n\t\treturn function(url, args) {\n\t\t\tif (typeof url !== \"string\") { args = url; url = url.url }\n\t\t\telse if (args == null) args = {}\n\t\t\tvar promise = new Promise(function(resolve, reject) {\n\t\t\t\tfactory(buildPathname(url, args.params), args, function (data) {\n\t\t\t\t\tif (typeof args.type === \"function\") {\n\t\t\t\t\t\tif (Array.isArray(data)) {\n\t\t\t\t\t\t\tfor (var i = 0; i < data.length; i++) {\n\t\t\t\t\t\t\t\tdata[i] = new args.type(data[i])\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse data = new args.type(data)\n\t\t\t\t\t}\n\t\t\t\t\tresolve(data)\n\t\t\t\t}, reject)\n\t\t\t})\n\t\t\tif (args.background === true) return promise\n\t\t\tvar count = 0\n\t\t\tfunction complete() {\n\t\t\t\tif (--count === 0 && typeof oncompletion === \"function\") oncompletion()\n\t\t\t}\n\n\t\t\treturn wrap(promise)\n\n\t\t\tfunction wrap(promise) {\n\t\t\t\tvar then = promise.then\n\t\t\t\t// Set the constructor, so engines know to not await or resolve\n\t\t\t\t// this as a native promise. At the time of writing, this is\n\t\t\t\t// only necessary for V8, but their behavior is the correct\n\t\t\t\t// behavior per spec. See this spec issue for more details:\n\t\t\t\t// https://github.com/tc39/ecma262/issues/1577. Also, see the\n\t\t\t\t// corresponding comment in `request/tests/test-request.js` for\n\t\t\t\t// a bit more background on the issue at hand.\n\t\t\t\tpromise.constructor = PromiseProxy\n\t\t\t\tpromise.then = function() {\n\t\t\t\t\tcount++\n\t\t\t\t\tvar next = then.apply(promise, arguments)\n\t\t\t\t\tnext.then(complete, function(e) {\n\t\t\t\t\t\tcomplete()\n\t\t\t\t\t\tif (count === 0) throw e\n\t\t\t\t\t})\n\t\t\t\t\treturn wrap(next)\n\t\t\t\t}\n\t\t\t\treturn promise\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction hasHeader(args, name) {\n\t\tfor (var key in args.headers) {\n\t\t\tif ({}.hasOwnProperty.call(args.headers, key) && name.test(key)) return true\n\t\t}\n\t\treturn false\n\t}\n\n\treturn {\n\t\trequest: makeRequest(function(url, args, resolve, reject) {\n\t\t\tvar method = args.method != null ? args.method.toUpperCase() : \"GET\"\n\t\t\tvar body = args.body\n\t\t\tvar assumeJSON = (args.serialize == null || args.serialize === JSON.serialize) && !(body instanceof $window.FormData)\n\t\t\tvar responseType = args.responseType || (typeof args.extract === \"function\" ? \"\" : \"json\")\n\n\t\t\tvar xhr = new $window.XMLHttpRequest(), aborted = false\n\t\t\tvar original = xhr, replacedAbort\n\t\t\tvar abort = xhr.abort\n\n\t\t\txhr.abort = function() {\n\t\t\t\taborted = true\n\t\t\t\tabort.call(this)\n\t\t\t}\n\n\t\t\txhr.open(method, url, args.async !== false, typeof args.user === \"string\" ? args.user : undefined, typeof args.password === \"string\" ? args.password : undefined)\n\n\t\t\tif (assumeJSON && body != null && !hasHeader(args, /^content-type$/i)) {\n\t\t\t\txhr.setRequestHeader(\"Content-Type\", \"application/json; charset=utf-8\")\n\t\t\t}\n\t\t\tif (typeof args.deserialize !== \"function\" && !hasHeader(args, /^accept$/i)) {\n\t\t\t\txhr.setRequestHeader(\"Accept\", \"application/json, text/*\")\n\t\t\t}\n\t\t\tif (args.withCredentials) xhr.withCredentials = args.withCredentials\n\t\t\tif (args.timeout) xhr.timeout = args.timeout\n\t\t\txhr.responseType = responseType\n\n\t\t\tfor (var key in args.headers) {\n\t\t\t\tif ({}.hasOwnProperty.call(args.headers, key)) {\n\t\t\t\t\txhr.setRequestHeader(key, args.headers[key])\n\t\t\t\t}\n\t\t\t}\n\n\t\t\txhr.onreadystatechange = function(ev) {\n\t\t\t\t// Don't throw errors on xhr.abort().\n\t\t\t\tif (aborted) return\n\n\t\t\t\tif (ev.target.readyState === 4) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tvar success = (ev.target.status >= 200 && ev.target.status < 300) || ev.target.status === 304 || (/^file:\\/\\//i).test(url)\n\t\t\t\t\t\t// When the response type isn't \"\" or \"text\",\n\t\t\t\t\t\t// `xhr.responseText` is the wrong thing to use.\n\t\t\t\t\t\t// Browsers do the right thing and throw here, and we\n\t\t\t\t\t\t// should honor that and do the right thing by\n\t\t\t\t\t\t// preferring `xhr.response` where possible/practical.\n\t\t\t\t\t\tvar response = ev.target.response, message\n\n\t\t\t\t\t\tif (responseType === \"json\") {\n\t\t\t\t\t\t\t// For IE and Edge, which don't implement\n\t\t\t\t\t\t\t// `responseType: \"json\"`.\n\t\t\t\t\t\t\tif (!ev.target.responseType && typeof args.extract !== \"function\") response = JSON.parse(ev.target.responseText)\n\t\t\t\t\t\t} else if (!responseType || responseType === \"text\") {\n\t\t\t\t\t\t\t// Only use this default if it's text. If a parsed\n\t\t\t\t\t\t\t// document is needed on old IE and friends (all\n\t\t\t\t\t\t\t// unsupported), the user should use a custom\n\t\t\t\t\t\t\t// `config` instead. They're already using this at\n\t\t\t\t\t\t\t// their own risk.\n\t\t\t\t\t\t\tif (response == null) response = ev.target.responseText\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (typeof args.extract === \"function\") {\n\t\t\t\t\t\t\tresponse = args.extract(ev.target, args)\n\t\t\t\t\t\t\tsuccess = true\n\t\t\t\t\t\t} else if (typeof args.deserialize === \"function\") {\n\t\t\t\t\t\t\tresponse = args.deserialize(response)\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (success) resolve(response)\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\ttry { message = ev.target.responseText }\n\t\t\t\t\t\t\tcatch (e) { message = response }\n\t\t\t\t\t\t\tvar error = new Error(message)\n\t\t\t\t\t\t\terror.code = ev.target.status\n\t\t\t\t\t\t\terror.response = response\n\t\t\t\t\t\t\treject(error)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tcatch (e) {\n\t\t\t\t\t\treject(e)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (typeof args.config === \"function\") {\n\t\t\t\txhr = args.config(xhr, args, url) || xhr\n\n\t\t\t\t// Propagate the `abort` to any replacement XHR as well.\n\t\t\t\tif (xhr !== original) {\n\t\t\t\t\treplacedAbort = xhr.abort\n\t\t\t\t\txhr.abort = function() {\n\t\t\t\t\t\taborted = true\n\t\t\t\t\t\treplacedAbort.call(this)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (body == null) xhr.send()\n\t\t\telse if (typeof args.serialize === \"function\") xhr.send(args.serialize(body))\n\t\t\telse if (body instanceof $window.FormData) xhr.send(body)\n\t\t\telse xhr.send(JSON.stringify(body))\n\t\t}),\n\t\tjsonp: makeRequest(function(url, args, resolve, reject) {\n\t\t\tvar callbackName = args.callbackName || \"_mithril_\" + Math.round(Math.random() * 1e16) + \"_\" + callbackCount++\n\t\t\tvar script = $window.document.createElement(\"script\")\n\t\t\t$window[callbackName] = function(data) {\n\t\t\t\tdelete $window[callbackName]\n\t\t\t\tscript.parentNode.removeChild(script)\n\t\t\t\tresolve(data)\n\t\t\t}\n\t\t\tscript.onerror = function() {\n\t\t\t\tdelete $window[callbackName]\n\t\t\t\tscript.parentNode.removeChild(script)\n\t\t\t\treject(new Error(\"JSONP request failed\"))\n\t\t\t}\n\t\t\tscript.src = url + (url.indexOf(\"?\") < 0 ? \"?\" : \"&\") +\n\t\t\t\tencodeURIComponent(args.callbackKey || \"callback\") + \"=\" +\n\t\t\t\tencodeURIComponent(callbackName)\n\t\t\t$window.document.documentElement.appendChild(script)\n\t\t}),\n\t}\n}\n","\"use strict\"\n\nvar mountRedraw = require(\"./mount-redraw\")\n\nmodule.exports = require(\"./api/router\")(window, mountRedraw)\n","\"use strict\"\n\nvar Vnode = require(\"../render/vnode\")\nvar m = require(\"../render/hyperscript\")\nvar Promise = require(\"../promise/promise\")\n\nvar buildPathname = require(\"../pathname/build\")\nvar parsePathname = require(\"../pathname/parse\")\nvar compileTemplate = require(\"../pathname/compileTemplate\")\nvar assign = require(\"../pathname/assign\")\n\nvar sentinel = {}\n\nmodule.exports = function($window, mountRedraw) {\n\tvar fireAsync\n\n\tfunction setPath(path, data, options) {\n\t\tpath = buildPathname(path, data)\n\t\tif (fireAsync != null) {\n\t\t\tfireAsync()\n\t\t\tvar state = options ? options.state : null\n\t\t\tvar title = options ? options.title : null\n\t\t\tif (options && options.replace) $window.history.replaceState(state, title, route.prefix + path)\n\t\t\telse $window.history.pushState(state, title, route.prefix + path)\n\t\t}\n\t\telse {\n\t\t\t$window.location.href = route.prefix + path\n\t\t}\n\t}\n\n\tvar currentResolver = sentinel, component, attrs, currentPath, lastUpdate\n\n\tvar SKIP = route.SKIP = {}\n\n\tfunction route(root, defaultRoute, routes) {\n\t\tif (root == null) throw new Error(\"Ensure the DOM element that was passed to `m.route` is not undefined\")\n\t\t// 0 = start\n\t\t// 1 = init\n\t\t// 2 = ready\n\t\tvar state = 0\n\n\t\tvar compiled = Object.keys(routes).map(function(route) {\n\t\t\tif (route[0] !== \"/\") throw new SyntaxError(\"Routes must start with a `/`\")\n\t\t\tif ((/:([^\\/\\.-]+)(\\.{3})?:/).test(route)) {\n\t\t\t\tthrow new SyntaxError(\"Route parameter names must be separated with either `/`, `.`, or `-`\")\n\t\t\t}\n\t\t\treturn {\n\t\t\t\troute: route,\n\t\t\t\tcomponent: routes[route],\n\t\t\t\tcheck: compileTemplate(route),\n\t\t\t}\n\t\t})\n\t\tvar callAsync = typeof setImmediate === \"function\" ? setImmediate : setTimeout\n\t\tvar p = Promise.resolve()\n\t\tvar scheduled = false\n\t\tvar onremove\n\n\t\tfireAsync = null\n\n\t\tif (defaultRoute != null) {\n\t\t\tvar defaultData = parsePathname(defaultRoute)\n\n\t\t\tif (!compiled.some(function (i) { return i.check(defaultData) })) {\n\t\t\t\tthrow new ReferenceError(\"Default route doesn't match any known routes\")\n\t\t\t}\n\t\t}\n\n\t\tfunction resolveRoute() {\n\t\t\tscheduled = false\n\t\t\t// Consider the pathname holistically. The prefix might even be invalid,\n\t\t\t// but that's not our problem.\n\t\t\tvar prefix = $window.location.hash\n\t\t\tif (route.prefix[0] !== \"#\") {\n\t\t\t\tprefix = $window.location.search + prefix\n\t\t\t\tif (route.prefix[0] !== \"?\") {\n\t\t\t\t\tprefix = $window.location.pathname + prefix\n\t\t\t\t\tif (prefix[0] !== \"/\") prefix = \"/\" + prefix\n\t\t\t\t}\n\t\t\t}\n\t\t\t// This seemingly useless `.concat()` speeds up the tests quite a bit,\n\t\t\t// since the representation is consistently a relatively poorly\n\t\t\t// optimized cons string.\n\t\t\tvar path = prefix.concat()\n\t\t\t\t.replace(/(?:%[a-f89][a-f0-9])+/gim, decodeURIComponent)\n\t\t\t\t.slice(route.prefix.length)\n\t\t\tvar data = parsePathname(path)\n\n\t\t\tassign(data.params, $window.history.state)\n\n\t\t\tfunction fail() {\n\t\t\t\tif (path === defaultRoute) throw new Error(\"Could not resolve default route \" + defaultRoute)\n\t\t\t\tsetPath(defaultRoute, null, {replace: true})\n\t\t\t}\n\n\t\t\tloop(0)\n\t\t\tfunction loop(i) {\n\t\t\t\t// 0 = init\n\t\t\t\t// 1 = scheduled\n\t\t\t\t// 2 = done\n\t\t\t\tfor (; i < compiled.length; i++) {\n\t\t\t\t\tif (compiled[i].check(data)) {\n\t\t\t\t\t\tvar payload = compiled[i].component\n\t\t\t\t\t\tvar matchedRoute = compiled[i].route\n\t\t\t\t\t\tvar localComp = payload\n\t\t\t\t\t\tvar update = lastUpdate = function(comp) {\n\t\t\t\t\t\t\tif (update !== lastUpdate) return\n\t\t\t\t\t\t\tif (comp === SKIP) return loop(i + 1)\n\t\t\t\t\t\t\tcomponent = comp != null && (typeof comp.view === \"function\" || typeof comp === \"function\")? comp : \"div\"\n\t\t\t\t\t\t\tattrs = data.params, currentPath = path, lastUpdate = null\n\t\t\t\t\t\t\tcurrentResolver = payload.render ? payload : null\n\t\t\t\t\t\t\tif (state === 2) mountRedraw.redraw()\n\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\tstate = 2\n\t\t\t\t\t\t\t\tmountRedraw.redraw.sync()\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// There's no understating how much I *wish* I could\n\t\t\t\t\t\t// use `async`/`await` here...\n\t\t\t\t\t\tif (payload.view || typeof payload === \"function\") {\n\t\t\t\t\t\t\tpayload = {}\n\t\t\t\t\t\t\tupdate(localComp)\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (payload.onmatch) {\n\t\t\t\t\t\t\tp.then(function () {\n\t\t\t\t\t\t\t\treturn payload.onmatch(data.params, path, matchedRoute)\n\t\t\t\t\t\t\t}).then(update, fail)\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse update(\"div\")\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tfail()\n\t\t\t}\n\t\t}\n\n\t\t// Set it unconditionally so `m.route.set` and `m.route.Link` both work,\n\t\t// even if neither `pushState` nor `hashchange` are supported. It's\n\t\t// cleared if `hashchange` is used, since that makes it automatically\n\t\t// async.\n\t\tfireAsync = function() {\n\t\t\tif (!scheduled) {\n\t\t\t\tscheduled = true\n\t\t\t\tcallAsync(resolveRoute)\n\t\t\t}\n\t\t}\n\n\t\tif (typeof $window.history.pushState === \"function\") {\n\t\t\tonremove = function() {\n\t\t\t\t$window.removeEventListener(\"popstate\", fireAsync, false)\n\t\t\t}\n\t\t\t$window.addEventListener(\"popstate\", fireAsync, false)\n\t\t} else if (route.prefix[0] === \"#\") {\n\t\t\tfireAsync = null\n\t\t\tonremove = function() {\n\t\t\t\t$window.removeEventListener(\"hashchange\", resolveRoute, false)\n\t\t\t}\n\t\t\t$window.addEventListener(\"hashchange\", resolveRoute, false)\n\t\t}\n\n\t\treturn mountRedraw.mount(root, {\n\t\t\tonbeforeupdate: function() {\n\t\t\t\tstate = state ? 2 : 1\n\t\t\t\treturn !(!state || sentinel === currentResolver)\n\t\t\t},\n\t\t\toncreate: resolveRoute,\n\t\t\tonremove: onremove,\n\t\t\tview: function() {\n\t\t\t\tif (!state || sentinel === currentResolver) return\n\t\t\t\t// Wrap in a fragment to preserve existing key semantics\n\t\t\t\tvar vnode = [Vnode(component, attrs.key, attrs)]\n\t\t\t\tif (currentResolver) vnode = currentResolver.render(vnode[0])\n\t\t\t\treturn vnode\n\t\t\t},\n\t\t})\n\t}\n\troute.set = function(path, data, options) {\n\t\tif (lastUpdate != null) {\n\t\t\toptions = options || {}\n\t\t\toptions.replace = true\n\t\t}\n\t\tlastUpdate = null\n\t\tsetPath(path, data, options)\n\t}\n\troute.get = function() {return currentPath}\n\troute.prefix = \"#!\"\n\troute.Link = {\n\t\tview: function(vnode) {\n\t\t\tvar options = vnode.attrs.options\n\t\t\t// Remove these so they don't get overwritten\n\t\t\tvar attrs = {}, onclick, href\n\t\t\tassign(attrs, vnode.attrs)\n\t\t\t// The first two are internal, but the rest are magic attributes\n\t\t\t// that need censored to not screw up rendering.\n\t\t\tattrs.selector = attrs.options = attrs.key = attrs.oninit =\n\t\t\tattrs.oncreate = attrs.onbeforeupdate = attrs.onupdate =\n\t\t\tattrs.onbeforeremove = attrs.onremove = null\n\n\t\t\t// Do this now so we can get the most current `href` and `disabled`.\n\t\t\t// Those attributes may also be specified in the selector, and we\n\t\t\t// should honor that.\n\t\t\tvar child = m(vnode.attrs.selector || \"a\", attrs, vnode.children)\n\n\t\t\t// Let's provide a *right* way to disable a route link, rather than\n\t\t\t// letting people screw up accessibility on accident.\n\t\t\t//\n\t\t\t// The attribute is coerced so users don't get surprised over\n\t\t\t// `disabled: 0` resulting in a button that's somehow routable\n\t\t\t// despite being visibly disabled.\n\t\t\tif (child.attrs.disabled = Boolean(child.attrs.disabled)) {\n\t\t\t\tchild.attrs.href = null\n\t\t\t\tchild.attrs[\"aria-disabled\"] = \"true\"\n\t\t\t\t// If you *really* do want to do this on a disabled link, use\n\t\t\t\t// an `oncreate` hook to add it.\n\t\t\t\tchild.attrs.onclick = null\n\t\t\t} else {\n\t\t\t\tonclick = child.attrs.onclick\n\t\t\t\thref = child.attrs.href\n\t\t\t\tchild.attrs.href = route.prefix + href\n\t\t\t\tchild.attrs.onclick = function(e) {\n\t\t\t\t\tvar result\n\t\t\t\t\tif (typeof onclick === \"function\") {\n\t\t\t\t\t\tresult = onclick.call(e.currentTarget, e)\n\t\t\t\t\t} else if (onclick == null || typeof onclick !== \"object\") {\n\t\t\t\t\t\t// do nothing\n\t\t\t\t\t} else if (typeof onclick.handleEvent === \"function\") {\n\t\t\t\t\t\tonclick.handleEvent(e)\n\t\t\t\t\t}\n\n\t\t\t\t\t// Adapted from React Router's implementation:\n\t\t\t\t\t// https://github.com/ReactTraining/react-router/blob/520a0acd48ae1b066eb0b07d6d4d1790a1d02482/packages/react-router-dom/modules/Link.js\n\t\t\t\t\t//\n\t\t\t\t\t// Try to be flexible and intuitive in how we handle links.\n\t\t\t\t\t// Fun fact: links aren't as obvious to get right as you\n\t\t\t\t\t// would expect. There's a lot more valid ways to click a\n\t\t\t\t\t// link than this, and one might want to not simply click a\n\t\t\t\t\t// link, but right click or command-click it to copy the\n\t\t\t\t\t// link target, etc. Nope, this isn't just for blind people.\n\t\t\t\t\tif (\n\t\t\t\t\t\t// Skip if `onclick` prevented default\n\t\t\t\t\t\tresult !== false && !e.defaultPrevented &&\n\t\t\t\t\t\t// Ignore everything but left clicks\n\t\t\t\t\t\t(e.button === 0 || e.which === 0 || e.which === 1) &&\n\t\t\t\t\t\t// Let the browser handle `target=_blank`, etc.\n\t\t\t\t\t\t(!e.currentTarget.target || e.currentTarget.target === \"_self\") &&\n\t\t\t\t\t\t// No modifier keys\n\t\t\t\t\t\t!e.ctrlKey && !e.metaKey && !e.shiftKey && !e.altKey\n\t\t\t\t\t) {\n\t\t\t\t\t\te.preventDefault()\n\t\t\t\t\t\te.redraw = false\n\t\t\t\t\t\troute.set(href, null, options)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn child\n\t\t},\n\t}\n\troute.param = function(key) {\n\t\treturn attrs && key != null ? attrs[key] : attrs\n\t}\n\n\treturn route\n}\n","\"use strict\"\n\nvar parsePathname = require(\"./parse\")\n\n// Compiles a template into a function that takes a resolved path (without query\n// strings) and returns an object containing the template parameters with their\n// parsed values. This expects the input of the compiled template to be the\n// output of `parsePathname`. Note that it does *not* remove query parameters\n// specified in the template.\nmodule.exports = function(template) {\n\tvar templateData = parsePathname(template)\n\tvar templateKeys = Object.keys(templateData.params)\n\tvar keys = []\n\tvar regexp = new RegExp(\"^\" + templateData.path.replace(\n\t\t// I escape literal text so people can use things like `:file.:ext` or\n\t\t// `:lang-:locale` in routes. This is all merged into one pass so I\n\t\t// don't also accidentally escape `-` and make it harder to detect it to\n\t\t// ban it from template parameters.\n\t\t/:([^\\/.-]+)(\\.{3}|\\.(?!\\.)|-)?|[\\\\^$*+.()|\\[\\]{}]/g,\n\t\tfunction(m, key, extra) {\n\t\t\tif (key == null) return \"\\\\\" + m\n\t\t\tkeys.push({k: key, r: extra === \"...\"})\n\t\t\tif (extra === \"...\") return \"(.*)\"\n\t\t\tif (extra === \".\") return \"([^/]+)\\\\.\"\n\t\t\treturn \"([^/]+)\" + (extra || \"\")\n\t\t}\n\t) + \"$\")\n\treturn function(data) {\n\t\t// First, check the params. Usually, there isn't any, and it's just\n\t\t// checking a static set.\n\t\tfor (var i = 0; i < templateKeys.length; i++) {\n\t\t\tif (templateData.params[templateKeys[i]] !== data.params[templateKeys[i]]) return false\n\t\t}\n\t\t// If no interpolations exist, let's skip all the ceremony\n\t\tif (!keys.length) return regexp.test(data.path)\n\t\tvar values = regexp.exec(data.path)\n\t\tif (values == null) return false\n\t\tfor (var i = 0; i < keys.length; i++) {\n\t\t\tdata.params[keys[i].k] = keys[i].r ? values[i + 1] : decodeURIComponent(values[i + 1])\n\t\t}\n\t\treturn true\n\t}\n}\n","if(!global[\"m\"]) global[\"m\"] = {};\nmodule.exports = global[\"m\"][\"bidi\"] = require(\"-!E:\\\\sites\\\\flarum-new\\\\packages\\\\flarum-core\\\\js\\\\node_modules\\\\babel-loader\\\\lib\\\\index.js??ref--5!E:\\\\sites\\\\flarum-new\\\\packages\\\\flarum-core\\\\js\\\\node_modules\\\\source-map-loader\\\\index.js!.\\\\bidi.js\");","( function _package( factory ){\r\n\tif( typeof define === 'function' && define.amd ){\r\n\t\tdefine( [ 'mithril' ], factory )\r\n\t}\r\n\telse if( typeof exports === 'object' ){\r\n\t\tmodule.exports = factory( require( 'mithril' ) )\r\n\t}\r\n\telse{\r\n\t\tfactory( m )\r\n\t}\r\n}( function define( m ){\r\n\tfunction bidi( node, prop ){\r\n\t\tvar type = node.tag === 'select'\r\n\t\t\t? node.attrs.multi\r\n\t\t\t\t? 'multi'\r\n\t\t\t\t: 'select'\r\n\t\t\t: node.attrs.type\r\n\r\n\t\t// Setup: bind listeners\r\n\t\tif( type === 'multi' ){\r\n\t\t\tnode.attrs.onchange = function(){\r\n\t\t\t\tprop( [].slice.call( this.selectedOptions, function( x ){\r\n\t\t\t\t\treturn x.value\r\n\t\t\t\t} ) )\r\n\t\t\t}\r\n\t\t}\r\n\t\telse if( type === 'select' ){\r\n\t\t\tnode.attrs.onchange = function( e ){\r\n\t\t\t\tprop( this.selectedOptions[ 0 ].value )\r\n\t\t\t}\r\n\t\t}\r\n\t\telse if( type === 'checkbox' ){\r\n\t\t\tnode.attrs.onchange = function( e ){\r\n\t\t\t\tprop( this.checked )\r\n\t\t\t}\r\n\t\t}\r\n\t\telse {\r\n\t\t\tnode.attrs.onchange = node.attrs.oninput = function( e ){\r\n\t\t\t\tprop( this.value )\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif( node.tag === 'select' ){\r\n\t\t\tnode.children.forEach( function( option ){\r\n\t\t\t\tif( option.attrs.value === prop() || option.children[ 0 ] === prop() ){\r\n\t\t\t\t\toption.attrs.selected = true\r\n\t\t\t\t}\r\n\t\t\t} )\r\n\t\t}\r\n\t\telse if( type === 'checkbox' ){\r\n\t\t\tnode.attrs.checked = prop()\r\n\t\t}\r\n\t\telse if( type === 'radio' ){\r\n\t\t\tnode.attrs.checked = prop() === node.attrs.value\r\n\t\t}\r\n\t\telse {\r\n\t\t\tnode.attrs.value = prop()\r\n\t\t}\r\n\r\n\t\treturn node\r\n\t}\r\n\r\n\tbidi.view = function( ctrl, node, prop ){\r\n\t return bidi( node, node.attrs.bidi )\r\n\t}\r\n\r\n\tif( m.attrs ) m.attrs.bidi = bidi\r\n\t\r\n\tm.bidi = bidi\r\n\r\n\treturn bidi\r\n} ) )\r\n","module.exports = global[\"Mousetrap\"] = require(\"-!E:\\\\sites\\\\flarum-new\\\\packages\\\\flarum-core\\\\js\\\\node_modules\\\\babel-loader\\\\lib\\\\index.js??ref--5!E:\\\\sites\\\\flarum-new\\\\packages\\\\flarum-core\\\\js\\\\node_modules\\\\source-map-loader\\\\index.js!.\\\\mousetrap.js\");","/*global define:false */\n/**\n * Copyright 2012-2017 Craig Campbell\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * Mousetrap is a simple keyboard shortcut library for Javascript with\n * no external dependencies\n *\n * @version 1.6.5\n * @url craig.is/killing/mice\n */\n(function(window, document, undefined) {\n\n // Check if mousetrap is used inside browser, if not, return\n if (!window) {\n return;\n }\n\n /**\n * mapping of special keycodes to their corresponding keys\n *\n * everything in this dictionary cannot use keypress events\n * so it has to be here to map to the correct keycodes for\n * keyup/keydown events\n *\n * @type {Object}\n */\n var _MAP = {\n 8: 'backspace',\n 9: 'tab',\n 13: 'enter',\n 16: 'shift',\n 17: 'ctrl',\n 18: 'alt',\n 20: 'capslock',\n 27: 'esc',\n 32: 'space',\n 33: 'pageup',\n 34: 'pagedown',\n 35: 'end',\n 36: 'home',\n 37: 'left',\n 38: 'up',\n 39: 'right',\n 40: 'down',\n 45: 'ins',\n 46: 'del',\n 91: 'meta',\n 93: 'meta',\n 224: 'meta'\n };\n\n /**\n * mapping for special characters so they can support\n *\n * this dictionary is only used incase you want to bind a\n * keyup or keydown event to one of these keys\n *\n * @type {Object}\n */\n var _KEYCODE_MAP = {\n 106: '*',\n 107: '+',\n 109: '-',\n 110: '.',\n 111 : '/',\n 186: ';',\n 187: '=',\n 188: ',',\n 189: '-',\n 190: '.',\n 191: '/',\n 192: '`',\n 219: '[',\n 220: '\\\\',\n 221: ']',\n 222: '\\''\n };\n\n /**\n * this is a mapping of keys that require shift on a US keypad\n * back to the non shift equivelents\n *\n * this is so you can use keyup events with these keys\n *\n * note that this will only work reliably on US keyboards\n *\n * @type {Object}\n */\n var _SHIFT_MAP = {\n '~': '`',\n '!': '1',\n '@': '2',\n '#': '3',\n '$': '4',\n '%': '5',\n '^': '6',\n '&': '7',\n '*': '8',\n '(': '9',\n ')': '0',\n '_': '-',\n '+': '=',\n ':': ';',\n '\\\"': '\\'',\n '<': ',',\n '>': '.',\n '?': '/',\n '|': '\\\\'\n };\n\n /**\n * this is a list of special strings you can use to map\n * to modifier keys when you specify your keyboard shortcuts\n *\n * @type {Object}\n */\n var _SPECIAL_ALIASES = {\n 'option': 'alt',\n 'command': 'meta',\n 'return': 'enter',\n 'escape': 'esc',\n 'plus': '+',\n 'mod': /Mac|iPod|iPhone|iPad/.test(navigator.platform) ? 'meta' : 'ctrl'\n };\n\n /**\n * variable to store the flipped version of _MAP from above\n * needed to check if we should use keypress or not when no action\n * is specified\n *\n * @type {Object|undefined}\n */\n var _REVERSE_MAP;\n\n /**\n * loop through the f keys, f1 to f19 and add them to the map\n * programatically\n */\n for (var i = 1; i < 20; ++i) {\n _MAP[111 + i] = 'f' + i;\n }\n\n /**\n * loop through to map numbers on the numeric keypad\n */\n for (i = 0; i <= 9; ++i) {\n\n // This needs to use a string cause otherwise since 0 is falsey\n // mousetrap will never fire for numpad 0 pressed as part of a keydown\n // event.\n //\n // @see https://github.com/ccampbell/mousetrap/pull/258\n _MAP[i + 96] = i.toString();\n }\n\n /**\n * cross browser add event method\n *\n * @param {Element|HTMLDocument} object\n * @param {string} type\n * @param {Function} callback\n * @returns void\n */\n function _addEvent(object, type, callback) {\n if (object.addEventListener) {\n object.addEventListener(type, callback, false);\n return;\n }\n\n object.attachEvent('on' + type, callback);\n }\n\n /**\n * takes the event and returns the key character\n *\n * @param {Event} e\n * @return {string}\n */\n function _characterFromEvent(e) {\n\n // for keypress events we should return the character as is\n if (e.type == 'keypress') {\n var character = String.fromCharCode(e.which);\n\n // if the shift key is not pressed then it is safe to assume\n // that we want the character to be lowercase. this means if\n // you accidentally have caps lock on then your key bindings\n // will continue to work\n //\n // the only side effect that might not be desired is if you\n // bind something like 'A' cause you want to trigger an\n // event when capital A is pressed caps lock will no longer\n // trigger the event. shift+a will though.\n if (!e.shiftKey) {\n character = character.toLowerCase();\n }\n\n return character;\n }\n\n // for non keypress events the special maps are needed\n if (_MAP[e.which]) {\n return _MAP[e.which];\n }\n\n if (_KEYCODE_MAP[e.which]) {\n return _KEYCODE_MAP[e.which];\n }\n\n // if it is not in the special map\n\n // with keydown and keyup events the character seems to always\n // come in as an uppercase character whether you are pressing shift\n // or not. we should make sure it is always lowercase for comparisons\n return String.fromCharCode(e.which).toLowerCase();\n }\n\n /**\n * checks if two arrays are equal\n *\n * @param {Array} modifiers1\n * @param {Array} modifiers2\n * @returns {boolean}\n */\n function _modifiersMatch(modifiers1, modifiers2) {\n return modifiers1.sort().join(',') === modifiers2.sort().join(',');\n }\n\n /**\n * takes a key event and figures out what the modifiers are\n *\n * @param {Event} e\n * @returns {Array}\n */\n function _eventModifiers(e) {\n var modifiers = [];\n\n if (e.shiftKey) {\n modifiers.push('shift');\n }\n\n if (e.altKey) {\n modifiers.push('alt');\n }\n\n if (e.ctrlKey) {\n modifiers.push('ctrl');\n }\n\n if (e.metaKey) {\n modifiers.push('meta');\n }\n\n return modifiers;\n }\n\n /**\n * prevents default for this event\n *\n * @param {Event} e\n * @returns void\n */\n function _preventDefault(e) {\n if (e.preventDefault) {\n e.preventDefault();\n return;\n }\n\n e.returnValue = false;\n }\n\n /**\n * stops propogation for this event\n *\n * @param {Event} e\n * @returns void\n */\n function _stopPropagation(e) {\n if (e.stopPropagation) {\n e.stopPropagation();\n return;\n }\n\n e.cancelBubble = true;\n }\n\n /**\n * determines if the keycode specified is a modifier key or not\n *\n * @param {string} key\n * @returns {boolean}\n */\n function _isModifier(key) {\n return key == 'shift' || key == 'ctrl' || key == 'alt' || key == 'meta';\n }\n\n /**\n * reverses the map lookup so that we can look for specific keys\n * to see what can and can't use keypress\n *\n * @return {Object}\n */\n function _getReverseMap() {\n if (!_REVERSE_MAP) {\n _REVERSE_MAP = {};\n for (var key in _MAP) {\n\n // pull out the numeric keypad from here cause keypress should\n // be able to detect the keys from the character\n if (key > 95 && key < 112) {\n continue;\n }\n\n if (_MAP.hasOwnProperty(key)) {\n _REVERSE_MAP[_MAP[key]] = key;\n }\n }\n }\n return _REVERSE_MAP;\n }\n\n /**\n * picks the best action based on the key combination\n *\n * @param {string} key - character for key\n * @param {Array} modifiers\n * @param {string=} action passed in\n */\n function _pickBestAction(key, modifiers, action) {\n\n // if no action was picked in we should try to pick the one\n // that we think would work best for this key\n if (!action) {\n action = _getReverseMap()[key] ? 'keydown' : 'keypress';\n }\n\n // modifier keys don't work as expected with keypress,\n // switch to keydown\n if (action == 'keypress' && modifiers.length) {\n action = 'keydown';\n }\n\n return action;\n }\n\n /**\n * Converts from a string key combination to an array\n *\n * @param {string} combination like \"command+shift+l\"\n * @return {Array}\n */\n function _keysFromString(combination) {\n if (combination === '+') {\n return ['+'];\n }\n\n combination = combination.replace(/\\+{2}/g, '+plus');\n return combination.split('+');\n }\n\n /**\n * Gets info for a specific key combination\n *\n * @param {string} combination key combination (\"command+s\" or \"a\" or \"*\")\n * @param {string=} action\n * @returns {Object}\n */\n function _getKeyInfo(combination, action) {\n var keys;\n var key;\n var i;\n var modifiers = [];\n\n // take the keys from this pattern and figure out what the actual\n // pattern is all about\n keys = _keysFromString(combination);\n\n for (i = 0; i < keys.length; ++i) {\n key = keys[i];\n\n // normalize key names\n if (_SPECIAL_ALIASES[key]) {\n key = _SPECIAL_ALIASES[key];\n }\n\n // if this is not a keypress event then we should\n // be smart about using shift keys\n // this will only work for US keyboards however\n if (action && action != 'keypress' && _SHIFT_MAP[key]) {\n key = _SHIFT_MAP[key];\n modifiers.push('shift');\n }\n\n // if this key is a modifier then add it to the list of modifiers\n if (_isModifier(key)) {\n modifiers.push(key);\n }\n }\n\n // depending on what the key combination is\n // we will try to pick the best event for it\n action = _pickBestAction(key, modifiers, action);\n\n return {\n key: key,\n modifiers: modifiers,\n action: action\n };\n }\n\n function _belongsTo(element, ancestor) {\n if (element === null || element === document) {\n return false;\n }\n\n if (element === ancestor) {\n return true;\n }\n\n return _belongsTo(element.parentNode, ancestor);\n }\n\n function Mousetrap(targetElement) {\n var self = this;\n\n targetElement = targetElement || document;\n\n if (!(self instanceof Mousetrap)) {\n return new Mousetrap(targetElement);\n }\n\n /**\n * element to attach key events to\n *\n * @type {Element}\n */\n self.target = targetElement;\n\n /**\n * a list of all the callbacks setup via Mousetrap.bind()\n *\n * @type {Object}\n */\n self._callbacks = {};\n\n /**\n * direct map of string combinations to callbacks used for trigger()\n *\n * @type {Object}\n */\n self._directMap = {};\n\n /**\n * keeps track of what level each sequence is at since multiple\n * sequences can start out with the same sequence\n *\n * @type {Object}\n */\n var _sequenceLevels = {};\n\n /**\n * variable to store the setTimeout call\n *\n * @type {null|number}\n */\n var _resetTimer;\n\n /**\n * temporary state where we will ignore the next keyup\n *\n * @type {boolean|string}\n */\n var _ignoreNextKeyup = false;\n\n /**\n * temporary state where we will ignore the next keypress\n *\n * @type {boolean}\n */\n var _ignoreNextKeypress = false;\n\n /**\n * are we currently inside of a sequence?\n * type of action (\"keyup\" or \"keydown\" or \"keypress\") or false\n *\n * @type {boolean|string}\n */\n var _nextExpectedAction = false;\n\n /**\n * resets all sequence counters except for the ones passed in\n *\n * @param {Object} doNotReset\n * @returns void\n */\n function _resetSequences(doNotReset) {\n doNotReset = doNotReset || {};\n\n var activeSequences = false,\n key;\n\n for (key in _sequenceLevels) {\n if (doNotReset[key]) {\n activeSequences = true;\n continue;\n }\n _sequenceLevels[key] = 0;\n }\n\n if (!activeSequences) {\n _nextExpectedAction = false;\n }\n }\n\n /**\n * finds all callbacks that match based on the keycode, modifiers,\n * and action\n *\n * @param {string} character\n * @param {Array} modifiers\n * @param {Event|Object} e\n * @param {string=} sequenceName - name of the sequence we are looking for\n * @param {string=} combination\n * @param {number=} level\n * @returns {Array}\n */\n function _getMatches(character, modifiers, e, sequenceName, combination, level) {\n var i;\n var callback;\n var matches = [];\n var action = e.type;\n\n // if there are no events related to this keycode\n if (!self._callbacks[character]) {\n return [];\n }\n\n // if a modifier key is coming up on its own we should allow it\n if (action == 'keyup' && _isModifier(character)) {\n modifiers = [character];\n }\n\n // loop through all callbacks for the key that was pressed\n // and see if any of them match\n for (i = 0; i < self._callbacks[character].length; ++i) {\n callback = self._callbacks[character][i];\n\n // if a sequence name is not specified, but this is a sequence at\n // the wrong level then move onto the next match\n if (!sequenceName && callback.seq && _sequenceLevels[callback.seq] != callback.level) {\n continue;\n }\n\n // if the action we are looking for doesn't match the action we got\n // then we should keep going\n if (action != callback.action) {\n continue;\n }\n\n // if this is a keypress event and the meta key and control key\n // are not pressed that means that we need to only look at the\n // character, otherwise check the modifiers as well\n //\n // chrome will not fire a keypress if meta or control is down\n // safari will fire a keypress if meta or meta+shift is down\n // firefox will fire a keypress if meta or control is down\n if ((action == 'keypress' && !e.metaKey && !e.ctrlKey) || _modifiersMatch(modifiers, callback.modifiers)) {\n\n // when you bind a combination or sequence a second time it\n // should overwrite the first one. if a sequenceName or\n // combination is specified in this call it does just that\n //\n // @todo make deleting its own method?\n var deleteCombo = !sequenceName && callback.combo == combination;\n var deleteSequence = sequenceName && callback.seq == sequenceName && callback.level == level;\n if (deleteCombo || deleteSequence) {\n self._callbacks[character].splice(i, 1);\n }\n\n matches.push(callback);\n }\n }\n\n return matches;\n }\n\n /**\n * actually calls the callback function\n *\n * if your callback function returns false this will use the jquery\n * convention - prevent default and stop propogation on the event\n *\n * @param {Function} callback\n * @param {Event} e\n * @returns void\n */\n function _fireCallback(callback, e, combo, sequence) {\n\n // if this event should not happen stop here\n if (self.stopCallback(e, e.target || e.srcElement, combo, sequence)) {\n return;\n }\n\n if (callback(e, combo) === false) {\n _preventDefault(e);\n _stopPropagation(e);\n }\n }\n\n /**\n * handles a character key event\n *\n * @param {string} character\n * @param {Array} modifiers\n * @param {Event} e\n * @returns void\n */\n self._handleKey = function(character, modifiers, e) {\n var callbacks = _getMatches(character, modifiers, e);\n var i;\n var doNotReset = {};\n var maxLevel = 0;\n var processedSequenceCallback = false;\n\n // Calculate the maxLevel for sequences so we can only execute the longest callback sequence\n for (i = 0; i < callbacks.length; ++i) {\n if (callbacks[i].seq) {\n maxLevel = Math.max(maxLevel, callbacks[i].level);\n }\n }\n\n // loop through matching callbacks for this key event\n for (i = 0; i < callbacks.length; ++i) {\n\n // fire for all sequence callbacks\n // this is because if for example you have multiple sequences\n // bound such as \"g i\" and \"g t\" they both need to fire the\n // callback for matching g cause otherwise you can only ever\n // match the first one\n if (callbacks[i].seq) {\n\n // only fire callbacks for the maxLevel to prevent\n // subsequences from also firing\n //\n // for example 'a option b' should not cause 'option b' to fire\n // even though 'option b' is part of the other sequence\n //\n // any sequences that do not match here will be discarded\n // below by the _resetSequences call\n if (callbacks[i].level != maxLevel) {\n continue;\n }\n\n processedSequenceCallback = true;\n\n // keep a list of which sequences were matches for later\n doNotReset[callbacks[i].seq] = 1;\n _fireCallback(callbacks[i].callback, e, callbacks[i].combo, callbacks[i].seq);\n continue;\n }\n\n // if there were no sequence matches but we are still here\n // that means this is a regular match so we should fire that\n if (!processedSequenceCallback) {\n _fireCallback(callbacks[i].callback, e, callbacks[i].combo);\n }\n }\n\n // if the key you pressed matches the type of sequence without\n // being a modifier (ie \"keyup\" or \"keypress\") then we should\n // reset all sequences that were not matched by this event\n //\n // this is so, for example, if you have the sequence \"h a t\" and you\n // type \"h e a r t\" it does not match. in this case the \"e\" will\n // cause the sequence to reset\n //\n // modifier keys are ignored because you can have a sequence\n // that contains modifiers such as \"enter ctrl+space\" and in most\n // cases the modifier key will be pressed before the next key\n //\n // also if you have a sequence such as \"ctrl+b a\" then pressing the\n // \"b\" key will trigger a \"keypress\" and a \"keydown\"\n //\n // the \"keydown\" is expected when there is a modifier, but the\n // \"keypress\" ends up matching the _nextExpectedAction since it occurs\n // after and that causes the sequence to reset\n //\n // we ignore keypresses in a sequence that directly follow a keydown\n // for the same character\n var ignoreThisKeypress = e.type == 'keypress' && _ignoreNextKeypress;\n if (e.type == _nextExpectedAction && !_isModifier(character) && !ignoreThisKeypress) {\n _resetSequences(doNotReset);\n }\n\n _ignoreNextKeypress = processedSequenceCallback && e.type == 'keydown';\n };\n\n /**\n * handles a keydown event\n *\n * @param {Event} e\n * @returns void\n */\n function _handleKeyEvent(e) {\n\n // normalize e.which for key events\n // @see http://stackoverflow.com/questions/4285627/javascript-keycode-vs-charcode-utter-confusion\n if (typeof e.which !== 'number') {\n e.which = e.keyCode;\n }\n\n var character = _characterFromEvent(e);\n\n // no character found then stop\n if (!character) {\n return;\n }\n\n // need to use === for the character check because the character can be 0\n if (e.type == 'keyup' && _ignoreNextKeyup === character) {\n _ignoreNextKeyup = false;\n return;\n }\n\n self.handleKey(character, _eventModifiers(e), e);\n }\n\n /**\n * called to set a 1 second timeout on the specified sequence\n *\n * this is so after each key press in the sequence you have 1 second\n * to press the next key before you have to start over\n *\n * @returns void\n */\n function _resetSequenceTimer() {\n clearTimeout(_resetTimer);\n _resetTimer = setTimeout(_resetSequences, 1000);\n }\n\n /**\n * binds a key sequence to an event\n *\n * @param {string} combo - combo specified in bind call\n * @param {Array} keys\n * @param {Function} callback\n * @param {string=} action\n * @returns void\n */\n function _bindSequence(combo, keys, callback, action) {\n\n // start off by adding a sequence level record for this combination\n // and setting the level to 0\n _sequenceLevels[combo] = 0;\n\n /**\n * callback to increase the sequence level for this sequence and reset\n * all other sequences that were active\n *\n * @param {string} nextAction\n * @returns {Function}\n */\n function _increaseSequence(nextAction) {\n return function() {\n _nextExpectedAction = nextAction;\n ++_sequenceLevels[combo];\n _resetSequenceTimer();\n };\n }\n\n /**\n * wraps the specified callback inside of another function in order\n * to reset all sequence counters as soon as this sequence is done\n *\n * @param {Event} e\n * @returns void\n */\n function _callbackAndReset(e) {\n _fireCallback(callback, e, combo);\n\n // we should ignore the next key up if the action is key down\n // or keypress. this is so if you finish a sequence and\n // release the key the final key will not trigger a keyup\n if (action !== 'keyup') {\n _ignoreNextKeyup = _characterFromEvent(e);\n }\n\n // weird race condition if a sequence ends with the key\n // another sequence begins with\n setTimeout(_resetSequences, 10);\n }\n\n // loop through keys one at a time and bind the appropriate callback\n // function. for any key leading up to the final one it should\n // increase the sequence. after the final, it should reset all sequences\n //\n // if an action is specified in the original bind call then that will\n // be used throughout. otherwise we will pass the action that the\n // next key in the sequence should match. this allows a sequence\n // to mix and match keypress and keydown events depending on which\n // ones are better suited to the key provided\n for (var i = 0; i < keys.length; ++i) {\n var isFinal = i + 1 === keys.length;\n var wrappedCallback = isFinal ? _callbackAndReset : _increaseSequence(action || _getKeyInfo(keys[i + 1]).action);\n _bindSingle(keys[i], wrappedCallback, action, combo, i);\n }\n }\n\n /**\n * binds a single keyboard combination\n *\n * @param {string} combination\n * @param {Function} callback\n * @param {string=} action\n * @param {string=} sequenceName - name of sequence if part of sequence\n * @param {number=} level - what part of the sequence the command is\n * @returns void\n */\n function _bindSingle(combination, callback, action, sequenceName, level) {\n\n // store a direct mapped reference for use with Mousetrap.trigger\n self._directMap[combination + ':' + action] = callback;\n\n // make sure multiple spaces in a row become a single space\n combination = combination.replace(/\\s+/g, ' ');\n\n var sequence = combination.split(' ');\n var info;\n\n // if this pattern is a sequence of keys then run through this method\n // to reprocess each pattern one key at a time\n if (sequence.length > 1) {\n _bindSequence(combination, sequence, callback, action);\n return;\n }\n\n info = _getKeyInfo(combination, action);\n\n // make sure to initialize array if this is the first time\n // a callback is added for this key\n self._callbacks[info.key] = self._callbacks[info.key] || [];\n\n // remove an existing match if there is one\n _getMatches(info.key, info.modifiers, {type: info.action}, sequenceName, combination, level);\n\n // add this call back to the array\n // if it is a sequence put it at the beginning\n // if not put it at the end\n //\n // this is important because the way these are processed expects\n // the sequence ones to come first\n self._callbacks[info.key][sequenceName ? 'unshift' : 'push']({\n callback: callback,\n modifiers: info.modifiers,\n action: info.action,\n seq: sequenceName,\n level: level,\n combo: combination\n });\n }\n\n /**\n * binds multiple combinations to the same callback\n *\n * @param {Array} combinations\n * @param {Function} callback\n * @param {string|undefined} action\n * @returns void\n */\n self._bindMultiple = function(combinations, callback, action) {\n for (var i = 0; i < combinations.length; ++i) {\n _bindSingle(combinations[i], callback, action);\n }\n };\n\n // start!\n _addEvent(targetElement, 'keypress', _handleKeyEvent);\n _addEvent(targetElement, 'keydown', _handleKeyEvent);\n _addEvent(targetElement, 'keyup', _handleKeyEvent);\n }\n\n /**\n * binds an event to mousetrap\n *\n * can be a single key, a combination of keys separated with +,\n * an array of keys, or a sequence of keys separated by spaces\n *\n * be sure to list the modifier keys first to make sure that the\n * correct key ends up getting bound (the last key in the pattern)\n *\n * @param {string|Array} keys\n * @param {Function} callback\n * @param {string=} action - 'keypress', 'keydown', or 'keyup'\n * @returns void\n */\n Mousetrap.prototype.bind = function(keys, callback, action) {\n var self = this;\n keys = keys instanceof Array ? keys : [keys];\n self._bindMultiple.call(self, keys, callback, action);\n return self;\n };\n\n /**\n * unbinds an event to mousetrap\n *\n * the unbinding sets the callback function of the specified key combo\n * to an empty function and deletes the corresponding key in the\n * _directMap dict.\n *\n * TODO: actually remove this from the _callbacks dictionary instead\n * of binding an empty function\n *\n * the keycombo+action has to be exactly the same as\n * it was defined in the bind method\n *\n * @param {string|Array} keys\n * @param {string} action\n * @returns void\n */\n Mousetrap.prototype.unbind = function(keys, action) {\n var self = this;\n return self.bind.call(self, keys, function() {}, action);\n };\n\n /**\n * triggers an event that has already been bound\n *\n * @param {string} keys\n * @param {string=} action\n * @returns void\n */\n Mousetrap.prototype.trigger = function(keys, action) {\n var self = this;\n if (self._directMap[keys + ':' + action]) {\n self._directMap[keys + ':' + action]({}, keys);\n }\n return self;\n };\n\n /**\n * resets the library back to its initial state. this is useful\n * if you want to clear out the current keyboard shortcuts and bind\n * new ones - for example if you switch to another page\n *\n * @returns void\n */\n Mousetrap.prototype.reset = function() {\n var self = this;\n self._callbacks = {};\n self._directMap = {};\n return self;\n };\n\n /**\n * should we stop this event before firing off callbacks\n *\n * @param {Event} e\n * @param {Element} element\n * @return {boolean}\n */\n Mousetrap.prototype.stopCallback = function(e, element) {\n var self = this;\n\n // if the element has the class \"mousetrap\" then no need to stop\n if ((' ' + element.className + ' ').indexOf(' mousetrap ') > -1) {\n return false;\n }\n\n if (_belongsTo(element, self.target)) {\n return false;\n }\n\n // Events originating from a shadow DOM are re-targetted and `e.target` is the shadow host,\n // not the initial event target in the shadow tree. Note that not all events cross the\n // shadow boundary.\n // For shadow trees with `mode: 'open'`, the initial event target is the first element in\n // the event’s composed path. For shadow trees with `mode: 'closed'`, the initial event\n // target cannot be obtained.\n if ('composedPath' in e && typeof e.composedPath === 'function') {\n // For open shadow trees, update `element` so that the following check works.\n var initialEventTarget = e.composedPath()[0];\n if (initialEventTarget !== e.target) {\n element = initialEventTarget;\n }\n }\n\n // stop for input, select, and textarea\n return element.tagName == 'INPUT' || element.tagName == 'SELECT' || element.tagName == 'TEXTAREA' || element.isContentEditable;\n };\n\n /**\n * exposes _handleKey publicly so it can be overwritten by extensions\n */\n Mousetrap.prototype.handleKey = function() {\n var self = this;\n return self._handleKey.apply(self, arguments);\n };\n\n /**\n * allow custom key mappings\n */\n Mousetrap.addKeycodes = function(object) {\n for (var key in object) {\n if (object.hasOwnProperty(key)) {\n _MAP[key] = object[key];\n }\n }\n _REVERSE_MAP = null;\n };\n\n /**\n * Init the global mousetrap functions\n *\n * This method is needed to allow the global mousetrap functions to work\n * now that mousetrap is a constructor function.\n */\n Mousetrap.init = function() {\n var documentMousetrap = Mousetrap(document);\n for (var method in documentMousetrap) {\n if (method.charAt(0) !== '_') {\n Mousetrap[method] = (function(method) {\n return function() {\n return documentMousetrap[method].apply(documentMousetrap, arguments);\n };\n } (method));\n }\n }\n };\n\n Mousetrap.init();\n\n // expose mousetrap to the global object\n window.Mousetrap = Mousetrap;\n\n // expose as a common js module\n if (typeof module !== 'undefined' && module.exports) {\n module.exports = Mousetrap;\n }\n\n // expose mousetrap as an AMD module\n if (typeof define === 'function' && define.amd) {\n define(function() {\n return Mousetrap;\n });\n }\n}) (typeof window !== 'undefined' ? window : null, typeof window !== 'undefined' ? document : null);\n","module.exports = global[\"classNames\"] = require(\"-!E:\\\\sites\\\\flarum-new\\\\packages\\\\flarum-core\\\\js\\\\node_modules\\\\babel-loader\\\\lib\\\\index.js??ref--5!E:\\\\sites\\\\flarum-new\\\\packages\\\\flarum-core\\\\js\\\\node_modules\\\\source-map-loader\\\\index.js!.\\\\index.js\");","/*!\n Copyright (c) 2017 Jed Watson.\n Licensed under the MIT License (MIT), see\n http://jedwatson.github.io/classnames\n*/\n/* global define */\n\n(function () {\n\t'use strict';\n\n\tvar hasOwn = {}.hasOwnProperty;\n\n\tfunction classNames () {\n\t\tvar classes = [];\n\n\t\tfor (var i = 0; i < arguments.length; i++) {\n\t\t\tvar arg = arguments[i];\n\t\t\tif (!arg) continue;\n\n\t\t\tvar argType = typeof arg;\n\n\t\t\tif (argType === 'string' || argType === 'number') {\n\t\t\t\tclasses.push(arg);\n\t\t\t} else if (Array.isArray(arg) && arg.length) {\n\t\t\t\tvar inner = classNames.apply(null, arg);\n\t\t\t\tif (inner) {\n\t\t\t\t\tclasses.push(inner);\n\t\t\t\t}\n\t\t\t} else if (argType === 'object') {\n\t\t\t\tfor (var key in arg) {\n\t\t\t\t\tif (hasOwn.call(arg, key) && arg[key]) {\n\t\t\t\t\t\tclasses.push(key);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn classes.join(' ');\n\t}\n\n\tif (typeof module !== 'undefined' && module.exports) {\n\t\tclassNames.default = classNames;\n\t\tmodule.exports = classNames;\n\t} else if (typeof define === 'function' && typeof define.amd === 'object' && define.amd) {\n\t\t// register as 'classnames', consistent with npm package name\n\t\tdefine('classnames', [], function () {\n\t\t\treturn classNames;\n\t\t});\n\t} else {\n\t\twindow.classNames = classNames;\n\t}\n}());\n","// Zepto.js\n// (c) 2010-2016 Thomas Fuchs\n// Zepto.js may be freely distributed under the MIT license.\n\n;(function($){\n var zepto = $.zepto, oldQsa = zepto.qsa, oldMatches = zepto.matches\n\n function visible(elem){\n elem = $(elem)\n return !!(elem.width() || elem.height()) && elem.css(\"display\") !== \"none\"\n }\n\n // Implements a subset from:\n // http://api.jquery.com/category/selectors/jquery-selector-extensions/\n //\n // Each filter function receives the current index, all nodes in the\n // considered set, and a value if there were parentheses. The value\n // of `this` is the node currently being considered. The function returns the\n // resulting node(s), null, or undefined.\n //\n // Complex selectors are not supported:\n // li:has(label:contains(\"foo\")) + li:has(label:contains(\"bar\"))\n // ul.inner:first > li\n var filters = $.expr[':'] = {\n visible: function(){ if (visible(this)) return this },\n hidden: function(){ if (!visible(this)) return this },\n selected: function(){ if (this.selected) return this },\n checked: function(){ if (this.checked) return this },\n parent: function(){ return this.parentNode },\n first: function(idx){ if (idx === 0) return this },\n last: function(idx, nodes){ if (idx === nodes.length - 1) return this },\n eq: function(idx, _, value){ if (idx === value) return this },\n contains: function(idx, _, text){ if ($(this).text().indexOf(text) > -1) return this },\n has: function(idx, _, sel){ if (zepto.qsa(this, sel).length) return this }\n }\n\n var filterRe = new RegExp('(.*):(\\\\w+)(?:\\\\(([^)]+)\\\\))?$\\\\s*'),\n childRe = /^\\s*>/,\n classTag = 'Zepto' + (+new Date())\n\n function process(sel, fn) {\n // quote the hash in `a[href^=#]` expression\n sel = sel.replace(/=#\\]/g, '=\"#\"]')\n var filter, arg, match = filterRe.exec(sel)\n if (match && match[2] in filters) {\n filter = filters[match[2]], arg = match[3]\n sel = match[1]\n if (arg) {\n var num = Number(arg)\n if (isNaN(num)) arg = arg.replace(/^[\"']|[\"']$/g, '')\n else arg = num\n }\n }\n return fn(sel, filter, arg)\n }\n\n zepto.qsa = function(node, selector) {\n return process(selector, function(sel, filter, arg){\n try {\n var taggedParent\n if (!sel && filter) sel = '*'\n else if (childRe.test(sel))\n // support \"> *\" child queries by tagging the parent node with a\n // unique class and prepending that classname onto the selector\n taggedParent = $(node).addClass(classTag), sel = '.'+classTag+' '+sel\n\n var nodes = oldQsa(node, sel)\n } catch(e) {\n console.error('error performing selector: %o', selector)\n throw e\n } finally {\n if (taggedParent) taggedParent.removeClass(classTag)\n }\n return !filter ? nodes :\n zepto.uniq($.map(nodes, function(n, i){ return filter.call(n, i, nodes, arg) }))\n })\n }\n\n zepto.matches = function(node, selector){\n return process(selector, function(sel, filter, arg){\n return (!sel || oldMatches(node, sel)) &&\n (!filter || filter.call(node, null, arg) === node)\n })\n }\n})(Zepto)\n","// Zepto.js\n// (c) 2010-2016 Thomas Fuchs\n// Zepto.js may be freely distributed under the MIT license.\n\n// The following code is heavily inspired by jQuery's $.fn.data()\n\n;(function($){\n var data = {}, dataAttr = $.fn.data, camelize = $.camelCase,\n exp = $.expando = 'Zepto' + (+new Date()), emptyArray = []\n\n // Get value from node:\n // 1. first try key as given,\n // 2. then try camelized key,\n // 3. fall back to reading \"data-*\" attribute.\n function getData(node, name) {\n var id = node[exp], store = id && data[id]\n if (name === undefined) return store || setData(node)\n else {\n if (store) {\n if (name in store) return store[name]\n var camelName = camelize(name)\n if (camelName in store) return store[camelName]\n }\n return dataAttr.call($(node), name)\n }\n }\n\n // Store value under camelized key on node\n function setData(node, name, value) {\n var id = node[exp] || (node[exp] = ++$.uuid),\n store = data[id] || (data[id] = attributeData(node))\n if (name !== undefined) store[camelize(name)] = value\n return store\n }\n\n // Read all \"data-*\" attributes from a node\n function attributeData(node) {\n var store = {}\n $.each(node.attributes || emptyArray, function(i, attr){\n if (attr.name.indexOf('data-') == 0)\n store[camelize(attr.name.replace('data-', ''))] =\n $.zepto.deserializeValue(attr.value)\n })\n return store\n }\n\n $.fn.data = function(name, value) {\n return value === undefined ?\n // set multiple values via object\n $.isPlainObject(name) ?\n this.each(function(i, node){\n $.each(name, function(key, value){ setData(node, key, value) })\n }) :\n // get value from first element\n (0 in this ? getData(this[0], name) : undefined) :\n // set value on all elements\n this.each(function(){ setData(this, name, value) })\n }\n\n $.data = function(elem, name, value) {\n return $(elem).data(name, value)\n }\n\n $.hasData = function(elem) {\n var id = elem[exp], store = id && data[id]\n return store ? !$.isEmptyObject(store) : false\n }\n\n $.fn.removeData = function(names) {\n if (typeof names == 'string') names = names.split(/\\s+/)\n return this.each(function(){\n var id = this[exp], store = id && data[id]\n if (store) $.each(names || store, function(key){\n delete store[names ? camelize(this) : key]\n })\n })\n }\n\n // Generate extended `remove` and `empty` functions\n ;['remove', 'empty'].forEach(function(methodName){\n var origFn = $.fn[methodName]\n $.fn[methodName] = function() {\n var elements = this.find('*')\n if (methodName === 'remove') elements = elements.add(this)\n elements.removeData()\n return origFn.call(this)\n }\n })\n})(Zepto)\n","// Zepto.js\n// (c) 2010-2016 Thomas Fuchs\n// Zepto.js may be freely distributed under the MIT license.\n\n;(function($, undefined){\n var prefix = '', eventPrefix,\n vendors = { Webkit: 'webkit', Moz: '', O: 'o' },\n testEl = document.createElement('div'),\n supportedTransforms = /^((translate|rotate|scale)(X|Y|Z|3d)?|matrix(3d)?|perspective|skew(X|Y)?)$/i,\n transform,\n transitionProperty, transitionDuration, transitionTiming, transitionDelay,\n animationName, animationDuration, animationTiming, animationDelay,\n cssReset = {}\n\n function dasherize(str) { return str.replace(/([A-Z])/g, '-$1').toLowerCase() }\n function normalizeEvent(name) { return eventPrefix ? eventPrefix + name : name.toLowerCase() }\n\n if (testEl.style.transform === undefined) $.each(vendors, function(vendor, event){\n if (testEl.style[vendor + 'TransitionProperty'] !== undefined) {\n prefix = '-' + vendor.toLowerCase() + '-'\n eventPrefix = event\n return false\n }\n })\n\n transform = prefix + 'transform'\n cssReset[transitionProperty = prefix + 'transition-property'] =\n cssReset[transitionDuration = prefix + 'transition-duration'] =\n cssReset[transitionDelay = prefix + 'transition-delay'] =\n cssReset[transitionTiming = prefix + 'transition-timing-function'] =\n cssReset[animationName = prefix + 'animation-name'] =\n cssReset[animationDuration = prefix + 'animation-duration'] =\n cssReset[animationDelay = prefix + 'animation-delay'] =\n cssReset[animationTiming = prefix + 'animation-timing-function'] = ''\n\n $.fx = {\n off: (eventPrefix === undefined && testEl.style.transitionProperty === undefined),\n speeds: { _default: 400, fast: 200, slow: 600 },\n cssPrefix: prefix,\n transitionEnd: normalizeEvent('TransitionEnd'),\n animationEnd: normalizeEvent('AnimationEnd')\n }\n\n $.fn.animate = function(properties, duration, ease, callback, delay){\n if ($.isFunction(duration))\n callback = duration, ease = undefined, duration = undefined\n if ($.isFunction(ease))\n callback = ease, ease = undefined\n if ($.isPlainObject(duration))\n ease = duration.easing, callback = duration.complete, delay = duration.delay, duration = duration.duration\n if (duration) duration = (typeof duration == 'number' ? duration :\n ($.fx.speeds[duration] || $.fx.speeds._default)) / 1000\n if (delay) delay = parseFloat(delay) / 1000\n return this.anim(properties, duration, ease, callback, delay)\n }\n\n $.fn.anim = function(properties, duration, ease, callback, delay){\n var key, cssValues = {}, cssProperties, transforms = '',\n that = this, wrappedCallback, endEvent = $.fx.transitionEnd,\n fired = false\n\n if (duration === undefined) duration = $.fx.speeds._default / 1000\n if (delay === undefined) delay = 0\n if ($.fx.off) duration = 0\n\n if (typeof properties == 'string') {\n // keyframe animation\n cssValues[animationName] = properties\n cssValues[animationDuration] = duration + 's'\n cssValues[animationDelay] = delay + 's'\n cssValues[animationTiming] = (ease || 'linear')\n endEvent = $.fx.animationEnd\n } else {\n cssProperties = []\n // CSS transitions\n for (key in properties)\n if (supportedTransforms.test(key)) transforms += key + '(' + properties[key] + ') '\n else cssValues[key] = properties[key], cssProperties.push(dasherize(key))\n\n if (transforms) cssValues[transform] = transforms, cssProperties.push(transform)\n if (duration > 0 && typeof properties === 'object') {\n cssValues[transitionProperty] = cssProperties.join(', ')\n cssValues[transitionDuration] = duration + 's'\n cssValues[transitionDelay] = delay + 's'\n cssValues[transitionTiming] = (ease || 'linear')\n }\n }\n\n wrappedCallback = function(event){\n if (typeof event !== 'undefined') {\n if (event.target !== event.currentTarget) return // makes sure the event didn't bubble from \"below\"\n $(event.target).unbind(endEvent, wrappedCallback)\n } else\n $(this).unbind(endEvent, wrappedCallback) // triggered by setTimeout\n\n fired = true\n $(this).css(cssReset)\n callback && callback.call(this)\n }\n if (duration > 0){\n this.bind(endEvent, wrappedCallback)\n // transitionEnd is not always firing on older Android phones\n // so make sure it gets fired\n setTimeout(function(){\n if (fired) return\n wrappedCallback.call(that)\n }, ((duration + delay) * 1000) + 25)\n }\n\n // trigger page reflow so new elements can animate\n this.size() && this.get(0).clientLeft\n\n this.css(cssValues)\n\n if (duration <= 0) setTimeout(function() {\n that.each(function(){ wrappedCallback.call(this) })\n }, 0)\n\n return this\n }\n\n testEl = null\n})(Zepto)\n","// Zepto.js\n// (c) 2010-2016 Thomas Fuchs\n// Zepto.js may be freely distributed under the MIT license.\n\n;(function($, undefined){\n var document = window.document, docElem = document.documentElement,\n origShow = $.fn.show, origHide = $.fn.hide, origToggle = $.fn.toggle\n\n function anim(el, speed, opacity, scale, callback) {\n if (typeof speed == 'function' && !callback) callback = speed, speed = undefined\n var props = { opacity: opacity }\n if (scale) {\n props.scale = scale\n el.css($.fx.cssPrefix + 'transform-origin', '0 0')\n }\n return el.animate(props, speed, null, callback)\n }\n\n function hide(el, speed, scale, callback) {\n return anim(el, speed, 0, scale, function(){\n origHide.call($(this))\n callback && callback.call(this)\n })\n }\n\n $.fn.show = function(speed, callback) {\n origShow.call(this)\n if (speed === undefined) speed = 0\n else this.css('opacity', 0)\n return anim(this, speed, 1, '1,1', callback)\n }\n\n $.fn.hide = function(speed, callback) {\n if (speed === undefined) return origHide.call(this)\n else return hide(this, speed, '0,0', callback)\n }\n\n $.fn.toggle = function(speed, callback) {\n if (speed === undefined || typeof speed == 'boolean')\n return origToggle.call(this, speed)\n else return this.each(function(){\n var el = $(this)\n el[el.css('display') == 'none' ? 'show' : 'hide'](speed, callback)\n })\n }\n\n $.fn.fadeTo = function(speed, opacity, callback) {\n return anim(this, speed, opacity, null, callback)\n }\n\n $.fn.fadeIn = function(speed, callback) {\n var target = this.css('opacity')\n if (target > 0) this.css('opacity', 0)\n else target = 1\n return origShow.call(this).fadeTo(speed, target, callback)\n }\n\n $.fn.fadeOut = function(speed, callback) {\n return hide(this, speed, null, callback)\n }\n\n $.fn.fadeToggle = function(speed, callback) {\n return this.each(function(){\n var el = $(this)\n el[\n (el.css('opacity') == 0 || el.css('display') == 'none') ? 'fadeIn' : 'fadeOut'\n ](speed, callback)\n })\n }\n\n})(Zepto)\n","/*!\n * HC-Sticky\n * =========\n * Version: 2.2.3\n * Author: Some Web Media\n * Author URL: http://somewebmedia.com\n * Plugin URL: https://github.com/somewebmedia/hc-sticky\n * Description: Cross-browser plugin that makes any element on your page visible while you scroll\n * License: MIT\n */\n!function(t,e){\"use strict\";if(\"object\"==typeof module&&\"object\"==typeof module.exports){if(!t.document)throw new Error(\"HC-Sticky requires a browser to run.\");module.exports=e(t)}else\"function\"==typeof define&&define.amd?define(\"hcSticky\",[],e(t)):e(t)}(\"undefined\"!=typeof window?window:this,function(U){\"use strict\";var Y={top:0,bottom:0,bottomEnd:0,innerTop:0,innerSticker:null,stickyClass:\"sticky\",stickTo:null,followScroll:!0,responsive:null,mobileFirst:!1,onStart:null,onStop:null,onBeforeResize:null,onResize:null,resizeDebounce:100,disable:!1,queries:null,queryFlow:\"down\"},$=function(t,e,o){console.log(\"%c! HC Sticky:%c \"+t+\"%c \"+o+\" is now deprecated and will be removed. Use%c \"+e+\"%c instead.\",\"color: red\",\"color: darkviolet\",\"color: black\",\"color: darkviolet\",\"color: black\")},Q=U.document,X=function(n,f){var o=this;if(\"string\"==typeof n&&(n=Q.querySelector(n)),!n)return!1;f.queries&&$(\"queries\",\"responsive\",\"option\"),f.queryFlow&&$(\"queryFlow\",\"mobileFirst\",\"option\");var p={},d=X.Helpers,s=n.parentNode;\"static\"===d.getStyle(s,\"position\")&&(s.style.position=\"relative\");var u=function(){var t=0<arguments.length&&void 0!==arguments[0]?arguments[0]:{};d.isEmptyObject(t)&&!d.isEmptyObject(p)||(p=Object.assign({},Y,p,t))},t=function(){return p.disable},e=function(){var t,e=p.responsive||p.queries;if(e){var o=U.innerWidth;if(t=f,(p=Object.assign({},Y,t||{})).mobileFirst)for(var i in e)i<=o&&!d.isEmptyObject(e[i])&&u(e[i]);else{var n=[];for(var s in e){var r={};r[s]=e[s],n.push(r)}for(var l=n.length-1;0<=l;l--){var a=n[l],c=Object.keys(a)[0];o<=c&&!d.isEmptyObject(a[c])&&u(a[c])}}}},r={css:{},position:null,stick:function(){var t=0<arguments.length&&void 0!==arguments[0]?arguments[0]:{};d.hasClass(n,p.stickyClass)||(!1===l.isAttached&&l.attach(),r.position=\"fixed\",n.style.position=\"fixed\",n.style.left=l.offsetLeft+\"px\",n.style.width=l.width,void 0===t.bottom?n.style.bottom=\"auto\":n.style.bottom=t.bottom+\"px\",void 0===t.top?n.style.top=\"auto\":n.style.top=t.top+\"px\",n.classList?n.classList.add(p.stickyClass):n.className+=\" \"+p.stickyClass,p.onStart&&p.onStart.call(n,Object.assign({},p)))},release:function(){var t=0<arguments.length&&void 0!==arguments[0]?arguments[0]:{};if(t.stop=t.stop||!1,!0===t.stop||\"fixed\"===r.position||null===r.position||!(void 0===t.top&&void 0===t.bottom||void 0!==t.top&&(parseInt(d.getStyle(n,\"top\"))||0)===t.top||void 0!==t.bottom&&(parseInt(d.getStyle(n,\"bottom\"))||0)===t.bottom)){!0===t.stop?!0===l.isAttached&&l.detach():!1===l.isAttached&&l.attach();var e=t.position||r.css.position;r.position=e,n.style.position=e,n.style.left=!0===t.stop?r.css.left:l.positionLeft+\"px\",n.style.width=\"absolute\"!==e?r.css.width:l.width,void 0===t.bottom?n.style.bottom=!0===t.stop?\"\":\"auto\":n.style.bottom=t.bottom+\"px\",void 0===t.top?n.style.top=!0===t.stop?\"\":\"auto\":n.style.top=t.top+\"px\",n.classList?n.classList.remove(p.stickyClass):n.className=n.className.replace(new RegExp(\"(^|\\\\b)\"+p.stickyClass.split(\" \").join(\"|\")+\"(\\\\b|$)\",\"gi\"),\" \"),p.onStop&&p.onStop.call(n,Object.assign({},p))}}},l={el:Q.createElement(\"div\"),offsetLeft:null,positionLeft:null,width:null,isAttached:!1,init:function(){for(var t in l.el.className=\"sticky-spacer\",r.css)l.el.style[t]=r.css[t];l.el.style[\"z-index\"]=\"-1\";var e=d.getStyle(n);l.offsetLeft=d.offset(n).left-(parseInt(e.marginLeft)||0),l.positionLeft=d.position(n).left,l.width=d.getStyle(n,\"width\")},attach:function(){s.insertBefore(l.el,n),l.isAttached=!0},detach:function(){l.el=s.removeChild(l.el),l.isAttached=!1}},a=void 0,c=void 0,g=void 0,m=void 0,h=void 0,v=void 0,y=void 0,b=void 0,S=void 0,w=void 0,k=void 0,E=void 0,x=void 0,L=void 0,T=void 0,j=void 0,O=void 0,C=void 0,i=function(){var t,e,o,i;r.css=(t=n,e=d.getCascadedStyle(t),o=d.getStyle(t),i={height:t.offsetHeight+\"px\",left:e.left,right:e.right,top:e.top,bottom:e.bottom,position:o.position,display:o.display,verticalAlign:o.verticalAlign,boxSizing:o.boxSizing,marginLeft:e.marginLeft,marginRight:e.marginRight,marginTop:e.marginTop,marginBottom:e.marginBottom,paddingLeft:e.paddingLeft,paddingRight:e.paddingRight},e.float&&(i.float=e.float||\"none\"),e.cssFloat&&(i.cssFloat=e.cssFloat||\"none\"),o.MozBoxSizing&&(i.MozBoxSizing=o.MozBoxSizing),i.width=\"auto\"!==e.width?e.width:\"border-box\"===i.boxSizing||\"border-box\"===i.MozBoxSizing?t.offsetWidth+\"px\":o.width,i),l.init(),a=!(!p.stickTo||!(\"document\"===p.stickTo||p.stickTo.nodeType&&9===p.stickTo.nodeType||\"object\"==typeof p.stickTo&&p.stickTo instanceof(\"undefined\"!=typeof HTMLDocument?HTMLDocument:Document))),c=p.stickTo?a?Q:\"string\"==typeof p.stickTo?Q.querySelector(p.stickTo):p.stickTo:s,T=(C=function(){var t=n.offsetHeight+(parseInt(r.css.marginTop)||0)+(parseInt(r.css.marginBottom)||0),e=(T||0)-t;return-1<=e&&e<=1?T:t})(),m=(O=function(){return a?Math.max(Q.documentElement.clientHeight,Q.body.scrollHeight,Q.documentElement.scrollHeight,Q.body.offsetHeight,Q.documentElement.offsetHeight):c.offsetHeight})(),h=a?0:d.offset(c).top,v=p.stickTo?a?0:d.offset(s).top:h,y=U.innerHeight,j=n.offsetTop-(parseInt(r.css.marginTop)||0),g=p.innerSticker?\"string\"==typeof p.innerSticker?Q.querySelector(p.innerSticker):p.innerSticker:null,b=isNaN(p.top)&&-1<p.top.indexOf(\"%\")?parseFloat(p.top)/100*y:p.top,S=isNaN(p.bottom)&&-1<p.bottom.indexOf(\"%\")?parseFloat(p.bottom)/100*y:p.bottom,w=g?g.offsetTop:p.innerTop?p.innerTop:0,k=isNaN(p.bottomEnd)&&-1<p.bottomEnd.indexOf(\"%\")?parseFloat(p.bottomEnd)/100*y:p.bottomEnd,E=h-b+w+j},z=U.pageYOffset||Q.documentElement.scrollTop,N=0,H=void 0,R=function(){T=C(),m=O(),x=h+m-b-k,L=y<T;var t=U.pageYOffset||Q.documentElement.scrollTop,e=d.offset(n).top,o=e-t,i=void 0;H=t<z?\"up\":\"down\",N=t-z,E<(z=t)?x+b+(L?S:0)-(p.followScroll&&L?0:b)<=t+T-w-(y-(E-w)<T-w&&p.followScroll&&0<(i=T-y-w)?i:0)?r.release({position:\"absolute\",bottom:v+s.offsetHeight-x-b}):L&&p.followScroll?\"down\"===H?o+T+S<=y+.9?r.stick({bottom:S}):\"fixed\"===r.position&&r.release({position:\"absolute\",top:e-b-E-N+w}):Math.ceil(o+w)<0&&\"fixed\"===r.position?r.release({position:\"absolute\",top:e-b-E+w-N}):t+b-w<=e&&r.stick({top:b-w}):r.stick({top:b-w}):r.release({stop:!0})},A=!1,B=!1,I=function(){A&&(d.event.unbind(U,\"scroll\",R),A=!1)},q=function(){null!==n.offsetParent&&\"none\"!==d.getStyle(n,\"display\")?(i(),m<=T?I():(R(),A||(d.event.bind(U,\"scroll\",R),A=!0))):I()},F=function(){n.style.position=\"\",n.style.left=\"\",n.style.top=\"\",n.style.bottom=\"\",n.style.width=\"\",n.classList?n.classList.remove(p.stickyClass):n.className=n.className.replace(new RegExp(\"(^|\\\\b)\"+p.stickyClass.split(\" \").join(\"|\")+\"(\\\\b|$)\",\"gi\"),\" \"),r.css={},!(r.position=null)===l.isAttached&&l.detach()},M=function(){F(),e(),t()?I():q()},D=function(){p.onBeforeResize&&p.onBeforeResize.call(n,Object.assign({},p)),M(),p.onResize&&p.onResize.call(n,Object.assign({},p))},P=p.resizeDebounce?d.debounce(D,p.resizeDebounce):D,W=function(){B&&(d.event.unbind(U,\"resize\",P),B=!1),I()},V=function(){B||(d.event.bind(U,\"resize\",P),B=!0),e(),t()?I():q()};this.options=function(t){return t?p[t]:Object.assign({},p)},this.refresh=M,this.update=function(t){u(t),f=Object.assign({},f,t||{}),M()},this.attach=V,this.detach=W,this.destroy=function(){W(),F()},this.triggerMethod=function(t,e){\"function\"==typeof o[t]&&o[t](e)},this.reinit=function(){$(\"reinit\",\"refresh\",\"method\"),M()},u(f),V(),d.event.bind(U,\"load\",M)};if(void 0!==U.jQuery){var i=U.jQuery,n=\"hcSticky\";i.fn.extend({hcSticky:function(e,o){return this.length?\"options\"===e?i.data(this.get(0),n).options():this.each(function(){var t=i.data(this,n);t?t.triggerMethod(e,o):(t=new X(this,e),i.data(this,n,t))}):this}})}return U.hcSticky=U.hcSticky||X,X}),function(c){\"use strict\";var t=c.hcSticky,f=c.document;\"function\"!=typeof Object.assign&&Object.defineProperty(Object,\"assign\",{value:function(t,e){if(null==t)throw new TypeError(\"Cannot convert undefined or null to object\");for(var o=Object(t),i=1;i<arguments.length;i++){var n=arguments[i];if(null!=n)for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(o[s]=n[s])}return o},writable:!0,configurable:!0}),Array.prototype.forEach||(Array.prototype.forEach=function(t){var e,o;if(null==this)throw new TypeError(\"this is null or not defined\");var i=Object(this),n=i.length>>>0;if(\"function\"!=typeof t)throw new TypeError(t+\" is not a function\");for(1<arguments.length&&(e=arguments[1]),o=0;o<n;){var s;o in i&&(s=i[o],t.call(e,s,o,i)),o++}});var e=function(){var t=f.documentElement,e=function(){};function i(t){var e=c.event;return e.target=e.target||e.srcElement||t,e}t.addEventListener?e=function(t,e,o){t.addEventListener(e,o,!1)}:t.attachEvent&&(e=function(e,t,o){e[t+o]=o.handleEvent?function(){var t=i(e);o.handleEvent.call(o,t)}:function(){var t=i(e);o.call(e,t)},e.attachEvent(\"on\"+t,e[t+o])});var o=function(){};return t.removeEventListener?o=function(t,e,o){t.removeEventListener(e,o,!1)}:t.detachEvent&&(o=function(e,o,i){e.detachEvent(\"on\"+o,e[o+i]);try{delete e[o+i]}catch(t){e[o+i]=void 0}}),{bind:e,unbind:o}}(),r=function(t,e){return c.getComputedStyle?e?f.defaultView.getComputedStyle(t,null).getPropertyValue(e):f.defaultView.getComputedStyle(t,null):t.currentStyle?e?t.currentStyle[e.replace(/-\\w/g,function(t){return t.toUpperCase().replace(\"-\",\"\")})]:t.currentStyle:void 0},l=function(t){var e=t.getBoundingClientRect(),o=c.pageYOffset||f.documentElement.scrollTop,i=c.pageXOffset||f.documentElement.scrollLeft;return{top:e.top+o,left:e.left+i}};t.Helpers={isEmptyObject:function(t){for(var e in t)return!1;return!0},debounce:function(i,n,s){var r=void 0;return function(){var t=this,e=arguments,o=s&&!r;clearTimeout(r),r=setTimeout(function(){r=null,s||i.apply(t,e)},n),o&&i.apply(t,e)}},hasClass:function(t,e){return t.classList?t.classList.contains(e):new RegExp(\"(^| )\"+e+\"( |$)\",\"gi\").test(t.className)},offset:l,position:function(t){var e=t.offsetParent,o=l(e),i=l(t),n=r(e),s=r(t);return o.top+=parseInt(n.borderTopWidth)||0,o.left+=parseInt(n.borderLeftWidth)||0,{top:i.top-o.top-(parseInt(s.marginTop)||0),left:i.left-o.left-(parseInt(s.marginLeft)||0)}},getStyle:r,getCascadedStyle:function(t){var e=t.cloneNode(!0);e.style.display=\"none\",Array.prototype.slice.call(e.querySelectorAll('input[type=\"radio\"]')).forEach(function(t){t.removeAttribute(\"name\")}),t.parentNode.insertBefore(e,t.nextSibling);var o=void 0;e.currentStyle?o=e.currentStyle:c.getComputedStyle&&(o=f.defaultView.getComputedStyle(e,null));var i={};for(var n in o)!isNaN(n)||\"string\"!=typeof o[n]&&\"number\"!=typeof o[n]||(i[n]=o[n]);if(Object.keys(i).length<3)for(var s in i={},o)isNaN(s)||(i[o[s].replace(/-\\w/g,function(t){return t.toUpperCase().replace(\"-\",\"\")})]=o.getPropertyValue(o[s]));if(i.margin||\"auto\"!==i.marginLeft?i.margin||i.marginLeft!==i.marginRight||i.marginLeft!==i.marginTop||i.marginLeft!==i.marginBottom||(i.margin=i.marginLeft):i.margin=\"auto\",!i.margin&&\"0px\"===i.marginLeft&&\"0px\"===i.marginRight){var r=t.offsetLeft-t.parentNode.offsetLeft,l=r-(parseInt(i.left)||0)-(parseInt(i.right)||0),a=t.parentNode.offsetWidth-t.offsetWidth-r-(parseInt(i.right)||0)+(parseInt(i.left)||0)-l;0!==a&&1!==a||(i.margin=\"auto\")}return e.parentNode.removeChild(e),e=null,i},event:e}}(window);","module.exports = function(originalModule) {\n\tif (!originalModule.webpackPolyfill) {\n\t\tvar module = Object.create(originalModule);\n\t\t// module.parent = undefined by default\n\t\tif (!module.children) module.children = [];\n\t\tObject.defineProperty(module, \"loaded\", {\n\t\t\tenumerable: true,\n\t\t\tget: function() {\n\t\t\t\treturn module.l;\n\t\t\t}\n\t\t});\n\t\tObject.defineProperty(module, \"id\", {\n\t\t\tenumerable: true,\n\t\t\tget: function() {\n\t\t\t\treturn module.i;\n\t\t\t}\n\t\t});\n\t\tObject.defineProperty(module, \"exports\", {\n\t\t\tenumerable: true\n\t\t});\n\t\tmodule.webpackPolyfill = 1;\n\t}\n\treturn module;\n};\n","/* globals __webpack_amd_options__ */\nmodule.exports = __webpack_amd_options__;\n","/* ========================================================================\n * Bootstrap: dropdown.js v3.4.1\n * https://getbootstrap.com/docs/3.4/javascript/#dropdowns\n * ========================================================================\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n 'use strict';\n\n // DROPDOWN CLASS DEFINITION\n // =========================\n\n var backdrop = '.dropdown-backdrop'\n var toggle = '[data-toggle=\"dropdown\"]'\n var Dropdown = function (element) {\n $(element).on('click.bs.dropdown', this.toggle)\n }\n\n Dropdown.VERSION = '3.4.1'\n\n function getParent($this) {\n var selector = $this.attr('data-target')\n\n if (!selector) {\n selector = $this.attr('href')\n selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\\s]*$)/, '') // strip for ie7\n }\n\n var $parent = selector !== '#' ? $(document).find(selector) : null\n\n return $parent && $parent.length ? $parent : $this.parent()\n }\n\n function clearMenus(e) {\n if (e && e.which === 3) return\n $(backdrop).remove()\n $(toggle).each(function () {\n var $this = $(this)\n var $parent = getParent($this)\n var relatedTarget = { relatedTarget: this }\n\n if (!$parent.hasClass('open')) return\n\n if (e && e.type == 'click' && /input|textarea/i.test(e.target.tagName) && $.contains($parent[0], e.target)) return\n\n $parent.trigger(e = $.Event('hide.bs.dropdown', relatedTarget))\n\n if (e.isDefaultPrevented()) return\n\n $this.attr('aria-expanded', 'false')\n $parent.removeClass('open').trigger($.Event('hidden.bs.dropdown', relatedTarget))\n })\n }\n\n Dropdown.prototype.toggle = function (e) {\n var $this = $(this)\n\n if ($this.is('.disabled, :disabled')) return\n\n var $parent = getParent($this)\n var isActive = $parent.hasClass('open')\n\n clearMenus()\n\n if (!isActive) {\n if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) {\n // if mobile we use a backdrop because click events don't delegate\n $(document.createElement('div'))\n .addClass('dropdown-backdrop')\n .insertAfter($(this))\n .on('click', clearMenus)\n }\n\n var relatedTarget = { relatedTarget: this }\n $parent.trigger(e = $.Event('show.bs.dropdown', relatedTarget))\n\n if (e.isDefaultPrevented()) return\n\n $this\n .trigger('focus')\n .attr('aria-expanded', 'true')\n\n $parent\n .toggleClass('open')\n .trigger($.Event('shown.bs.dropdown', relatedTarget))\n }\n\n return false\n }\n\n Dropdown.prototype.keydown = function (e) {\n if (!/(38|40|27|32)/.test(e.which) || /input|textarea/i.test(e.target.tagName)) return\n\n var $this = $(this)\n\n e.preventDefault()\n e.stopPropagation()\n\n if ($this.is('.disabled, :disabled')) return\n\n var $parent = getParent($this)\n var isActive = $parent.hasClass('open')\n\n if (!isActive && e.which != 27 || isActive && e.which == 27) {\n if (e.which == 27) $parent.find(toggle).trigger('focus')\n return $this.trigger('click')\n }\n\n var desc = ' li:not(.disabled):visible a'\n var $items = $parent.find('.dropdown-menu' + desc)\n\n if (!$items.length) return\n\n var index = $items.index(e.target)\n\n if (e.which == 38 && index > 0) index-- // up\n if (e.which == 40 && index < $items.length - 1) index++ // down\n if (!~index) index = 0\n\n $items.eq(index).trigger('focus')\n }\n\n\n // DROPDOWN PLUGIN DEFINITION\n // ==========================\n\n function Plugin(option) {\n return this.each(function () {\n var $this = $(this)\n var data = $this.data('bs.dropdown')\n\n if (!data) $this.data('bs.dropdown', (data = new Dropdown(this)))\n if (typeof option == 'string') data[option].call($this)\n })\n }\n\n var old = $.fn.dropdown\n\n $.fn.dropdown = Plugin\n $.fn.dropdown.Constructor = Dropdown\n\n\n // DROPDOWN NO CONFLICT\n // ====================\n\n $.fn.dropdown.noConflict = function () {\n $.fn.dropdown = old\n return this\n }\n\n\n // APPLY TO STANDARD DROPDOWN ELEMENTS\n // ===================================\n\n $(document)\n .on('click.bs.dropdown.data-api', clearMenus)\n .on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() })\n .on('click.bs.dropdown.data-api', toggle, Dropdown.prototype.toggle)\n .on('keydown.bs.dropdown.data-api', toggle, Dropdown.prototype.keydown)\n .on('keydown.bs.dropdown.data-api', '.dropdown-menu', Dropdown.prototype.keydown)\n\n}(jQuery);\n","/* ========================================================================\n * Bootstrap: transition.js v3.4.1\n * https://getbootstrap.com/docs/3.4/javascript/#transitions\n * ========================================================================\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n 'use strict';\n\n // CSS TRANSITION SUPPORT (Shoutout: https://modernizr.com/)\n // ============================================================\n\n function transitionEnd() {\n var el = document.createElement('bootstrap')\n\n var transEndEventNames = {\n WebkitTransition : 'webkitTransitionEnd',\n MozTransition : 'transitionend',\n OTransition : 'oTransitionEnd otransitionend',\n transition : 'transitionend'\n }\n\n for (var name in transEndEventNames) {\n if (el.style[name] !== undefined) {\n return { end: transEndEventNames[name] }\n }\n }\n\n return false // explicit for ie8 ( ._.)\n }\n\n // https://blog.alexmaccaw.com/css-transitions\n $.fn.emulateTransitionEnd = function (duration) {\n var called = false\n var $el = this\n $(this).one('bsTransitionEnd', function () { called = true })\n var callback = function () { if (!called) $($el).trigger($.support.transition.end) }\n setTimeout(callback, duration)\n return this\n }\n\n $(function () {\n $.support.transition = transitionEnd()\n\n if (!$.support.transition) return\n\n $.event.special.bsTransitionEnd = {\n bindType: $.support.transition.end,\n delegateType: $.support.transition.end,\n handle: function (e) {\n if ($(e.target).is(this)) return e.handleObj.handler.apply(this, arguments)\n }\n }\n })\n\n}(jQuery);\n","/* eslint-disable */\n;(function() {\n\"use strict\"\n/* eslint-enable */\nStream.SKIP = {}\nStream.lift = lift\nStream.scan = scan\nStream.merge = merge\nStream.combine = combine\nStream.scanMerge = scanMerge\nStream[\"fantasy-land/of\"] = Stream\n\nvar warnedHalt = false\nObject.defineProperty(Stream, \"HALT\", {\n\tget: function() {\n\t\twarnedHalt || console.log(\"HALT is deprecated and has been renamed to SKIP\");\n\t\twarnedHalt = true\n\t\treturn Stream.SKIP\n\t}\n})\n\nfunction Stream(value) {\n\tvar dependentStreams = []\n\tvar dependentFns = []\n\n\tfunction stream(v) {\n\t\tif (arguments.length && v !== Stream.SKIP) {\n\t\t\tvalue = v\n\t\t\tif (open(stream)) {\n\t\t\t\tstream._changing()\n\t\t\t\tstream._state = \"active\"\n\t\t\t\tdependentStreams.forEach(function(s, i) { s(dependentFns[i](value)) })\n\t\t\t}\n\t\t}\n\n\t\treturn value\n\t}\n\n\tstream.constructor = Stream\n\tstream._state = arguments.length && value !== Stream.SKIP ? \"active\" : \"pending\"\n\tstream._parents = []\n\n\tstream._changing = function() {\n\t\tif (open(stream)) stream._state = \"changing\"\n\t\tdependentStreams.forEach(function(s) {\n\t\t\ts._changing()\n\t\t})\n\t}\n\n\tstream._map = function(fn, ignoreInitial) {\n\t\tvar target = ignoreInitial ? Stream() : Stream(fn(value))\n\t\ttarget._parents.push(stream)\n\t\tdependentStreams.push(target)\n\t\tdependentFns.push(fn)\n\t\treturn target\n\t}\n\n\tstream.map = function(fn) {\n\t\treturn stream._map(fn, stream._state !== \"active\")\n\t}\n\n\tvar end\n\tfunction createEnd() {\n\t\tend = Stream()\n\t\tend.map(function(value) {\n\t\t\tif (value === true) {\n\t\t\t\tstream._parents.forEach(function (p) {p._unregisterChild(stream)})\n\t\t\t\tstream._state = \"ended\"\n\t\t\t\tstream._parents.length = dependentStreams.length = dependentFns.length = 0\n\t\t\t}\n\t\t\treturn value\n\t\t})\n\t\treturn end\n\t}\n\n\tstream.toJSON = function() { return value != null && typeof value.toJSON === \"function\" ? value.toJSON() : value }\n\n\tstream[\"fantasy-land/map\"] = stream.map\n\tstream[\"fantasy-land/ap\"] = function(x) { return combine(function(s1, s2) { return s1()(s2()) }, [x, stream]) }\n\n\tstream._unregisterChild = function(child) {\n\t\tvar childIndex = dependentStreams.indexOf(child)\n\t\tif (childIndex !== -1) {\n\t\t\tdependentStreams.splice(childIndex, 1)\n\t\t\tdependentFns.splice(childIndex, 1)\n\t\t}\n\t}\n\n\tObject.defineProperty(stream, \"end\", {\n\t\tget: function() { return end || createEnd() }\n\t})\n\n\treturn stream\n}\n\nfunction combine(fn, streams) {\n\tvar ready = streams.every(function(s) {\n\t\tif (s.constructor !== Stream)\n\t\t\tthrow new Error(\"Ensure that each item passed to stream.combine/stream.merge/lift is a stream\")\n\t\treturn s._state === \"active\"\n\t})\n\tvar stream = ready\n\t\t? Stream(fn.apply(null, streams.concat([streams])))\n\t\t: Stream()\n\n\tvar changed = []\n\n\tvar mappers = streams.map(function(s) {\n\t\treturn s._map(function(value) {\n\t\t\tchanged.push(s)\n\t\t\tif (ready || streams.every(function(s) { return s._state !== \"pending\" })) {\n\t\t\t\tready = true\n\t\t\t\tstream(fn.apply(null, streams.concat([changed])))\n\t\t\t\tchanged = []\n\t\t\t}\n\t\t\treturn value\n\t\t}, true)\n\t})\n\n\tvar endStream = stream.end.map(function(value) {\n\t\tif (value === true) {\n\t\t\tmappers.forEach(function(mapper) { mapper.end(true) })\n\t\t\tendStream.end(true)\n\t\t}\n\t\treturn undefined\n\t})\n\n\treturn stream\n}\n\nfunction merge(streams) {\n\treturn combine(function() { return streams.map(function(s) { return s() }) }, streams)\n}\n\nfunction scan(fn, acc, origin) {\n\tvar stream = origin.map(function(v) {\n\t\tvar next = fn(acc, v)\n\t\tif (next !== Stream.SKIP) acc = next\n\t\treturn next\n\t})\n\tstream(acc)\n\treturn stream\n}\n\nfunction scanMerge(tuples, seed) {\n\tvar streams = tuples.map(function(tuple) { return tuple[0] })\n\n\tvar stream = combine(function() {\n\t\tvar changed = arguments[arguments.length - 1]\n\t\tstreams.forEach(function(stream, i) {\n\t\t\tif (changed.indexOf(stream) > -1)\n\t\t\t\tseed = tuples[i][1](seed, stream())\n\t\t})\n\n\t\treturn seed\n\t}, streams)\n\n\tstream(seed)\n\n\treturn stream\n}\n\nfunction lift() {\n\tvar fn = arguments[0]\n\tvar streams = Array.prototype.slice.call(arguments, 1)\n\treturn merge(streams).map(function(streams) {\n\t\treturn fn.apply(undefined, streams)\n\t})\n}\n\nfunction open(s) {\n\treturn s._state === \"pending\" || s._state === \"active\" || s._state === \"changing\"\n}\n\nif (typeof module !== \"undefined\") module[\"exports\"] = Stream\nelse if (typeof window.m === \"function\" && !(\"stream\" in window.m)) window.m.stream = Stream\nelse window.m = {stream : Stream}\n\n}());\n","var root = require('./_root');\n\n/** Built-in value references. */\nvar Symbol = root.Symbol;\n\nmodule.exports = Symbol;\n","/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return value != null && typeof value == 'object';\n}\n\nmodule.exports = isObjectLike;\n","var baseFlatten = require('./_baseFlatten');\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/**\n * Recursively flattens `array`.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Array\n * @param {Array} array The array to flatten.\n * @returns {Array} Returns the new flattened array.\n * @example\n *\n * _.flattenDeep([1, [2, [3, [4]], 5]]);\n * // => [1, 2, 3, 4, 5]\n */\nfunction flattenDeep(array) {\n var length = array == null ? 0 : array.length;\n return length ? baseFlatten(array, INFINITY) : [];\n}\n\nmodule.exports = flattenDeep;\n","module.exports = global[\"ColorThief\"] = require(\"-!E:\\\\sites\\\\flarum-new\\\\packages\\\\flarum-core\\\\js\\\\node_modules\\\\babel-loader\\\\lib\\\\index.js??ref--5!E:\\\\sites\\\\flarum-new\\\\packages\\\\flarum-core\\\\js\\\\node_modules\\\\source-map-loader\\\\index.js!.\\\\color-thief.umd.js\");","!function(t,r){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=r():\"function\"==typeof define&&define.amd?define(r):t.ColorThief=r()}(this,function(){if(!t)var t={map:function(t,r){var n={};return r?t.map(function(t,o){return n.index=o,r.call(n,t)}):t.slice()},naturalOrder:function(t,r){return t<r?-1:t>r?1:0},sum:function(t,r){var n={};return t.reduce(r?function(t,o,e){return n.index=e,t+r.call(n,o)}:function(t,r){return t+r},0)},max:function(r,n){return Math.max.apply(null,n?t.map(r,n):r)}};var r=function(){var r=5,n=8-r,o=1e3;function e(t,n,o){return(t<<2*r)+(n<<r)+o}function i(t){var r=[],n=!1;function o(){r.sort(t),n=!0}return{push:function(t){r.push(t),n=!1},peek:function(t){return n||o(),void 0===t&&(t=r.length-1),r[t]},pop:function(){return n||o(),r.pop()},size:function(){return r.length},map:function(t){return r.map(t)},debug:function(){return n||o(),r}}}function u(t,r,n,o,e,i,u){this.r1=t,this.r2=r,this.g1=n,this.g2=o,this.b1=e,this.b2=i,this.histo=u}function a(){this.vboxes=new i(function(r,n){return t.naturalOrder(r.vbox.count()*r.vbox.volume(),n.vbox.count()*n.vbox.volume())})}function s(r,n){if(n.count()){var o=n.r2-n.r1+1,i=n.g2-n.g1+1,u=t.max([o,i,n.b2-n.b1+1]);if(1==n.count())return[n.copy()];var a,s,h,c,f=0,v=[],l=[];if(u==o)for(a=n.r1;a<=n.r2;a++){for(c=0,s=n.g1;s<=n.g2;s++)for(h=n.b1;h<=n.b2;h++)c+=r[e(a,s,h)]||0;v[a]=f+=c}else if(u==i)for(a=n.g1;a<=n.g2;a++){for(c=0,s=n.r1;s<=n.r2;s++)for(h=n.b1;h<=n.b2;h++)c+=r[e(s,a,h)]||0;v[a]=f+=c}else for(a=n.b1;a<=n.b2;a++){for(c=0,s=n.r1;s<=n.r2;s++)for(h=n.g1;h<=n.g2;h++)c+=r[e(s,h,a)]||0;v[a]=f+=c}return v.forEach(function(t,r){l[r]=f-t}),function(t){var r,o,e,i,u,s=t+\"1\",h=t+\"2\",c=0;for(a=n[s];a<=n[h];a++)if(v[a]>f/2){for(e=n.copy(),i=n.copy(),u=(r=a-n[s])<=(o=n[h]-a)?Math.min(n[h]-1,~~(a+o/2)):Math.max(n[s],~~(a-1-r/2));!v[u];)u++;for(c=l[u];!c&&v[u-1];)c=l[--u];return e[h]=u,i[s]=e[h]+1,[e,i]}}(u==o?\"r\":u==i?\"g\":\"b\")}}return u.prototype={volume:function(t){return this._volume&&!t||(this._volume=(this.r2-this.r1+1)*(this.g2-this.g1+1)*(this.b2-this.b1+1)),this._volume},count:function(t){var r=this.histo;if(!this._count_set||t){var n,o,i,u=0;for(n=this.r1;n<=this.r2;n++)for(o=this.g1;o<=this.g2;o++)for(i=this.b1;i<=this.b2;i++)u+=r[e(n,o,i)]||0;this._count=u,this._count_set=!0}return this._count},copy:function(){return new u(this.r1,this.r2,this.g1,this.g2,this.b1,this.b2,this.histo)},avg:function(t){var n=this.histo;if(!this._avg||t){var o,i,u,a,s=0,h=1<<8-r,c=0,f=0,v=0;for(i=this.r1;i<=this.r2;i++)for(u=this.g1;u<=this.g2;u++)for(a=this.b1;a<=this.b2;a++)s+=o=n[e(i,u,a)]||0,c+=o*(i+.5)*h,f+=o*(u+.5)*h,v+=o*(a+.5)*h;this._avg=s?[~~(c/s),~~(f/s),~~(v/s)]:[~~(h*(this.r1+this.r2+1)/2),~~(h*(this.g1+this.g2+1)/2),~~(h*(this.b1+this.b2+1)/2)]}return this._avg},contains:function(t){var r=t[0]>>n;return gval=t[1]>>n,bval=t[2]>>n,r>=this.r1&&r<=this.r2&&gval>=this.g1&&gval<=this.g2&&bval>=this.b1&&bval<=this.b2}},a.prototype={push:function(t){this.vboxes.push({vbox:t,color:t.avg()})},palette:function(){return this.vboxes.map(function(t){return t.color})},size:function(){return this.vboxes.size()},map:function(t){for(var r=this.vboxes,n=0;n<r.size();n++)if(r.peek(n).vbox.contains(t))return r.peek(n).color;return this.nearest(t)},nearest:function(t){for(var r,n,o,e=this.vboxes,i=0;i<e.size();i++)((n=Math.sqrt(Math.pow(t[0]-e.peek(i).color[0],2)+Math.pow(t[1]-e.peek(i).color[1],2)+Math.pow(t[2]-e.peek(i).color[2],2)))<r||void 0===r)&&(r=n,o=e.peek(i).color);return o},forcebw:function(){var r=this.vboxes;r.sort(function(r,n){return t.naturalOrder(t.sum(r.color),t.sum(n.color))});var n=r[0].color;n[0]<5&&n[1]<5&&n[2]<5&&(r[0].color=[0,0,0]);var o=r.length-1,e=r[o].color;e[0]>251&&e[1]>251&&e[2]>251&&(r[o].color=[255,255,255])}},{quantize:function(h,c){if(!h.length||c<2||c>256)return!1;var f=function(t){var o,i=new Array(1<<3*r);return t.forEach(function(t){o=e(t[0]>>n,t[1]>>n,t[2]>>n),i[o]=(i[o]||0)+1}),i}(h);f.forEach(function(){});var v=function(t,r){var o,e,i,a=1e6,s=0,h=1e6,c=0,f=1e6,v=0;return t.forEach(function(t){(o=t[0]>>n)<a?a=o:o>s&&(s=o),(e=t[1]>>n)<h?h=e:e>c&&(c=e),(i=t[2]>>n)<f?f=i:i>v&&(v=i)}),new u(a,s,h,c,f,v,r)}(h,f),l=new i(function(r,n){return t.naturalOrder(r.count(),n.count())});function g(t,r){for(var n,e=t.size(),i=0;i<o;){if(e>=r)return;if(i++>o)return;if((n=t.pop()).count()){var u=s(f,n),a=u[0],h=u[1];if(!a)return;t.push(a),h&&(t.push(h),e++)}else t.push(n),i++}}l.push(v),g(l,.75*c);for(var p=new i(function(r,n){return t.naturalOrder(r.count()*r.volume(),n.count()*n.volume())});l.size();)p.push(l.pop());g(p,c);for(var d=new a;p.size();)d.push(p.pop());return d}}}().quantize,n=function(t){this.canvas=document.createElement(\"canvas\"),this.context=this.canvas.getContext(\"2d\"),this.width=this.canvas.width=t.width,this.height=this.canvas.height=t.height,this.context.drawImage(t,0,0,this.width,this.height)};n.prototype.getImageData=function(){return this.context.getImageData(0,0,this.width,this.height)};var o=function(){};return o.prototype.getColor=function(t,r){return void 0===r&&(r=10),this.getPalette(t,5,r)[0]},o.prototype.getPalette=function(t,o,e){var i=function(t){var r=t.colorCount,n=t.quality;if(void 0!==r&&Number.isInteger(r)){if(1===r)throw new Error(\"colorCount should be between 2 and 20. To get one color, call getColor() instead of getPalette()\");r=Math.max(r,2),r=Math.min(r,20)}else r=10;return void 0===n||Number.isInteger(n)?n=10:n<1&&(n=10),{colorCount:r,quality:n}}({colorCount:o,quality:e}),u=new n(t),a=function(t,r,n){for(var o=t,e=[],i=0,u=void 0,a=void 0,s=void 0,h=void 0,c=void 0;i<r;i+=n)a=o[0+(u=4*i)],s=o[u+1],h=o[u+2],(void 0===(c=o[u+3])||c>=125)&&(a>250&&s>250&&h>250||e.push([a,s,h]));return e}(u.getImageData().data,u.width*u.height,i.quality),s=r(a,i.colorCount);return s?s.palette():null},o.prototype.getColorFromUrl=function(t,r,n){var o=document.createElement(\"img\"),e=this;o.addEventListener(\"load\",function(){var i=e.getPalette(o,5,n);r(i[0],t)}),o.src=t},o.prototype.getImageData=function(t,r){var n=new XMLHttpRequest;n.open(\"GET\",t,!0),n.responseType=\"arraybuffer\",n.onload=function(){if(200==this.status){var t=new Uint8Array(this.response);o=t.length;for(var n=new Array(o),o=0;o<t.length;o++)n[o]=String.fromCharCode(t[o]);var e=n.join(\"\"),i=window.btoa(e);r(\"data:image/png;base64,\"+i)}},n.send()},o.prototype.getColorAsync=function(t,r,n){var o=this;this.getImageData(t,function(t){var e=document.createElement(\"img\");e.addEventListener(\"load\",function(){var t=o.getPalette(e,5,n);r(t[0],this)}),e.src=t})},o});\n","var arrayPush = require('./_arrayPush'),\n isFlattenable = require('./_isFlattenable');\n\n/**\n * The base implementation of `_.flatten` with support for restricting flattening.\n *\n * @private\n * @param {Array} array The array to flatten.\n * @param {number} depth The maximum recursion depth.\n * @param {boolean} [predicate=isFlattenable] The function invoked per iteration.\n * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks.\n * @param {Array} [result=[]] The initial result value.\n * @returns {Array} Returns the new flattened array.\n */\nfunction baseFlatten(array, depth, predicate, isStrict, result) {\n var index = -1,\n length = array.length;\n\n predicate || (predicate = isFlattenable);\n result || (result = []);\n\n while (++index < length) {\n var value = array[index];\n if (depth > 0 && predicate(value)) {\n if (depth > 1) {\n // Recursively flatten arrays (susceptible to call stack limits).\n baseFlatten(value, depth - 1, predicate, isStrict, result);\n } else {\n arrayPush(result, value);\n }\n } else if (!isStrict) {\n result[result.length] = value;\n }\n }\n return result;\n}\n\nmodule.exports = baseFlatten;\n","/**\n * Appends the elements of `values` to `array`.\n *\n * @private\n * @param {Array} array The array to modify.\n * @param {Array} values The values to append.\n * @returns {Array} Returns `array`.\n */\nfunction arrayPush(array, values) {\n var index = -1,\n length = values.length,\n offset = array.length;\n\n while (++index < length) {\n array[offset + index] = values[index];\n }\n return array;\n}\n\nmodule.exports = arrayPush;\n","var Symbol = require('./_Symbol'),\n isArguments = require('./isArguments'),\n isArray = require('./isArray');\n\n/** Built-in value references. */\nvar spreadableSymbol = Symbol ? Symbol.isConcatSpreadable : undefined;\n\n/**\n * Checks if `value` is a flattenable `arguments` object or array.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is flattenable, else `false`.\n */\nfunction isFlattenable(value) {\n return isArray(value) || isArguments(value) ||\n !!(spreadableSymbol && value && value[spreadableSymbol]);\n}\n\nmodule.exports = isFlattenable;\n","var freeGlobal = require('./_freeGlobal');\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\nmodule.exports = root;\n","/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\nmodule.exports = freeGlobal;\n","var baseIsArguments = require('./_baseIsArguments'),\n isObjectLike = require('./isObjectLike');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Built-in value references. */\nvar propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n/**\n * Checks if `value` is likely an `arguments` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n * else `false`.\n * @example\n *\n * _.isArguments(function() { return arguments; }());\n * // => true\n *\n * _.isArguments([1, 2, 3]);\n * // => false\n */\nvar isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {\n return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&\n !propertyIsEnumerable.call(value, 'callee');\n};\n\nmodule.exports = isArguments;\n","var baseGetTag = require('./_baseGetTag'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]';\n\n/**\n * The base implementation of `_.isArguments`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n */\nfunction baseIsArguments(value) {\n return isObjectLike(value) && baseGetTag(value) == argsTag;\n}\n\nmodule.exports = baseIsArguments;\n","var Symbol = require('./_Symbol'),\n getRawTag = require('./_getRawTag'),\n objectToString = require('./_objectToString');\n\n/** `Object#toString` result references. */\nvar nullTag = '[object Null]',\n undefinedTag = '[object Undefined]';\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * The base implementation of `getTag` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nfunction baseGetTag(value) {\n if (value == null) {\n return value === undefined ? undefinedTag : nullTag;\n }\n return (symToStringTag && symToStringTag in Object(value))\n ? getRawTag(value)\n : objectToString(value);\n}\n\nmodule.exports = baseGetTag;\n","var Symbol = require('./_Symbol');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the raw `toStringTag`.\n */\nfunction getRawTag(value) {\n var isOwn = hasOwnProperty.call(value, symToStringTag),\n tag = value[symToStringTag];\n\n try {\n value[symToStringTag] = undefined;\n var unmasked = true;\n } catch (e) {}\n\n var result = nativeObjectToString.call(value);\n if (unmasked) {\n if (isOwn) {\n value[symToStringTag] = tag;\n } else {\n delete value[symToStringTag];\n }\n }\n return result;\n}\n\nmodule.exports = getRawTag;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/**\n * Converts `value` to a string using `Object.prototype.toString`.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\nfunction objectToString(value) {\n return nativeObjectToString.call(value);\n}\n\nmodule.exports = objectToString;\n","/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\nvar isArray = Array.isArray;\n\nmodule.exports = isArray;\n","export default function _assertThisInitialized(self) {\n if (self === void 0) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }\n\n return self;\n}","export default function _inheritsLoose(subClass, superClass) {\n subClass.prototype = Object.create(superClass.prototype);\n subClass.prototype.constructor = subClass;\n subClass.__proto__ = superClass;\n}","/**\r\n * The `extract` utility deletes a property from an object and returns its\r\n * value.\r\n */\r\nexport default function extract(object: object, property: string): any {\r\n const value = object[property];\r\n\r\n delete object[property];\r\n\r\n return value;\r\n}\r\n","/**\r\n * Extract the text nodes from a virtual element.\r\n *\r\n * @param {VirtualElement} vdom\r\n * @return {String}\r\n */\r\nexport default function extractText(vdom: any): string {\r\n if (vdom instanceof Array) {\r\n return vdom.map((element) => extractText(element)).join('');\r\n } else if (typeof vdom === 'object' && vdom !== null) {\r\n return vdom.text || extractText(vdom.children);\r\n } else {\r\n return vdom;\r\n }\r\n}\r\n","/**\r\n * The `username` helper displays a user's username in a <span class=\"username\">\r\n * tag. If the user doesn't exist, the username will be displayed as [deleted].\r\n *\r\n * @param {User} user\r\n */\r\nexport default function username(user): any {\r\n const name = (user && user.displayName()) || app.translator.trans('core.lib.username.deleted_text');\r\n\r\n return <span className=\"username\">{name}</span>;\r\n}\r\n","import extract from './utils/extract';\r\nimport extractText from './utils/extractText';\r\nimport username from './helpers/username';\r\n\r\ntype Translations = { [key: string]: string };\r\n\r\nexport default class Translator {\r\n /**\r\n * A map of translation keys to their translated values.\r\n */\r\n translations: Translations = {};\r\n locale?: string;\r\n\r\n addTranslations(translations) {\r\n Object.assign(this.translations, translations);\r\n }\r\n\r\n trans(id: string, parameters?: any): string | any[] {\r\n const translation = this.translations[id];\r\n\r\n if (translation) {\r\n return this.apply(translation, parameters || {});\r\n }\r\n\r\n return id;\r\n }\r\n\r\n transText(id: string, parameters?: any): string {\r\n return extractText(this.trans(id, parameters));\r\n }\r\n\r\n transChoice(id: string, number: number, parameters: any): string | any[] {\r\n let translation: string = this.translations[id];\r\n\r\n if (translation) {\r\n translation = this.pluralize(translation, number);\r\n\r\n return this.apply(translation, parameters || {});\r\n }\r\n\r\n return id;\r\n }\r\n\r\n apply(translation: string, input: any) {\r\n if ('user' in input) {\r\n const user = extract(input, 'user');\r\n if (!input.username) input.username = username(user);\r\n }\r\n\r\n const parts = translation.split(new RegExp('({[a-z0-9_]+}|</?[a-z0-9_]+>)', 'gi'));\r\n\r\n const hydrated: any[] = [];\r\n const open: any[][] = [hydrated];\r\n\r\n parts.forEach((part) => {\r\n const match = part.match(new RegExp('{([a-z0-9_]+)}|<(/?)([a-z0-9_]+)>', 'i'));\r\n\r\n if (match) {\r\n if (match[1]) {\r\n open[0].push(input[match[1]]);\r\n } else if (match[3]) {\r\n if (match[2]) {\r\n open.shift();\r\n } else {\r\n let tag = input[match[3]] || { tag: match[3], children: [] };\r\n open[0].push(tag);\r\n open.unshift(tag.children || tag);\r\n }\r\n }\r\n } else {\r\n open[0].push({ tag: 'span', text: part });\r\n }\r\n });\r\n\r\n return hydrated.filter((part) => part);\r\n }\r\n\r\n pluralize(translation: string, number: number): string | undefined {\r\n const sPluralRegex = new RegExp(/^\\w+\\: +(.+)$/),\r\n cPluralRegex = new RegExp(\r\n /^\\s*((\\{\\s*(\\-?\\d+[\\s*,\\s*\\-?\\d+]*)\\s*\\})|([\\[\\]])\\s*(-Inf|\\-?\\d+)\\s*,\\s*(\\+?Inf|\\-?\\d+)\\s*([\\[\\]]))\\s?(.+?)$/\r\n ),\r\n iPluralRegex = new RegExp(/^\\s*(\\{\\s*(\\-?\\d+[\\s*,\\s*\\-?\\d+]*)\\s*\\})|([\\[\\]])\\s*(-Inf|\\-?\\d+)\\s*,\\s*(\\+?Inf|\\-?\\d+)\\s*([\\[\\]])/),\r\n standardRules = [],\r\n explicitRules = [];\r\n\r\n translation.split('|').forEach((part) => {\r\n if (cPluralRegex.test(part)) {\r\n const matches = part.match(cPluralRegex);\r\n explicitRules[matches[0]] = matches[matches.length - 1];\r\n } else if (sPluralRegex.test(part)) {\r\n const matches = part.match(sPluralRegex);\r\n standardRules.push(matches[1]);\r\n } else {\r\n standardRules.push(part);\r\n }\r\n });\r\n\r\n explicitRules.forEach((rule, e) => {\r\n if (iPluralRegex.test(e)) {\r\n const matches = e.match(iPluralRegex);\r\n\r\n if (matches[1]) {\r\n const ns = matches[2].split(',');\r\n\r\n for (let n in ns) {\r\n if (number == ns[n]) {\r\n return explicitRules[e];\r\n }\r\n }\r\n } else {\r\n const leftNumber = this.convertNumber(matches[4]);\r\n const rightNumber = this.convertNumber(matches[5]);\r\n\r\n if (\r\n ('[' === matches[3] ? number >= leftNumber : number > leftNumber) &&\r\n (']' === matches[6] ? number <= rightNumber : number < rightNumber)\r\n ) {\r\n return explicitRules[e];\r\n }\r\n }\r\n }\r\n });\r\n\r\n return standardRules[this.pluralPosition(number, this.locale)] || standardRules[0] || undefined;\r\n }\r\n\r\n convertNumber(number: string): number {\r\n if ('-Inf' === number) {\r\n return Number.NEGATIVE_INFINITY;\r\n } else if ('+Inf' === number || 'Inf' === number) {\r\n return Number.POSITIVE_INFINITY;\r\n }\r\n\r\n return parseInt(number, 10);\r\n }\r\n\r\n pluralPosition(number: number, locale: string): number {\r\n if ('pt_BR' === locale) {\r\n locale = 'xbr';\r\n }\r\n\r\n if (locale.length > 3) {\r\n locale = locale.split('_')[0];\r\n }\r\n\r\n switch (locale) {\r\n case 'bo':\r\n case 'dz':\r\n case 'id':\r\n case 'ja':\r\n case 'jv':\r\n case 'ka':\r\n case 'km':\r\n case 'kn':\r\n case 'ko':\r\n case 'ms':\r\n case 'th':\r\n case 'vi':\r\n case 'zh':\r\n return 0;\r\n\r\n case 'af':\r\n case 'az':\r\n case 'bn':\r\n case 'bg':\r\n case 'ca':\r\n case 'da':\r\n case 'de':\r\n case 'el':\r\n case 'en':\r\n case 'eo':\r\n case 'es':\r\n case 'et':\r\n case 'eu':\r\n case 'fa':\r\n case 'fi':\r\n case 'fo':\r\n case 'fur':\r\n case 'fy':\r\n case 'gl':\r\n case 'gu':\r\n case 'ha':\r\n case 'he':\r\n case 'hu':\r\n case 'is':\r\n case 'it':\r\n case 'ku':\r\n case 'lb':\r\n case 'ml':\r\n case 'mn':\r\n case 'mr':\r\n case 'nah':\r\n case 'nb':\r\n case 'ne':\r\n case 'nl':\r\n case 'nn':\r\n case 'no':\r\n case 'om':\r\n case 'or':\r\n case 'pa':\r\n case 'pap':\r\n case 'ps':\r\n case 'pt':\r\n case 'so':\r\n case 'sq':\r\n case 'sv':\r\n case 'sw':\r\n case 'ta':\r\n case 'te':\r\n case 'tk':\r\n case 'tr':\r\n case 'ur':\r\n case 'zu':\r\n return number == 1 ? 0 : 1;\r\n\r\n case 'am':\r\n case 'bh':\r\n case 'fil':\r\n case 'fr':\r\n case 'gun':\r\n case 'hi':\r\n case 'ln':\r\n case 'mg':\r\n case 'nso':\r\n case 'xbr':\r\n case 'ti':\r\n case 'wa':\r\n return number === 0 || number == 1 ? 0 : 1;\r\n\r\n case 'be':\r\n case 'bs':\r\n case 'hr':\r\n case 'ru':\r\n case 'sr':\r\n case 'uk':\r\n return number % 10 == 1 && number % 100 != 11\r\n ? 0\r\n : number % 10 >= 2 && number % 10 <= 4 && (number % 100 < 10 || number % 100 >= 20)\r\n ? 1\r\n : 2;\r\n\r\n case 'cs':\r\n case 'sk':\r\n return number == 1 ? 0 : number >= 2 && number <= 4 ? 1 : 2;\r\n\r\n case 'ga':\r\n return number == 1 ? 0 : number == 2 ? 1 : 2;\r\n\r\n case 'lt':\r\n return number % 10 == 1 && number % 100 != 11 ? 0 : number % 10 >= 2 && (number % 100 < 10 || number % 100 >= 20) ? 1 : 2;\r\n\r\n case 'sl':\r\n return number % 100 == 1 ? 0 : number % 100 == 2 ? 1 : number % 100 == 3 || number % 100 == 4 ? 2 : 3;\r\n\r\n case 'mk':\r\n return number % 10 == 1 ? 0 : 1;\r\n\r\n case 'mt':\r\n return number == 1 ? 0 : number === 0 || (number % 100 > 1 && number % 100 < 11) ? 1 : number % 100 > 10 && number % 100 < 20 ? 2 : 3;\r\n\r\n case 'lv':\r\n return number === 0 ? 0 : number % 10 == 1 && number % 100 != 11 ? 1 : 2;\r\n\r\n case 'pl':\r\n return number == 1 ? 0 : number % 10 >= 2 && number % 10 <= 4 && (number % 100 < 12 || number % 100 > 14) ? 1 : 2;\r\n\r\n case 'cy':\r\n return number == 1 ? 0 : number == 2 ? 1 : number == 8 || number == 11 ? 2 : 3;\r\n\r\n case 'ro':\r\n return number == 1 ? 0 : number === 0 || (number % 100 > 0 && number % 100 < 20) ? 1 : 2;\r\n\r\n case 'ar':\r\n return number === 0 ? 0 : number == 1 ? 1 : number == 2 ? 2 : number >= 3 && number <= 10 ? 3 : number >= 11 && number <= 99 ? 4 : 5;\r\n\r\n default:\r\n return 0;\r\n }\r\n }\r\n}\r\n","import User from './models/User';\r\n\r\n/**\r\n * The `Session` class defines the current user session. It stores a reference\r\n * to the current authenticated user, and provides methods to log in/out.\r\n */\r\nexport default class Session {\r\n /**\r\n * The current authenticated user.\r\n */\r\n user: User;\r\n\r\n /**\r\n * The CSRF token.\r\n */\r\n csrfToken?: string;\r\n\r\n constructor(user, csrfToken) {\r\n this.user = user;\r\n\r\n this.csrfToken = csrfToken;\r\n }\r\n\r\n /**\r\n * Attempt to log in a user.\r\n */\r\n login(body: { identification: string; password: string; remember?: boolean }, options = {}) {\r\n return app.request(\r\n Object.assign(\r\n {\r\n method: 'POST',\r\n url: `${app.forum.attribute('baseUrl')}/login`,\r\n body,\r\n },\r\n options\r\n )\r\n );\r\n }\r\n\r\n /**\r\n * Log the user out.\r\n *\r\n * @public\r\n */\r\n logout() {\r\n window.location.href = `${app.forum.attribute('baseUrl')}/logout?token=${this.csrfToken}`;\r\n }\r\n}\r\n","import Model from './Model';\r\n\r\n/**\r\n * The `Store` class defines a local data store, and provides methods to\r\n * retrieve data from the API.\r\n */\r\nexport default class Store {\r\n /**\r\n * The local data store. A tree of resource types to IDs, such that\r\n * accessing data[type][id] will return the model for that type/ID.\r\n */\r\n data: { [key: string]: Model[] } = {};\r\n\r\n /**\r\n * The model registry. A map of resource types to the model class that\r\n * should be used to represent resources of that type.\r\n */\r\n models: {};\r\n\r\n constructor(models) {\r\n this.models = models;\r\n }\r\n\r\n /**\r\n * Push resources contained within an API payload into the store.\r\n *\r\n * @param payload\r\n * @return The model(s) representing the resource(s) contained\r\n * within the 'data' key of the payload.\r\n */\r\n pushPayload(payload: { included?: {}[]; data?: {} | {}[] }): Model | Model[] {\r\n if (payload.included) payload.included.map(this.pushObject.bind(this));\r\n\r\n const result: any = payload.data instanceof Array ? payload.data.map(this.pushObject.bind(this)) : this.pushObject(payload.data);\r\n\r\n // Attach the original payload to the model that we give back. This is\r\n // useful to consumers as it allows them to access meta information\r\n // associated with their request.\r\n result.payload = payload;\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Create a model to represent a resource object (or update an existing one),\r\n * and push it into the store.\r\n *\r\n * @param {Object} data The resource object\r\n * @return The model, or null if no model class has been\r\n * registered for this resource type.\r\n */\r\n pushObject(data): Model | null {\r\n if (!this.models[data.type]) return null;\r\n\r\n const type = (this.data[data.type] = this.data[data.type] || {});\r\n\r\n if (type[data.id]) {\r\n type[data.id].pushData(data);\r\n } else {\r\n type[data.id] = this.createRecord(data.type, data);\r\n }\r\n\r\n type[data.id].exists = true;\r\n\r\n return type[data.id];\r\n }\r\n\r\n /**\r\n * Make a request to the API to find record(s) of a specific type.\r\n *\r\n * @param type The resource type.\r\n * @param [id] The ID(s) of the model(s) to retrieve.\r\n * Alternatively, if an object is passed, it will be handled as the\r\n * `query` parameter.\r\n * @param query\r\n * @param options\r\n */\r\n find<T extends Model = Model>(type: string, id?: number | number[] | any, query = {}, options = {}): Promise<T | T[]> {\r\n let params = query;\r\n let url = `${app.forum.attribute('apiUrl')}/${type}`;\r\n\r\n if (id instanceof Array) {\r\n url += `?filter[id]=${id.join(',')}`;\r\n } else if (typeof id === 'object') {\r\n params = id;\r\n } else if (id) {\r\n url += `/${id}`;\r\n }\r\n\r\n return <Promise<T | T[]>>app\r\n .request(\r\n Object.assign(\r\n {\r\n method: 'GET',\r\n url,\r\n params,\r\n },\r\n options\r\n )\r\n )\r\n .then(this.pushPayload.bind(this));\r\n }\r\n\r\n /**\r\n * Get a record from the store by ID.\r\n *\r\n * @param type The resource type.\r\n * @param id The resource ID.\r\n */\r\n getById<T extends Model = Model>(type: string, id: number | string): T {\r\n return this.data[type] && (this.data[type][id] as T);\r\n }\r\n\r\n /**\r\n * Get a record from the store by the value of a model attribute.\r\n *\r\n * @param type The resource type.\r\n * @param key The name of the method on the model.\r\n * @param value The value of the model attribute.\r\n */\r\n getBy<T extends Model = Model>(type: string, key: string, value: any): T {\r\n return this.all<T>(type).filter((model) => model[key]() === value)[0];\r\n }\r\n\r\n /**\r\n * Get all loaded records of a specific type.\r\n */\r\n all<T extends Model = Model>(type: string): T[] {\r\n const records = this.data[type];\r\n\r\n return records ? Object.keys(records).map((id) => records[id]) : [];\r\n }\r\n\r\n /**\r\n * Remove the given model from the store.\r\n */\r\n remove(model: Model) {\r\n delete this.data[model.data.type][model.id()];\r\n }\r\n\r\n /**\r\n * Create a new record of the given type.\r\n *\r\n * @param {String} type The resource type\r\n * @param {Object} [data] Any data to initialize the model with\r\n */\r\n createRecord<T extends Model = Model>(type: string, data: any = {}): T {\r\n data.type = data.type || type;\r\n\r\n return new this.models[type](data, this);\r\n }\r\n}\r\n","/**\r\n * Extend an object's method by running its output through a mutating callback\r\n * every time it is called.\r\n *\r\n * The callback accepts the method's return value and should perform any\r\n * mutations directly on this value. For this reason, this function will not be\r\n * effective on methods which return scalar values (numbers, strings, booleans).\r\n *\r\n * Care should be taken to extend the correct object – in most cases, a class'\r\n * prototype will be the desired target of extension, not the class itself.\r\n *\r\n * @example\r\n * extend(Discussion.prototype, 'badges', function(badges) {\r\n * // do something with `badges`\r\n * });\r\n *\r\n * @param {Object} object The object that owns the method\r\n * @param {String} method The name of the method to extend\r\n * @param {function} callback A callback which mutates the method's output\r\n */\r\nexport function extend(object, method, callback) {\r\n const original = object[method];\r\n\r\n object[method] = (...args) => {\r\n // @ts-ignore\r\n const value = original ? original.apply(object, args) : undefined;\r\n\r\n // @ts-ignore\r\n callback.apply(object, [value].concat(args));\r\n\r\n return value;\r\n };\r\n\r\n Object.assign(object[method], original);\r\n}\r\n\r\n/**\r\n * Override an object's method by replacing it with a new function, so that the\r\n * new function will be run every time the object's method is called.\r\n *\r\n * The replacement function accepts the original method as its first argument,\r\n * which is like a call to 'super'. Any arguments passed to the original method\r\n * are also passed to the replacement.\r\n *\r\n * Care should be taken to extend the correct object – in most cases, a class'\r\n * prototype will be the desired target of extension, not the class itself.\r\n *\r\n * @example\r\n * override(Discussion.prototype, 'badges', function(original) {\r\n * const badges = original();\r\n * // do something with badges\r\n * return badges;\r\n * });\r\n *\r\n * @param {Object} object The object that owns the method\r\n * @param {String} method The name of the method to override\r\n * @param {function} newMethod The method to replace it with\r\n */\r\nexport function override(object, method, newMethod) {\r\n const original = object[method];\r\n\r\n object[method] = function (...args) {\r\n // @ts-ignore\r\n return newMethod.apply(this, [original.bind(this)].concat(args));\r\n };\r\n\r\n Object.assign(object[method], original);\r\n}\r\n","import { RouteDefs } from 'mithril';\r\n\r\n/**\r\n * The `mapRoutes` utility converts a map of named application routes into a\r\n * format that can be understood by Mithril.\r\n *\r\n * @see https://lhorie.github.io/mithril/mithril.route.html#defining-routes\r\n */\r\nexport default function mapRoutes(routes: object, basePath: string = ''): RouteDefs {\r\n const map = {};\r\n\r\n for (const key in routes) {\r\n const route = routes[key];\r\n\r\n if (route.component) {\r\n if (!route.component.attrs) route.component.attrs = {};\r\n route.component.attrs.routeName = key;\r\n }\r\n\r\n map[basePath + route.path] = route.component;\r\n }\r\n\r\n return map;\r\n}\r\n","/**\r\n * The `Drawer` class controls the page's drawer. The drawer is the area the\r\n * slides out from the left on mobile devices; it contains the header and the\r\n * footer.\r\n */\r\nexport default class Drawer {\r\n private $backdrop?: ZeptoCollection;\r\n\r\n constructor() {\r\n // Set up an event handler so that whenever the content area is tapped,\r\n // the drawer will close.\r\n $('#content').click((e) => {\r\n if (this.isOpen()) {\r\n e.preventDefault();\r\n this.hide();\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Check whether or not the drawer is currently open.\r\n */\r\n isOpen(): boolean {\r\n return $('#app').hasClass('drawerOpen');\r\n }\r\n\r\n /**\r\n * Hide the drawer.\r\n */\r\n hide() {\r\n $('#app').removeClass('drawerOpen');\r\n\r\n if (this.$backdrop) this.$backdrop.remove();\r\n }\r\n\r\n /**\r\n * Show the drawer.\r\n */\r\n public show() {\r\n $('#app').addClass('drawerOpen');\r\n\r\n this.$backdrop = $('<div/>')\r\n .addClass('drawer-backdrop fade')\r\n .appendTo('body')\r\n .click(() => this.hide());\r\n\r\n requestAnimationFrame(() => this.$backdrop!.addClass('in'));\r\n }\r\n}\r\n","import Mithril from 'mithril';\r\n\r\nexport interface RequestErrorResponse extends JSON {\r\n errors?: {\r\n code: string;\r\n source?: {\r\n pointer: string;\r\n };\r\n }[];\r\n}\r\n\r\nexport default class RequestError {\r\n status: number;\r\n responseText: string;\r\n options: Mithril.RequestOptions;\r\n xhr: XMLHttpRequest;\r\n response?: RequestErrorResponse;\r\n alert?: Mithril.Vnode;\r\n\r\n constructor(status, responseText, options, xhr) {\r\n this.status = status;\r\n this.responseText = responseText;\r\n this.options = options;\r\n this.xhr = xhr;\r\n\r\n try {\r\n this.response = JSON.parse(responseText);\r\n } catch (e) {\r\n this.response = null;\r\n }\r\n\r\n this.alert = null;\r\n }\r\n}\r\n","class Item<T> {\r\n content: T;\r\n priority: number;\r\n key: number = 0;\r\n\r\n constructor(content: any, priority: number) {\r\n this.content = content;\r\n this.priority = priority;\r\n }\r\n}\r\n\r\nexport default class ItemList<T = any> {\r\n private items: { [key: string]: Item<T> } = {};\r\n\r\n /**\r\n * Check whether the list is empty.\r\n *\r\n * @returns {boolean}\r\n * @public\r\n */\r\n isEmpty(): boolean {\r\n for (const i in this.items) {\r\n if (this.items.hasOwnProperty(i)) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Check whether an item is present in the list.\r\n */\r\n has(key: any): boolean {\r\n return !!this.items[key];\r\n }\r\n\r\n /**\r\n * Get the content of an item.\r\n */\r\n get(key: any): T {\r\n return this.items[key]?.content;\r\n }\r\n\r\n /**\r\n * Add an item to the list.\r\n *\r\n * @param {String} key A unique key for the item.\r\n * @param {*} content The item's content.\r\n * @param {Integer} [priority] The priority of the item. Items with a higher\r\n * priority will be positioned before items with a lower priority.\r\n * @return {ItemList}\r\n * @public\r\n */\r\n add(key: any, content: T, priority = 0) {\r\n this.items[key] = new Item(content, priority);\r\n\r\n return this;\r\n }\r\n\r\n toArray(): T[] {\r\n const items: Item<T>[] = [];\r\n\r\n for (const i in this.items) {\r\n if (this.items.hasOwnProperty(i)) {\r\n if (this.items[i] !== null && this.items[i] instanceof Item) {\r\n this.items[i].content = Object(this.items[i].content);\r\n\r\n // @ts-ignore\r\n this.items[i].content.itemName = i;\r\n items.push(this.items[i]);\r\n this.items[i].key = items.length;\r\n }\r\n }\r\n }\r\n\r\n return items\r\n .sort((a, b) => {\r\n if (a.priority === b.priority) {\r\n return a.key - b.key;\r\n } else if (a.priority > b.priority) {\r\n return -1;\r\n }\r\n return 1;\r\n })\r\n .map((item) => item.content);\r\n }\r\n}\r\n","const later =\r\n window.requestAnimationFrame ||\r\n window.webkitRequestAnimationFrame ||\r\n window.mozRequestAnimationFrame ||\r\n window.msRequestAnimationFrame ||\r\n window.oRequestAnimationFrame ||\r\n ((callback) => window.setTimeout(callback, 1000 / 60));\r\n\r\n/**\r\n * The `ScrollListener` class sets up a listener that handles window scroll\r\n * events.\r\n */\r\nexport default class ScrollListener {\r\n ticking: boolean = false;\r\n\r\n callback: Function;\r\n active: EventListener;\r\n\r\n /**\r\n * @param callback The callback to run when the scroll position\r\n * changes.\r\n */\r\n public constructor(callback: Function) {\r\n this.callback = callback;\r\n }\r\n\r\n /**\r\n * On each animation frame, as long as the listener is active, run the\r\n * `update` method.\r\n */\r\n protected loop() {\r\n // THROTTLE: If the callback is still running (or hasn't yet run), we ignore\r\n // further scroll events.\r\n if (this.ticking) return;\r\n\r\n // Schedule the callback to be executed soon (TM), and stop throttling once\r\n // the callback is done.\r\n later(() => {\r\n this.update();\r\n this.ticking = false;\r\n });\r\n\r\n this.ticking = true;\r\n }\r\n\r\n /**\r\n * Run the callback, whether there was a scroll event or not.\r\n */\r\n public update() {\r\n this.callback(window.pageYOffset);\r\n }\r\n\r\n /**\r\n * Start listening to and handling the window's scroll position.\r\n */\r\n public start() {\r\n if (!this.active) {\r\n window.addEventListener('scroll', (this.active = this.loop.bind(this)));\r\n }\r\n }\r\n\r\n /**\r\n * Stop listening to and handling the window's scroll position.\r\n */\r\n public stop() {\r\n window.removeEventListener('scroll', this.active);\r\n\r\n this.active = null;\r\n }\r\n}\r\n","import Store from './Store';\r\n\r\nexport interface Identifier {\r\n type: string;\r\n id: string;\r\n}\r\n\r\nexport interface Data extends Identifier {\r\n attributes?: { [key: string]: any };\r\n relationships?: { [key: string]: { data: Identifier | Identifier[] } };\r\n}\r\n\r\n/**\r\n * The `Model` class represents a local data resource. It provides methods to\r\n * persist changes via the API.\r\n */\r\nexport default abstract class Model {\r\n /**\r\n * The resource object from the API.\r\n */\r\n data: Data;\r\n\r\n payload: any;\r\n\r\n /**\r\n * The time at which the model's data was last updated. Watching the value\r\n * of this property is a fast way to retain/cache a subtree if data hasn't\r\n * changed.\r\n */\r\n freshness: Date;\r\n\r\n /**\r\n * Whether or not the resource exists on the server.\r\n */\r\n exists: boolean;\r\n\r\n /**\r\n * The data store that this resource should be persisted to.\r\n */\r\n protected store?: Store;\r\n\r\n /**\r\n * @param data A resource object from the API.\r\n * @param store The data store that this model should be persisted to.\r\n */\r\n constructor(data = <Data>{}, store?: Store) {\r\n this.data = data;\r\n this.store = store;\r\n\r\n this.freshness = new Date();\r\n this.exists = false;\r\n }\r\n\r\n /**\r\n * Get the model's ID.\r\n * @final\r\n */\r\n id(): string {\r\n return this.data.id;\r\n }\r\n\r\n /**\r\n * Get one of the model's attributes.\r\n * @final\r\n */\r\n attribute(attribute: string): any {\r\n return this.data.attributes && this.data.attributes[attribute];\r\n }\r\n\r\n /**\r\n * Merge new data into this model locally.\r\n *\r\n * @param data A resource object to merge into this model\r\n */\r\n public pushData(data: {}) {\r\n // Since most of the top-level items in a resource object are objects\r\n // (e.g. relationships, attributes), we'll need to check and perform the\r\n // merge at the second level if that's the case.\r\n for (const key in data) {\r\n if (typeof data[key] === 'object') {\r\n this.data[key] = this.data[key] || {};\r\n\r\n // For every item in a second-level object, we want to check if we've\r\n // been handed a Model instance. If so, we will convert it to a\r\n // relationship data object.\r\n for (const innerKey in data[key]) {\r\n if (data[key][innerKey] instanceof Model) {\r\n data[key][innerKey] = { data: Model.getIdentifier(data[key][innerKey]) };\r\n }\r\n this.data[key][innerKey] = data[key][innerKey];\r\n }\r\n } else {\r\n this.data[key] = data[key];\r\n }\r\n }\r\n\r\n // Now that we've updated the data, we can say that the model is fresh.\r\n // This is an easy way to invalidate retained subtrees etc.\r\n this.freshness = new Date();\r\n }\r\n\r\n /**\r\n * Merge new attributes into this model locally.\r\n *\r\n * @param attributes The attributes to merge.\r\n */\r\n pushAttributes(attributes: any) {\r\n this.pushData({ attributes });\r\n }\r\n\r\n /**\r\n * Merge new attributes into this model, both locally and with persistence.\r\n *\r\n * @param attributes The attributes to save. If a 'relationships' key\r\n * exists, it will be extracted and relationships will also be saved.\r\n * @param [options]\r\n */\r\n save(attributes: any, options: any = {}): Promise<Model | Model[]> {\r\n const data: Data = {\r\n type: this.data.type,\r\n id: this.data.id,\r\n attributes,\r\n };\r\n\r\n // If a 'relationships' key exists, extract it from the attributes hash and\r\n // set it on the top-level data object instead. We will be sending this data\r\n // object to the API for persistence.\r\n if (attributes.relationships) {\r\n data.relationships = {};\r\n\r\n for (const key in attributes.relationships) {\r\n const model = attributes.relationships[key];\r\n\r\n data.relationships[key] = {\r\n data: model instanceof Array ? model.map(Model.getIdentifier) : Model.getIdentifier(model),\r\n };\r\n }\r\n\r\n delete attributes.relationships;\r\n }\r\n\r\n // Before we update the model's data, we should make a copy of the model's\r\n // old data so that we can revert back to it if something goes awry during\r\n // persistence.\r\n const oldData = this.copyData();\r\n\r\n this.pushData(data);\r\n\r\n const request = { data };\r\n if (options.meta) request.meta = options.meta;\r\n\r\n return app\r\n .request(\r\n Object.assign(\r\n {\r\n method: this.exists ? 'PATCH' : 'POST',\r\n url: app.forum.attribute('apiUrl') + this.apiEndpoint(),\r\n body: request,\r\n },\r\n options\r\n )\r\n )\r\n .then(\r\n // If everything went well, we'll make sure the store knows that this\r\n // model exists now (if it didn't already), and we'll push the data that\r\n // the API returned into the store.\r\n (payload) => {\r\n this.store.data[payload.data.type] = this.store.data[payload.data.type] || {};\r\n this.store.data[payload.data.type][payload.data.id] = this;\r\n return this.store.pushPayload(payload);\r\n },\r\n\r\n // If something went wrong, though... good thing we backed up our model's\r\n // old data! We'll revert to that and let others handle the error.\r\n (response) => {\r\n this.pushData(oldData);\r\n m.redraw();\r\n throw response;\r\n }\r\n );\r\n }\r\n\r\n /**\r\n * Send a request to delete the resource.\r\n *\r\n * @param {Object} body Data to send along with the DELETE request.\r\n * @param {Object} [options]\r\n * @return {Promise}\r\n * @public\r\n */\r\n delete(body = {}, options = {}) {\r\n if (!this.exists) return Promise.resolve();\r\n\r\n return app\r\n .request(\r\n Object.assign(\r\n {\r\n method: 'DELETE',\r\n url: app.forum.attribute('apiUrl') + this.apiEndpoint(),\r\n body,\r\n },\r\n options\r\n )\r\n )\r\n .then(() => {\r\n this.exists = false;\r\n this.store!.remove(this);\r\n });\r\n }\r\n\r\n /**\r\n * Construct a path to the API endpoint for this resource.\r\n *\r\n * @return {String}\r\n * @protected\r\n */\r\n apiEndpoint() {\r\n return '/' + this.data.type + (this.exists ? '/' + this.data.id : '');\r\n }\r\n\r\n copyData() {\r\n return JSON.parse(JSON.stringify(this.data));\r\n }\r\n\r\n /**\r\n * Generate a function which returns the value of the given attribute.\r\n *\r\n * @param name\r\n * @param [transform] A function to transform the attribute value\r\n */\r\n static attribute(name: string, transform?: Function): () => any {\r\n return function (this: Model) {\r\n const value = this.data.attributes && this.data.attributes[name];\r\n\r\n return transform ? transform(value) : value;\r\n };\r\n }\r\n\r\n /**\r\n * Generate a function which returns the value of the given has-one\r\n * relationship.\r\n *\r\n * @return false if no information about the\r\n * relationship exists; undefined if the relationship exists but the model\r\n * has not been loaded; or the model if it has been loaded.\r\n */\r\n static hasOne(name: string): () => Model | boolean {\r\n return function (this: Model) {\r\n if (this.data.relationships) {\r\n const relationship = this.data.relationships[name];\r\n\r\n if (relationship && !Array.isArray(relationship.data)) {\r\n return app.store.getById(relationship.data.type, relationship.data.id);\r\n }\r\n }\r\n\r\n return false;\r\n };\r\n }\r\n\r\n /**\r\n * Generate a function which returns the value of the given has-many\r\n * relationship.\r\n *\r\n * @return false if no information about the relationship\r\n * exists; an array if it does, containing models if they have been\r\n * loaded, and undefined for those that have not.\r\n */\r\n static hasMany(name: string): () => any[] | false {\r\n return function (this: Model) {\r\n if (this.data.relationships) {\r\n const relationship = this.data.relationships[name];\r\n\r\n if (relationship && Array.isArray(relationship.data)) {\r\n return relationship.data.map((data) => app.store.getById(data.type, data.id));\r\n }\r\n }\r\n\r\n return false;\r\n };\r\n }\r\n\r\n /**\r\n * Transform the given value into a Date object.\r\n */\r\n static transformDate(value: string): Date | null {\r\n return value ? new Date(value) : null;\r\n }\r\n\r\n /**\r\n * Get a resource identifier object for the given model.\r\n */\r\n protected static getIdentifier(model: Model): Identifier {\r\n return {\r\n type: model.data.type,\r\n id: model.data.id,\r\n };\r\n }\r\n}\r\n","import Model from '../Model';\r\n\r\nexport default class Forum extends Model {\r\n apiEndpoint() {\r\n return '/';\r\n }\r\n}\r\n","/**\r\n * The `computed` utility creates a function that will cache its output until\r\n * any of the dependent values are dirty.\r\n *\r\n * @param dependentKeys The keys of the dependent values.\r\n * @param compute The function which computes the value using the\r\n * dependent values.\r\n */\r\nexport default function computed(dependentKeys: string | string[], compute: Function): () => any {\r\n const keys = [].concat(dependentKeys);\r\n\r\n const dependentValues = {};\r\n let computedValue;\r\n\r\n return function () {\r\n let recompute = false;\r\n\r\n // Read all of the dependent values. If any of them have changed since last\r\n // time, then we'll want to recompute our output.\r\n keys.forEach((key) => {\r\n const value = typeof this[key] === 'function' ? this[key]() : this[key];\r\n\r\n if (dependentValues[key] !== value) {\r\n recompute = true;\r\n dependentValues[key] = value;\r\n }\r\n });\r\n\r\n if (recompute) {\r\n computedValue = compute.apply(\r\n this,\r\n keys.map((key) => dependentValues[key])\r\n );\r\n }\r\n\r\n return computedValue;\r\n };\r\n}\r\n","/**\r\n * The `icon` helper displays an icon.\r\n *\r\n * @param {String} fontClass The full icon class, prefix and the icon’s name.\r\n * @param {Object} attrs Any other attributes to apply.\r\n */\r\nexport default function icon(fontClass: string, attrs: any = {}) {\r\n attrs.className = 'icon ' + fontClass + ' ' + (attrs.className || '');\r\n\r\n return <i {...attrs} />;\r\n}\r\n","import Component from '../Component';\r\nimport icon from '../helpers/icon';\r\nimport extract from '../utils/extract';\r\n\r\n/**\r\n * The `Badge` component represents a user/discussion badge, indicating some\r\n * status (e.g. a discussion is stickied, a user is an admin).\r\n *\r\n * A badge may have the following special props:\r\n *\r\n * - `type` The type of badge this is. This will be used to give the badge a\r\n * class name of `Badge--{type}`.\r\n * - `icon` The name of an icon to show inside the badge.\r\n * - `label`\r\n *\r\n * All other props will be assigned as attributes on the badge element.\r\n */\r\nexport default class Badge extends Component {\r\n view(vnode) {\r\n const attrs = vnode.attrs;\r\n const type = extract(attrs, 'type');\r\n const iconName = extract(attrs, 'icon');\r\n\r\n attrs.className = `Badge ${type ? `Badge--${type}` : ''} ${attrs.className || ''}`;\r\n attrs.title = extract(attrs, 'label') || '';\r\n\r\n return <span {...attrs}>{iconName ? icon(iconName, { className: 'Badge-icon' }) : m.trust('&nbsp;')}</span>;\r\n }\r\n\r\n oncreate(vnode) {\r\n super.oncreate(vnode);\r\n\r\n if (this.props.label) this.$().tooltip({ container: 'body' });\r\n }\r\n}\r\n","import Model from '../Model';\r\nimport computed from '../utils/computed';\r\nimport ItemList from '../utils/ItemList';\r\nimport Badge from '../components/Badge';\r\n\r\nimport User from './User';\r\nimport Post from './Post';\r\n\r\nexport default class Discussion extends Model {\r\n title = Model.attribute('title') as () => string;\r\n slug = Model.attribute('slug') as () => string;\r\n\r\n createdAt = Model.attribute('createdAt', Model.transformDate) as () => Date;\r\n user = Model.hasOne('user') as () => User;\r\n firstPost = Model.hasOne('firstPost') as () => Post;\r\n\r\n lastPostedAt = Model.attribute('lastPostedAt', Model.transformDate) as () => Date;\r\n lastPostedUser = Model.hasOne('lastPostedUser') as () => User;\r\n lastPost = Model.hasOne('lastPost') as () => Post;\r\n lastPostNumber = Model.attribute('lastPostNumber') as () => number;\r\n\r\n commentCount = Model.attribute('commentCount') as () => number;\r\n replyCount = computed('commentCount', (commentCount) => Math.max(0, commentCount - 1)) as () => number;\r\n posts = Model.hasMany('posts') as () => Post[];\r\n mostRelevantPost = Model.hasOne('mostRelevantPost') as () => Post;\r\n\r\n lastReadAt = Model.attribute('lastReadAt', Model.transformDate) as () => Date;\r\n lastReadPostNumber = Model.attribute('lastReadPostNumber') as () => number;\r\n isUnread = computed('unreadCount', (unreadCount) => !!unreadCount) as () => boolean;\r\n isRead = computed('unreadCount', (unreadCount) => app.session.user && !unreadCount) as () => boolean;\r\n\r\n hiddenAt = Model.attribute('hiddenAt', Model.transformDate) as () => Date;\r\n hiddenUser = Model.hasOne('hiddenUser') as () => User;\r\n isHidden = computed('hiddenAt', (hiddenAt) => !!hiddenAt) as () => boolean;\r\n\r\n canReply = Model.attribute('canReply') as () => boolean;\r\n canRename = Model.attribute('canRename') as () => boolean;\r\n canHide = Model.attribute('canHide') as () => boolean;\r\n canDelete = Model.attribute('canDelete') as () => boolean;\r\n\r\n /**\r\n * Remove a post from the discussion's posts relationship.\r\n *\r\n * @param id The ID of the post to remove.\r\n */\r\n removePost(id: string) {\r\n const relationships = this.data.relationships;\r\n const posts = relationships && relationships.posts;\r\n\r\n if (posts) {\r\n posts.data.some((data, i) => {\r\n if (id === data.id) {\r\n posts.data.splice(i, 1);\r\n return true;\r\n }\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Get the estimated number of unread posts in this discussion for the current\r\n * user.\r\n */\r\n unreadCount(): number {\r\n const user = app.session.user;\r\n\r\n if (user && user.markedAllAsReadAt() < this.lastPostedAt()) {\r\n return Math.max(0, this.lastPostNumber() - (this.lastReadPostNumber() || 0));\r\n }\r\n\r\n return 0;\r\n }\r\n\r\n /**\r\n * Get the Badge components that apply to this discussion.\r\n */\r\n badges(): ItemList {\r\n const items = new ItemList();\r\n\r\n if (this.isHidden()) {\r\n items.add('hidden', <Badge type=\"hidden\" icon=\"fas fa-trash\" label={app.translator.transText('core.lib.badge.hidden_tooltip')} />);\r\n }\r\n\r\n return items;\r\n }\r\n\r\n /**\r\n * Get a list of all of the post IDs in this discussion.\r\n */\r\n postIds(): string[] {\r\n const posts = this.data.relationships?.posts;\r\n\r\n return posts ? posts.data.map((link) => link.id) : [];\r\n }\r\n}\r\n","export function hsvToRgb(h: number, s: number, v: number) {\r\n let r;\r\n let g;\r\n let b;\r\n\r\n const i = Math.floor(h * 6);\r\n const f = h * 6 - i;\r\n const p = v * (1 - s);\r\n const q = v * (1 - f * s);\r\n const t = v * (1 - (1 - f) * s);\r\n\r\n switch (i % 6) {\r\n case 0:\r\n r = v;\r\n g = t;\r\n b = p;\r\n break;\r\n case 1:\r\n r = q;\r\n g = v;\r\n b = p;\r\n break;\r\n case 2:\r\n r = p;\r\n g = v;\r\n b = t;\r\n break;\r\n case 3:\r\n r = p;\r\n g = q;\r\n b = v;\r\n break;\r\n case 4:\r\n r = t;\r\n g = p;\r\n b = v;\r\n break;\r\n case 5:\r\n r = v;\r\n g = p;\r\n b = q;\r\n break;\r\n }\r\n\r\n return {\r\n r: Math.floor(r * 255),\r\n g: Math.floor(g * 255),\r\n b: Math.floor(b * 255),\r\n };\r\n}\r\n\r\n/**\r\n * Convert the given string to a unique color.\r\n */\r\nexport default function stringToColor(string: string): string {\r\n let num = 0;\r\n\r\n // Convert the username into a number based on the ASCII value of each\r\n // character.\r\n for (let i = 0; i < string.length; i++) {\r\n num += string.charCodeAt(i);\r\n }\r\n\r\n // Construct a color using the remainder of that number divided by 360, and\r\n // some predefined saturation and value values.\r\n const hue = num % 360;\r\n const rgb = hsvToRgb(hue / 360, 0.3, 0.9);\r\n\r\n return '' + rgb.r.toString(16) + rgb.g.toString(16) + rgb.b.toString(16);\r\n}\r\n","import Badge from './Badge';\r\nimport extract from '../utils/extract';\r\n\r\nexport default class GroupBadge extends Badge {\r\n static initProps(props) {\r\n super.initProps(props);\r\n\r\n const group = extract(props, 'group');\r\n\r\n if (group) {\r\n props.icon = group.icon();\r\n props.style = { backgroundColor: group.color() };\r\n props.label = typeof props.label === 'undefined' ? group.nameSingular() : props.label;\r\n props.type = `group--${group.id()}`;\r\n }\r\n }\r\n}\r\n","import Model from '../Model';\r\nimport stringToColor from '../utils/stringToColor';\r\nimport ItemList from '../utils/ItemList';\r\nimport computed from '../utils/computed';\r\nimport GroupBadge from '../components/GroupBadge';\r\nimport Group from './Group';\r\n\r\nexport interface UserPreferences {\r\n discloseOnline?: boolean;\r\n indexProfile?: boolean;\r\n locale?: string;\r\n\r\n [key: string]: any;\r\n}\r\n\r\nexport default class User extends Model {\r\n username = Model.attribute('username') as () => string;\r\n\r\n displayName = Model.attribute('displayName') as () => string;\r\n email = Model.attribute('email') as () => string;\r\n isEmailConfirmed = Model.attribute('isEmailConfirmed') as () => boolean;\r\n password = Model.attribute('password') as () => string;\r\n\r\n avatarUrl = Model.attribute('avatarUrl') as () => string;\r\n preferences = Model.attribute('preferences') as () => UserPreferences;\r\n groups = Model.hasMany('groups') as () => Group[];\r\n\r\n joinTime = Model.attribute('joinTime', Model.transformDate) as () => Date;\r\n lastSeenAt = Model.attribute('lastSeenAt', Model.transformDate) as () => Date;\r\n markedAllAsReadAt = Model.attribute('markedAllAsReadAt', Model.transformDate) as () => Date;\r\n unreadNotificationCount = Model.attribute('unreadNotificationCount') as () => number;\r\n newNotificationCount = Model.attribute('newNotificationCount') as () => number;\r\n\r\n discussionCount = Model.attribute('discussionCount') as () => number;\r\n commentCount = Model.attribute('commentCount') as () => number;\r\n\r\n canEdit = Model.attribute('canEdit') as () => boolean;\r\n canDelete = Model.attribute('canDelete') as () => boolean;\r\n\r\n avatarColor = null;\r\n color = computed(['username', 'avatarUrl', 'avatarColor'], function (username, avatarUrl, avatarColor) {\r\n // If we've already calculated and cached the dominant color of the user's\r\n // avatar, then we can return that in RGB format. If we haven't, we'll want\r\n // to calculate it. Unless the user doesn't have an avatar, in which case\r\n // we generate a color from their username.\r\n if (avatarColor) {\r\n return 'rgb(' + avatarColor.join(', ') + ')';\r\n } else if (avatarUrl) {\r\n this.calculateAvatarColor();\r\n return '';\r\n }\r\n\r\n return '#' + stringToColor(username);\r\n }) as () => string;\r\n\r\n isOnline(): boolean {\r\n return this.lastSeenAt() > dayjs().subtract(5, 'minutes').toDate();\r\n }\r\n\r\n /**\r\n * Get the Badge components that apply to this user.\r\n */\r\n badges(): ItemList {\r\n const items = new ItemList();\r\n const groups = this.groups();\r\n\r\n if (groups) {\r\n groups.forEach((group) => {\r\n items.add('group' + group.id(), GroupBadge.component({ group }));\r\n });\r\n }\r\n\r\n return items;\r\n }\r\n\r\n /**\r\n * Calculate the dominant color of the user's avatar. The dominant color will\r\n * be set to the `avatarColor` property once it has been calculated.\r\n *\r\n * @protected\r\n */\r\n calculateAvatarColor() {\r\n const image = new Image();\r\n const user = this;\r\n\r\n image.onload = function () {\r\n const colorThief = new ColorThief();\r\n user.avatarColor = colorThief.getColor(this);\r\n user.freshness = new Date();\r\n m.redraw();\r\n };\r\n image.crossOrigin = 'anonymous';\r\n image.src = this.avatarUrl();\r\n }\r\n\r\n /**\r\n * Update the user's preferences.\r\n */\r\n savePreferences(newPreferences: UserPreferences): Promise<User> {\r\n const preferences = this.preferences();\r\n\r\n Object.assign(preferences, newPreferences);\r\n\r\n return <Promise<User>>this.save({ preferences });\r\n }\r\n}\r\n","/**\r\n * Truncate a string to the given length, appending ellipses if necessary.\r\n */\r\nexport function truncate(string: string, length: number, start = 0): string {\r\n return (start > 0 ? '...' : '') + string.substring(start, start + length) + (string.length > start + length ? '...' : '');\r\n}\r\n\r\n/**\r\n * Create a slug out of the given string. Non-alphanumeric characters are\r\n * converted to hyphens.\r\n */\r\nexport function slug(string: string): string {\r\n return string\r\n .toLowerCase()\r\n .replace(/[^a-z0-9]/gi, '-')\r\n .replace(/-+/g, '-')\r\n .replace(/-$|^-/g, '');\r\n}\r\n\r\n/**\r\n * Strip HTML tags and quotes out of the given string, replacing them with\r\n * meaningful punctuation.\r\n */\r\nexport function getPlainContent(string: string): string {\r\n const html = string.replace(/(<\\/p>|<br>)/g, '$1 &nbsp;').replace(/<img\\b[^>]*>/gi, ' ');\r\n\r\n const dom = $('<div/>').html(html);\r\n\r\n dom.find(getPlainContent.removeSelectors.join(',')).remove();\r\n\r\n return dom.text().replace(/\\s+/g, ' ').trim();\r\n}\r\n\r\n/**\r\n * An array of DOM selectors to remove when getting plain content.\r\n *\r\n * @type {String[]}\r\n */\r\ngetPlainContent.removeSelectors = ['blockquote', 'script'];\r\n\r\n/**\r\n * Make a string's first character uppercase.\r\n */\r\nexport function ucfirst(string: string): string {\r\n return string.substr(0, 1).toUpperCase() + string.substr(1);\r\n}\r\n","import Model from '../Model';\r\nimport computed from '../utils/computed';\r\nimport { getPlainContent } from '../utils/string';\r\n\r\nimport Discussion from './Discussion';\r\nimport User from './User';\r\n\r\nexport default class Post extends Model {\r\n number = Model.attribute('number') as () => number;\r\n discussion = Model.hasOne('discussion') as () => Discussion;\r\n\r\n createdAt = Model.attribute('createdAt', Model.transformDate) as () => Date;\r\n user = Model.hasOne('user') as () => User;\r\n contentType = Model.attribute('contentType') as () => string;\r\n content = Model.attribute('content') as () => string;\r\n contentHtml = Model.attribute('contentHtml') as () => string;\r\n contentPlain = computed('contentHtml', getPlainContent) as () => string;\r\n\r\n editedAt = Model.attribute('editedAt', Model.transformDate) as () => Date;\r\n editedUser = Model.hasOne('editedUser') as () => User;\r\n isEdited = computed('editedAt', (editedAt) => !!editedAt) as () => boolean;\r\n\r\n hiddenAt = Model.attribute('hiddenAt', Model.transformDate) as () => Date;\r\n hiddenUser = Model.hasOne('hiddenUser') as () => User;\r\n isHidden = computed('hiddenAt', (hiddenAt) => !!hiddenAt) as () => boolean;\r\n\r\n canEdit = Model.attribute('canEdit') as () => boolean;\r\n canHide = Model.attribute('canHide') as () => boolean;\r\n canDelete = Model.attribute('canDelete') as () => boolean;\r\n}\r\n","import Model from '../Model';\r\n\r\nexport default class Group extends Model {\r\n static ADMINISTRATOR_ID = '1';\r\n static GUEST_ID = '2';\r\n static MEMBER_ID = '3';\r\n\r\n nameSingular = Model.attribute('nameSingular') as () => string;\r\n namePlural = Model.attribute('namePlural') as () => string;\r\n color = Model.attribute('color') as () => string;\r\n icon = Model.attribute('icon') as () => string;\r\n}\r\n","import Model from '../Model';\r\nimport User from './User';\r\n\r\nexport default class Notification extends Model {\r\n static ADMINISTRATOR_ID = '1';\r\n static GUEST_ID = '2';\r\n static MEMBER_ID = '3';\r\n\r\n contentType = Model.attribute('contentType') as () => string;\r\n content = Model.attribute('content') as () => string;\r\n createdAt = Model.attribute('createdAt', Model.transformDate) as () => Date;\r\n\r\n isRead = Model.attribute('isRead') as () => boolean;\r\n\r\n user = Model.hasOne('user') as () => User;\r\n fromUser = Model.hasOne('fromUser') as () => User;\r\n subject = Model.hasOne('subhect') as () => any;\r\n}\r\n","var __assign = (this && this.__assign) || function () {\r\n __assign = Object.assign || function(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\r\n t[p] = s[p];\r\n }\r\n return t;\r\n };\r\n return __assign.apply(this, arguments);\r\n};\r\nvar defaults = {\r\n lines: 12,\r\n length: 7,\r\n width: 5,\r\n radius: 10,\r\n scale: 1.0,\r\n corners: 1,\r\n color: '#000',\r\n fadeColor: 'transparent',\r\n animation: 'spinner-line-fade-default',\r\n rotate: 0,\r\n direction: 1,\r\n speed: 1,\r\n zIndex: 2e9,\r\n className: 'spinner',\r\n top: '50%',\r\n left: '50%',\r\n shadow: '0 0 1px transparent',\r\n position: 'absolute',\r\n};\r\nvar Spinner = /** @class */ (function () {\r\n function Spinner(opts) {\r\n if (opts === void 0) { opts = {}; }\r\n this.opts = __assign(__assign({}, defaults), opts);\r\n }\r\n /**\r\n * Adds the spinner to the given target element. If this instance is already\r\n * spinning, it is automatically removed from its previous target by calling\r\n * stop() internally.\r\n */\r\n Spinner.prototype.spin = function (target) {\r\n this.stop();\r\n this.el = document.createElement('div');\r\n this.el.className = this.opts.className;\r\n this.el.setAttribute('role', 'progressbar');\r\n css(this.el, {\r\n position: this.opts.position,\r\n width: 0,\r\n zIndex: this.opts.zIndex,\r\n left: this.opts.left,\r\n top: this.opts.top,\r\n transform: \"scale(\" + this.opts.scale + \")\",\r\n });\r\n if (target) {\r\n target.insertBefore(this.el, target.firstChild || null);\r\n }\r\n drawLines(this.el, this.opts);\r\n return this;\r\n };\r\n /**\r\n * Stops and removes the Spinner.\r\n * Stopped spinners may be reused by calling spin() again.\r\n */\r\n Spinner.prototype.stop = function () {\r\n if (this.el) {\r\n if (typeof requestAnimationFrame !== 'undefined') {\r\n cancelAnimationFrame(this.animateId);\r\n }\r\n else {\r\n clearTimeout(this.animateId);\r\n }\r\n if (this.el.parentNode) {\r\n this.el.parentNode.removeChild(this.el);\r\n }\r\n this.el = undefined;\r\n }\r\n return this;\r\n };\r\n return Spinner;\r\n}());\r\nexport { Spinner };\r\n/**\r\n * Sets multiple style properties at once.\r\n */\r\nfunction css(el, props) {\r\n for (var prop in props) {\r\n el.style[prop] = props[prop];\r\n }\r\n return el;\r\n}\r\n/**\r\n * Returns the line color from the given string or array.\r\n */\r\nfunction getColor(color, idx) {\r\n return typeof color == 'string' ? color : color[idx % color.length];\r\n}\r\n/**\r\n * Internal method that draws the individual lines.\r\n */\r\nfunction drawLines(el, opts) {\r\n var borderRadius = (Math.round(opts.corners * opts.width * 500) / 1000) + 'px';\r\n var shadow = 'none';\r\n if (opts.shadow === true) {\r\n shadow = '0 2px 4px #000'; // default shadow\r\n }\r\n else if (typeof opts.shadow === 'string') {\r\n shadow = opts.shadow;\r\n }\r\n var shadows = parseBoxShadow(shadow);\r\n for (var i = 0; i < opts.lines; i++) {\r\n var degrees = ~~(360 / opts.lines * i + opts.rotate);\r\n var backgroundLine = css(document.createElement('div'), {\r\n position: 'absolute',\r\n top: -opts.width / 2 + \"px\",\r\n width: (opts.length + opts.width) + 'px',\r\n height: opts.width + 'px',\r\n background: getColor(opts.fadeColor, i),\r\n borderRadius: borderRadius,\r\n transformOrigin: 'left',\r\n transform: \"rotate(\" + degrees + \"deg) translateX(\" + opts.radius + \"px)\",\r\n });\r\n var delay = i * opts.direction / opts.lines / opts.speed;\r\n delay -= 1 / opts.speed; // so initial animation state will include trail\r\n var line = css(document.createElement('div'), {\r\n width: '100%',\r\n height: '100%',\r\n background: getColor(opts.color, i),\r\n borderRadius: borderRadius,\r\n boxShadow: normalizeShadow(shadows, degrees),\r\n animation: 1 / opts.speed + \"s linear \" + delay + \"s infinite \" + opts.animation,\r\n });\r\n backgroundLine.appendChild(line);\r\n el.appendChild(backgroundLine);\r\n }\r\n}\r\nfunction parseBoxShadow(boxShadow) {\r\n var regex = /^\\s*([a-zA-Z]+\\s+)?(-?\\d+(\\.\\d+)?)([a-zA-Z]*)\\s+(-?\\d+(\\.\\d+)?)([a-zA-Z]*)(.*)$/;\r\n var shadows = [];\r\n for (var _i = 0, _a = boxShadow.split(','); _i < _a.length; _i++) {\r\n var shadow = _a[_i];\r\n var matches = shadow.match(regex);\r\n if (matches === null) {\r\n continue; // invalid syntax\r\n }\r\n var x = +matches[2];\r\n var y = +matches[5];\r\n var xUnits = matches[4];\r\n var yUnits = matches[7];\r\n if (x === 0 && !xUnits) {\r\n xUnits = yUnits;\r\n }\r\n if (y === 0 && !yUnits) {\r\n yUnits = xUnits;\r\n }\r\n if (xUnits !== yUnits) {\r\n continue; // units must match to use as coordinates\r\n }\r\n shadows.push({\r\n prefix: matches[1] || '',\r\n x: x,\r\n y: y,\r\n xUnits: xUnits,\r\n yUnits: yUnits,\r\n end: matches[8],\r\n });\r\n }\r\n return shadows;\r\n}\r\n/**\r\n * Modify box-shadow x/y offsets to counteract rotation\r\n */\r\nfunction normalizeShadow(shadows, degrees) {\r\n var normalized = [];\r\n for (var _i = 0, shadows_1 = shadows; _i < shadows_1.length; _i++) {\r\n var shadow = shadows_1[_i];\r\n var xy = convertOffset(shadow.x, shadow.y, degrees);\r\n normalized.push(shadow.prefix + xy[0] + shadow.xUnits + ' ' + xy[1] + shadow.yUnits + shadow.end);\r\n }\r\n return normalized.join(', ');\r\n}\r\nfunction convertOffset(x, y, degrees) {\r\n var radians = degrees * Math.PI / 180;\r\n var sin = Math.sin(radians);\r\n var cos = Math.cos(radians);\r\n return [\r\n Math.round((x * cos + y * sin) * 1000) / 1000,\r\n Math.round((-x * sin + y * cos) * 1000) / 1000,\r\n ];\r\n}\r\n","import Component from '../Component';\r\nimport { Spinner, SpinnerOptions } from 'spin.js';\r\n\r\n/**\r\n * The `LoadingIndicator` component displays a loading spinner with spin.js. It\r\n * may have the following special props:\r\n *\r\n * - `size` The spin.js size preset to use. Defaults to 'small'.\r\n *\r\n * All other props will be assigned as attributes on the element.\r\n */\r\nexport default class LoadingIndicator extends Component {\r\n view(vnode) {\r\n const attrs = vnode.attrs;\r\n\r\n attrs.className = 'LoadingIndicator ' + (attrs.className || '');\r\n delete attrs.size;\r\n\r\n return <div {...attrs}>{m.trust('&nbsp;')}</div>;\r\n }\r\n\r\n oncreate(vnode) {\r\n super.oncreate(vnode);\r\n\r\n const options: SpinnerOptions = { zIndex: 'auto', color: this.$().css('color') };\r\n let sizeOptions: SpinnerOptions = {};\r\n\r\n switch (vnode.attrs.size) {\r\n case 'large':\r\n sizeOptions = { lines: 10, length: 8, width: 4, radius: 8 };\r\n break;\r\n\r\n case 'tiny':\r\n sizeOptions = { lines: 8, length: 2, width: 2, radius: 3 };\r\n break;\r\n\r\n default:\r\n sizeOptions = { lines: 8, length: 4, width: 3, radius: 5 };\r\n }\r\n\r\n new Spinner({ ...options, ...sizeOptions }).spin(this.element);\r\n }\r\n}\r\n","import Component, { ComponentProps } from '../Component';\r\nimport icon from '../helpers/icon';\r\nimport extract from '../utils/extract';\r\nimport extractText from '../utils/extractText';\r\nimport LoadingIndicator from './LoadingIndicator';\r\n\r\nexport interface ButtonProps extends ComponentProps {\r\n title?: string;\r\n type?: string;\r\n icon?: string;\r\n\r\n loading?: boolean;\r\n disabled?: boolean;\r\n onclick?: Function;\r\n}\r\n\r\n/**\r\n * The `Button` component defines an element which, when clicked, performs an\r\n * action. The button may have the following special props:\r\n *\r\n * - `icon` The name of the icon class. If specified, the button will be given a\r\n * 'has-icon' class name.\r\n * - `disabled` Whether or not the button is disabled. If truthy, the button\r\n * will be given a 'disabled' class name, and any `onclick` handler will be\r\n * removed.\r\n * - `loading` Whether or not the button should be in a disabled loading state.\r\n *\r\n * All other props will be assigned as attributes on the button element.\r\n *\r\n * Note that a Button has no default class names. This is because a Button can\r\n * be used to represent any generic clickable control, like a menu item.\r\n */\r\nexport default class Button<T extends ButtonProps = ButtonProps> extends Component<T> {\r\n view() {\r\n const { children, ...attrs } = this.props;\r\n\r\n attrs.className = attrs.className || '';\r\n attrs.type = attrs.type || 'button';\r\n\r\n // If a tooltip was provided for buttons without additional content, we also\r\n // use this tooltip as text for screen readers\r\n if (attrs.title && !this.props.children) {\r\n attrs['aria-label'] = attrs.title;\r\n }\r\n\r\n // If nothing else is provided, we use the textual button content as tooltip\r\n if (!attrs.title && this.props.children) {\r\n attrs.title = extractText(this.props.children);\r\n }\r\n\r\n const iconName = extract(attrs, 'icon');\r\n if (iconName) attrs.className += ' hasIcon';\r\n\r\n const loading = extract(attrs, 'loading');\r\n if (attrs.disabled || loading) {\r\n attrs.className = classNames(attrs.className, 'disabled', loading && 'loading');\r\n delete attrs.onclick;\r\n }\r\n\r\n return <button {...attrs}>{this.getButtonContent(iconName, loading, children)}</button>;\r\n }\r\n\r\n /**\r\n * Get the template for the button's content.\r\n */\r\n protected getButtonContent(iconName?: string | boolean, loading?: boolean, children?: any): any[] {\r\n return [\r\n iconName && iconName !== true ? icon(iconName, { className: 'Button-icon' }) : '',\r\n children ? <span className=\"Button-label\">{children}</span> : '',\r\n loading ? LoadingIndicator.component({ size: 'tiny', className: 'LoadingIndicator--inline' }) : '',\r\n ];\r\n }\r\n}\r\n","export default function _objectWithoutPropertiesLoose(source, excluded) {\n if (source == null) return {};\n var target = {};\n var sourceKeys = Object.keys(source);\n var key, i;\n\n for (i = 0; i < sourceKeys.length; i++) {\n key = sourceKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n target[key] = source[key];\n }\n\n return target;\n}","import Component from '../Component';\r\n\r\n/**\r\n * The `Separator` component defines a menu separator item.\r\n */\r\nexport default class Separator extends Component {\r\n static isListItem = true;\r\n\r\n view() {\r\n return <li className=\"Dropdown-separator\" />;\r\n }\r\n}\r\n","import Separator from '../components/Separator';\r\n\r\nexport function isSeparator(item) {\r\n return item?.tag === Separator;\r\n}\r\n\r\nexport function withoutUnnecessarySeparators(items) {\r\n const newItems = [];\r\n let prevItem;\r\n\r\n items.forEach((item, i) => {\r\n if (!isSeparator(item) || (prevItem && !isSeparator(prevItem) && i !== items.length - 1)) {\r\n prevItem = item;\r\n newItems.push(item);\r\n }\r\n });\r\n\r\n return newItems;\r\n}\r\n\r\n/**\r\n * The `listItems` helper wraps a collection of components in <li> tags,\r\n * stripping out any unnecessary `Separator` components.\r\n *\r\n * @param {*} items\r\n * @return {Array}\r\n */\r\nexport default function listItems(items) {\r\n if (!(items instanceof Array)) items = [items];\r\n\r\n return withoutUnnecessarySeparators(items).map((item) => {\r\n const isListItem = item.tag?.isListItem;\r\n const active = item.tag?.isActive && item.tag.isActive(item.attrs);\r\n const className = item.attrs?.itemClassName || item.itemClassName;\r\n\r\n if (isListItem) {\r\n item.attrs = item.attrs || {};\r\n item.attrs.key = item.attrs.key || item.itemName;\r\n item.key = item.attrs.key;\r\n }\r\n\r\n const node = isListItem ? (\r\n item\r\n ) : (\r\n <li\r\n className={classNames(className, item.itemName && `item-${item.itemName}`, active && 'active')}\r\n key={item.attrs?.key || item.itemName}\r\n >\r\n {item}\r\n </li>\r\n );\r\n\r\n node.state = node.state || {};\r\n\r\n return node;\r\n });\r\n}\r\n","import Component, { ComponentProps } from '../Component';\r\nimport Button from './Button';\r\nimport listItems from '../helpers/listItems';\r\nimport extract from '../utils/extract';\r\nimport * as Mithril from 'mithril';\r\n\r\nexport interface AlertProps extends ComponentProps {\r\n controls?: Mithril.ChildArray;\r\n type?: string;\r\n dismissible?: boolean;\r\n\r\n ondismiss?: () => any;\r\n}\r\n\r\n/**\r\n * The `Alert` component represents an alert box, which contains a message,\r\n * some controls, and may be dismissible.\r\n *\r\n * The alert may have the following special props:\r\n *\r\n * - `type` The type of alert this is. Will be used to give the alert a class\r\n * name of `Alert--{type}`.\r\n * - `controls` An array of controls to show in the alert.\r\n * - `dismissible` Whether or not the alert can be dismissed.\r\n * - `ondismiss` A callback to run when the alert is dismissed.\r\n *\r\n * All other props will be assigned as attributes on the alert element.\r\n */\r\nexport default class Alert extends Component<AlertProps> {\r\n view() {\r\n const attrs: AlertProps = Object.assign({}, this.props);\r\n\r\n const type: string = extract(attrs, 'type');\r\n attrs.className = `Alert Alert--${type} ${attrs.className || ''}`;\r\n\r\n const children: Mithril.Children = extract(attrs, 'children');\r\n const controls: Mithril.ChildArray = extract(attrs, 'controls') || [];\r\n\r\n // If the alert is meant to be dismissible (which is the case by default),\r\n // then we will create a dismiss button to append as the final control in\r\n // the alert.\r\n const dismissible: boolean | undefined = extract(attrs, 'dismissible');\r\n const ondismiss: () => any = extract(attrs, 'ondismiss');\r\n const dismissControl = [];\r\n\r\n if (dismissible || dismissible === undefined) {\r\n dismissControl.push(<Button icon=\"fas fa-times\" className=\"Button Button--link Button--icon Alert-dismiss\" onclick={ondismiss} />);\r\n }\r\n\r\n return (\r\n <div {...attrs}>\r\n <span className=\"Alert-body\">{children}</span>\r\n <ul className=\"Alert-controls\">{listItems(controls.concat(dismissControl))}</ul>\r\n </div>\r\n );\r\n }\r\n}\r\n","function _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n}\n\nfunction _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n return Constructor;\n}\n\nfunction _toConsumableArray(arr) {\n return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread();\n}\n\nfunction _arrayWithoutHoles(arr) {\n if (Array.isArray(arr)) return _arrayLikeToArray(arr);\n}\n\nfunction _iterableToArray(iter) {\n if (typeof Symbol !== \"undefined\" && Symbol.iterator in Object(iter)) return Array.from(iter);\n}\n\nfunction _unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(n);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\n\nfunction _arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n\n for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];\n\n return arr2;\n}\n\nfunction _nonIterableSpread() {\n throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\n\nvar MicroModal = function () {\n\n var FOCUSABLE_ELEMENTS = ['a[href]', 'area[href]', 'input:not([disabled]):not([type=\"hidden\"]):not([aria-hidden])', 'select:not([disabled]):not([aria-hidden])', 'textarea:not([disabled]):not([aria-hidden])', 'button:not([disabled]):not([aria-hidden])', 'iframe', 'object', 'embed', '[contenteditable]', '[tabindex]:not([tabindex^=\"-\"])'];\n\n var Modal = /*#__PURE__*/function () {\n function Modal(_ref) {\n var targetModal = _ref.targetModal,\n _ref$triggers = _ref.triggers,\n triggers = _ref$triggers === void 0 ? [] : _ref$triggers,\n _ref$onShow = _ref.onShow,\n onShow = _ref$onShow === void 0 ? function () {} : _ref$onShow,\n _ref$onClose = _ref.onClose,\n onClose = _ref$onClose === void 0 ? function () {} : _ref$onClose,\n _ref$openTrigger = _ref.openTrigger,\n openTrigger = _ref$openTrigger === void 0 ? 'data-micromodal-trigger' : _ref$openTrigger,\n _ref$closeTrigger = _ref.closeTrigger,\n closeTrigger = _ref$closeTrigger === void 0 ? 'data-micromodal-close' : _ref$closeTrigger,\n _ref$openClass = _ref.openClass,\n openClass = _ref$openClass === void 0 ? 'is-open' : _ref$openClass,\n _ref$disableScroll = _ref.disableScroll,\n disableScroll = _ref$disableScroll === void 0 ? false : _ref$disableScroll,\n _ref$disableFocus = _ref.disableFocus,\n disableFocus = _ref$disableFocus === void 0 ? false : _ref$disableFocus,\n _ref$awaitCloseAnimat = _ref.awaitCloseAnimation,\n awaitCloseAnimation = _ref$awaitCloseAnimat === void 0 ? false : _ref$awaitCloseAnimat,\n _ref$awaitOpenAnimati = _ref.awaitOpenAnimation,\n awaitOpenAnimation = _ref$awaitOpenAnimati === void 0 ? false : _ref$awaitOpenAnimati,\n _ref$debugMode = _ref.debugMode,\n debugMode = _ref$debugMode === void 0 ? false : _ref$debugMode;\n\n _classCallCheck(this, Modal);\n\n // Save a reference of the modal\n this.modal = document.getElementById(targetModal); // Save a reference to the passed config\n\n this.config = {\n debugMode: debugMode,\n disableScroll: disableScroll,\n openTrigger: openTrigger,\n closeTrigger: closeTrigger,\n openClass: openClass,\n onShow: onShow,\n onClose: onClose,\n awaitCloseAnimation: awaitCloseAnimation,\n awaitOpenAnimation: awaitOpenAnimation,\n disableFocus: disableFocus\n }; // Register click events only if pre binding eventListeners\n\n if (triggers.length > 0) this.registerTriggers.apply(this, _toConsumableArray(triggers)); // pre bind functions for event listeners\n\n this.onClick = this.onClick.bind(this);\n this.onKeydown = this.onKeydown.bind(this);\n }\n /**\n * Loops through all openTriggers and binds click event\n * @param {array} triggers [Array of node elements]\n * @return {void}\n */\n\n\n _createClass(Modal, [{\n key: \"registerTriggers\",\n value: function registerTriggers() {\n var _this = this;\n\n for (var _len = arguments.length, triggers = new Array(_len), _key = 0; _key < _len; _key++) {\n triggers[_key] = arguments[_key];\n }\n\n triggers.filter(Boolean).forEach(function (trigger) {\n trigger.addEventListener('click', function (event) {\n return _this.showModal(event);\n });\n });\n }\n }, {\n key: \"showModal\",\n value: function showModal() {\n var _this2 = this;\n\n var event = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n this.activeElement = document.activeElement;\n this.modal.setAttribute('aria-hidden', 'false');\n this.modal.classList.add(this.config.openClass);\n this.scrollBehaviour('disable');\n this.addEventListeners();\n\n if (this.config.awaitOpenAnimation) {\n var handler = function handler() {\n _this2.modal.removeEventListener('animationend', handler, false);\n\n _this2.setFocusToFirstNode();\n };\n\n this.modal.addEventListener('animationend', handler, false);\n } else {\n this.setFocusToFirstNode();\n }\n\n this.config.onShow(this.modal, this.activeElement, event);\n }\n }, {\n key: \"closeModal\",\n value: function closeModal() {\n var event = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n var modal = this.modal;\n this.modal.setAttribute('aria-hidden', 'true');\n this.removeEventListeners();\n this.scrollBehaviour('enable');\n\n if (this.activeElement && this.activeElement.focus) {\n this.activeElement.focus();\n }\n\n this.config.onClose(this.modal, this.activeElement, event);\n\n if (this.config.awaitCloseAnimation) {\n var openClass = this.config.openClass; // <- old school ftw\n\n this.modal.addEventListener('animationend', function handler() {\n modal.classList.remove(openClass);\n modal.removeEventListener('animationend', handler, false);\n }, false);\n } else {\n modal.classList.remove(this.config.openClass);\n }\n }\n }, {\n key: \"closeModalById\",\n value: function closeModalById(targetModal) {\n this.modal = document.getElementById(targetModal);\n if (this.modal) this.closeModal();\n }\n }, {\n key: \"scrollBehaviour\",\n value: function scrollBehaviour(toggle) {\n if (!this.config.disableScroll) return;\n var body = document.querySelector('body');\n\n switch (toggle) {\n case 'enable':\n Object.assign(body.style, {\n overflow: ''\n });\n break;\n\n case 'disable':\n Object.assign(body.style, {\n overflow: 'hidden'\n });\n break;\n }\n }\n }, {\n key: \"addEventListeners\",\n value: function addEventListeners() {\n this.modal.addEventListener('touchstart', this.onClick);\n this.modal.addEventListener('click', this.onClick);\n document.addEventListener('keydown', this.onKeydown);\n }\n }, {\n key: \"removeEventListeners\",\n value: function removeEventListeners() {\n this.modal.removeEventListener('touchstart', this.onClick);\n this.modal.removeEventListener('click', this.onClick);\n document.removeEventListener('keydown', this.onKeydown);\n }\n }, {\n key: \"onClick\",\n value: function onClick(event) {\n if (event.target.hasAttribute(this.config.closeTrigger)) {\n this.closeModal(event);\n }\n }\n }, {\n key: \"onKeydown\",\n value: function onKeydown(event) {\n if (event.keyCode === 27) this.closeModal(event); // esc\n\n if (event.keyCode === 9) this.retainFocus(event); // tab\n }\n }, {\n key: \"getFocusableNodes\",\n value: function getFocusableNodes() {\n var nodes = this.modal.querySelectorAll(FOCUSABLE_ELEMENTS);\n return Array.apply(void 0, _toConsumableArray(nodes));\n }\n /**\n * Tries to set focus on a node which is not a close trigger\n * if no other nodes exist then focuses on first close trigger\n */\n\n }, {\n key: \"setFocusToFirstNode\",\n value: function setFocusToFirstNode() {\n var _this3 = this;\n\n if (this.config.disableFocus) return;\n var focusableNodes = this.getFocusableNodes(); // no focusable nodes\n\n if (focusableNodes.length === 0) return; // remove nodes on whose click, the modal closes\n // could not think of a better name :(\n\n var nodesWhichAreNotCloseTargets = focusableNodes.filter(function (node) {\n return !node.hasAttribute(_this3.config.closeTrigger);\n });\n if (nodesWhichAreNotCloseTargets.length > 0) nodesWhichAreNotCloseTargets[0].focus();\n if (nodesWhichAreNotCloseTargets.length === 0) focusableNodes[0].focus();\n }\n }, {\n key: \"retainFocus\",\n value: function retainFocus(event) {\n var focusableNodes = this.getFocusableNodes(); // no focusable nodes\n\n if (focusableNodes.length === 0) return;\n /**\n * Filters nodes which are hidden to prevent\n * focus leak outside modal\n */\n\n focusableNodes = focusableNodes.filter(function (node) {\n return node.offsetParent !== null;\n }); // if disableFocus is true\n\n if (!this.modal.contains(document.activeElement)) {\n focusableNodes[0].focus();\n } else {\n var focusedItemIndex = focusableNodes.indexOf(document.activeElement);\n\n if (event.shiftKey && focusedItemIndex === 0) {\n focusableNodes[focusableNodes.length - 1].focus();\n event.preventDefault();\n }\n\n if (!event.shiftKey && focusableNodes.length > 0 && focusedItemIndex === focusableNodes.length - 1) {\n focusableNodes[0].focus();\n event.preventDefault();\n }\n }\n }\n }]);\n\n return Modal;\n }();\n /**\n * Modal prototype ends.\n * Here on code is responsible for detecting and\n * auto binding event handlers on modal triggers\n */\n // Keep a reference to the opened modal\n\n\n var activeModal = null;\n /**\n * Generates an associative array of modals and it's\n * respective triggers\n * @param {array} triggers An array of all triggers\n * @param {string} triggerAttr The data-attribute which triggers the module\n * @return {array}\n */\n\n var generateTriggerMap = function generateTriggerMap(triggers, triggerAttr) {\n var triggerMap = [];\n triggers.forEach(function (trigger) {\n var targetModal = trigger.attributes[triggerAttr].value;\n if (triggerMap[targetModal] === undefined) triggerMap[targetModal] = [];\n triggerMap[targetModal].push(trigger);\n });\n return triggerMap;\n };\n /**\n * Validates whether a modal of the given id exists\n * in the DOM\n * @param {number} id The id of the modal\n * @return {boolean}\n */\n\n\n var validateModalPresence = function validateModalPresence(id) {\n if (!document.getElementById(id)) {\n console.warn(\"MicroModal: \\u2757Seems like you have missed %c'\".concat(id, \"'\"), 'background-color: #f8f9fa;color: #50596c;font-weight: bold;', 'ID somewhere in your code. Refer example below to resolve it.');\n console.warn(\"%cExample:\", 'background-color: #f8f9fa;color: #50596c;font-weight: bold;', \"<div class=\\\"modal\\\" id=\\\"\".concat(id, \"\\\"></div>\"));\n return false;\n }\n };\n /**\n * Validates if there are modal triggers present\n * in the DOM\n * @param {array} triggers An array of data-triggers\n * @return {boolean}\n */\n\n\n var validateTriggerPresence = function validateTriggerPresence(triggers) {\n if (triggers.length <= 0) {\n console.warn(\"MicroModal: \\u2757Please specify at least one %c'micromodal-trigger'\", 'background-color: #f8f9fa;color: #50596c;font-weight: bold;', 'data attribute.');\n console.warn(\"%cExample:\", 'background-color: #f8f9fa;color: #50596c;font-weight: bold;', \"<a href=\\\"#\\\" data-micromodal-trigger=\\\"my-modal\\\"></a>\");\n return false;\n }\n };\n /**\n * Checks if triggers and their corresponding modals\n * are present in the DOM\n * @param {array} triggers Array of DOM nodes which have data-triggers\n * @param {array} triggerMap Associative array of modals and their triggers\n * @return {boolean}\n */\n\n\n var validateArgs = function validateArgs(triggers, triggerMap) {\n validateTriggerPresence(triggers);\n if (!triggerMap) return true;\n\n for (var id in triggerMap) {\n validateModalPresence(id);\n }\n\n return true;\n };\n /**\n * Binds click handlers to all modal triggers\n * @param {object} config [description]\n * @return void\n */\n\n\n var init = function init(config) {\n // Create an config object with default openTrigger\n var options = Object.assign({}, {\n openTrigger: 'data-micromodal-trigger'\n }, config); // Collects all the nodes with the trigger\n\n var triggers = _toConsumableArray(document.querySelectorAll(\"[\".concat(options.openTrigger, \"]\"))); // Makes a mappings of modals with their trigger nodes\n\n\n var triggerMap = generateTriggerMap(triggers, options.openTrigger); // Checks if modals and triggers exist in dom\n\n if (options.debugMode === true && validateArgs(triggers, triggerMap) === false) return; // For every target modal creates a new instance\n\n for (var key in triggerMap) {\n var value = triggerMap[key];\n options.targetModal = key;\n options.triggers = _toConsumableArray(value);\n activeModal = new Modal(options); // eslint-disable-line no-new\n }\n };\n /**\n * Shows a particular modal\n * @param {string} targetModal [The id of the modal to display]\n * @param {object} config [The configuration object to pass]\n * @return {void}\n */\n\n\n var show = function show(targetModal, config) {\n var options = config || {};\n options.targetModal = targetModal; // Checks if modals and triggers exist in dom\n\n if (options.debugMode === true && validateModalPresence(targetModal) === false) return; // clear events in case previous modal wasn't close\n\n if (activeModal) activeModal.removeEventListeners(); // stores reference to active modal\n\n activeModal = new Modal(options); // eslint-disable-line no-new\n\n activeModal.showModal();\n };\n /**\n * Closes the active modal\n * @param {string} targetModal [The id of the modal to close]\n * @return {void}\n */\n\n\n var close = function close(targetModal) {\n targetModal ? activeModal.closeModalById(targetModal) : activeModal.closeModal();\n };\n\n return {\n init: init,\n show: show,\n close: close\n };\n}();\nwindow.MicroModal = MicroModal;\n\nexport default MicroModal;\n","import MicroModal from 'micromodal';\r\n\r\nimport Component, { ComponentProps } from '../Component';\r\nimport { extend } from '../extend';\r\nimport Modal from './Modal';\r\n\r\n/**\r\n * The `ModalManager` component manages a modal dialog. Only one modal dialog\r\n * can be shown at once; loading a new component into the ModalManager will\r\n * overwrite the previous one.\r\n */\r\nexport default class ModalManager extends Component {\r\n showing!: boolean;\r\n hideTimeout!: number;\r\n\r\n modal: (new () => Modal) | null = null;\r\n modalProps: ComponentProps = {};\r\n\r\n component: Modal | null = null;\r\n\r\n oncreate(vnode) {\r\n super.oncreate(vnode);\r\n\r\n app.modal = this;\r\n }\r\n\r\n view() {\r\n return (\r\n <div className=\"ModalManager modal\" id=\"Modal\" onclick={this.onclick.bind(this)} key=\"modal\">\r\n {this.modal && m(this.modal, this.modalProps)}\r\n </div>\r\n );\r\n }\r\n\r\n /**\r\n * Show a modal dialog.\r\n */\r\n show(component: new () => Modal, props: ComponentProps = {}) {\r\n clearTimeout(this.hideTimeout);\r\n\r\n this.showing = true;\r\n this.modal = component;\r\n this.modalProps = props;\r\n this.component = null;\r\n\r\n // Store the vnode state in app.modal.component\r\n extend(this.modalProps, 'oninit', (v, vnode) => (this.component = vnode.state));\r\n\r\n // if (app.current) app.current.retain = true;\r\n\r\n m.redraw();\r\n\r\n if (!$('.modal-backdrop').length) {\r\n $('<div />').addClass('modal-backdrop').appendTo('body');\r\n }\r\n\r\n MicroModal.show('Modal', {\r\n awaitCloseAnimation: true,\r\n awaitOpenAnimation: true,\r\n disableFocus: true,\r\n onShow: () => $('body').addClass('modal-open'),\r\n onClose: () => {\r\n $('body').removeClass('modal-open');\r\n\r\n const backdrop = $('.modal-backdrop');\r\n\r\n backdrop.fadeOut(200, () => {\r\n backdrop.remove();\r\n\r\n this.clear();\r\n });\r\n\r\n this.showing = false;\r\n },\r\n });\r\n\r\n this.$().one('animationend', () => this.onready());\r\n }\r\n\r\n onclick(e) {\r\n if (e.target === this.element) {\r\n this.close();\r\n }\r\n }\r\n\r\n /**\r\n * Close the modal dialog.\r\n */\r\n close() {\r\n if (!this.showing) return;\r\n\r\n // Don't hide the modal immediately, because if the consumer happens to call\r\n // the `show` method straight after to show another modal dialog, it will\r\n // cause the new modal dialog to disappear. Instead we will wait for a tiny\r\n // bit to give the `show` method the opportunity to prevent this from going\r\n // ahead.\r\n this.hideTimeout = setTimeout(() => MicroModal.close('Modal'));\r\n }\r\n\r\n /**\r\n * Clear content from the modal area.\r\n */\r\n protected clear() {\r\n if (this.component) {\r\n this.component.onhide();\r\n }\r\n\r\n this.modal = null;\r\n this.component = null;\r\n this.modalProps = {};\r\n\r\n // app.current.retain = false;\r\n\r\n m.redraw();\r\n }\r\n\r\n /**\r\n * When the modal dialog is ready to be used, tell it!\r\n */\r\n protected onready() {\r\n if (this.component) {\r\n this.component.onready();\r\n }\r\n }\r\n}\r\n","import Mithril from 'mithril';\r\n\r\nimport Component, { ComponentProps } from '../Component';\r\nimport Button from './Button';\r\nimport RequestError from '../utils/RequestError';\r\n\r\n/**\r\n * The `Modal` component displays a modal dialog, wrapped in a form. Subclasses\r\n * should implement the `className`, `title`, and `content` methods.\r\n */\r\nexport default abstract class Modal<T extends ComponentProps = ComponentProps> extends Component<T> {\r\n /**\r\n * An alert component to show below the header.\r\n */\r\n alert: Mithril.Vnode;\r\n\r\n loading: boolean;\r\n\r\n view() {\r\n if (this.alert) {\r\n this.alert.attrs.dismissible = false;\r\n }\r\n\r\n return (\r\n <div className={`Modal modal-dialog ${this.className()}`}>\r\n <div className=\"Modal-content\">\r\n {this.isDismissible() ? (\r\n <div className=\"Modal-close App-backControl\">\r\n {Button.component({\r\n icon: 'fas fa-times',\r\n onclick: this.hide.bind(this),\r\n className: 'Button Button--icon Button--link',\r\n })}\r\n </div>\r\n ) : (\r\n ''\r\n )}\r\n\r\n <form onsubmit={this.onsubmit.bind(this)}>\r\n <div className=\"Modal-header\">\r\n <h3 className=\"App-titleControl App-titleControl--text\">{this.title()}</h3>\r\n </div>\r\n\r\n {this.alert && <div className=\"Modal-alert\">{this.alert}</div>}\r\n\r\n {this.content()}\r\n </form>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n /**\r\n * Determine whether or not the modal should be dismissible via an 'x' button.\r\n */\r\n isDismissible(): boolean {\r\n return true;\r\n }\r\n\r\n /**\r\n * Get the class name to apply to the modal.\r\n */\r\n abstract className(): string;\r\n\r\n /**\r\n * Get the title of the modal dialog.\r\n */\r\n abstract title(): string;\r\n\r\n /**\r\n * Get the content of the modal.\r\n */\r\n abstract content();\r\n\r\n /**\r\n * Handle the modal form's submit event.\r\n */\r\n onsubmit(e: Event) {}\r\n\r\n /**\r\n * Focus on the first input when the modal is ready to be used.\r\n */\r\n onready() {\r\n this.$('form').find('input, select, textarea').first().focus().select();\r\n }\r\n\r\n onhide() {}\r\n\r\n /**\r\n * Hide the modal.\r\n */\r\n hide() {\r\n app.modal.close();\r\n }\r\n\r\n /**\r\n * Stop loading.\r\n */\r\n loaded() {\r\n this.loading = false;\r\n m.redraw();\r\n }\r\n\r\n /**\r\n * Show an alert describing an error returned from the API, and give focus to\r\n * the first relevant field.\r\n */\r\n onerror(error: RequestError) {\r\n this.alert = error.alert;\r\n\r\n m.redraw();\r\n\r\n if (error.status === 422 && error.response.errors) {\r\n this.$(`form [name=\"${error.response.errors[0].source.pointer.replace('/data/attributes/', '')}\"]`).select();\r\n } else {\r\n this.onready();\r\n }\r\n }\r\n}\r\n","import Modal from './Modal';\r\nimport { ComponentProps } from '../Component';\r\nimport RequestError from '../utils/RequestError';\r\n\r\nexport interface RequestErrorModalProps extends ComponentProps {\r\n error: RequestError;\r\n}\r\n\r\nexport default class RequestErrorModal<T extends RequestErrorModalProps = RequestErrorModalProps> extends Modal<T> {\r\n className(): string {\r\n return 'RequestErrorModal Modal--large';\r\n }\r\n\r\n title(): string {\r\n return this.props.error.xhr ? `${this.props.error.xhr.status} ${this.props.error.xhr.statusText}` : '';\r\n }\r\n\r\n content() {\r\n let responseText;\r\n\r\n try {\r\n responseText = JSON.stringify(JSON.parse(this.props.error.responseText), null, 2);\r\n } catch (e) {\r\n responseText = this.props.error.responseText;\r\n }\r\n\r\n return (\r\n <div className=\"Modal-body\">\r\n <pre>\r\n {this.props.error.options.method} {this.props.error.options.url}\r\n <br />\r\n <br />\r\n {responseText}\r\n </pre>\r\n </div>\r\n );\r\n }\r\n}\r\n","import Component, { ComponentProps } from '../Component';\r\nimport Alert from './Alert';\r\nimport { Vnode } from 'mithril';\r\n\r\n/**\r\n * The `AlertManager` component provides an area in which `Alert` components can\r\n * be shown and dismissed.\r\n */\r\nexport default class AlertManager extends Component {\r\n /**\r\n * An array of Alert components which are currently showing.\r\n */\r\n protected components: Vnode<ComponentProps, Alert>[] = [];\r\n\r\n view() {\r\n return (\r\n <div className=\"AlertManager\">\r\n {this.components.map((vnode) => (\r\n <div className=\"AlertManager-alert\">{vnode}</div>\r\n ))}\r\n </div>\r\n );\r\n }\r\n\r\n /**\r\n * Show an Alert in the alerts area.\r\n */\r\n public show(vnode: Vnode<ComponentProps, Alert>) {\r\n vnode.attrs.ondismiss = this.dismiss.bind(this, vnode);\r\n\r\n this.components.push(vnode);\r\n m.redraw();\r\n }\r\n\r\n /**\r\n * Dismiss an alert.\r\n */\r\n public dismiss(vnode) {\r\n const index = this.components.indexOf(vnode);\r\n\r\n if (index !== -1) {\r\n this.components.splice(index, 1);\r\n m.redraw();\r\n }\r\n }\r\n\r\n /**\r\n * Clear all alerts.\r\n */\r\n public clear() {\r\n this.components = [];\r\n m.redraw();\r\n }\r\n}\r\n","import Mithril from 'mithril';\r\n\r\nimport Translator from './Translator';\r\nimport Session from './Session';\r\nimport Store from './Store';\r\nimport { extend } from './extend';\r\n\r\nimport extract from './utils/extract';\r\nimport mapRoutes from './utils/mapRoutes';\r\nimport Drawer from './utils/Drawer';\r\nimport RequestError from './utils/RequestError';\r\nimport ItemList from './utils/ItemList';\r\nimport ScrollListener from './utils/ScrollListener';\r\n\r\nimport Forum from './models/Forum';\r\nimport Discussion from './models/Discussion';\r\nimport User from './models/User';\r\nimport Post from './models/Post';\r\nimport Group from './models/Group';\r\nimport Notification from './models/Notification';\r\n\r\nimport Alert from './components/Alert';\r\nimport Button from './components/Button';\r\nimport ModalManager from './components/ModalManager';\r\nimport RequestErrorModal from './components/RequestErrorModal';\r\n\r\nimport flattenDeep from 'lodash/flattenDeep';\r\nimport AlertManager from './components/AlertManager';\r\n\r\nexport type ApplicationData = {\r\n apiDocument: any;\r\n locale: string;\r\n locales: any;\r\n resources: any[];\r\n session: any;\r\n};\r\n\r\nexport default abstract class Application {\r\n /**\r\n * The forum model for this application.\r\n */\r\n public forum!: Forum;\r\n\r\n /**\r\n * A map of routes, keyed by a unique route name. Each route is an object\r\n * containing the following properties:\r\n *\r\n * - `path` The path that the route is accessed at.\r\n * - `component` The Mithril component to render when this route is active.\r\n *\r\n * @example\r\n * app.routes.discussion = {path: '/d/:id', component: DiscussionPage.component()};\r\n */\r\n public routes: { [key: string]: { path: string; component: any; [key: string]: any } } = {};\r\n\r\n /**\r\n * An ordered list of initializers to bootstrap the application.\r\n */\r\n public initializers = new ItemList();\r\n\r\n /**\r\n * The app's session.\r\n */\r\n public session!: Session;\r\n\r\n /**\r\n * The app's translator.\r\n */\r\n public translator = new Translator();\r\n\r\n /**\r\n * The app's data store.\r\n */\r\n public store = new Store({\r\n forums: Forum,\r\n users: User,\r\n discussions: Discussion,\r\n posts: Post,\r\n groups: Group,\r\n notifications: Notification,\r\n });\r\n\r\n /**\r\n * A local cache that can be used to store data at the application level, so\r\n * that is persists between different routes.\r\n */\r\n public cache: { [key: string]: any } = {};\r\n\r\n /**\r\n * Whether or not the app has been booted.\r\n */\r\n public booted: boolean = false;\r\n\r\n /**\r\n * An Alert that was shown as a result of an AJAX request error. If present,\r\n * it will be dismissed on the next successful request.\r\n */\r\n private requestError: RequestError | null = null;\r\n\r\n data!: ApplicationData;\r\n\r\n title = '';\r\n titleCount = 0;\r\n\r\n drawer = new Drawer();\r\n\r\n modal!: ModalManager;\r\n alerts!: AlertManager;\r\n\r\n load(payload) {\r\n this.data = payload;\r\n this.translator.locale = payload.locale;\r\n }\r\n\r\n boot() {\r\n this.initializers.toArray().forEach((initializer) => initializer(this));\r\n\r\n this.store.pushPayload({ data: this.data.resources });\r\n\r\n this.forum = this.store.getById('forums', 1);\r\n\r\n this.session = new Session(this.store.getById('users', this.data.session.userId), this.data.session.csrfToken);\r\n\r\n this.mount();\r\n\r\n this.booted = true;\r\n }\r\n\r\n bootExtensions(extensions) {\r\n Object.keys(extensions).forEach((name) => {\r\n const extension = extensions[name];\r\n\r\n const extenders = flattenDeep(extension.extend);\r\n\r\n for (const extender of extenders) {\r\n extender.extend(this, { name, exports: extension });\r\n }\r\n });\r\n }\r\n\r\n mount(basePath = '') {\r\n const $modal = document.getElementById('modal');\r\n const $alerts = document.getElementById('alerts');\r\n const $content = document.getElementById('content');\r\n\r\n if ($modal) m.mount($modal, (this.modal = new ModalManager()));\r\n\r\n if ($alerts) m.mount($alerts, (this.alerts = new AlertManager({ oninit: (vnode) => (this.alerts = vnode.state) })));\r\n\r\n if ($content) m.route($content, basePath + '/', mapRoutes(this.routes, basePath));\r\n\r\n // Add a class to the body which indicates that the page has been scrolled\r\n // down.\r\n new ScrollListener((top) => {\r\n const $app = $('#app');\r\n const offset = $app.offset().top;\r\n\r\n $app.toggleClass('affix', top >= offset).toggleClass('scrolled', top > offset);\r\n }).start();\r\n\r\n $(() => {\r\n $('body').addClass('ontouchstart' in window ? 'touch' : 'no-touch');\r\n });\r\n }\r\n\r\n /**\r\n * Get the API response document that has been preloaded into the application.\r\n */\r\n preloadedApiDocument() {\r\n if (this.data.apiDocument) {\r\n const results = this.store.pushPayload(this.data.apiDocument);\r\n\r\n this.data.apiDocument = null;\r\n\r\n return results;\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Set the <title> of the page.\r\n */\r\n setTitle(title: string) {\r\n this.title = title;\r\n this.updateTitle();\r\n }\r\n\r\n /**\r\n * Set a number to display in the <title> of the page.\r\n */\r\n setTitleCount(count: number) {\r\n this.titleCount = count;\r\n this.updateTitle();\r\n }\r\n\r\n updateTitle() {\r\n document.title = (this.titleCount ? `(${this.titleCount}) ` : '') + (this.title ? this.title + ' - ' : '') + this.forum.attribute('title');\r\n }\r\n\r\n /**\r\n * Construct a URL to the route with the given name.\r\n */\r\n route(name: string, params: object = {}): string {\r\n const route = this.routes[name];\r\n\r\n if (!route) throw new Error(`Route '${name}' does not exist`);\r\n\r\n const url = route.path.replace(/:([^\\/]+)/g, (m, key) => extract(params, key));\r\n\r\n // Remove falsy values in params to avoid\r\n // having urls like '/?sort&q'\r\n for (const key in params) {\r\n if (params.hasOwnProperty(key) && !params[key]) delete params[key];\r\n }\r\n\r\n const queryString = m.buildQueryString(params as Mithril.Params);\r\n const prefix = m.route.prefix === '' ? this.forum.attribute('basePath') : '';\r\n\r\n return prefix + url + (queryString ? '?' + queryString : '');\r\n }\r\n\r\n /**\r\n * Make an AJAX request, handling any low-level errors that may occur.\r\n *\r\n * @see https://mithril.js.org/request.html\r\n */\r\n request(originalOptions: Mithril.RequestOptions<JSON> | any): Promise<any> {\r\n const options: Mithril.RequestOptions<JSON> | any = Object.assign({}, originalOptions);\r\n\r\n // Set some default options if they haven't been overridden. We want to\r\n // authenticate all requests with the session token. We also want all\r\n // requests to run asynchronously in the background, so that they don't\r\n // prevent redraws from occurring.\r\n options.background = options.background || true;\r\n\r\n extend(options, 'config', (result, xhr: XMLHttpRequest) => xhr.setRequestHeader('X-CSRF-Token', this.session.csrfToken!));\r\n\r\n // If the method is something like PATCH or DELETE, which not all servers\r\n // and clients support, then we'll send it as a POST request with the\r\n // intended method specified in the X-HTTP-Method-Override header.\r\n if (options.method !== 'GET' && options.method !== 'POST') {\r\n const method = options.method;\r\n extend(options, 'config', (result, xhr: XMLHttpRequest) => xhr.setRequestHeader('X-HTTP-Method-Override', method));\r\n options.method = 'POST';\r\n }\r\n\r\n // When we deserialize JSON data, if for some reason the server has provided\r\n // a dud response, we don't want the application to crash. We'll show an\r\n // error message to the user instead.\r\n options.deserialize = options.deserialize || ((responseText) => responseText);\r\n\r\n options.errorHandler =\r\n options.errorHandler ||\r\n ((error) => {\r\n throw error;\r\n });\r\n\r\n // When extracting the data from the response, we can check the server\r\n // response code and show an error message to the user if something's gone\r\n // awry.\r\n const original = options.extract;\r\n options.extract = (xhr) => {\r\n let responseText;\r\n\r\n if (original) {\r\n responseText = original(xhr.responseText);\r\n } else {\r\n responseText = xhr.responseText || null;\r\n }\r\n\r\n const status = xhr.status;\r\n\r\n if (status < 200 || status > 299) {\r\n throw new RequestError(status, responseText, options, xhr);\r\n }\r\n\r\n if (xhr.getResponseHeader) {\r\n const csrfToken = xhr.getResponseHeader('X-CSRF-Token');\r\n if (csrfToken) app.session.csrfToken = csrfToken;\r\n }\r\n\r\n try {\r\n return JSON.parse(responseText);\r\n } catch (e) {\r\n throw new RequestError(500, responseText, options, xhr);\r\n }\r\n };\r\n\r\n if (this.requestError) this.alerts.dismiss(this.requestError.alert);\r\n\r\n // Now make the request. If it's a failure, inspect the error that was\r\n // returned and show an alert containing its contents.\r\n return m.request(options).then(\r\n (res) => res,\r\n (error) => {\r\n this.requestError = error;\r\n\r\n let children;\r\n\r\n switch (error.status) {\r\n case 422:\r\n children = error.response.errors\r\n .map((error) => [error.detail, m('br')])\r\n .reduce((a, b) => a.concat(b), [])\r\n .slice(0, -1);\r\n break;\r\n\r\n case 401:\r\n case 403:\r\n children = this.translator.trans('core.lib.error.permission_denied_message');\r\n break;\r\n\r\n case 404:\r\n case 410:\r\n children = this.translator.trans('core.lib.error.not_found_message');\r\n break;\r\n\r\n case 429:\r\n children = this.translator.trans('core.lib.error.rate_limit_exceeded_message');\r\n break;\r\n\r\n default:\r\n children = this.translator.trans('core.lib.error.generic_message');\r\n }\r\n\r\n const isDebug = app.forum.attribute('debug');\r\n\r\n error.alert = Alert.component({\r\n type: 'error',\r\n children,\r\n controls: isDebug && [\r\n Button.component({\r\n className: 'Button Button--link',\r\n onclick: this.showDebug.bind(this, error),\r\n children: 'DEBUG', // TODO make translatable\r\n }),\r\n ],\r\n });\r\n\r\n try {\r\n options.errorHandler(error);\r\n } catch (error) {\r\n console.error(error);\r\n this.alerts.show(error.alert);\r\n }\r\n\r\n return Promise.reject(error);\r\n }\r\n );\r\n }\r\n\r\n private showDebug(error: RequestError) {\r\n this.alerts.dismiss(this.requestError!.alert);\r\n\r\n this.modal.show(RequestErrorModal, { error });\r\n }\r\n}\r\n","export interface StackItem {\r\n name: string;\r\n title?: string;\r\n url: string;\r\n}\r\n\r\n/**\r\n * The `History` class keeps track and manages a stack of routes that the user\r\n * has navigated to in their session.\r\n *\r\n * An item can be pushed to the top of the stack using the `push` method. An\r\n * item in the stack has a name and a URL. The name need not be unique; if it is\r\n * the same as the item before it, that will be overwritten with the new URL. In\r\n * this way, if a user visits a discussion, and then visits another discussion,\r\n * popping the history stack will still take them back to the discussion list\r\n * rather than the previous discussion.\r\n */\r\nexport default class History {\r\n /**\r\n * The stack of routes that have been navigated to.\r\n */\r\n protected stack: StackItem[] = [];\r\n\r\n /**\r\n * Get the item on the top of the stack.\r\n */\r\n getCurrent(): StackItem {\r\n return this.stack[this.stack.length - 1];\r\n }\r\n\r\n /**\r\n * Get the previous item on the stack.\r\n */\r\n getPrevious(): StackItem {\r\n return this.stack[this.stack.length - 2];\r\n }\r\n\r\n /**\r\n * Push an item to the top of the stack.\r\n *\r\n * @param name The name of the route.\r\n * @param title The title of the route.\r\n * @param [url] The URL of the route. The current URL will be used if\r\n * not provided.\r\n */\r\n push(name: string, title?: string, url: string = m.route.get()) {\r\n // If we're pushing an item with the same name as second-to-top item in the\r\n // stack, we will assume that the user has clicked the 'back' button in\r\n // their browser. In this case, we don't want to push a new item, so we will\r\n // pop off the top item, and then the second-to-top item will be overwritten\r\n // below.\r\n const secondTop = this.stack[this.stack.length - 2];\r\n if (secondTop && secondTop.name === name) {\r\n this.stack.pop();\r\n }\r\n\r\n // If we're pushing an item with the same name as the top item in the stack,\r\n // then we'll overwrite it with the new URL.\r\n const top = this.getCurrent();\r\n if (top && top.name === name) {\r\n Object.assign(top, { url, title });\r\n } else {\r\n this.stack.push({ name, url, title });\r\n }\r\n }\r\n\r\n /**\r\n * Check whether or not the history stack is able to be popped.\r\n */\r\n canGoBack(): boolean {\r\n return this.stack.length > 1;\r\n }\r\n\r\n /**\r\n * Go back to the previous route in the history stack.\r\n */\r\n back() {\r\n if (!this.canGoBack()) {\r\n return this.home();\r\n }\r\n\r\n this.stack.pop();\r\n\r\n m.route.set(this.getCurrent().url);\r\n }\r\n\r\n /**\r\n * Get the URL of the previous page.\r\n */\r\n backUrl(): string {\r\n const secondTop = this.stack[this.stack.length - 2];\r\n\r\n return secondTop.url;\r\n }\r\n\r\n /**\r\n * Go to the first route in the history stack.\r\n */\r\n home() {\r\n this.stack.splice(0);\r\n\r\n m.route.set('/');\r\n }\r\n}\r\n","/**\r\n * The `Pane` class manages the page's discussion list sidepane. The pane is a\r\n * part of the content view (DiscussionPage component), but its visibility is\r\n * determined by CSS classes applied to the outer page element. This class\r\n * manages the application of those CSS classes.\r\n */\r\nexport default class Pane {\r\n /**\r\n * The localStorage key to store the pane's pinned state with.\r\n */\r\n protected pinnedKey = 'panePinned';\r\n\r\n /**\r\n * The page element.\r\n */\r\n protected $element;\r\n\r\n /**\r\n * Whether or not the pane is currently pinned.\r\n */\r\n protected pinned = !!localStorage.getItem(this.pinnedKey);\r\n\r\n /**\r\n * Whether or not the pane is currently showing, or is hidden off the edge\r\n * of the screen.\r\n */\r\n protected showing: boolean = false;\r\n\r\n active: boolean = false;\r\n\r\n hideTimeout?: number;\r\n\r\n constructor(element) {\r\n this.$element = $(element);\r\n\r\n this.render();\r\n }\r\n\r\n /**\r\n * Enable the pane.\r\n */\r\n public enable() {\r\n this.active = true;\r\n this.render();\r\n }\r\n\r\n /**\r\n * Disable the pane.\r\n */\r\n public disable() {\r\n this.active = false;\r\n this.showing = false;\r\n this.render();\r\n }\r\n\r\n /**\r\n * Show the pane.\r\n */\r\n public show() {\r\n clearTimeout(this.hideTimeout);\r\n this.showing = true;\r\n this.render();\r\n }\r\n\r\n /**\r\n * Hide the pane.\r\n */\r\n public hide() {\r\n this.showing = false;\r\n this.render();\r\n }\r\n\r\n /**\r\n * Begin a timeout to hide the pane, which can be cancelled by showing the\r\n * pane.\r\n */\r\n public onmouseleave() {\r\n this.hideTimeout = setTimeout(this.hide.bind(this), 250);\r\n }\r\n\r\n /**\r\n * Toggle whether or not the pane is pinned.\r\n */\r\n public togglePinned() {\r\n this.pinned = !this.pinned;\r\n\r\n localStorage.setItem(this.pinnedKey, this.pinned ? 'true' : 'false');\r\n\r\n this.render();\r\n }\r\n\r\n /**\r\n * Apply the appropriate CSS classes to the page element.\r\n */\r\n protected render() {\r\n this.$element.toggleClass('panePinned', this.pinned).toggleClass('hasPane', this.active).toggleClass('paneShowing', this.showing);\r\n }\r\n}\r\n","import Button, { ButtonProps } from './Button';\r\n\r\ninterface LinkButtonProps extends ButtonProps {\r\n active?: boolean;\r\n oncreate?: Function;\r\n href?: string;\r\n}\r\n\r\n/**\r\n * The `LinkButton` component defines a `Button` which links to a route.\r\n *\r\n * ### Props\r\n *\r\n * All of the props accepted by `Button`, plus:\r\n *\r\n * - `active` Whether or not the page that this button links to is currently\r\n * active.\r\n * - `href` The URL to link to. If the current URL `m.route()` matches this,\r\n * the `active` prop will automatically be set to true.\r\n */\r\nexport default class LinkButton extends Button<LinkButtonProps> {\r\n static initProps(props: LinkButtonProps) {\r\n props.active = this.isActive(props);\r\n }\r\n\r\n view() {\r\n const vdom = super.view();\r\n\r\n vdom.tag = m.route.Link;\r\n vdom.attrs.active = String(vdom.attrs.active);\r\n\r\n return vdom;\r\n }\r\n\r\n /**\r\n * Determine whether a component with the given props is 'active'.\r\n */\r\n static isActive(props: LinkButtonProps): boolean {\r\n return typeof props.active !== 'undefined' ? props.active : m.route.get() === props.href;\r\n }\r\n}\r\n","import Component, { ComponentProps } from '../Component';\r\nimport Button from './Button';\r\nimport LinkButton from './LinkButton';\r\n\r\nimport History from '../../forum/utils/History';\r\n\r\nexport interface NavigationProps extends ComponentProps {\r\n /**\r\n * The name of a class to set on the root element.\r\n */\r\n className?: string;\r\n\r\n /**\r\n * Whether or not to show a button to toggle the app's drawer if\r\n * there is no more history to pop.\r\n */\r\n drawer?: boolean;\r\n}\r\n\r\n/**\r\n * The `Navigation` component displays a set of navigation buttons. Typically\r\n * this is just a back button which pops the app's History. If the user is on\r\n * the root page and there is no history to pop, then in some instances it may\r\n * show a button that toggles the app's drawer.\r\n *\r\n * If the app has a pane, it will also include a 'pin' button which toggles the\r\n * pinned state of the pane.\r\n */\r\nexport default class Navigation extends Component<NavigationProps> {\r\n className?: string;\r\n drawer: boolean;\r\n\r\n constructor(options: { className?: string; drawer?: boolean } = {}) {\r\n super();\r\n\r\n this.className = options.className;\r\n this.drawer = !!options.drawer;\r\n }\r\n\r\n view() {\r\n const { history, pane }: { history: History; pane: any } = app;\r\n\r\n return (\r\n <div\r\n className={'Navigation ButtonGroup ' + (this.className || '')}\r\n onmouseenter={pane && pane.show.bind(pane)}\r\n onmouseleave={pane && pane.onmouseleave.bind(pane)}\r\n >\r\n {history.canGoBack() ? [this.getBackButton(), this.getPaneButton()] : this.getDrawerButton()}\r\n </div>\r\n );\r\n }\r\n\r\n /**\r\n * Get the back button.\r\n */\r\n protected getBackButton() {\r\n const { history } = app;\r\n const previous = history.getPrevious() || {};\r\n\r\n return (\r\n <LinkButton\r\n className=\"Button Navigation-back Button--icon\"\r\n href={history.backUrl()}\r\n icon=\"fas fa-chevron-left\"\r\n title={previous.title}\r\n onclick={(e) => {\r\n if (e.shiftKey || e.ctrlKey || e.metaKey || e.which === 2) return;\r\n e.preventDefault();\r\n history.back();\r\n }}\r\n />\r\n );\r\n }\r\n\r\n /**\r\n * Get the pane pinned toggle button.\r\n */\r\n protected getPaneButton() {\r\n const { pane } = app;\r\n\r\n if (!pane || !pane.active) return '';\r\n\r\n return (\r\n <Button\r\n className={'Button Button--icon Navigation-pin' + (pane.pinned ? ' active' : '')}\r\n onclick={pane.togglePinned.bind(pane)}\r\n icon=\"fas fa-thumbtack\"\r\n />\r\n );\r\n }\r\n\r\n /**\r\n * Get the drawer toggle button.\r\n */\r\n protected getDrawerButton() {\r\n if (!this.drawer) return '';\r\n\r\n const { drawer } = app;\r\n const user = app.session.user;\r\n\r\n return (\r\n <Button\r\n className={'Button Button--icon Navigation-drawer' + (user && user.newNotificationCount() ? ' new' : '')}\r\n onclick={(e) => {\r\n e.stopPropagation();\r\n drawer.show();\r\n }}\r\n icon=\"fas fa-bars\"\r\n />\r\n );\r\n }\r\n}\r\n","import Component from '../../common/Component';\r\nimport ItemList from '../../common/utils/ItemList';\r\nimport listItems from '../../common/helpers/listItems';\r\n\r\n/**\r\n * The `HeaderPrimary` component displays primary header controls. On the\r\n * default skin, these are shown just to the right of the forum title.\r\n */\r\nexport default class HeaderPrimary extends Component {\r\n view() {\r\n return <ul className=\"Header-controls\">{listItems(this.items().toArray())}</ul>;\r\n }\r\n\r\n /**\r\n * Build an item list for the controls.\r\n */\r\n items(): ItemList {\r\n return new ItemList();\r\n }\r\n}\r\n","import Component from '../../common/Component';\r\nimport ItemList from '../../common/utils/ItemList';\r\n\r\n/**\r\n * The `LogInButtons` component displays a collection of social login buttons.\r\n */\r\nexport default class LogInButtons extends Component {\r\n view() {\r\n return <div className=\"LogInButtons\">{this.items().toArray()}</div>;\r\n }\r\n\r\n /**\r\n * Build a list of LogInButton components.\r\n */\r\n items(): ItemList {\r\n return new ItemList();\r\n }\r\n}\r\n","import Stream from 'mithril/stream';\r\n\r\nimport { ComponentProps } from '../../common/Component';\r\nimport Modal from '../../common/components/Modal';\r\nimport ItemList from '../../common/utils/ItemList';\r\nimport Button from '../../common/components/Button';\r\n\r\nimport LogInButtons from './LogInButtons';\r\nimport LogInModal from './LogInModal';\r\n\r\nexport interface SignUpModalProps extends ComponentProps {\r\n username?: string;\r\n email?: string;\r\n password?: string;\r\n\r\n /**\r\n * An email token to sign up with\r\n */\r\n token?: string;\r\n\r\n provided?: string[];\r\n}\r\n\r\n/**\r\n * The `SignUpModal` component displays a modal dialog with a singup form.\r\n */\r\nexport default class SignUpModal extends Modal<SignUpModalProps> {\r\n /**\r\n * The value of the username input.\r\n */\r\n username!: Stream<string>;\r\n\r\n /**\r\n * The value of the email input.\r\n */\r\n email!: Stream<string>;\r\n\r\n /**\r\n * The value of the password input.\r\n */\r\n password!: Stream<string>;\r\n\r\n oninit(vnode) {\r\n super.oninit(vnode);\r\n\r\n this.username = m.prop(this.props.username || '');\r\n\r\n this.email = m.prop(this.props.email || '');\r\n\r\n this.password = m.prop(this.props.password || '');\r\n }\r\n\r\n className() {\r\n return 'Modal--small SignUpModal';\r\n }\r\n\r\n title() {\r\n return app.translator.transText('core.forum.sign_up.title');\r\n }\r\n\r\n content() {\r\n return [<div className=\"Modal-body\">{this.body()}</div>, <div className=\"Modal-footer\">{this.footer()}</div>];\r\n }\r\n\r\n isProvided(field) {\r\n return this.props.provided && this.props.provided.indexOf(field) !== -1;\r\n }\r\n\r\n body() {\r\n return [this.props.token ? '' : <LogInButtons />, <div className=\"Form Form--centered\">{this.fields().toArray()}</div>];\r\n }\r\n\r\n fields() {\r\n const items = new ItemList();\r\n\r\n items.add(\r\n 'username',\r\n <div className=\"Form-group\">\r\n <input\r\n className=\"FormControl\"\r\n name=\"username\"\r\n type=\"text\"\r\n placeholder={app.translator.transText('core.forum.sign_up.username_placeholder')}\r\n value={this.username()}\r\n onchange={m.withAttr('value', this.username)}\r\n disabled={this.loading || this.isProvided('username')}\r\n />\r\n </div>,\r\n 30\r\n );\r\n\r\n items.add(\r\n 'email',\r\n <div className=\"Form-group\">\r\n <input\r\n className=\"FormControl\"\r\n name=\"email\"\r\n type=\"email\"\r\n placeholder={app.translator.transText('core.forum.sign_up.email_placeholder')}\r\n value={this.email()}\r\n onchange={m.withAttr('value', this.email)}\r\n disabled={this.loading || this.isProvided('email')}\r\n />\r\n </div>,\r\n 20\r\n );\r\n\r\n if (!this.props.token) {\r\n items.add(\r\n 'password',\r\n <div className=\"Form-group\">\r\n <input\r\n className=\"FormControl\"\r\n name=\"password\"\r\n type=\"password\"\r\n placeholder={app.translator.transText('core.forum.sign_up.password_placeholder')}\r\n value={this.password()}\r\n onchange={m.withAttr('value', this.password)}\r\n disabled={this.loading}\r\n />\r\n </div>,\r\n 10\r\n );\r\n }\r\n\r\n items.add(\r\n 'submit',\r\n <div className=\"Form-group\">\r\n <Button className=\"Button Button--primary Button--block\" type=\"submit\" loading={this.loading}>\r\n {app.translator.trans('core.forum.sign_up.submit_button')}\r\n </Button>\r\n </div>,\r\n -10\r\n );\r\n\r\n return items;\r\n }\r\n\r\n footer() {\r\n return [\r\n <p className=\"SignUpModal-logIn\">\r\n {app.translator.trans('core.forum.sign_up.log_in_text', {\r\n a: <a onclick={this.logIn.bind(this)} />,\r\n })}\r\n </p>,\r\n ];\r\n }\r\n\r\n /**\r\n * Open the log in modal, prefilling it with an email/username/password if\r\n * the user has entered one.\r\n *\r\n * @public\r\n */\r\n logIn() {\r\n const props = {\r\n identification: this.email() || this.username(),\r\n password: this.password(),\r\n };\r\n\r\n app.modal.show(LogInModal, props);\r\n }\r\n\r\n onready() {\r\n if (this.props.username && !this.props.email) {\r\n this.$('[name=email]').select();\r\n } else {\r\n this.$('[name=username]').select();\r\n }\r\n }\r\n\r\n onsubmit(e) {\r\n e.preventDefault();\r\n\r\n this.loading = true;\r\n\r\n const data = this.submitData();\r\n\r\n app.request({\r\n url: app.forum.attribute('baseUrl') + '/register',\r\n method: 'POST',\r\n data,\r\n errorHandler: this.onerror.bind(this),\r\n }).then(() => window.location.reload(), this.loaded.bind(this));\r\n }\r\n\r\n /**\r\n * Get the data that should be submitted in the sign-up request.\r\n *\r\n * @return {Object}\r\n * @public\r\n */\r\n submitData() {\r\n const data = {\r\n username: this.username(),\r\n email: this.email(),\r\n };\r\n\r\n if (this.props.token) {\r\n data.token = this.props.token;\r\n } else {\r\n data.password = this.password();\r\n }\r\n\r\n return data;\r\n }\r\n}\r\n","import Stream from 'mithril/stream';\r\n\r\nimport { ComponentProps } from '../../common/Component';\r\nimport Modal from '../../common/components/Modal';\r\nimport ItemList from '../../common/utils/ItemList';\r\nimport Button from '../../common/components/Button';\r\n\r\nimport LogInButtons from './LogInButtons';\r\nimport SignUpModal from './SignUpModal';\r\n\r\nexport interface LogInModalProps extends ComponentProps {\r\n identification?: string;\r\n password?: string;\r\n remember?: boolean;\r\n}\r\n\r\n/**\r\n * The `LogInModal` component displays a modal dialog with a login form.\r\n */\r\nexport default class LogInModal extends Modal<LogInModalProps> {\r\n /**\r\n * The value of the identification input.\r\n */\r\n identification!: Stream<string>;\r\n\r\n /**\r\n * The value of the password input.\r\n */\r\n password!: Stream<string>;\r\n\r\n /**\r\n * The value of the remember me input.\r\n */\r\n remember!: Stream<boolean>;\r\n\r\n oninit(vnode) {\r\n super.oninit(vnode);\r\n\r\n this.identification = m.prop(this.props.identification || '');\r\n\r\n this.password = m.prop(this.props.password || '');\r\n\r\n this.remember = m.prop(!!this.props.remember);\r\n }\r\n\r\n className(): string {\r\n return 'LogInModal Modal--small';\r\n }\r\n\r\n title(): string {\r\n return app.translator.transText('core.forum.log_in.title');\r\n }\r\n\r\n content() {\r\n return [<div className=\"Modal-body\">{this.body()}</div>, <div className=\"Modal-footer\">{this.footer()}</div>];\r\n }\r\n\r\n body() {\r\n return [<LogInButtons />, <div className=\"Form Form--centered\">{this.fields().toArray()}</div>];\r\n }\r\n\r\n fields() {\r\n const items = new ItemList();\r\n\r\n items.add(\r\n 'identification',\r\n <div className=\"Form-group\">\r\n <input\r\n className=\"FormControl\"\r\n name=\"identification\"\r\n type=\"text\"\r\n placeholder={app.translator.transText('core.forum.log_in.username_or_email_placeholder')}\r\n bidi={this.identification}\r\n disabled={this.loading}\r\n />\r\n </div>,\r\n 30\r\n );\r\n\r\n items.add(\r\n 'password',\r\n <div className=\"Form-group\">\r\n <input\r\n className=\"FormControl\"\r\n name=\"password\"\r\n type=\"password\"\r\n placeholder={app.translator.transText('core.forum.log_in.password_placeholder')}\r\n bidi={this.password}\r\n disabled={this.loading}\r\n />\r\n </div>,\r\n 20\r\n );\r\n\r\n items.add(\r\n 'remember',\r\n <div className=\"Form-group\">\r\n <div>\r\n <label className=\"checkbox\">\r\n <input type=\"checkbox\" bidi={this.remember} disabled={this.loading} />\r\n {app.translator.trans('core.forum.log_in.remember_me_label')}\r\n </label>\r\n </div>\r\n </div>,\r\n 10\r\n );\r\n\r\n items.add(\r\n 'submit',\r\n <div className=\"Form-group\">\r\n {Button.component({\r\n className: 'Button Button--primary Button--block',\r\n type: 'submit',\r\n loading: this.loading,\r\n children: app.translator.trans('core.forum.log_in.submit_button'),\r\n })}\r\n </div>,\r\n -10\r\n );\r\n\r\n return items;\r\n }\r\n\r\n footer() {\r\n return [\r\n <p className=\"LogInModal-forgotPassword\">\r\n <a onclick={this.forgotPassword.bind(this)}>{app.translator.trans('core.forum.log_in.forgot_password_link')}</a>\r\n </p>,\r\n\r\n app.forum.attribute('allowSignUp') && (\r\n <p className=\"LogInModal-signUp\">\r\n {app.translator.trans('core.forum.log_in.sign_up_text', { a: <a onclick={this.signUp.bind(this)} /> })}\r\n </p>\r\n ),\r\n ];\r\n }\r\n\r\n /**\r\n * Open the forgot password modal, prefilling it with an email if the user has\r\n * entered one.\r\n *\r\n * @public\r\n */\r\n forgotPassword() {\r\n const email = this.identification();\r\n const props = email.indexOf('@') !== -1 ? { email } : undefined;\r\n\r\n app.modal.show(ForgotPasswordModal, props);\r\n }\r\n\r\n /**\r\n * Open the sign up modal, prefilling it with an email/username/password if\r\n * the user has entered one.\r\n *\r\n * @public\r\n */\r\n signUp() {\r\n const props = { password: this.password() };\r\n const identification = this.identification();\r\n props[identification.indexOf('@') !== -1 ? 'email' : 'username'] = identification;\r\n\r\n app.modal.show(SignUpModal, props);\r\n }\r\n\r\n oncreate(vnode) {\r\n super.oncreate(vnode);\r\n\r\n this.$(`[name=\"${this.identification() ? 'password' : 'identification'}\"]`).select();\r\n }\r\n\r\n onsubmit(e) {\r\n e.preventDefault();\r\n\r\n this.loading = true;\r\n\r\n const identification = this.identification();\r\n const password = this.password();\r\n const remember = this.remember();\r\n\r\n app.session\r\n .login({ identification, password, remember }, { errorHandler: this.onerror.bind(this) })\r\n .then(() => window.location.reload(), this.loaded.bind(this));\r\n }\r\n\r\n onerror(error) {\r\n if (error.status === 401) {\r\n error.alert.attrs.children = app.translator.trans('core.forum.log_in.invalid_login_message');\r\n }\r\n\r\n super.onerror(error);\r\n }\r\n}\r\n","/**\r\n * The `avatar` helper displays a user's avatar.\r\n *\r\n * @param {User} user\r\n * @param {Object} attrs Attributes to apply to the avatar element\r\n * @return {Object}\r\n */\r\nexport default function avatar(user, attrs: any = {}) {\r\n attrs.className = 'Avatar ' + (attrs.className || '');\r\n let content = '';\r\n\r\n // If the `title` attribute is set to null or false, we don't want to give the\r\n // avatar a title. On the other hand, if it hasn't been given at all, we can\r\n // safely default it to the user's username.\r\n const hasTitle = attrs.title === 'undefined' || attrs.title;\r\n if (!hasTitle) delete attrs.title;\r\n\r\n // If a user has been passed, then we will set up an avatar using their\r\n // uploaded image, or the first letter of their username if they haven't\r\n // uploaded one.\r\n if (user) {\r\n const username = user.displayName() || '?';\r\n const avatarUrl = user.avatarUrl();\r\n\r\n if (hasTitle) attrs.title = attrs.title || username;\r\n\r\n if (avatarUrl) {\r\n return <img {...attrs} src={avatarUrl} />;\r\n }\r\n\r\n content = username.charAt(0).toUpperCase();\r\n attrs.style = { background: user.color() };\r\n }\r\n\r\n return <span {...attrs}>{content}</span>;\r\n}\r\n","import Component, { ComponentProps } from '../Component';\r\nimport icon from '../helpers/icon';\r\nimport listItems from '../helpers/listItems';\r\n\r\nexport interface DropdownProps extends ComponentProps {\r\n buttonClassName?: string;\r\n menuClassName?: string;\r\n label?: string;\r\n icon?: string;\r\n caretIcon?: undefined | string;\r\n\r\n onhide?: Function;\r\n onshow?: Function;\r\n onclick?: Function;\r\n}\r\n\r\n/**\r\n * The `Dropdown` component displays a button which, when clicked, shows a\r\n * dropdown menu beneath it.\r\n *\r\n * ### Props\r\n *\r\n * - `buttonClassName` A class name to apply to the dropdown toggle button.\r\n * - `menuClassName` A class name to apply to the dropdown menu.\r\n * - `icon` The name of an icon to show in the dropdown toggle button.\r\n * - `caretIcon` The name of an icon to show on the right of the button.\r\n * - `label` The label of the dropdown toggle button. Defaults to 'Controls'.\r\n * - `onhide`\r\n * - `onshow`\r\n *\r\n * The children will be displayed as a list inside of the dropdown menu.\r\n */\r\nexport default class Dropdown<T extends DropdownProps = DropdownProps> extends Component<T> {\r\n showing: boolean = false;\r\n\r\n static initProps(props: DropdownProps) {\r\n props.className = props.className || '';\r\n props.buttonClassName = props.buttonClassName || '';\r\n props.menuClassName = props.menuClassName || '';\r\n props.label = props.label || '';\r\n props.caretIcon = typeof props.caretIcon !== 'undefined' ? props.caretIcon : 'fas fa-caret-down';\r\n }\r\n\r\n view() {\r\n const items = this.props.children ? listItems(this.props.children) : [];\r\n\r\n return (\r\n <div className={`ButtonGroup Dropdown dropdown ${this.props.className} itemCount${items.length}${this.showing ? ' open' : ''}`}>\r\n {this.getButton()}\r\n {this.getMenu(items)}\r\n </div>\r\n );\r\n }\r\n\r\n oncreate(vnode) {\r\n super.oncreate(vnode);\r\n\r\n this.$('> .Dropdown-toggle').dropdown();\r\n\r\n // When opening the dropdown menu, work out if the menu goes beyond the\r\n // bottom of the viewport. If it does, we will apply class to make it show\r\n // above the toggle button instead of below it.\r\n this.element.addEventListener('shown.bs.dropdown', () => {\r\n this.showing = true;\r\n\r\n if (this.props.onshow) {\r\n this.props.onshow();\r\n }\r\n\r\n m.redraw();\r\n\r\n const $menu = this.$('.Dropdown-menu');\r\n const isRight = $menu.hasClass('Dropdown-menu--right');\r\n\r\n $menu.removeClass('Dropdown-menu--top Dropdown-menu--right');\r\n\r\n $menu.toggleClass('Dropdown-menu--top', $menu.offset().top + $menu.height() > $(window).scrollTop() + $(window).height());\r\n\r\n if ($menu.offset().top < 0) {\r\n $menu.removeClass('Dropdown-menu--top');\r\n }\r\n\r\n $menu.toggleClass('Dropdown-menu--right', isRight || $menu.offset().left + $menu.width() > $(window).scrollLeft() + $(window).width());\r\n });\r\n\r\n this.element.addEventListener('hidden.bs.dropdown', () => {\r\n this.showing = false;\r\n\r\n if (this.props.onhide) {\r\n this.props.onhide();\r\n }\r\n\r\n m.redraw();\r\n });\r\n }\r\n\r\n /**\r\n * Get the template for the button.\r\n */\r\n protected getButton(): any {\r\n return (\r\n <button className={'Dropdown-toggle ' + this.props.buttonClassName} data-toggle=\"dropdown\" onclick={this.props.onclick}>\r\n {this.getButtonContent()}\r\n </button>\r\n );\r\n }\r\n\r\n /**\r\n * Get the template for the button's content.\r\n *\r\n * @return {*}\r\n */\r\n protected getButtonContent() {\r\n const attrs = this.props;\r\n\r\n return [\r\n attrs.icon ? icon(attrs.icon, { className: 'Button-icon' }) : '',\r\n <span className=\"Button-label\">{attrs.label}</span>,\r\n attrs.caretIcon ? icon(attrs.caretIcon, { className: 'Button-caret' }) : '',\r\n ];\r\n }\r\n\r\n protected getMenu(items) {\r\n return <ul className={'Dropdown-menu dropdown-menu ' + this.props.menuClassName}>{items}</ul>;\r\n }\r\n}\r\n","import avatar from '../../common/helpers/avatar';\r\nimport username from '../../common/helpers/username';\r\nimport Dropdown from '../../common/components/Dropdown';\r\nimport LinkButton from '../../common/components/LinkButton';\r\nimport Button from '../../common/components/Button';\r\nimport ItemList from '../../common/utils/ItemList';\r\nimport Separator from '../../common/components/Separator';\r\nimport Group from '../../common/models/Group';\r\n\r\n/**\r\n * The `SessionDropdown` component shows a button with the current user's\r\n * avatar/name, with a dropdown of session controls.\r\n */\r\nexport default class SessionDropdown extends Dropdown {\r\n static initProps(props) {\r\n super.initProps(props);\r\n\r\n props.className = 'SessionDropdown';\r\n props.buttonClassName = 'Button Button--user Button--flat';\r\n props.menuClassName = 'Dropdown-menu--right';\r\n }\r\n\r\n view() {\r\n this.props.children = this.items().toArray();\r\n\r\n return super.view();\r\n }\r\n\r\n getButtonContent() {\r\n const user = app.session.user;\r\n\r\n return [avatar(user), ' ', <span className=\"Button-label\">{username(user)}</span>];\r\n }\r\n\r\n /**\r\n * Build an item list for the contents of the dropdown menu.\r\n */\r\n items(): ItemList {\r\n const items = new ItemList();\r\n const user = app.session.user;\r\n\r\n items.add(\r\n 'profile',\r\n LinkButton.component({\r\n icon: 'fas fa-user',\r\n children: app.translator.trans('core.forum.header.profile_button'),\r\n href: app.route.user(user),\r\n }),\r\n 100\r\n );\r\n\r\n items.add(\r\n 'settings',\r\n LinkButton.component({\r\n icon: 'fas fa-cog',\r\n children: app.translator.trans('core.forum.header.settings_button'),\r\n href: app.route('settings'),\r\n }),\r\n 50\r\n );\r\n\r\n if (app.forum.attribute('adminUrl')) {\r\n items.add(\r\n 'administration',\r\n LinkButton.component({\r\n icon: 'fas fa-wrench',\r\n children: app.translator.trans('core.forum.header.admin_button'),\r\n href: app.forum.attribute('adminUrl'),\r\n target: '_blank',\r\n }),\r\n 0\r\n );\r\n }\r\n\r\n items.add('separator', Separator.component(), -90);\r\n\r\n items.add(\r\n 'logOut',\r\n Button.component({\r\n icon: 'fas fa-sign-out-alt',\r\n children: app.translator.trans('core.forum.header.log_out_button'),\r\n onclick: app.session.logout.bind(app.session),\r\n }),\r\n -100\r\n );\r\n\r\n return items;\r\n }\r\n}\r\n","import Dropdown, { DropdownProps } from './Dropdown';\r\nimport icon from '../helpers/icon';\r\n\r\nexport interface SelectDropdownProps extends DropdownProps {\r\n defaultLabel?: string;\r\n}\r\n\r\n/**\r\n * The `SelectDropdown` component is the same as a `Dropdown`, except the toggle\r\n * button's label is set as the label of the first child which has a truthy\r\n * `active` prop.\r\n *\r\n * ### Props\r\n *\r\n * - `caretIcon`\r\n * - `defaultLabel`\r\n */\r\nexport default class SelectDropdown extends Dropdown<SelectDropdownProps> {\r\n static initProps(props: SelectDropdownProps) {\r\n props.caretIcon = typeof props.caretIcon !== 'undefined' ? props.caretIcon : 'fas fa-sort';\r\n\r\n super.initProps(props);\r\n\r\n props.className += ' Dropdown--select';\r\n }\r\n\r\n getButtonContent() {\r\n const activeChild = this.props.children.filter((child) => child.attrs.active)[0];\r\n let label = (activeChild && activeChild.attrs.children) || this.props.defaultLabel;\r\n\r\n if (label instanceof Array) label = label[0];\r\n\r\n return [<span className=\"Button-label\">{label}</span>, icon(this.props.caretIcon, { className: 'Button-caret' })];\r\n }\r\n}\r\n","import app from '../app';\r\n\r\nimport Component from '../../common/Component';\r\nimport listItems from '../../common/helpers/listItems';\r\nimport Button from '../../common/components/Button';\r\nimport LoadingIndicator from '../../common/components/LoadingIndicator';\r\nimport Notification from '../../common/models/Notification';\r\nimport Discussion from '../../common/models/Discussion';\r\n\r\n/**\r\n * The `NotificationList` component displays a list of the logged-in user's\r\n * notifications, grouped by discussion.\r\n */\r\nexport default class NotificationList extends Component {\r\n /**\r\n * Whether or not the notifications are loading.\r\n */\r\n loading: boolean = false;\r\n\r\n /**\r\n * Whether or not there are more results that can be loaded.\r\n */\r\n moreResults: boolean = false;\r\n\r\n private $scrollParent: ZeptoCollection;\r\n private scrollHandler: () => void;\r\n\r\n view() {\r\n const pages = app.cache.notifications || [];\r\n\r\n return (\r\n <div className=\"NotificationList\">\r\n <div className=\"NotificationList-header\">\r\n <div className=\"App-primaryControl\">\r\n {Button.component({\r\n className: 'Button Button--icon Button--link',\r\n icon: 'fas fa-check',\r\n title: app.translator.transText('core.forum.notifications.mark_all_as_read_tooltip'),\r\n onclick: this.markAllAsRead.bind(this),\r\n })}\r\n </div>\r\n\r\n <h4 className=\"App-titleControl App-titleControl--text\">{app.translator.trans('core.forum.notifications.title')}</h4>\r\n </div>\r\n\r\n <div className=\"NotificationList-content\">\r\n {pages.length\r\n ? pages.map((notifications) => {\r\n const groups: { discussion: Discussion; notifications: Notification[] }[] = [];\r\n const discussions = {};\r\n\r\n notifications.forEach((notification) => {\r\n const subject = notification.subject();\r\n\r\n if (typeof subject === 'undefined') return;\r\n\r\n // Get the discussion that this notification is related to. If it's not\r\n // directly related to a discussion, it may be related to a post or\r\n // other entity which is related to a discussion.\r\n let discussion: any = false;\r\n if (subject instanceof Discussion) discussion = subject;\r\n else if (subject && subject.discussion) discussion = subject.discussion();\r\n\r\n // If the notification is not related to a discussion directly or\r\n // indirectly, then we will assign it to a neutral group.\r\n const key = discussion ? discussion.id() : 0;\r\n discussions[key] = discussions[key] || { discussion: discussion, notifications: [] };\r\n discussions[key].notifications.push(notification);\r\n\r\n if (groups.indexOf(discussions[key]) === -1) {\r\n groups.push(discussions[key]);\r\n }\r\n });\r\n\r\n return groups.map((group) => {\r\n const badges = group.discussion?.badges().toArray();\r\n\r\n return (\r\n <div className=\"NotificationGroup\">\r\n {group.discussion ? (\r\n <m.route.Link className=\"NotificationGroup-header\" href={app.route.discussion(group.discussion)}>\r\n {badges && badges.length ? (\r\n <ul className=\"NotificationGroup-badges badges\">{listItems(badges)}</ul>\r\n ) : (\r\n ''\r\n )}\r\n {group.discussion.title()}\r\n </m.route.Link>\r\n ) : (\r\n <div className=\"NotificationGroup-header\">{app.forum.attribute('title')}</div>\r\n )}\r\n\r\n <ul className=\"NotificationGroup-content\">\r\n {group.notifications.map((notification) => {\r\n const NotificationComponent = app.notificationComponents[notification.contentType()];\r\n return NotificationComponent ? <li>{NotificationComponent.component({ notification })}</li> : '';\r\n })}\r\n </ul>\r\n </div>\r\n );\r\n });\r\n })\r\n : ''}\r\n {this.loading ? (\r\n <LoadingIndicator className=\"LoadingIndicator--block\" />\r\n ) : pages.length ? (\r\n ''\r\n ) : (\r\n <div className=\"NotificationList-empty\">{app.translator.trans('core.forum.notifications.empty_text')}</div>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n oncreate(vnode) {\r\n super.oncreate(vnode);\r\n\r\n const $notifications = this.$('.NotificationList-content');\r\n const $scrollParent = (this.$scrollParent = $notifications.css('overflow') === 'auto' ? $notifications : $(window));\r\n\r\n this.scrollHandler = () => {\r\n const scrollTop = $scrollParent.scrollTop();\r\n const viewportHeight = $scrollParent.height();\r\n const contentTop = $scrollParent === $notifications ? 0 : $notifications.offset().top;\r\n const contentHeight = $notifications[0].scrollHeight;\r\n\r\n if (this.moreResults && !this.loading && scrollTop + viewportHeight >= contentTop + contentHeight) {\r\n this.loadMore();\r\n }\r\n };\r\n\r\n $scrollParent.on('scroll', this.scrollHandler);\r\n\r\n this.load();\r\n }\r\n\r\n onremove(vnode) {\r\n super.onremove(vnode);\r\n\r\n this.$scrollParent.off('scroll', this.scrollHandler);\r\n }\r\n\r\n /**\r\n * Load notifications into the application's cache if they haven't already\r\n * been loaded.\r\n */\r\n load() {\r\n if (app.session.user.newNotificationCount()) {\r\n delete app.cache.notifications;\r\n }\r\n\r\n if (app.cache.notifications) {\r\n return;\r\n }\r\n\r\n app.session.user.pushAttributes({ newNotificationCount: 0 });\r\n\r\n this.loadMore();\r\n }\r\n\r\n /**\r\n * Load the next page of notification results.\r\n */\r\n loadMore() {\r\n this.loading = true;\r\n m.redraw();\r\n\r\n const params = app.cache.notifications ? { page: { offset: app.cache.notifications.length * 10 } } : null;\r\n\r\n return app.store\r\n .find<Notification>('notifications', params)\r\n .then(this.parseResults.bind(this))\r\n .catch(() => {})\r\n .then(() => {\r\n this.loading = false;\r\n m.redraw();\r\n });\r\n }\r\n\r\n /**\r\n * Parse results and append them to the notification list.\r\n */\r\n parseResults(results: Notification[]): Notification[] {\r\n app.cache.notifications = app.cache.notifications || [];\r\n\r\n if (results.length) app.cache.notifications.push(results);\r\n\r\n this.moreResults = !!results.payload.links.next;\r\n\r\n return results;\r\n }\r\n\r\n /**\r\n * Mark all of the notifications as read.\r\n */\r\n markAllAsRead() {\r\n if (!app.cache.notifications) return;\r\n\r\n app.session.user.pushAttributes({ unreadNotificationCount: 0 });\r\n\r\n app.cache.notifications.forEach((notifications) => {\r\n notifications.forEach((notification) => notification.pushAttributes({ isRead: true }));\r\n });\r\n\r\n app.request({\r\n url: `${app.forum.attribute('apiUrl')}/notifications/read`,\r\n method: 'POST',\r\n });\r\n }\r\n}\r\n","import Dropdown from '../../common/components/Dropdown';\r\nimport icon from '../../common/helpers/icon';\r\nimport NotificationList from './NotificationList';\r\n\r\nexport default class NotificationsDropdown extends Dropdown {\r\n list = (<NotificationList />);\r\n\r\n static initProps(props) {\r\n props.className = props.className || 'NotificationsDropdown';\r\n props.buttonClassName = props.buttonClassName || 'Button Button--flat';\r\n props.menuClassName = props.menuClassName || 'Dropdown-menu--right';\r\n props.label = props.label || app.translator.transText('core.forum.notifications.tooltip');\r\n props.icon = props.icon || 'fas fa-bell';\r\n\r\n super.initProps(props);\r\n }\r\n\r\n getButton() {\r\n const newNotifications = this.getNewCount();\r\n const vdom = super.getButton();\r\n\r\n vdom.attrs.title = this.props.label;\r\n\r\n vdom.attrs.className += newNotifications ? ' new' : '';\r\n vdom.attrs.onclick = this.onclick.bind(this);\r\n\r\n return vdom;\r\n }\r\n\r\n getButtonContent() {\r\n const unread = this.getUnreadCount();\r\n\r\n return [\r\n icon(this.props.icon!, { className: 'Button-icon' }),\r\n unread ? <span className=\"NotificationsDropdown-unread\">{unread}</span> : '',\r\n <span className=\"Button-label\">{this.props.label}</span>,\r\n ];\r\n }\r\n\r\n getMenu() {\r\n return (\r\n <div className={'Dropdown-menu ' + this.props.menuClassName} onclick={this.menuClick.bind(this)}>\r\n {this.showing && this.list}\r\n </div>\r\n );\r\n }\r\n\r\n onclick() {\r\n if (app.drawer.isOpen()) {\r\n this.goToRoute();\r\n }\r\n }\r\n\r\n goToRoute() {\r\n m.route.set(app.route('notifications'));\r\n }\r\n\r\n getUnreadCount() {\r\n return app.session.user.unreadNotificationCount();\r\n }\r\n\r\n getNewCount() {\r\n return app.session.user.newNotificationCount();\r\n }\r\n\r\n menuClick(e: MouseEvent) {\r\n // Don't close the notifications dropdown if the user is opening a link in a\r\n // new tab or window.\r\n if (e.shiftKey || e.metaKey || e.ctrlKey || e.which === 2) e.stopPropagation();\r\n }\r\n}\r\n","export type KeyboardEventCallback = (KeyboardEvent) => boolean | void;\r\n\r\n/**\r\n * The `KeyboardNavigatable` class manages lists that can be navigated with the\r\n * keyboard, calling callbacks for each actions.\r\n *\r\n * This helper encapsulates the key binding logic, providing a simple fluent\r\n * API for use.\r\n */\r\nexport default class KeyboardNavigatable {\r\n /**\r\n * Callback to be executed for a specified input.\r\n *\r\n * @callback KeyboardNavigatable~keyCallback\r\n * @param {KeyboardEvent} event\r\n * @returns {boolean}\r\n */\r\n callbacks: { [key: number]: KeyboardEventCallback } = {};\r\n\r\n // By default, always handle keyboard navigation.\r\n whenCallback: KeyboardEventCallback = () => true;\r\n\r\n /**\r\n * Provide a callback to be executed when navigating upwards.\r\n *\r\n * This will be triggered by the Up key.\r\n */\r\n onUp(callback: KeyboardEventCallback): this {\r\n this.callbacks[38] = (e) => {\r\n e.preventDefault();\r\n callback(e);\r\n };\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Provide a callback to be executed when navigating downwards.\r\n *\r\n * This will be triggered by the Down key.\r\n */\r\n onDown(callback: KeyboardEventCallback): this {\r\n this.callbacks[40] = (e) => {\r\n e.preventDefault();\r\n callback(e);\r\n };\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Provide a callback to be executed when the current item is selected..\r\n *\r\n * This will be triggered by the Return and Tab keys..\r\n */\r\n onSelect(callback: KeyboardEventCallback): this {\r\n this.callbacks[9] = this.callbacks[13] = (e) => {\r\n e.preventDefault();\r\n callback(e);\r\n };\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Provide a callback to be executed when the navigation is canceled.\r\n *\r\n * This will be triggered by the Escape key.\r\n */\r\n onCancel(callback: Function): this {\r\n this.callbacks[27] = (e) => {\r\n e.stopPropagation();\r\n e.preventDefault();\r\n callback(e);\r\n };\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Provide a callback to be executed when previous input is removed.\r\n *\r\n * This will be triggered by the Backspace key.\r\n */\r\n onRemove(callback: Function): this {\r\n this.callbacks[8] = (e) => {\r\n if (e.target.selectionStart === 0 && e.target.selectionEnd === 0) {\r\n callback(e);\r\n e.preventDefault();\r\n }\r\n };\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Provide a callback that determines whether keyboard input should be handled.\r\n */\r\n when(callback: KeyboardEventCallback): this {\r\n this.whenCallback = callback;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Set up the navigation key bindings on the given jQuery element.\r\n */\r\n bindTo($element: any) {\r\n // Handle navigation key events on the navigatable element.\r\n $element.on('keydown', this.navigate.bind(this));\r\n }\r\n\r\n /**\r\n * Interpret the given keyboard event as navigation commands.\r\n */\r\n navigate(event: KeyboardEvent) {\r\n // This callback determines whether keyboard should be handled or ignored.\r\n if (!this.whenCallback(event)) return;\r\n\r\n const keyCallback = this.callbacks[event.which];\r\n if (keyCallback) {\r\n keyCallback(event);\r\n }\r\n }\r\n}\r\n","import { truncate } from '../utils/string';\r\n\r\n/**\r\n * The `highlight` helper searches for a word phrase in a string, and wraps\r\n * matches with the <mark> tag.\r\n *\r\n * @param {String} string The string to highlight.\r\n * @param {String|RegExp} phrase The word or words to highlight.\r\n * @param {Integer} [length] The number of characters to truncate the string to.\r\n * The string will be truncated surrounding the first match.\r\n */\r\nexport default function highlight(string: string, phrase: string | RegExp, length?: number): any {\r\n if (!phrase && !length) return string;\r\n\r\n // Convert the word phrase into a global regular expression (if it isn't\r\n // already) so we can search the string for matched.\r\n const regexp = phrase instanceof RegExp ? phrase : new RegExp(phrase, 'gi');\r\n\r\n let highlighted = string;\r\n let start = 0;\r\n\r\n // If a length was given, the truncate the string surrounding the first match.\r\n if (length) {\r\n if (phrase) start = Math.max(0, string.search(regexp) - length / 2);\r\n\r\n highlighted = truncate(highlighted, length, start);\r\n }\r\n\r\n // Convert the string into HTML entities, then highlight all matches with\r\n // <mark> tags. Then we will return the result as a trusted HTML string.\r\n highlighted = $('<div/>').text(highlighted).html();\r\n\r\n if (phrase) highlighted = highlighted.replace(regexp, '<mark>$&</mark>');\r\n\r\n return m.trust(highlighted);\r\n}\r\n","export default abstract class SearchSource {\r\n abstract view(vnode: string);\r\n\r\n abstract search(query: string);\r\n}\r\n","import highlight from '../../common/helpers/highlight';\r\nimport LinkButton from '../../common/components/LinkButton';\r\nimport SearchSource from './SearchSource';\r\nimport Discussion from '../../common/models/Discussion';\r\n\r\n/**\r\n * The `DiscussionsSearchSource` finds and displays discussion search results in\r\n * the search dropdown.\r\n */\r\nexport default class DiscussionsSearchSource extends SearchSource {\r\n protected results: { [key: string]: Discussion[] } = {};\r\n\r\n search(query: string) {\r\n query = query.toLowerCase();\r\n\r\n this.results[query] = [];\r\n\r\n const params = {\r\n filter: { q: query },\r\n page: { limit: 3 },\r\n include: 'mostRelevantPost',\r\n };\r\n\r\n return app.store.find<Discussion>('discussions', params).then((results) => (this.results[query] = results));\r\n }\r\n\r\n view(query: string) {\r\n query = query.toLowerCase();\r\n\r\n const results = this.results[query] || [];\r\n\r\n return [\r\n <li className=\"Dropdown-header\">{app.translator.trans('core.forum.search.discussions_heading')}</li>,\r\n <li>\r\n {LinkButton.component({\r\n icon: 'fas fa-search',\r\n children: app.translator.trans('core.forum.search.all_discussions_button', { query }),\r\n href: app.route('index', { q: query }),\r\n })}\r\n </li>,\r\n results.map((discussion) => {\r\n const mostRelevantPost = discussion.mostRelevantPost();\r\n\r\n return (\r\n <li className=\"DiscussionSearchResult\" data-index={'discussions' + discussion.id()}>\r\n <m.route.Link href={app.route.discussion(discussion, mostRelevantPost && mostRelevantPost.number())}>\r\n <div className=\"DiscussionSearchResult-title\">{highlight(discussion.title(), query)}</div>\r\n {mostRelevantPost ? (\r\n <div className=\"DiscussionSearchResult-excerpt\">{highlight(mostRelevantPost.contentPlain(), query, 100)}</div>\r\n ) : (\r\n ''\r\n )}\r\n </m.route.Link>\r\n </li>\r\n );\r\n }),\r\n ];\r\n }\r\n}\r\n","import highlight from '../../common/helpers/highlight';\r\nimport avatar from '../../common/helpers/avatar';\r\nimport username from '../../common/helpers/username';\r\nimport SearchSource from './SearchSource';\r\nimport User from '../../common/models/User';\r\n\r\n/**\r\n * The `UsersSearchSource` finds and displays user search results in the search\r\n * dropdown.\r\n *\r\n * @implements SearchSource\r\n */\r\nexport default class UsersSearchSource extends SearchSource {\r\n protected results: { [key: string]: User[] } = {};\r\n\r\n search(query: string) {\r\n return app.store\r\n .find<User>('users', {\r\n filter: { q: query },\r\n page: { limit: 5 },\r\n })\r\n .then((results) => {\r\n this.results[query] = results;\r\n m.redraw();\r\n });\r\n }\r\n\r\n view(query: string) {\r\n query = query.toLowerCase();\r\n\r\n const results = (this.results[query] || [])\r\n .concat(\r\n app.store\r\n .all<User>('users')\r\n .filter((user) => [user.username(), user.displayName()].some((value) => value.toLowerCase().substr(0, query.length) === query))\r\n )\r\n .filter((e, i, arr) => arr.lastIndexOf(e) === i)\r\n .sort((a, b) => a.displayName().localeCompare(b.displayName()));\r\n\r\n if (!results.length) return '';\r\n\r\n return [\r\n <li className=\"Dropdown-header\">{app.translator.trans('core.forum.search.users_heading')}</li>,\r\n results.map((user) => {\r\n const name = username(user);\r\n\r\n if (!name.children) {\r\n name.children = [name.text];\r\n delete name.text;\r\n }\r\n\r\n name.children[0] = highlight(name.children[0], query);\r\n\r\n return (\r\n <li className=\"UserSearchResult\" data-index={'users' + user.id()}>\r\n <m.route.Link href={app.route.user(user)}>\r\n {avatar(user)}\r\n {name}\r\n </m.route.Link>\r\n </li>\r\n );\r\n }),\r\n ];\r\n }\r\n}\r\n","import Component from '../../common/Component';\r\nimport LoadingIndicator from '../../common/components/LoadingIndicator';\r\nimport ItemList from '../../common/utils/ItemList';\r\nimport KeyboardNavigatable from '../utils/KeyboardNavigatable';\r\nimport icon from '../../common/helpers/icon';\r\nimport DiscussionsSearchSource from './DiscussionsSearchSource';\r\nimport UsersSearchSource from './UsersSearchSource';\r\nimport SearchSource from './SearchSource';\r\n\r\nimport Stream from 'mithril/stream';\r\n\r\n/**\r\n * The `Search` component displays a menu of as-you-type results from a variety\r\n * of sources.\r\n *\r\n * The search box will be 'activated' if the app's current controller implements\r\n * a `searching` method that returns a truthy value. If this is the case, an 'x'\r\n * button will be shown next to the search field, and clicking it will call the\r\n * `clearSearch` method on the controller.\r\n */\r\nexport default class Search extends Component {\r\n /**\r\n * The value of the search input.\r\n */\r\n value: Stream<string> = m.prop('');\r\n\r\n /**\r\n * Whether or not the search input has focus.\r\n */\r\n hasFocus: boolean = false;\r\n\r\n /**\r\n * An array of SearchSources.\r\n */\r\n sources?: SearchSource[];\r\n\r\n /**\r\n * The number of sources that are still loading results.\r\n */\r\n loadingSources = 0;\r\n\r\n /**\r\n * A list of queries that have been searched for.\r\n */\r\n searched: string[] = [];\r\n\r\n /**\r\n * The index of the currently-selected <li> in the results list. This can be\r\n * a unique string (to account for the fact that an item's position may jump\r\n * around as new results load), but otherwise it will be numeric (the\r\n * sequential position within the list).\r\n */\r\n index: number = 0;\r\n\r\n navigator: KeyboardNavigatable = new KeyboardNavigatable();\r\n\r\n searchTimeout?: number;\r\n\r\n view() {\r\n const currentSearch = this.getCurrentSearch();\r\n\r\n // Initialize search input value in the view rather than the constructor so\r\n // that we have access to app.current.\r\n if (typeof this.value() === 'undefined') {\r\n this.value(currentSearch || '');\r\n }\r\n\r\n // Initialize search sources in the view rather than the constructor so\r\n // that we have access to app.forum.\r\n if (!this.sources) {\r\n this.sources = this.sourceItems().toArray();\r\n }\r\n\r\n // Hide the search view if no sources were loaded\r\n if (!this.sources.length) return <div />;\r\n\r\n return (\r\n <div\r\n className={classNames(\r\n 'Search',\r\n this.value() && this.hasFocus && 'open',\r\n this.hasFocus && 'focused',\r\n !!currentSearch && 'active',\r\n !!this.loadingSources && 'loading'\r\n )}\r\n >\r\n <div className=\"Search-input\">\r\n <input\r\n className=\"FormControl\"\r\n type=\"search\"\r\n placeholder={app.translator.transText('core.forum.header.search_placeholder')}\r\n value={this.value()}\r\n oninput={m.withAttr('value', this.value)}\r\n onfocus={() => (this.hasFocus = true)}\r\n onblur={() => (this.hasFocus = false)}\r\n />\r\n {this.loadingSources ? (\r\n LoadingIndicator.component({ size: 'tiny', className: 'Button Button--icon Button--link' })\r\n ) : currentSearch ? (\r\n <button className=\"Search-clear Button Button--icon Button--link\" onclick={this.clear.bind(this)}>\r\n {icon('fas fa-times-circle')}\r\n </button>\r\n ) : (\r\n ''\r\n )}\r\n </div>\r\n <ul className=\"Dropdown-menu Search-results\">\r\n {this.value() && this.hasFocus ? this.sources.map((source) => source.view(this.value())) : ''}\r\n </ul>\r\n </div>\r\n );\r\n }\r\n\r\n oncreate(vnode) {\r\n super.oncreate(vnode);\r\n\r\n // Highlight the item that is currently selected.\r\n this.setIndex(this.getCurrentNumericIndex());\r\n\r\n const search = this;\r\n\r\n this.$('.Search-results')\r\n .on('mousedown', (e) => e.preventDefault())\r\n .on('click', () => this.$('input').blur())\r\n\r\n // Whenever the mouse is hovered over a search result, highlight it.\r\n .on('mouseenter', '> li:not(.Dropdown-header)', function (this: HTMLElement) {\r\n search.setIndex(search.selectableItems().index(this));\r\n });\r\n\r\n const $input = this.$('input');\r\n\r\n this.navigator\r\n .onUp(() => this.setIndex(this.getCurrentNumericIndex() - 1, true))\r\n .onDown(() => this.setIndex(this.getCurrentNumericIndex() + 1, true))\r\n .onSelect(this.selectResult.bind(this))\r\n .onCancel(this.clear.bind(this))\r\n .bindTo($input);\r\n\r\n // Handle input key events on the search input, triggering results to load.\r\n $input\r\n .on('input focus', function (this: HTMLInputElement) {\r\n const query = this.value.toLowerCase();\r\n\r\n if (!query) return;\r\n\r\n clearTimeout(search.searchTimeout);\r\n search.searchTimeout = setTimeout(() => {\r\n if (search.searched.indexOf(query) !== -1) return;\r\n\r\n if (query.length >= 3 && search.sources) {\r\n search.sources.map((source) => {\r\n if (!source.search) return;\r\n\r\n search.loadingSources++;\r\n\r\n source.search(query).then(() => {\r\n search.loadingSources = Math.max(0, search.loadingSources - 1);\r\n m.redraw();\r\n });\r\n });\r\n }\r\n\r\n search.searched.push(query);\r\n m.redraw();\r\n }, 250);\r\n })\r\n\r\n .on('focus', function (this: HTMLElement) {\r\n $(this)\r\n .one('mouseup', (e) => e.preventDefault())\r\n .select();\r\n });\r\n }\r\n\r\n /**\r\n * Get the active search in the app's current controller.\r\n */\r\n getCurrentSearch(): string | false {\r\n return app.current && typeof app.current.searching === 'function' && app.current.searching();\r\n }\r\n\r\n /**\r\n * Navigate to the currently selected search result and close the list.\r\n */\r\n selectResult() {\r\n clearTimeout(this.searchTimeout);\r\n this.loadingSources = 0;\r\n\r\n if (this.value()) {\r\n m.route.set(this.getItem(this.index).find('a').attr('href'));\r\n } else {\r\n this.clear();\r\n }\r\n\r\n this.$('input').blur();\r\n }\r\n\r\n /**\r\n * Clear the search input and the current controller's active search.\r\n */\r\n clear() {\r\n this.value('');\r\n\r\n if (this.getCurrentSearch()) {\r\n app.current.clearSearch();\r\n } else {\r\n m.redraw();\r\n }\r\n }\r\n\r\n /**\r\n * Build an item list of SearchSources.\r\n *\r\n * @return {ItemList}\r\n */\r\n sourceItems() {\r\n const items = new ItemList();\r\n\r\n if (app.forum.attribute('canViewDiscussions')) items.add('discussions', new DiscussionsSearchSource());\r\n if (app.forum.attribute('canViewUserList')) items.add('users', new UsersSearchSource());\r\n\r\n return items;\r\n }\r\n\r\n /**\r\n * Get all of the search result items that are selectable.\r\n */\r\n selectableItems() {\r\n return this.$('.Search-results > li:not(.Dropdown-header)');\r\n }\r\n\r\n /**\r\n * Get the position of the currently selected search result item.\r\n */\r\n getCurrentNumericIndex(): number {\r\n return this.selectableItems().index(this.getItem(this.index));\r\n }\r\n\r\n /**\r\n * Get the <li> in the search results with the given index (numeric or named).\r\n */\r\n getItem(index: number): ZeptoCollection {\r\n const $items = this.selectableItems();\r\n let $item = $items.filter(`[data-index=\"${index}\"]`);\r\n\r\n if (!$item.length) {\r\n $item = $items.eq(index);\r\n }\r\n\r\n return $item;\r\n }\r\n\r\n /**\r\n * Set the currently-selected search result item to the one with the given\r\n * index.\r\n *\r\n * @param index\r\n * @param scrollToItem Whether or not to scroll the dropdown so that\r\n * the item is in view.\r\n */\r\n setIndex(index: number, scrollToItem?: boolean) {\r\n const $items = this.selectableItems();\r\n const $dropdown = $items.parent();\r\n\r\n let fixedIndex = index;\r\n if (index < 0) {\r\n fixedIndex = $items.length - 1;\r\n } else if (index >= $items.length) {\r\n fixedIndex = 0;\r\n }\r\n\r\n const $item = $items.removeClass('active').eq(fixedIndex).addClass('active');\r\n\r\n this.index = Number($item.attr('data-index') || fixedIndex);\r\n\r\n if (scrollToItem) {\r\n const dropdownScroll = $dropdown.scrollTop();\r\n const dropdownTop = $dropdown.offset().top;\r\n const dropdownBottom = dropdownTop + $dropdown.outerHeight();\r\n const itemTop = $item.offset().top;\r\n const itemBottom = itemTop + $item.outerHeight();\r\n\r\n let scrollTop;\r\n if (itemTop < dropdownTop) {\r\n scrollTop = dropdownScroll - dropdownTop + itemTop - parseInt($dropdown.css('padding-top'), 10);\r\n } else if (itemBottom > dropdownBottom) {\r\n scrollTop = dropdownScroll - dropdownBottom + itemBottom + parseInt($dropdown.css('padding-bottom'), 10);\r\n }\r\n\r\n if (typeof scrollTop !== 'undefined') {\r\n $dropdown.animateScrollTop(scrollTop, 100);\r\n }\r\n }\r\n }\r\n}\r\n","import { Vnode } from 'mithril';\r\n\r\nimport Component from '../../common/Component';\r\nimport Button from '../../common/components/Button';\r\nimport LogInModal from './LogInModal';\r\nimport SignUpModal from './SignUpModal';\r\nimport SessionDropdown from './SessionDropdown';\r\nimport SelectDropdown from '../../common/components/SelectDropdown';\r\nimport NotificationsDropdown from './NotificationsDropdown';\r\nimport ItemList from '../../common/utils/ItemList';\r\nimport listItems from '../../common/helpers/listItems';\r\n\r\nimport Search from './Search';\r\n\r\n/**\r\n * The `HeaderSecondary` component displays secondary header controls, such as\r\n * the search box and the user menu. On the default skin, these are shown on the\r\n * right side of the header.\r\n */\r\nexport default class HeaderSecondary extends Component {\r\n view() {\r\n return <ul className=\"Header-controls\">{listItems(this.items().toArray())}</ul>;\r\n }\r\n\r\n /**\r\n * Build an item list for the controls.\r\n */\r\n items(): ItemList {\r\n const items = new ItemList();\r\n\r\n items.add('search', Search.component(), 30);\r\n\r\n if (app.forum.attribute('showLanguageSelector') && Object.keys(app.data.locales).length > 1) {\r\n const locales: Vnode<any, any>[] = [];\r\n\r\n for (const locale in app.data.locales) {\r\n if (!app.data.locales.hasOwnProperty(locale)) continue;\r\n\r\n locales.push(\r\n Button.component({\r\n active: app.data.locale === locale,\r\n children: app.data.locales[locale],\r\n icon: app.data.locale === locale ? 'fas fa-check' : true,\r\n onclick: () => {\r\n if (app.session.user) {\r\n app.session.user.savePreferences({ locale }).then(() => window.location.reload());\r\n } else {\r\n document.cookie = `locale=${locale}; path=/; expires=Tue, 19 Jan 2038 03:14:07 GMT`;\r\n window.location.reload();\r\n }\r\n },\r\n })\r\n );\r\n }\r\n\r\n items.add(\r\n 'locale',\r\n SelectDropdown.component({\r\n children: locales,\r\n buttonClassName: 'Button Button--link',\r\n }),\r\n 20\r\n );\r\n }\r\n\r\n if (app.session.user) {\r\n items.add('notifications', <NotificationsDropdown />, 10);\r\n items.add('session', <SessionDropdown />, 0);\r\n } else {\r\n if (app.forum.attribute('allowSignUp')) {\r\n items.add(\r\n 'signUp',\r\n Button.component({\r\n children: app.translator.trans('core.forum.header.sign_up_link'),\r\n className: 'Button Button--link',\r\n onclick: () => app.modal.show(SignUpModal),\r\n }),\r\n 10\r\n );\r\n }\r\n ``;\r\n\r\n items.add(\r\n 'logIn',\r\n Button.component({\r\n children: app.translator.trans('core.forum.header.log_in_link'),\r\n className: 'Button Button--link',\r\n onclick: () => app.modal.show(LogInModal),\r\n }),\r\n 0\r\n );\r\n }\r\n\r\n return items;\r\n }\r\n}\r\n","// import EditPostComposer from '../components/EditPostComposer';\r\nimport Button from '../../common/components/Button';\r\nimport Separator from '../../common/components/Separator';\r\nimport ItemList from '../../common/utils/ItemList';\r\nimport Post from '../../common/models/Post';\r\nimport PostComponent from '../../forum/components/Post';\r\n\r\n/**\r\n * The `PostControls` utility constructs a list of buttons for a post which\r\n * perform actions on it.\r\n */\r\nexport default {\r\n /**\r\n * Get a list of controls for a post.\r\n *\r\n * @param post\r\n * @param context The parent component under which the controls menu will\r\n * be displayed.\r\n * @public\r\n */\r\n controls(post: Post, context: any) {\r\n const items = new ItemList();\r\n\r\n ['user', 'moderation', 'destructive'].forEach((section) => {\r\n const controls = this[section](post, context).toArray();\r\n\r\n if (controls.length) {\r\n controls.forEach((item) => items.add(item.itemName, item));\r\n items.add(section + 'Separator', Separator.component());\r\n }\r\n });\r\n\r\n return items;\r\n },\r\n\r\n /**\r\n * Get controls for a post pertaining to the current user (e.g. report).\r\n *\r\n * @param post\r\n * @param context The parent component under which the controls menu will\r\n * be displayed.\r\n * @protected\r\n */\r\n user(post: Post, context: any) {\r\n return new ItemList();\r\n },\r\n\r\n /**\r\n * Get controls for a post pertaining to moderation (e.g. edit).\r\n *\r\n * @param post\r\n * @param context The parent component under which the controls menu will\r\n * be displayed.\r\n * @protected\r\n */\r\n moderation(post: Post, context: any) {\r\n const items = new ItemList();\r\n\r\n if (post.contentType() === 'comment' && post.canEdit()) {\r\n if (!post.isHidden()) {\r\n items.add(\r\n 'edit',\r\n Button.component(\r\n {\r\n icon: 'fas fa-pencil-alt',\r\n onclick: this.editAction.bind(post),\r\n },\r\n app.translator.trans('core.forum.post_controls.edit_button')\r\n )\r\n );\r\n }\r\n }\r\n\r\n return items;\r\n },\r\n\r\n /**\r\n * Get controls for a post that are destructive (e.g. delete).\r\n *\r\n * @param post\r\n * @param context The parent component under which the controls menu will\r\n * be displayed.\r\n * @protected\r\n */\r\n destructive(post: Post, context: any) {\r\n const items = new ItemList();\r\n\r\n if (post.contentType() === 'comment' && !post.isHidden()) {\r\n if (post.canHide()) {\r\n items.add(\r\n 'hide',\r\n Button.component({\r\n icon: 'far fa-trash-alt',\r\n children: app.translator.trans('core.forum.post_controls.delete_button'),\r\n onclick: this.hideAction.bind(post),\r\n })\r\n );\r\n }\r\n } else {\r\n if (post.contentType() === 'comment' && post.canHide()) {\r\n items.add(\r\n 'restore',\r\n Button.component({\r\n icon: 'fas fa-reply',\r\n children: app.translator.trans('core.forum.post_controls.restore_button'),\r\n onclick: this.restoreAction.bind(post),\r\n })\r\n );\r\n }\r\n if (post.canDelete()) {\r\n items.add(\r\n 'delete',\r\n Button.component({\r\n icon: 'fas fa-times',\r\n children: app.translator.trans('core.forum.post_controls.delete_forever_button'),\r\n onclick: this.deleteAction.bind(post, context),\r\n })\r\n );\r\n }\r\n }\r\n\r\n return items;\r\n },\r\n\r\n /**\r\n * Open the composer to edit a post.\r\n */\r\n editAction(this: Post) {\r\n return new Promise<EditPostComposer>((resolve) => {\r\n const component = new EditPostComposer({ post: this });\r\n\r\n app.composer.load(component);\r\n app.composer.show();\r\n\r\n resolve(component);\r\n });\r\n },\r\n\r\n /**\r\n * Hide a post.\r\n */\r\n hideAction(this: Post) {\r\n this.pushAttributes({ hiddenAt: new Date(), hiddenUser: app.session.user });\r\n\r\n return this.save({ isHidden: true }).then(() => m.redraw());\r\n },\r\n\r\n /**\r\n * Restore a post.\r\n */\r\n restoreAction(this: Post) {\r\n this.pushAttributes({ hiddenAt: null, hiddenUser: null });\r\n\r\n return this.save({ isHidden: false }).then(() => m.redraw());\r\n },\r\n\r\n /**\r\n * Delete a post.\r\n */\r\n deleteAction(this: Post, context: PostComponent) {\r\n if (context) context.loading = true;\r\n\r\n return this.delete()\r\n .then(() => {\r\n const discussion = this.discussion();\r\n\r\n discussion.removePost(this.id());\r\n\r\n // If this was the last post in the discussion, then we will assume that\r\n // the whole discussion was deleted too.\r\n if (!discussion.postIds().length) {\r\n // If there is a discussion list in the cache, remove this discussion.\r\n if (app.cache.discussionList) {\r\n app.cache.discussionList.removeDiscussion(discussion);\r\n }\r\n\r\n if (app.viewingDiscussion(discussion)) {\r\n app.history.back();\r\n }\r\n }\r\n })\r\n .catch(() => {})\r\n .then(() => {\r\n if (context) context.loading = false;\r\n m.redraw();\r\n });\r\n },\r\n};\r\n","export default class SubtreeRetainer {\r\n callbacks: Function[];\r\n data = {};\r\n\r\n constructor(...callbacks: Function[]) {\r\n this.callbacks = callbacks;\r\n }\r\n\r\n check(...callbacks: Function[]) {\r\n this.callbacks.push(...callbacks);\r\n }\r\n\r\n /**\r\n * Return whether the component should redraw.\r\n */\r\n update(): boolean {\r\n let update = false;\r\n\r\n this.callbacks.forEach((callback, i) => {\r\n const result = callback();\r\n\r\n if (result !== this.data[i]) {\r\n this.data[i] = result;\r\n update = true;\r\n }\r\n });\r\n\r\n return update;\r\n }\r\n}\r\n","import Component, { ComponentProps } from '../../common/Component';\r\nimport Dropdown from '../../common/components/Dropdown';\r\nimport PostControls from '../utils/PostControls';\r\nimport listItems from '../../common/helpers/listItems';\r\nimport ItemList from '../../common/utils/ItemList';\r\nimport SubtreeRetainer from '../../common/utils/SubtreeRetainer';\r\nimport { PostProp } from '../../common/concerns/ComponentProps';\r\n\r\n/**\r\n * The `Post` component displays a single post. The basic post template just\r\n * includes a controls dropdown; subclasses must implement `content` and `attrs`\r\n * methods.\r\n *\r\n * @abstract\r\n */\r\nexport default class Post<T extends PostProp = PostProp> extends Component<T> {\r\n loading = false;\r\n controlsOpen = false;\r\n\r\n /**\r\n * Set up a subtree retainer so that the post will not be redrawn\r\n * unless new data comes in.\r\n */\r\n subtree = new SubtreeRetainer(\r\n () => this.props.post.freshness,\r\n () => {\r\n const user = this.props.post.user();\r\n return user?.freshness;\r\n },\r\n () => this.controlsOpen\r\n );\r\n\r\n view() {\r\n const controls = PostControls.controls(this.props.post, this).toArray();\r\n const attrs = this.attrs();\r\n\r\n attrs.className = classNames(this.classes(attrs.className));\r\n\r\n return (\r\n <article {...attrs}>\r\n <div>\r\n {this.content()}\r\n <aside className=\"Post-actions\">\r\n <ul>\r\n {listItems(this.actionItems().toArray())}\r\n {controls.length ? (\r\n <li>\r\n <Dropdown\r\n className=\"Post-controls\"\r\n buttonClassName=\"Button Button--icon Button--flat\"\r\n menuClassName=\"Dropdown-menu--right\"\r\n icon=\"fas fa-ellipsis-h\"\r\n onshow={() => this.$('.Post-actions').addClass('open')}\r\n onhide={() => this.$('.Post-actions').removeClass('open')}\r\n >\r\n {controls}\r\n </Dropdown>\r\n </li>\r\n ) : (\r\n ''\r\n )}\r\n </ul>\r\n </aside>\r\n <footer className=\"Post-footer\">\r\n <ul>{listItems(this.footerItems().toArray())}</ul>\r\n </footer>\r\n </div>\r\n </article>\r\n );\r\n }\r\n\r\n onbeforeupdate(vnode) {\r\n super.onbeforeupdate(vnode);\r\n\r\n return this.subtree.update();\r\n }\r\n\r\n oncreate(vnode) {\r\n super.oncreate(vnode);\r\n\r\n const $actions = this.$('.Post-actions');\r\n const $controls = this.$('.Post-controls');\r\n\r\n $actions.toggleClass('open', $controls.hasClass('open'));\r\n }\r\n\r\n /**\r\n * Get attributes for the post element.\r\n */\r\n attrs(): ComponentProps {\r\n return {};\r\n }\r\n\r\n /**\r\n * Get the post's content.\r\n */\r\n content(): any[] {\r\n return [];\r\n }\r\n\r\n classes(existing) {\r\n let classes = (existing || '').split(' ').concat(['Post']);\r\n\r\n if (this.loading) {\r\n classes.push('Post--loading');\r\n }\r\n\r\n if (this.props.post.user() === app.session.user) {\r\n classes.push('Post--by-actor');\r\n }\r\n\r\n return classes;\r\n }\r\n\r\n /**\r\n * Build an item list for the post's actions.\r\n */\r\n actionItems() {\r\n return new ItemList();\r\n }\r\n\r\n /**\r\n * Build an item list for the post's footer.\r\n */\r\n footerItems() {\r\n return new ItemList();\r\n }\r\n}\r\n","/**\r\n * The `humanTime` utility converts a date to a localized, human-readable time-\r\n * ago string.\r\n */\r\nexport default function humanTime(time: Date): string {\r\n let m = dayjs(time);\r\n const now = dayjs();\r\n\r\n // To prevent showing things like \"in a few seconds\" due to small offsets\r\n // between client and server time, we always reset future dates to the\r\n // current time. This will result in \"just now\" being shown instead.\r\n if (m.isAfter(now)) {\r\n m = now;\r\n }\r\n\r\n const day = 864e5;\r\n const diff = m.diff(dayjs());\r\n let ago = null;\r\n\r\n // If this date was more than a month ago, we'll show the name of the month\r\n // in the string. If it wasn't this year, we'll show the year as well.\r\n if (diff < -30 * day) {\r\n if (m.year() === dayjs().year()) {\r\n ago = m.format('D MMM');\r\n } else {\r\n ago = m.format(\"MMM 'YY\");\r\n }\r\n } else {\r\n ago = m.fromNow();\r\n }\r\n\r\n return ago;\r\n}\r\n","import Stream from 'mithril/stream';\r\n\r\nimport Modal from '../../common/components/Modal';\r\nimport Button from '../../common/components/Button';\r\nimport GroupBadge from '../../common/components/GroupBadge';\r\nimport Group from '../../common/models/Group';\r\nimport ItemList from '../../common/utils/ItemList';\r\n\r\nimport User from '../../common/models/User';\r\nimport { UserProp } from '../../common/concerns/ComponentProps';\r\n\r\n/**\r\n * The `EditUserModal` component displays a modal dialog with a login form.\r\n */\r\nexport default class EditUserModal extends Modal<UserProp> {\r\n username!: Stream<string>;\r\n email!: Stream<string>;\r\n isEmailConfirmed!: Stream<boolean>;\r\n setPassword!: Stream<boolean>;\r\n password!: Stream<string>;\r\n\r\n groups: { [key: string]: Stream<boolean> } = {};\r\n\r\n oninit(vnode) {\r\n super.oninit(vnode);\r\n\r\n const user: User = this.props.user;\r\n\r\n this.username = m.prop(user.username() || '');\r\n this.email = m.prop(user.email() || '');\r\n this.isEmailConfirmed = m.prop(user.isEmailConfirmed() || false);\r\n this.setPassword = m.prop(false as boolean);\r\n this.password = m.prop(user.password() || '');\r\n this.groups = {};\r\n\r\n app.store\r\n .all<Group>('groups')\r\n .filter((group) => [Group.GUEST_ID, Group.MEMBER_ID].indexOf(group.id()) === -1)\r\n .forEach((group) => (this.groups[group.id()] = m.prop(user.groups().indexOf(group) !== -1)));\r\n }\r\n\r\n className() {\r\n return 'EditUserModal Modal--small';\r\n }\r\n\r\n title() {\r\n return app.translator.transText('core.forum.edit_user.title');\r\n }\r\n\r\n content() {\r\n return (\r\n <div className=\"Modal-body\">\r\n <div className=\"Form\">{this.fields().toArray()}</div>\r\n </div>\r\n );\r\n }\r\n\r\n fields() {\r\n const items = new ItemList();\r\n\r\n items.add(\r\n 'username',\r\n <div className=\"Form-group\">\r\n <label>{app.translator.transText('core.forum.edit_user.username_heading')}</label>\r\n <input className=\"FormControl\" placeholder={app.translator.transText('core.forum.edit_user.username_label')} bidi={this.username} />\r\n </div>,\r\n 40\r\n );\r\n\r\n if (app.session.user !== this.props.user) {\r\n items.add(\r\n 'email',\r\n <div className=\"Form-group\">\r\n <label>{app.translator.trans('core.forum.edit_user.email_heading')}</label>\r\n <div>\r\n <input className=\"FormControl\" placeholder={app.translator.transText('core.forum.edit_user.email_label')} bidi={this.email} />\r\n </div>\r\n {!this.isEmailConfirmed() && (\r\n <div>\r\n {Button.component({\r\n className: 'Button Button--block',\r\n children: app.translator.trans('core.forum.edit_user.activate_button'),\r\n loading: this.loading,\r\n onclick: this.activate.bind(this),\r\n })}\r\n </div>\r\n )}\r\n </div>,\r\n 30\r\n );\r\n\r\n items.add(\r\n 'password',\r\n <div className=\"Form-group\">\r\n <label>{app.translator.trans('core.forum.edit_user.password_heading')}</label>\r\n <div>\r\n <label className=\"checkbox\">\r\n <input\r\n type=\"checkbox\"\r\n onchange={(e) => {\r\n this.setPassword(e.target.checked);\r\n m.redraw();\r\n if (e.target.checked) this.$('[name=password]').select();\r\n }}\r\n />\r\n {app.translator.trans('core.forum.edit_user.set_password_label')}\r\n </label>\r\n {this.setPassword() && (\r\n <input\r\n className=\"FormControl\"\r\n type=\"password\"\r\n name=\"password\"\r\n placeholder={app.translator.transText('core.forum.edit_user.password_label')}\r\n bidi={this.password}\r\n />\r\n )}\r\n </div>\r\n </div>,\r\n 20\r\n );\r\n }\r\n\r\n items.add(\r\n 'groups',\r\n <div className=\"Form-group EditUserModal-groups\">\r\n <label>{app.translator.trans('core.forum.edit_user.groups_heading')}</label>\r\n <div>\r\n {Object.keys(this.groups)\r\n .map((id) => app.store.getById<Group>('groups', id))\r\n .map((group) => (\r\n <label className=\"checkbox\">\r\n <input\r\n type=\"checkbox\"\r\n bidi={this.groups[group.id()]}\r\n disabled={this.props.user.id() === '1' && group.id() === Group.ADMINISTRATOR_ID}\r\n />\r\n <GroupBadge group={group} label={''} /> {group.nameSingular()}\r\n </label>\r\n ))}\r\n </div>\r\n </div>,\r\n 10\r\n );\r\n\r\n items.add(\r\n 'submit',\r\n <div className=\"Form-group\">\r\n {Button.component({\r\n className: 'Button Button--primary',\r\n type: 'submit',\r\n loading: this.loading,\r\n children: app.translator.trans('core.forum.edit_user.submit_button'),\r\n })}\r\n </div>,\r\n -10\r\n );\r\n\r\n return items;\r\n }\r\n\r\n activate() {\r\n this.loading = true;\r\n const data = {\r\n username: this.username(),\r\n isEmailConfirmed: true,\r\n };\r\n\r\n return this.props.user\r\n .save(data, { errorHandler: this.onerror.bind(this) })\r\n .then(() => {\r\n this.isEmailConfirmed(true);\r\n this.loading = false;\r\n m.redraw();\r\n })\r\n .catch(() => {\r\n this.loading = false;\r\n m.redraw();\r\n });\r\n }\r\n\r\n data() {\r\n const groups = Object.keys(this.groups)\r\n .filter((id) => this.groups[id]())\r\n .map((id) => app.store.getById<Group>('groups', id));\r\n\r\n const data: any = {\r\n username: this.username(),\r\n relationships: { groups },\r\n };\r\n\r\n if (app.session.user !== this.props.user) {\r\n data.email = this.email();\r\n }\r\n\r\n if (this.setPassword()) {\r\n data.password = this.password();\r\n }\r\n\r\n return data;\r\n }\r\n\r\n onsubmit(e) {\r\n e.preventDefault();\r\n\r\n this.loading = true;\r\n\r\n this.props.user\r\n .save(this.data(), { errorHandler: this.onerror.bind(this) })\r\n .then(this.hide.bind(this))\r\n .catch(() => {\r\n this.loading = false;\r\n m.redraw();\r\n });\r\n }\r\n}\r\n","import Component from '../../common/Component';\r\n\r\n/**\r\n * The `Page` component\r\n */\r\nexport default abstract class Page extends Component {\r\n /**\r\n * A class name to apply to the body while the route is active.\r\n */\r\n bodyClass: string = '';\r\n\r\n oninit(vnode) {\r\n super.oninit(vnode);\r\n\r\n if (this.bodyClass) {\r\n $('#app').addClass(this.bodyClass);\r\n }\r\n }\r\n\r\n oncreate(vnode) {\r\n super.oncreate(vnode);\r\n\r\n app.previous = app.current;\r\n app.current = this;\r\n\r\n app.drawer.hide();\r\n app.modal.close();\r\n }\r\n\r\n onremove(vnode) {\r\n super.onremove(vnode);\r\n\r\n $('#app').removeClass(this.bodyClass);\r\n }\r\n}\r\n","/**\r\n * Setup the sidebar DOM element to be affixed to the top of the viewport\r\n * using hcSticky.\r\n */\r\nexport default function affixSidebar(vnode) {\r\n const element = vnode.dom;\r\n const $sidebar = $(element);\r\n const $header = $('#header');\r\n const $affixElement = $sidebar.find('> ul')[0];\r\n\r\n $(window).off('.affix');\r\n\r\n new hcSticky($affixElement, {\r\n stickTo: element,\r\n top: $header.outerHeight(true) + parseInt($sidebar.css('margin-top'), 10),\r\n });\r\n}\r\n","import Page from './Page';\r\nimport ItemList from '../../common/utils/ItemList';\r\nimport affixSidebar from '../utils/affixSidebar';\r\nimport UserCard from './UserCard';\r\nimport LoadingIndicator from '../../common/components/LoadingIndicator';\r\nimport SelectDropdown from '../../common/components/SelectDropdown';\r\nimport LinkButton from '../../common/components/LinkButton';\r\nimport Separator from '../../common/components/Separator';\r\nimport listItems from '../../common/helpers/listItems';\r\n\r\nimport User from '../../common/models/User';\r\n\r\n/**\r\n * The `UserPage` component shows a user's profile. It can be extended to show\r\n * content inside of the content area. See `ActivityPage` and `SettingsPage` for\r\n * examples.\r\n */\r\nexport default abstract class UserPage extends Page {\r\n /**\r\n * The user this page is for.\r\n */\r\n user: User;\r\n bodyClass: string = 'App--user';\r\n\r\n /**\r\n * The username of the currently loaded user\r\n */\r\n username: string;\r\n\r\n view() {\r\n return (\r\n <div className=\"UserPage\">\r\n {this.user\r\n ? [\r\n UserCard.component({\r\n user: this.user,\r\n className: 'Hero UserHero',\r\n editable: this.user.canEdit() || this.user === app.session.user,\r\n controlsButtonClassName: 'Button',\r\n }),\r\n <div className=\"container\">\r\n <div className=\"sideNavContainer\">\r\n <nav className=\"sideNav UserPage-nav\" config={affixSidebar}>\r\n <ul>{listItems(this.sidebarItems().toArray())}</ul>\r\n </nav>\r\n <div className=\"sideNavOffset UserPage-content\">{this.content()}</div>\r\n </div>\r\n </div>,\r\n ]\r\n : [LoadingIndicator.component({ lassName: 'LoadingIndicator--block' })]}\r\n </div>\r\n );\r\n }\r\n\r\n /**\r\n * Get the content to display in the user page.\r\n */\r\n abstract content();\r\n\r\n /**\r\n * Initialize the component with a user, and trigger the loading of their\r\n * activity feed.\r\n */\r\n protected show(user: User) {\r\n this.user = user;\r\n\r\n app.setTitle(user.displayName());\r\n\r\n m.redraw();\r\n }\r\n\r\n /**\r\n * Given a username, load the user's profile from the store, or make a request\r\n * if we don't have it yet. Then initialize the profile page with that user.\r\n */\r\n loadUser(username: string) {\r\n const lowercaseUsername = username.toLowerCase();\r\n\r\n // Load the preloaded user object, if any, into the global app store\r\n // We don't use the output of the method because it returns raw JSON\r\n // instead of the parsed models\r\n app.preloadedApiDocument();\r\n\r\n if (lowercaseUsername == this.username) return;\r\n\r\n this.username = lowercaseUsername;\r\n\r\n app.store.all<User>('users').some((user) => {\r\n if ((user.username().toLowerCase() === lowercaseUsername || user.id() === username) && user.joinTime()) {\r\n this.show(user);\r\n return true;\r\n }\r\n });\r\n\r\n if (!this.user) {\r\n app.store.find('users', username).then(this.show.bind(this));\r\n }\r\n }\r\n\r\n /**\r\n * Build an item list for the content of the sidebar.\r\n */\r\n sidebarItems() {\r\n const items = new ItemList();\r\n\r\n items.add(\r\n 'nav',\r\n SelectDropdown.component({\r\n children: this.navItems().toArray(),\r\n className: 'App-titleControl',\r\n buttonClassName: 'Button',\r\n })\r\n );\r\n\r\n return items;\r\n }\r\n\r\n /**\r\n * Build an item list for the navigation in the sidebar.\r\n */\r\n navItems() {\r\n const items = new ItemList();\r\n const user = this.user;\r\n\r\n items.add(\r\n 'posts',\r\n LinkButton.component({\r\n href: app.route('user.posts', { username: user.username() }),\r\n children: [app.translator.trans('core.forum.user.posts_link'), <span className=\"Button-badge\">{user.commentCount()}</span>],\r\n icon: 'far fa-comment',\r\n }),\r\n 100\r\n );\r\n\r\n items.add(\r\n 'discussions',\r\n LinkButton.component({\r\n href: app.route('user.discussions', { username: user.username() }),\r\n children: [app.translator.trans('core.forum.user.discussions_link'), <span className=\"Button-badge\">{user.discussionCount()}</span>],\r\n icon: 'fas fa-bars',\r\n }),\r\n 90\r\n );\r\n\r\n if (app.session.user === user) {\r\n items.add('separator', Separator.component(), -90);\r\n items.add(\r\n 'settings',\r\n LinkButton.component({\r\n href: app.route('settings'),\r\n children: app.translator.trans('core.forum.user.settings_link'),\r\n icon: 'fas fa-cog',\r\n }),\r\n -100\r\n );\r\n }\r\n\r\n return items;\r\n }\r\n}\r\n","import Alert from '../../common/components/Alert';\r\nimport Button from '../../common/components/Button';\r\nimport Separator from '../../common/components/Separator';\r\nimport EditUserModal from '../components/EditUserModal';\r\nimport UserPage from '../components/UserPage';\r\nimport ItemList from '../../common/utils/ItemList';\r\nimport User from '../../common/models/User';\r\n\r\n/**\r\n * The `UserControls` utility constructs a list of buttons for a user which\r\n * perform actions on it.\r\n */\r\nexport default {\r\n /**\r\n * Get a list of controls for a user.\r\n *\r\n * @param user\r\n * @param context The parent component under which the controls menu will\r\n * be displayed.\r\n */\r\n controls(user: User, context: any): ItemList {\r\n const items = new ItemList();\r\n\r\n ['user', 'moderation', 'destructive'].forEach((section) => {\r\n const controls = this[section](user, context).toArray();\r\n if (controls.length) {\r\n controls.forEach((item) => items.add(item.itemName, item));\r\n items.add(section + 'Separator', Separator.component());\r\n }\r\n });\r\n\r\n return items;\r\n },\r\n\r\n /**\r\n * Get controls for a user pertaining to the current user (e.g. poke, follow).\r\n */\r\n user(): ItemList {\r\n return new ItemList();\r\n },\r\n\r\n /**\r\n * Get controls for a user pertaining to moderation (e.g. suspend, edit).\r\n */\r\n moderation(user: User): ItemList {\r\n const items = new ItemList();\r\n\r\n if (user.canEdit()) {\r\n items.add(\r\n 'edit',\r\n Button.component({\r\n icon: 'fas fa-pencil-alt',\r\n children: app.translator.trans('core.forum.user_controls.edit_button'),\r\n onclick: this.editAction.bind(this, user),\r\n })\r\n );\r\n }\r\n\r\n return items;\r\n },\r\n\r\n /**\r\n * Get controls for a user which are destructive (e.g. delete).\r\n */\r\n destructive(user: User): ItemList {\r\n const items = new ItemList();\r\n\r\n if (user.id() !== '1' && user.canDelete()) {\r\n items.add(\r\n 'delete',\r\n Button.component({\r\n icon: 'fas fa-times',\r\n children: app.translator.trans('core.forum.user_controls.delete_button'),\r\n onclick: this.deleteAction.bind(this, user),\r\n })\r\n );\r\n }\r\n\r\n return items;\r\n },\r\n\r\n /**\r\n * Delete the user.\r\n */\r\n deleteAction(user: User) {\r\n if (!confirm(app.translator.transText('core.forum.user_controls.delete_confirmation'))) {\r\n return;\r\n }\r\n\r\n user.delete()\r\n .then(() => {\r\n this.showDeletionAlert(user, 'success');\r\n if (app.current instanceof UserPage && app.current.user === user) {\r\n app.history.back();\r\n } else {\r\n window.location.reload();\r\n }\r\n })\r\n .catch(() => this.showDeletionAlert(user, 'error'));\r\n },\r\n\r\n /**\r\n * Show deletion alert of user.\r\n */\r\n showDeletionAlert(user: User, type: string) {\r\n const { username, email } = user.data.attributes;\r\n const message = `core.forum.user_controls.delete_${type}_message`;\r\n\r\n app.alerts.show(\r\n Alert.component({\r\n type,\r\n children: app.translator.trans(message, { username, email }),\r\n })\r\n );\r\n },\r\n\r\n /**\r\n * Edit the user.\r\n */\r\n editAction(user: User) {\r\n app.modal.show(EditUserModal, { user });\r\n },\r\n};\r\n","import Component, { ComponentProps } from '../../common/Component';\r\nimport avatar from '../../common/helpers/avatar';\r\nimport icon from '../../common/helpers/icon';\r\nimport listItems from '../../common/helpers/listItems';\r\nimport ItemList from '../../common/utils/ItemList';\r\nimport Button from '../../common/components/Button';\r\nimport LoadingIndicator from '../../common/components/LoadingIndicator';\r\nimport User from '../../common/models/User';\r\n\r\nexport interface AvatarEditorProps extends ComponentProps {\r\n user: User;\r\n}\r\n\r\n/**\r\n * The `AvatarEditor` component displays a user's avatar along with a dropdown\r\n * menu which allows the user to upload/remove the avatar.\r\n */\r\nexport default class AvatarEditor extends Component<AvatarEditorProps> {\r\n /**\r\n * Whether or not an avatar upload is in progress.\r\n */\r\n loading = false;\r\n\r\n /**\r\n * Whether or not an image has been dragged over the dropzone.\r\n */\r\n isDraggedOver = false;\r\n\r\n static initProps(props) {\r\n super.initProps(props);\r\n\r\n props.className = props.className || '';\r\n }\r\n\r\n view() {\r\n const user = this.props.user;\r\n\r\n return (\r\n <div\r\n className={\r\n 'AvatarEditor Dropdown ' + this.props.className + (this.loading ? ' loading' : '') + (this.isDraggedOver ? ' dragover' : '')\r\n }\r\n >\r\n {avatar(user)}\r\n <a\r\n className={user.avatarUrl() ? 'Dropdown-toggle' : 'Dropdown-toggle AvatarEditor--noAvatar'}\r\n title={app.translator.trans('core.forum.user.avatar_upload_tooltip')}\r\n data-toggle=\"dropdown\"\r\n onclick={this.quickUpload.bind(this)}\r\n ondragover={this.enableDragover.bind(this)}\r\n ondragenter={this.enableDragover.bind(this)}\r\n ondragleave={this.disableDragover.bind(this)}\r\n ondragend={this.disableDragover.bind(this)}\r\n ondrop={this.dropUpload.bind(this)}\r\n >\r\n {this.loading ? LoadingIndicator.component() : user.avatarUrl() ? icon('fas fa-pencil-alt') : icon('fas fa-plus-circle')}\r\n </a>\r\n <ul className=\"Dropdown-menu Menu\">{listItems(this.controlItems().toArray())}</ul>\r\n </div>\r\n );\r\n }\r\n\r\n /**\r\n * Get the items in the edit avatar dropdown menu.\r\n */\r\n controlItems(): ItemList {\r\n const items = new ItemList();\r\n\r\n items.add(\r\n 'upload',\r\n Button.component({\r\n icon: 'fas fa-upload',\r\n children: app.translator.trans('core.forum.user.avatar_upload_button'),\r\n onclick: this.openPicker.bind(this),\r\n })\r\n );\r\n\r\n items.add(\r\n 'remove',\r\n Button.component({\r\n icon: 'fas fa-times',\r\n children: app.translator.trans('core.forum.user.avatar_remove_button'),\r\n onclick: this.remove.bind(this),\r\n })\r\n );\r\n\r\n return items;\r\n }\r\n\r\n /**\r\n * Enable dragover style\r\n */\r\n enableDragover(e: Event) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n this.isDraggedOver = true;\r\n }\r\n\r\n /**\r\n * Disable dragover style\r\n */\r\n disableDragover(e: Event) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n this.isDraggedOver = false;\r\n }\r\n\r\n /**\r\n * Upload avatar when file is dropped into dropzone.\r\n *\r\n * @param {Event} e\r\n */\r\n dropUpload(e: Event) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n this.isDraggedOver = false;\r\n this.upload(e.dataTransfer.files[0]);\r\n }\r\n\r\n /**\r\n * If the user doesn't have an avatar, there's no point in showing the\r\n * controls dropdown, because only one option would be viable: uploading.\r\n * Thus, when the avatar editor's dropdown toggle button is clicked, we prompt\r\n * the user to upload an avatar immediately.\r\n */\r\n quickUpload(e: Event) {\r\n if (!this.props.user.avatarUrl()) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n this.openPicker();\r\n }\r\n }\r\n\r\n /**\r\n * Upload avatar using file picker\r\n */\r\n openPicker() {\r\n if (this.loading) return;\r\n\r\n // Create a hidden HTML input element and click on it so the user can select\r\n // an avatar file. Once they have, we will upload it via the API.\r\n const user = this.props.user;\r\n const $input = $('<input type=\"file\">');\r\n\r\n $input\r\n .appendTo('body')\r\n .hide()\r\n .click()\r\n .on('change', (e) => {\r\n this.upload($(e.target)[0].files[0]);\r\n });\r\n }\r\n\r\n /**\r\n * Upload avatar\r\n */\r\n upload(file: File) {\r\n if (this.loading) return;\r\n\r\n const user = this.props.user;\r\n const body = new FormData();\r\n body.append('avatar', file);\r\n\r\n this.loading = true;\r\n m.redraw();\r\n\r\n app.request({\r\n method: 'POST',\r\n url: `${app.forum.attribute('apiUrl')}/users/${user.id()}/avatar`,\r\n serialize: (raw) => raw,\r\n body,\r\n }).then(this.success.bind(this), this.failure.bind(this));\r\n }\r\n\r\n /**\r\n * Remove the user's avatar.\r\n */\r\n remove() {\r\n const user = this.props.user;\r\n\r\n this.loading = true;\r\n m.redraw();\r\n\r\n app.request({\r\n method: 'DELETE',\r\n url: `${app.forum.attribute('apiUrl')}/users/${user.id()}/avatar`,\r\n }).then(this.success.bind(this), this.failure.bind(this));\r\n }\r\n\r\n /**\r\n * After a successful upload/removal, push the updated user data into the\r\n * store, and force a recomputation of the user's avatar color.\r\n */\r\n protected success(response: any) {\r\n app.store.pushPayload(response);\r\n delete this.props.user.avatarColor;\r\n\r\n this.loading = false;\r\n m.redraw();\r\n }\r\n\r\n /**\r\n * If avatar upload/removal fails, stop loading.\r\n */\r\n protected failure(response: any) {\r\n this.loading = false;\r\n m.redraw();\r\n }\r\n}\r\n","import Component, { ComponentProps } from '../../common/Component';\r\nimport humanTime from '../../common/utils/humanTime';\r\nimport ItemList from '../../common/utils/ItemList';\r\nimport UserControls from '../utils/UserControls';\r\nimport avatar from '../../common/helpers/avatar';\r\nimport username from '../../common/helpers/username';\r\nimport icon from '../../common/helpers/icon';\r\nimport Dropdown from '../../common/components/Dropdown';\r\nimport AvatarEditor from './AvatarEditor';\r\nimport listItems from '../../common/helpers/listItems';\r\nimport User from '../../common/models/User';\r\n\r\nexport interface UserCardProps extends ComponentProps {\r\n user: User;\r\n editable: boolean;\r\n controlsButtonClassName: string;\r\n}\r\n\r\n/**\r\n * The `UserCard` component displays a user's profile card. This is used both on\r\n * the `UserPage` (in the hero) and in discussions, shown when hovering over a\r\n * post author.\r\n */\r\nexport default class UserCard extends Component<UserCardProps> {\r\n view() {\r\n const user = this.props.user;\r\n const controls = UserControls.controls(user, this).toArray();\r\n const color = user.color();\r\n const badges = user.badges().toArray();\r\n\r\n return (\r\n <div className={'UserCard ' + (this.props.className || '')} style={color ? { backgroundColor: color } : ''}>\r\n <div className=\"darkenBackground\">\r\n <div className=\"container\">\r\n {controls.length\r\n ? Dropdown.component({\r\n children: controls,\r\n className: 'UserCard-controls App-primaryControl',\r\n menuClassName: 'Dropdown-menu--right',\r\n buttonClassName: this.props.controlsButtonClassName,\r\n label: app.translator.trans('core.forum.user_controls.button'),\r\n icon: 'fas fa-ellipsis-v',\r\n })\r\n : ''}\r\n\r\n <div className=\"UserCard-profile\">\r\n <h2 className=\"UserCard-identity\">\r\n {this.props.editable ? (\r\n [AvatarEditor.component({ user, className: 'UserCard-avatar' }), username(user)]\r\n ) : (\r\n <m.route.Link href={app.route.user(user)}>\r\n <div className=\"UserCard-avatar\">{avatar(user)}</div>\r\n {username(user)}\r\n </m.route.Link>\r\n )}\r\n </h2>\r\n\r\n {badges.length ? <ul className=\"UserCard-badges badges\">{listItems(badges)}</ul> : ''}\r\n\r\n <ul className=\"UserCard-info\">{listItems(this.infoItems().toArray())}</ul>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n /**\r\n * Build an item list of tidbits of info to show on this user's profile.\r\n *\r\n * @return {ItemList}\r\n */\r\n infoItems() {\r\n const items = new ItemList();\r\n const user = this.props.user;\r\n const lastSeenAt = user.lastSeenAt();\r\n\r\n if (lastSeenAt) {\r\n const online = user.isOnline();\r\n\r\n items.add(\r\n 'lastSeen',\r\n <span className={'UserCard-lastSeen' + (online ? ' online' : '')}>\r\n {online\r\n ? [icon('fas fa-circle'), ' ', app.translator.trans('core.forum.user.online_text')]\r\n : [icon('far fa-clock'), ' ', humanTime(lastSeenAt)]}\r\n </span>\r\n );\r\n }\r\n\r\n items.add('joined', app.translator.trans('core.forum.user.joined_date_text', { ago: humanTime(user.joinTime()) }));\r\n\r\n return items;\r\n }\r\n}\r\n","import icon from './icon';\r\nimport User from '../models/User';\r\n\r\n/**\r\n * The `useronline` helper displays a green circle if the user is online\r\n *\r\n * @param {User} user\r\n * @return {Object}\r\n */\r\nexport default function userOnline(user: User) {\r\n if (user.lastSeenAt() && user.isOnline()) {\r\n return <span className=\"UserOnline\">{icon('fas fa-circle')}</span>;\r\n }\r\n}\r\n","import Component from '../../common/Component';\r\nimport UserCard from './UserCard';\r\nimport avatar from '../../common/helpers/avatar';\r\nimport username from '../../common/helpers/username';\r\nimport userOnline from '../../common/helpers/userOnline';\r\nimport listItems from '../../common/helpers/listItems';\r\nimport { PostProp } from '../../common/concerns/ComponentProps';\r\n\r\n/**\r\n * The `PostUser` component shows the avatar and username of a post's author.\r\n */\r\nexport default class PostUser extends Component<PostProp> {\r\n /**\r\n * Whether or not the user hover card is visible.\r\n */\r\n cardVisible = false;\r\n\r\n view() {\r\n const post = this.props.post;\r\n const user = post.user();\r\n\r\n if (!user) {\r\n return (\r\n <div className=\"PostUser\">\r\n <h3>\r\n {avatar(user, { className: 'PostUser-avatar' })} {username(user)}\r\n </h3>\r\n </div>\r\n );\r\n }\r\n\r\n let card = '';\r\n\r\n if (!post.isHidden() && this.cardVisible) {\r\n card = UserCard.component({\r\n user,\r\n className: 'UserCard--popover',\r\n controlsButtonClassName: 'Button Button--icon Button--flat',\r\n });\r\n }\r\n\r\n return (\r\n <div className=\"PostUser\">\r\n <h3>\r\n <m.route.Link href={app.route.user(user)}>\r\n {avatar(user, { className: 'PostUser-avatar' })}\r\n {userOnline(user)}\r\n {username(user)}\r\n </m.route.Link>\r\n </h3>\r\n <ul className=\"PostUser-badges badges\">{listItems(user.badges().toArray())}</ul>\r\n {card}\r\n </div>\r\n );\r\n }\r\n\r\n oncreate(vnode) {\r\n super.oncreate(vnode);\r\n\r\n let timeout;\r\n\r\n this.$()\r\n .on('mouseover', 'h3 a, .UserCard', () => {\r\n clearTimeout(timeout);\r\n timeout = setTimeout(this.showCard.bind(this), 500);\r\n })\r\n .on('mouseout', 'h3 a, .UserCard', () => {\r\n clearTimeout(timeout);\r\n timeout = setTimeout(this.hideCard.bind(this), 250);\r\n });\r\n }\r\n\r\n /**\r\n * Show the user card.\r\n */\r\n showCard() {\r\n this.cardVisible = true;\r\n\r\n m.redraw();\r\n\r\n setTimeout(() => this.$('.UserCard').addClass('in'));\r\n }\r\n\r\n /**\r\n * Hide the user card.\r\n */\r\n hideCard() {\r\n this.$('.UserCard')\r\n .removeClass('in')\r\n .one('transitionend webkitTransitionEnd oTransitionEnd', () => {\r\n this.cardVisible = false;\r\n m.redraw();\r\n });\r\n }\r\n}\r\n","import humanTimeUtil from '../utils/humanTime';\r\n\r\n/**\r\n * The `humanTime` helper displays a time in a human-friendly time-ago format\r\n * (e.g. '12 days ago'), wrapped in a <time> tag with other information about\r\n * the time.\r\n */\r\nexport default function humanTime(time: Date) {\r\n const mo = dayjs(time);\r\n\r\n const datetime = mo.format();\r\n const full = mo.format('LLLL');\r\n const ago = humanTimeUtil(time);\r\n\r\n return (\r\n <time pubdate datetime={datetime} title={full} data-humantime>\r\n {ago}\r\n </time>\r\n );\r\n}\r\n","/**\r\n * The `fullTime` helper displays a formatted time string wrapped in a <time>\r\n * tag.\r\n */\r\nexport default function fullTime(time: Date) {\r\n const mo = dayjs(time);\r\n\r\n const datetime = mo.format();\r\n const full = mo.format('LLLL');\r\n\r\n return (\r\n <time pubdate datetime={datetime}>\r\n {full}\r\n </time>\r\n );\r\n}\r\n","import Component from '../../common/Component';\r\nimport { PostProp } from '../../common/concerns/ComponentProps';\r\nimport humanTime from '../../common/helpers/humanTime';\r\nimport fullTime from '../../common/helpers/fullTime';\r\nimport Post from '../../common/models/Post';\r\n\r\nexport default class PostMeta extends Component<PostProp> {\r\n view() {\r\n const post = this.props.post;\r\n const time = post.createdAt();\r\n const permalink = this.getPermalink(post);\r\n const touch = 'ontouchstart' in document.documentElement;\r\n\r\n // When the dropdown menu is shown, select the contents of the permalink\r\n // input so that the user can quickly copy the URL.\r\n const selectPermalink = function (this: HTMLElement) {\r\n setTimeout(() => $(this).parent().find('.PostMeta-permalink').select());\r\n };\r\n\r\n return (\r\n <div className=\"Dropdown PostMeta\">\r\n <a className=\"Dropdown-toggle\" onclick={selectPermalink} data-toggle=\"dropdown\">\r\n {humanTime(time)}\r\n </a>\r\n\r\n <div className=\"Dropdown-menu dropdown-menu\">\r\n <span className=\"PostMeta-number\">{app.translator.trans('core.forum.post.number_tooltip', { number: post.number() })}</span>{' '}\r\n <span className=\"PostMeta-time\">{fullTime(time)}</span> <span className=\"PostMeta-ip\">{post.data.attributes.ipAddress}</span>\r\n {touch ? (\r\n <a className=\"Button PostMeta-permalink\" href={permalink}>\r\n {permalink}\r\n </a>\r\n ) : (\r\n <input className=\"FormControl PostMeta-permalink\" value={permalink} onclick={(e) => e.stopPropagation()} />\r\n )}\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n /**\r\n * Get the permalink for the given post.\r\n */\r\n getPermalink(post: Post): string {\r\n return window.location.origin + app.route.post(post);\r\n }\r\n}\r\n","import Component from '../../common/Component';\r\nimport { PostProp } from '../../common/concerns/ComponentProps';\r\nimport humanTime from '../../common/utils/humanTime';\r\n\r\n/**\r\n * The `PostEdited` component displays information about when and by whom a post\r\n * was edited.\r\n */\r\nexport default class PostEdited extends Component<PostProp> {\r\n shouldUpdateTooltip = false;\r\n oldEditedInfo?: string;\r\n\r\n view() {\r\n const post = this.props.post;\r\n const editedUser = post.editedUser();\r\n const editedInfo = app.translator.transText('core.forum.post.edited_tooltip', { user: editedUser, ago: humanTime(post.editedAt()) });\r\n\r\n if (editedInfo !== this.oldEditedInfo) {\r\n this.shouldUpdateTooltip = true;\r\n this.oldEditedInfo = editedInfo;\r\n }\r\n\r\n return (\r\n <span className=\"PostEdited\" title={editedInfo}>\r\n {app.translator.trans('core.forum.post.edited_text')}\r\n </span>\r\n );\r\n }\r\n\r\n oncreate(vnode) {\r\n super.oncreate(vnode);\r\n\r\n this.$().tooltip();\r\n }\r\n\r\n onupdate(vnode) {\r\n super.onupdate(vnode);\r\n\r\n if (this.shouldUpdateTooltip) {\r\n this.$().tooltip('destroy').tooltip();\r\n this.shouldUpdateTooltip = false;\r\n }\r\n }\r\n}\r\n","import Post from './Post';\r\nimport PostUser from './PostUser';\r\nimport PostMeta from './PostMeta';\r\nimport PostEdited from './PostEdited';\r\n// import EditPostComposer from './EditPostComposer';\r\nimport ItemList from '../../common/utils/ItemList';\r\nimport listItems from '../../common/helpers/listItems';\r\nimport Button from '../../common/components/Button';\r\nimport { Vnode } from 'mithril';\r\n\r\n/**\r\n * The `CommentPost` component displays a standard `comment`-typed post. This\r\n * includes a number of item lists (controls, header, and footer) surrounding\r\n * the post's HTML content.\r\n */\r\nexport default class CommentPost extends Post {\r\n /**\r\n * If the post has been hidden, then this flag determines whether or not its\r\n * content has been expanded.\r\n */\r\n revealContent: boolean = false;\r\n\r\n postUser!: Vnode<{}, PostUser>;\r\n\r\n oninit(vnode) {\r\n super.oninit(vnode);\r\n\r\n // Create an instance of the component that displays the post's author so\r\n // that we can force the post to rerender when the user card is shown.\r\n this.postUser = <PostUser post={this.props.post} />;\r\n\r\n this.subtree.check(\r\n () => this.postUser.state?.cardVisible,\r\n () => this.revealContent,\r\n () => this.isEditing()\r\n );\r\n }\r\n\r\n content() {\r\n return super.content().concat([\r\n <header className=\"Post-header\">\r\n <ul>{listItems(this.headerItems().toArray())}</ul>\r\n </header>,\r\n <div className=\"Post-body\">\r\n {this.isEditing() ? <div className=\"Post-preview\" config={this.configPreview.bind(this)} /> : m.trust(this.props.post.contentHtml())}\r\n </div>,\r\n ]);\r\n }\r\n\r\n onupdate(vnode) {\r\n super.onupdate(vnode);\r\n\r\n const contentHtml = this.isEditing() ? '' : this.props.post.contentHtml();\r\n\r\n // TODO: idk what this is supposed to be\r\n\r\n // If the post content has changed since the last render, we'll run through\r\n // all of the <script> tags in the content and evaluate them. This is\r\n // necessary because TextFormatter outputs them for e.g. syntax highlighting.\r\n if (vnode.contentHtml !== contentHtml) {\r\n this.$('.Post-body script').each(function () {\r\n eval.call(window, $(this).text());\r\n });\r\n }\r\n\r\n vnode.contentHtml = contentHtml;\r\n }\r\n\r\n isEditing() {\r\n return false; // TODO\r\n // return app.composer?.component instanceof EditPostComposer &&\r\n // app.composer.component.props.post === this.props.post;\r\n }\r\n\r\n attrs() {\r\n const post = this.props.post;\r\n const attrs = super.attrs();\r\n\r\n attrs.className = classNames(\r\n attrs.className,\r\n 'CommentPost',\r\n post.isHidden() && 'Post--hidden',\r\n post.isEdited() && 'Post--edited',\r\n this.revealContent && 'revealContent',\r\n this.isEditing() && 'editing'\r\n );\r\n\r\n return attrs;\r\n }\r\n\r\n // TODO change so it works\r\n configPreview(element, isInitialized, context) {\r\n if (isInitialized) return;\r\n\r\n // Every 50ms, if the composer content has changed, then update the post's\r\n // body with a preview.\r\n let preview;\r\n const updatePreview = () => {\r\n const content = app.composer.component.content();\r\n\r\n if (preview === content) return;\r\n\r\n preview = content;\r\n\r\n s9e.TextFormatter.preview(preview || '', element);\r\n };\r\n updatePreview();\r\n\r\n const updateInterval = setInterval(updatePreview, 50);\r\n context.onunload = () => clearInterval(updateInterval);\r\n }\r\n\r\n /**\r\n * Toggle the visibility of a hidden post's content.\r\n */\r\n toggleContent() {\r\n this.revealContent = !this.revealContent;\r\n }\r\n\r\n /**\r\n * Build an item list for the post's header.\r\n */\r\n headerItems(): ItemList {\r\n const items = new ItemList();\r\n const post = this.props.post;\r\n const props = { post };\r\n\r\n items.add('user', <PostUser post={this.props.post} />, 100);\r\n items.add('meta', <PostMeta {...props} />);\r\n\r\n if (post.isEdited() && !post.isHidden()) {\r\n items.add('edited', <PostEdited {...props} />);\r\n }\r\n\r\n // If the post is hidden, add a button that allows toggling the visibility\r\n // of the post's content.\r\n if (post.isHidden()) {\r\n items.add(\r\n 'toggle',\r\n Button.component({\r\n className: 'Button Button--default Button--more',\r\n icon: 'fas fa-ellipsis-h',\r\n onclick: this.toggleContent.bind(this),\r\n })\r\n );\r\n }\r\n\r\n return items;\r\n }\r\n}\r\n","import EventPost from './EventPost';\r\n\r\n/**\r\n * The `DiscussionRenamedPost` component displays a discussion event post\r\n * indicating that the discussion has been renamed.\r\n */\r\nexport default class DiscussionRenamedPost extends EventPost {\r\n icon() {\r\n return 'fas fa-pencil-alt';\r\n }\r\n\r\n description(data) {\r\n const renamed = app.translator.trans('core.forum.post_stream.discussion_renamed_text', data);\r\n const oldName = app.translator.transText('core.forum.post_stream.discussion_renamed_old_tooltip', data);\r\n\r\n return <span title={oldName}>{renamed}</span>;\r\n }\r\n\r\n descriptionData() {\r\n const post = this.props.post;\r\n const oldTitle = post.content()[0];\r\n const newTitle = post.content()[1];\r\n\r\n return {\r\n old: oldTitle,\r\n new: <strong className=\"DiscussionRenamedPost-new\">{newTitle}</strong>,\r\n };\r\n }\r\n}\r\n","import Post from './Post';\r\nimport { ucfirst } from '../../common/utils/string';\r\nimport usernameHelper from '../../common/helpers/username';\r\nimport icon from '../../common/helpers/icon';\r\n\r\ninterface DescriptionData {\r\n [key: string]: any;\r\n}\r\n\r\n/**\r\n * The `EventPost` component displays a post which indicating a discussion\r\n * event, like a discussion being renamed or stickied. Subclasses must implement\r\n * the `icon` and `description` methods.\r\n */\r\nexport default abstract class EventPost extends Post {\r\n attrs() {\r\n const attrs = super.attrs();\r\n\r\n attrs.className = classNames(attrs.className, 'EventPost', ucfirst(this.props.post.contentType()) + 'Post');\r\n\r\n return attrs;\r\n }\r\n\r\n content() {\r\n const user = this.props.post.user();\r\n const username = usernameHelper(user);\r\n const data: DescriptionData = Object.assign(this.descriptionData(), {\r\n user,\r\n username: user ? (\r\n <m.route.Link className=\"EventPost-user\" href={app.route.user(user)}>\r\n {username}\r\n </m.route.Link>\r\n ) : (\r\n username\r\n ),\r\n });\r\n\r\n return super\r\n .content()\r\n .concat([icon(this.icon(), { className: 'EventPost-icon' }), <div class=\"EventPost-info\">{this.description(data)}</div>]);\r\n }\r\n\r\n /**\r\n * Get the name of the event icon.\r\n */\r\n abstract icon(): string;\r\n\r\n /**\r\n * Get the translation data for the description of the event.\r\n */\r\n abstract descriptionData(): DescriptionData;\r\n\r\n /**\r\n * Get the description text for the event.\r\n *\r\n * @return The description to render in the DOM\r\n */\r\n description(data: DescriptionData): any {\r\n return app.translator.transChoice(this.descriptionKey(), data.count, data);\r\n }\r\n\r\n /**\r\n * Get the translation key for the description of the event.\r\n */\r\n descriptionKey(): string {\r\n return '';\r\n }\r\n}\r\n","/**\r\n * The `abbreviateNumber` utility converts a number to a shorter localized form.\r\n *\r\n * @example\r\n * abbreviateNumber(1234);\r\n * // \"1.2K\"\r\n */\r\nexport default (number: number): string => {\r\n // TODO: translation\r\n if (number >= 1000000) {\r\n return Math.floor(number / 1000000) + app.translator.transText('core.lib.number_suffix.mega_text');\r\n } else if (number >= 1000) {\r\n return Math.floor(number / 1000) + app.translator.transText('core.lib.number_suffix.kilo_text');\r\n } else {\r\n return number.toString();\r\n }\r\n};\r\n","import Component from '../../common/Component';\r\nimport humanTime from '../../common/helpers/humanTime';\r\nimport icon from '../../common/helpers/icon';\r\nimport Post from '../../common/models/Post';\r\nimport { DiscussionProp } from '../../common/concerns/ComponentProps';\r\n\r\nexport interface TerminalPostProps extends DiscussionProp {\r\n lastPost: Post;\r\n}\r\n\r\n/**\r\n * Displays information about a the first or last post in a discussion.\r\n */\r\nexport default class TerminalPost<T extends TerminalPostProps = TerminalPostProps> extends Component<T> {\r\n view() {\r\n const discussion = this.props.discussion;\r\n const lastPost = this.props.lastPost && discussion.replyCount();\r\n\r\n const user = discussion[lastPost ? 'lastPostedUser' : 'user']();\r\n const time = discussion[lastPost ? 'lastPostedAt' : 'createdAt']();\r\n\r\n return (\r\n <span>\r\n {lastPost ? icon('fas fa-reply') : ''}{' '}\r\n {app.translator.trans(`core.forum.discussion_list.${lastPost ? 'replied' : 'started'}_text`, {\r\n user,\r\n ago: humanTime(time),\r\n })}\r\n </span>\r\n );\r\n }\r\n}\r\n","import Component from '../../common/Component';\r\nimport ItemList from '../../common/utils/ItemList';\r\nimport listItems from '../../common/helpers/listItems';\r\nimport { DiscussionProp } from '../../common/concerns/ComponentProps';\r\n\r\n/**\r\n * The `DiscussionHero` component displays the hero on a discussion page.\r\n */\r\nexport default class DiscussionHero<T extends DiscussionProp = DiscussionProp> extends Component<T> {\r\n view() {\r\n return (\r\n <header className=\"Hero DiscussionHero\">\r\n <div className=\"container\">\r\n <ul className=\"DiscussionHero-items\">{listItems(this.items().toArray())}</ul>\r\n </div>\r\n </header>\r\n );\r\n }\r\n\r\n /**\r\n * Build an item list for the contents of the discussion hero.\r\n *\r\n * @return {ItemList}\r\n */\r\n items() {\r\n const items = new ItemList();\r\n const discussion = this.props.discussion;\r\n const badges = discussion.badges().toArray();\r\n\r\n if (badges.length) {\r\n items.add('badges', <ul className=\"DiscussionHero-badges badges\">{listItems(badges)}</ul>, 10);\r\n }\r\n\r\n items.add('title', <h2 className=\"DiscussionHero-title\">{discussion.title()}</h2>);\r\n\r\n return items;\r\n }\r\n}\r\n","import Component from '../../common/Component';\r\nimport avatar from '../../common/helpers/avatar';\r\n\r\n/**\r\n * The `LoadingPost` component shows a placeholder that looks like a post,\r\n * indicating that the post is loading.\r\n */\r\nexport default class LoadingPost extends Component {\r\n view() {\r\n return (\r\n <div className=\"Post CommentPost LoadingPost\">\r\n <header className=\"Post-header\">\r\n {avatar(null, { className: 'PostUser-avatar' })}\r\n <div className=\"fakeText\" />\r\n </header>\r\n\r\n <div className=\"Post-body\">\r\n <div className=\"fakeText\" />\r\n <div className=\"fakeText\" />\r\n <div className=\"fakeText\" />\r\n </div>\r\n </div>\r\n );\r\n }\r\n}\r\n","/**\r\n * The `anchorScroll` utility saves the scroll position relative to an element,\r\n * and then restores it after a callback has been run.\r\n *\r\n * This is useful if a redraw will change the page's content above the viewport.\r\n * Normally doing this will result in the content in the viewport being pushed\r\n * down or pulled up. By wrapping the redraw with this utility, the scroll\r\n * position can be anchor to an element that is in or below the viewport, so\r\n * the content in the viewport will stay the same.\r\n *\r\n * @param element The element to anchor the scroll position to.\r\n * @param callback The callback to run that will change page content.\r\n */\r\nexport default function anchorScroll(element: ZeptoCollection | HTMLElement, callback: Function) {\r\n const $window = $(window);\r\n const $el = $(element);\r\n\r\n if (!element || !$el.length) {\r\n return callback();\r\n }\r\n\r\n const relativeScroll = $el.offset().top - $window.scrollTop();\r\n\r\n callback();\r\n\r\n $window.scrollTop($el.offset().top - relativeScroll);\r\n}\r\n","import Component from '../../common/Component';\r\nimport avatar from '../../common/helpers/avatar';\r\nimport username from '../../common/helpers/username';\r\nimport DiscussionControls from '../utils/DiscussionControls';\r\nimport { DiscussionProp } from '../../common/concerns/ComponentProps';\r\n\r\n/**\r\n * The `ReplyPlaceholder` component displays a placeholder for a reply, which,\r\n * when clicked, opens the reply composer.\r\n */\r\nexport default class ReplyPlaceholder<T extends DiscussionProp = DiscussionProp> extends Component<T> {\r\n view() {\r\n // TODO: add method & remove `false &&`\r\n if (false && app.composingReplyTo(this.props.discussion)) {\r\n return (\r\n <article className=\"Post CommentPost editing\">\r\n <header className=\"Post-header\">\r\n <div className=\"PostUser\">\r\n <h3>\r\n {avatar(app.session.user, { className: 'PostUser-avatar' })}\r\n {username(app.session.user)}\r\n </h3>\r\n </div>\r\n </header>\r\n <div className=\"Post-body\" oncreate={this.oncreatePreview.bind(this)} />\r\n </article>\r\n );\r\n }\r\n\r\n const reply = () => DiscussionControls.replyAction.call(this.props.discussion, true);\r\n\r\n return (\r\n <article className=\"Post ReplyPlaceholder\" onclick={reply}>\r\n <header className=\"Post-header\">\r\n {avatar(app.session.user, { className: 'PostUser-avatar' })} {app.translator.trans('core.forum.post_stream.reply_placeholder')}\r\n </header>\r\n </article>\r\n );\r\n }\r\n\r\n oncreatePreview(vnode) {\r\n // Every 50ms, if the composer content has changed, then update the post's\r\n // body with a preview.\r\n let preview;\r\n const updateInterval = setInterval(() => {\r\n // Since we're polling, the composer may have been closed in the meantime,\r\n // so we bail in that case.\r\n if (!app.composer.component) return;\r\n\r\n const content = app.composer.component.content();\r\n\r\n if (preview === content) return;\r\n\r\n preview = content;\r\n\r\n const anchorToBottom = $(window).scrollTop() + $(window).height() >= $(document).height();\r\n\r\n s9e.TextFormatter.preview(preview || '', vnode.dom);\r\n\r\n if (anchorToBottom) {\r\n $(window).scrollTop($(document).height());\r\n }\r\n }, 50);\r\n\r\n vnode.attrs.onunload = () => clearInterval(updateInterval);\r\n }\r\n}\r\n","export type EventHandler = (...args: any) => any;\r\n\r\nexport default class Evented {\r\n /**\r\n * Arrays of registered event handlers, grouped by the event name.\r\n */\r\n protected handlers: { [key: string]: EventHandler[] } = {};\r\n\r\n /**\r\n * Get all of the registered handlers for an event.\r\n *\r\n * @param event The name of the event.\r\n */\r\n protected getHandlers(event: string): EventHandler[] {\r\n this.handlers = this.handlers || {};\r\n\r\n this.handlers[event] = this.handlers[event] || [];\r\n\r\n return this.handlers[event];\r\n }\r\n\r\n /**\r\n * Trigger an event.\r\n *\r\n * @param event The name of the event.\r\n * @param args Arguments to pass to event handlers.\r\n */\r\n public trigger(event: string, ...args: any): this {\r\n this.getHandlers(event).forEach((handler) => handler.apply(this, args));\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Register an event handler.\r\n *\r\n * @param event The name of the event.\r\n * @param handler The function to handle the event.\r\n */\r\n on(event: string, handler: EventHandler): this {\r\n this.getHandlers(event).push(handler);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Register an event handler so that it will run only once, and then\r\n * unregister itself.\r\n *\r\n * @param event The name of the event.\r\n * @param handler The function to handle the event.\r\n */\r\n one(event: string, handler: EventHandler): this {\r\n const wrapper = function (this: Evented) {\r\n handler.apply(this, Array.from(arguments));\r\n\r\n this.off(event, wrapper);\r\n };\r\n\r\n this.getHandlers(event).push(wrapper);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Unregister an event handler.\r\n *\r\n * @param event The name of the event.\r\n * @param handler The function that handles the event.\r\n */\r\n off(event: string, handler: EventHandler): this {\r\n const handlers = this.getHandlers(event);\r\n const index = handlers.indexOf(handler);\r\n\r\n if (index !== -1) {\r\n handlers.splice(index, 1);\r\n }\r\n\r\n return this;\r\n }\r\n}\r\n","import app from '../app';\r\nimport { Attributes } from 'mithril';\r\n\r\nimport Component from '../../common/Component';\r\nimport ScrollListener from '../../common/utils/ScrollListener';\r\nimport PostLoading from './LoadingPost';\r\nimport anchorScroll from '../../common/utils/anchorScroll';\r\nimport ReplyPlaceholder from './ReplyPlaceholder';\r\nimport Button from '../../common/components/Button';\r\nimport Discussion from '../../common/models/Discussion';\r\nimport Post from '../../common/models/Post';\r\nimport Evented from '../../common/utils/Evented';\r\nimport { DiscussionProp } from '../../common/concerns/ComponentProps';\r\n\r\nexport interface PostStreamProps extends DiscussionProp {\r\n includedPosts: Post[];\r\n}\r\n\r\ninterface PostStream<T extends PostStreamProps = PostStreamProps> extends Component<T>, Evented {}\r\n\r\n/**\r\n * The `PostStream` component displays an infinitely-scrollable wall of posts in\r\n * a discussion. Posts that have not loaded will be displayed as placeholders.\r\n */\r\nclass PostStream<T extends PostStreamProps = PostStreamProps> extends Component<T> {\r\n /**\r\n * The number of posts to load per page.\r\n */\r\n static loadCount = 20;\r\n\r\n /**\r\n * The discussion to display the post stream for.\r\n */\r\n discussion: Discussion;\r\n\r\n /**\r\n * Whether or not the infinite-scrolling auto-load functionality is\r\n * disabled.\r\n */\r\n paused = false;\r\n\r\n scrollListener = new ScrollListener(this.onscroll.bind(this));\r\n loadPageTimeouts = {};\r\n pagesLoading = 0;\r\n\r\n calculatePositionTimeout: number = 0;\r\n visibleStart: number = 0;\r\n visibleEnd: number = 0;\r\n viewingEnd: boolean = true;\r\n\r\n constructor(...args) {\r\n super(...args);\r\n\r\n this.discussion = this.props.discussion;\r\n }\r\n\r\n oninit(vnode) {\r\n super.oninit(vnode);\r\n\r\n this.discussion = this.props.discussion;\r\n\r\n this.show(this.props.includedPosts);\r\n }\r\n\r\n /**\r\n * Load and scroll to a post with a certain number.\r\n *\r\n * @param number The post number to go to. If 'reply', go to\r\n * the last post and scroll the reply preview into view.\r\n * @param noAnimation\r\n */\r\n goToNumber(number: string | number | 'reply', noAnimation?: boolean): Promise<void> {\r\n // If we want to go to the reply preview, then we will go to the end of the\r\n // discussion and then scroll to the very bottom of the page.\r\n if (number === 'reply') {\r\n return this.goToLast().then(() => {\r\n $('html,body').animate(\r\n {\r\n scrollTop: $(document).height() - $(window).height(),\r\n },\r\n 'fast',\r\n () => {\r\n this.flashItem(this.$('.PostStream-item:last-child'));\r\n }\r\n );\r\n });\r\n }\r\n\r\n this.paused = true;\r\n\r\n const promise = this.loadNearNumber(number);\r\n\r\n m.redraw();\r\n\r\n return promise.then(() => {\r\n m.redraw();\r\n\r\n this.scrollToNumber(number, noAnimation).then(this.unpause.bind(this));\r\n });\r\n }\r\n\r\n /**\r\n * Load and scroll to a certain index within the discussion.\r\n *\r\n * @param index\r\n * @param backwards Whether or not to load backwards from the given\r\n * index.\r\n * @param noAnimation\r\n */\r\n goToIndex(index: number, backwards?: boolean, noAnimation?: boolean): Promise<void> {\r\n this.paused = true;\r\n\r\n return this.loadNearIndex(index).then(() => {\r\n m.redraw.sync();\r\n\r\n anchorScroll(this.$('.PostStream-item:' + (backwards ? 'last' : 'first')), () => m.redraw());\r\n\r\n return this.scrollToIndex(index, noAnimation, backwards).then(this.unpause.bind(this));\r\n });\r\n }\r\n\r\n /**\r\n * Load and scroll up to the first post in the discussion.\r\n */\r\n goToFirst(): Promise<void> {\r\n return this.goToIndex(0);\r\n }\r\n\r\n /**\r\n * Load and scroll down to the last post in the discussion.\r\n */\r\n goToLast(): Promise<void> {\r\n return this.goToIndex(this.count() - 1, true);\r\n }\r\n\r\n /**\r\n * Update the stream so that it loads and includes the latest posts in the\r\n * discussion, if the end is being viewed.\r\n */\r\n update(): Promise<void> {\r\n if (!this.viewingEnd) return Promise.resolve();\r\n\r\n this.visibleEnd = this.count();\r\n\r\n return this.loadRange(this.visibleStart, this.visibleEnd).then(() => m.redraw());\r\n }\r\n\r\n /**\r\n * Get the total number of posts in the discussion.\r\n */\r\n count(): number {\r\n return this.discussion.postIds().length;\r\n }\r\n\r\n /**\r\n * Make sure that the given index is not outside of the possible range of\r\n * indexes in the discussion.\r\n */\r\n protected sanitizeIndex(index: number) {\r\n return Math.max(0, Math.min(this.count(), index));\r\n }\r\n\r\n /**\r\n * Set up the stream with the given array of posts.\r\n */\r\n show(posts: Post[]) {\r\n this.visibleStart = posts.length ? this.discussion.postIds().indexOf(posts[0].id()) : 0;\r\n this.visibleEnd = this.visibleStart + posts.length;\r\n }\r\n\r\n /**\r\n * Reset the stream so that a specific range of posts is displayed. If a range\r\n * is not specified, the first page of posts will be displayed.\r\n */\r\n reset(start?: number, end?: number) {\r\n this.visibleStart = start || 0;\r\n this.visibleEnd = this.sanitizeIndex(end || this.constructor.loadCount);\r\n }\r\n\r\n /**\r\n * Get the visible page of posts.\r\n */\r\n posts(): (Post | null)[] {\r\n return this.discussion\r\n .postIds()\r\n .slice(this.visibleStart, this.visibleEnd)\r\n .map((id) => {\r\n const post = app.store.getById<Post>('posts', id);\r\n\r\n return post && post.discussion() && typeof post.canEdit() !== 'undefined' ? post : null;\r\n });\r\n }\r\n\r\n view() {\r\n function fadeIn(vnode) {\r\n if (!vnode.state.fadedIn) $(vnode.dom).hide().fadeIn();\r\n vnode.state.fadedIn = true;\r\n }\r\n\r\n let lastTime;\r\n\r\n this.visibleEnd = this.sanitizeIndex(this.visibleEnd);\r\n this.viewingEnd = this.visibleEnd === this.count();\r\n\r\n const posts = this.posts();\r\n const postIds = this.discussion.postIds();\r\n\r\n const items = posts.map((post, i) => {\r\n let content;\r\n const attrs: Attributes = { 'data-index': this.visibleStart + i };\r\n\r\n if (post) {\r\n const time = post.createdAt();\r\n const PostComponent = app.postComponents[post.contentType()];\r\n content = PostComponent ? <PostComponent post={post} /> : '';\r\n\r\n attrs.key = 'post' + post.id();\r\n attrs.oncreate = fadeIn;\r\n attrs['data-time'] = time.toISOString();\r\n attrs['data-number'] = post.number();\r\n attrs['data-id'] = post.id();\r\n attrs['data-type'] = post.contentType();\r\n\r\n // If the post before this one was more than 4 hours ago, we will\r\n // display a 'time gap' indicating how long it has been in between\r\n // the posts.\r\n const dt = time.valueOf() - lastTime;\r\n\r\n if (dt > 1000 * 60 * 60 * 24 * 4) {\r\n content = [\r\n <div className=\"PostStream-timeGap\">\r\n <span>\r\n {app.translator.trans('core.forum.post_stream.time_lapsed_text', { period: dayjs(time).from(dayjs(lastTime), true) })}\r\n </span>\r\n </div>,\r\n content,\r\n ];\r\n }\r\n\r\n lastTime = time;\r\n } else {\r\n attrs.key = 'post' + postIds[this.visibleStart + i];\r\n\r\n content = <PostLoading />;\r\n }\r\n\r\n return (\r\n <div className=\"PostStream-item\" {...attrs}>\r\n {content}\r\n </div>\r\n );\r\n });\r\n\r\n if (!this.viewingEnd && posts[this.visibleEnd - this.visibleStart - 1]) {\r\n items.push(\r\n <div className=\"PostStream-loadMore\" key=\"loadMore\">\r\n <Button className=\"Button\" onclick={this.loadNext.bind(this)}>\r\n {app.translator.trans('core.forum.post_stream.load_more_button')}\r\n </Button>\r\n </div>\r\n );\r\n }\r\n\r\n // If we're viewing the end of the discussion, the user can reply, and\r\n // is not already doing so, then show a 'write a reply' placeholder.\r\n if (this.viewingEnd && (!app.session.user || this.discussion.canReply())) {\r\n items.push(\r\n <div className=\"PostStream-item\" key=\"reply\">\r\n {ReplyPlaceholder.component({ discussion: this.discussion })}\r\n </div>\r\n );\r\n }\r\n\r\n return <div className=\"PostStream\">{items}</div>;\r\n }\r\n\r\n oncreate(vnode) {\r\n super.oncreate(vnode);\r\n\r\n this.scrollListener.start();\r\n }\r\n\r\n onremove(vnode) {\r\n super.onremove(vnode);\r\n\r\n this.scrollListener.stop();\r\n clearTimeout(this.calculatePositionTimeout);\r\n }\r\n\r\n /**\r\n * When the window is scrolled, check if either extreme of the post stream is\r\n * in the viewport, and if so, trigger loading the next/previous page.\r\n */\r\n onscroll(top: number) {\r\n if (this.paused) return;\r\n\r\n const marginTop = this.getMarginTop();\r\n const viewportHeight = $(window).height() - marginTop;\r\n const viewportTop = top + marginTop;\r\n const loadAheadDistance = 300;\r\n\r\n if (this.visibleStart > 0) {\r\n const $item = this.$(`.PostStream-item[data-index=\"${this.visibleStart}\"]`);\r\n\r\n if ($item.length && $item.offset().top > viewportTop - loadAheadDistance) {\r\n this.loadPrevious();\r\n }\r\n }\r\n\r\n if (this.visibleEnd < this.count()) {\r\n const $item = this.$(`.PostStream-item[data-index=\"${this.visibleEnd - 1}\"]`);\r\n\r\n if ($item.length && $item.offset().top + $item.outerHeight(true) < viewportTop + viewportHeight + loadAheadDistance) {\r\n this.loadNext();\r\n }\r\n }\r\n\r\n // Throttle calculation of our position (start/end numbers of posts in the\r\n // viewport) to 100ms.\r\n clearTimeout(this.calculatePositionTimeout);\r\n this.calculatePositionTimeout = setTimeout(this.calculatePosition.bind(this), 100);\r\n }\r\n\r\n /**\r\n * Load the next page of posts.\r\n */\r\n loadNext() {\r\n const start = this.visibleEnd;\r\n const end = (this.visibleEnd = this.sanitizeIndex(this.visibleEnd + this.constructor.loadCount));\r\n\r\n // Unload the posts which are two pages back from the page we're currently\r\n // loading.\r\n const twoPagesAway = start - this.constructor.loadCount * 2;\r\n if (twoPagesAway > this.visibleStart && twoPagesAway >= 0) {\r\n this.visibleStart = twoPagesAway + this.constructor.loadCount + 1;\r\n\r\n if (this.loadPageTimeouts[twoPagesAway]) {\r\n clearTimeout(this.loadPageTimeouts[twoPagesAway]);\r\n this.loadPageTimeouts[twoPagesAway] = null;\r\n this.pagesLoading--;\r\n }\r\n }\r\n\r\n this.loadPage(start, end);\r\n }\r\n\r\n /**\r\n * Load the previous page of posts.\r\n */\r\n loadPrevious() {\r\n const end = this.visibleStart;\r\n const start = (this.visibleStart = this.sanitizeIndex(this.visibleStart - this.constructor.loadCount));\r\n\r\n // Unload the posts which are two pages back from the page we're currently\r\n // loading.\r\n const twoPagesAway = start + this.constructor.loadCount * 2;\r\n if (twoPagesAway < this.visibleEnd && twoPagesAway <= this.count()) {\r\n this.visibleEnd = twoPagesAway;\r\n\r\n if (this.loadPageTimeouts[twoPagesAway]) {\r\n clearTimeout(this.loadPageTimeouts[twoPagesAway]);\r\n this.loadPageTimeouts[twoPagesAway] = null;\r\n this.pagesLoading--;\r\n }\r\n }\r\n\r\n this.loadPage(start, end, true);\r\n }\r\n\r\n /**\r\n * Load a page of posts into the stream and redraw.\r\n */\r\n loadPage(start: number, end: number, backwards?: boolean) {\r\n const redraw = () => {\r\n if (start < this.visibleStart || end > this.visibleEnd) return;\r\n\r\n const anchorIndex = backwards ? this.visibleEnd - 1 : this.visibleStart;\r\n anchorScroll(`.PostStream-item[data-index=\"${anchorIndex}\"]`, () => m.redraw(true));\r\n\r\n this.unpause();\r\n };\r\n redraw();\r\n\r\n this.loadPageTimeouts[start] = setTimeout(\r\n () => {\r\n this.loadRange(start, end).then(() => {\r\n redraw();\r\n this.pagesLoading--;\r\n });\r\n this.loadPageTimeouts[start] = null;\r\n },\r\n this.pagesLoading ? 1000 : 0\r\n );\r\n\r\n this.pagesLoading++;\r\n }\r\n\r\n /**\r\n * Load and inject the specified range of posts into the stream, without\r\n * clearing it.\r\n */\r\n loadRange(start?: number, end?: number): Promise<Post[]> {\r\n const loadIds: string[] = [];\r\n const loaded: Post[] = [];\r\n\r\n this.discussion\r\n .postIds()\r\n .slice(start, end)\r\n .forEach((id) => {\r\n const post = app.store.getById<Post>('posts', id);\r\n\r\n if (post && post.discussion() && typeof post.canEdit() !== 'undefined') {\r\n loaded.push(post);\r\n } else {\r\n loadIds.push(id);\r\n }\r\n });\r\n\r\n return loadIds.length ? app.store.find('posts', loadIds) : Promise.resolve(loaded);\r\n }\r\n\r\n /**\r\n * Clear the stream and load posts near a certain number. Returns a promise.\r\n * If the post with the given number is already loaded, the promise will be\r\n * resolved immediately.\r\n */\r\n loadNearNumber(number: string | number): Promise<void> {\r\n if (this.posts().some((post) => post && Number(post.number()) === Number(number))) {\r\n return Promise.resolve();\r\n }\r\n\r\n this.reset();\r\n\r\n return app.store\r\n .find<Post>('posts', {\r\n filter: { discussion: this.discussion.id() },\r\n page: { near: number },\r\n })\r\n .then(this.show.bind(this));\r\n }\r\n\r\n /**\r\n * Clear the stream and load posts near a certain index. A page of posts\r\n * surrounding the given index will be loaded. Returns a promise. If the given\r\n * index is already loaded, the promise will be resolved immediately.\r\n */\r\n loadNearIndex(index: number): Promise {\r\n if (index >= this.visibleStart && index <= this.visibleEnd) {\r\n return Promise.resolve();\r\n }\r\n\r\n const start = this.sanitizeIndex(index - this.constructor.loadCount / 2);\r\n const end = start + this.constructor.loadCount;\r\n\r\n this.reset(start, end);\r\n\r\n return this.loadRange(start, end).then(this.show.bind(this));\r\n }\r\n\r\n /**\r\n * Work out which posts (by number) are currently visible in the viewport, and\r\n * fire an event with the information.\r\n */\r\n calculatePosition() {\r\n const marginTop = this.getMarginTop();\r\n const $window = $(window);\r\n const viewportHeight = $window.height() - marginTop;\r\n const scrollTop = $window.scrollTop() + marginTop;\r\n let startNumber;\r\n let endNumber;\r\n\r\n this.$('.PostStream-item').each((index, item: HTMLElement) => {\r\n const $item = $(item);\r\n const top = $item.offset().top;\r\n const height = $item.outerHeight(true);\r\n\r\n if (top + height > scrollTop) {\r\n if (!startNumber) {\r\n startNumber = endNumber = $item.data('number');\r\n }\r\n\r\n if (top + height < scrollTop + viewportHeight) {\r\n if ($item.data('number')) {\r\n endNumber = $item.data('number');\r\n }\r\n } else return false;\r\n }\r\n\r\n return true;\r\n });\r\n\r\n if (startNumber) {\r\n this.trigger('positionChanged', startNumber || 1, endNumber);\r\n }\r\n }\r\n\r\n /**\r\n * Get the distance from the top of the viewport to the point at which we\r\n * would consider a post to be the first one visible.\r\n */\r\n getMarginTop(): number {\r\n return this.$() && $('#header').outerHeight() + parseInt(this.$().css('margin-top'), 10);\r\n }\r\n\r\n /**\r\n * Scroll down to a certain post by number and 'flash' it.\r\n */\r\n scrollToNumber(number: string | number, noAnimation?: boolean): Promise<void> {\r\n const $item = this.$(`.PostStream-item[data-number=\"${number}\"]`);\r\n\r\n return this.scrollToItem($item, noAnimation).then(() => this.flashItem($item));\r\n }\r\n\r\n /**\r\n * Scroll down to a certain post by index.\r\n *\r\n * @param index\r\n * @param noAnimation\r\n * @param bottom Whether or not to scroll to the bottom of the post\r\n * at the given index, instead of the top of it.\r\n */\r\n scrollToIndex(index: number, noAnimation?: boolean, bottom?: boolean): Promise<void> {\r\n const $item = this.$(`.PostStream-item[data-index=\"${index}\"]`);\r\n\r\n return this.scrollToItem($item, noAnimation, true, bottom);\r\n }\r\n\r\n /**\r\n * Scroll down to the given post.\r\n *\r\n * @param $item\r\n * @param noAnimation\r\n * @param force Whether or not to force scrolling to the item, even\r\n * if it is already in the viewport.\r\n * @param bottom Whether or not to scroll to the bottom of the post\r\n * at the given index, instead of the top of it.\r\n */\r\n scrollToItem($item, noAnimation?: boolean, force?: boolean, bottom?: boolean): Promise<void> {\r\n const $container = $('html, body');\r\n\r\n if ($item.length) {\r\n const itemTop = $item.offset().top - this.getMarginTop();\r\n const itemBottom = $item.offset().top + $item.height();\r\n const scrollTop = $container.scrollTop();\r\n const scrollBottom = scrollTop + $(window).height();\r\n\r\n // If the item is already in the viewport, we may not need to scroll.\r\n // If we're scrolling to the bottom of an item, then we'll make sure the\r\n // bottom will line up with the top of the composer.\r\n if (force || itemTop < scrollTop || itemBottom > scrollBottom) {\r\n // TODO const top = bottom ? itemBottom - $(window).height() + app.composer.computedHeight() : $item.is(':first-child') ? 0 : itemTop;\r\n const top = bottom ? itemBottom - $(window).height() : $item.is(':first-child') ? 0 : itemTop;\r\n\r\n return new Promise<void>((resolve) => {\r\n if (noAnimation) {\r\n $container.scrollTop(top);\r\n resolve();\r\n } else if (top !== scrollTop) {\r\n $container.animateScrollTop(top, 'fast', resolve);\r\n } else {\r\n resolve();\r\n }\r\n });\r\n }\r\n }\r\n\r\n return Promise.resolve();\r\n }\r\n\r\n /**\r\n * 'Flash' the given post, drawing the user's attention to it.\r\n *\r\n * @param {jQuery} $item\r\n */\r\n flashItem($item) {\r\n $item.addClass('flash').one('animationend webkitAnimationEnd', () => $item.removeClass('flash'));\r\n }\r\n\r\n /**\r\n * Resume the stream's ability to auto-load posts on scroll.\r\n */\r\n unpause() {\r\n this.paused = false;\r\n this.scrollListener.update();\r\n this.trigger('unpaused');\r\n }\r\n}\r\n\r\nObject.assign(PostStream.prototype, Evented.prototype);\r\n\r\nexport default PostStream;\r\n","/**\r\n * The `formatNumber` utility localizes a number into a string with the\r\n * appropriate punctuation.\r\n *\r\n * @param number Number to format\r\n * @param options Maximum significant digits or formatting options object\r\n *\r\n * @example\r\n * formatNumber(1234);\r\n * // 1,234\r\n */\r\nexport default function formatNumber(number: number, options: number | Intl.NumberFormatOptions = {}): string {\r\n const config = typeof options === 'number' ? { maximumSignificantDigits: options } : options;\r\n\r\n return number.toLocaleString(app.translator.locale, config);\r\n}\r\n","import Component from '../../common/Component';\r\nimport icon from '../../common/helpers/icon';\r\nimport ScrollListener from '../../common/utils/ScrollListener';\r\nimport SubtreeRetainer from '../../common/utils/SubtreeRetainer';\r\nimport formatNumber from '../../common/utils/formatNumber';\r\nimport PostStream from './PostStream';\r\nimport { EventHandler } from '../../common/utils/Evented';\r\n\r\n/**\r\n * The `PostStreamScrubber` component displays a scrubber which can be used to\r\n * navigate/scrub through a post stream.\r\n */\r\nexport default class PostStreamScrubber extends Component {\r\n handlers: { [key: string]: EventHandler } = {};\r\n\r\n /**\r\n * The index of the post that is currently at the top of the viewport.\r\n */\r\n index: number = 0;\r\n\r\n /**\r\n * The number of posts that are currently visible in the viewport.\r\n */\r\n visible: number = 1;\r\n\r\n /**\r\n * The description to render on the scrubber.\r\n */\r\n description: string = '';\r\n\r\n // Define a handler to update the state of the scrollbar to reflect the\r\n // current scroll position of the page.\r\n scrollListener = new ScrollListener(this.onscroll.bind(this));\r\n\r\n // Create a subtree retainer that will always cache the subtree after the\r\n // initial draw. We render parts of the scrubber using this because we\r\n // modify their DOM directly, and do not want Mithril messing around with\r\n // our changes.\r\n subtree = new SubtreeRetainer(() => true);\r\n\r\n // When the mouse is pressed on the scrollbar handle, we capture some\r\n // information about its current position. We will store this\r\n // information in an object and pass it on to the document's\r\n // mousemove/mouseup events later.\r\n dragging = false;\r\n mouseStart = 0;\r\n indexStart = 0;\r\n\r\n // Added when Component is initialized through `oninit` prop\r\n stream!: PostStream;\r\n\r\n view() {\r\n const count = this.count();\r\n const unreadCount = this.stream?.discussion.unreadCount() || 0;\r\n const unreadPercent = count ? Math.min(count - this.index, unreadCount) / count : 0;\r\n\r\n const viewing = app.translator.transChoice('core.forum.post_scrubber.viewing_text', count, {\r\n index: (\r\n <span className=\"Scrubber-index\" onbeforeupdate={() => this.subtree.update()}>\r\n {formatNumber(Math.min(Math.ceil(this.index + this.visible), count))}\r\n </span>\r\n ),\r\n count: <span className=\"Scrubber-count\">{formatNumber(count)}</span>,\r\n });\r\n\r\n function styleUnread(vnode) {\r\n const $element = $(vnode.dom);\r\n const newStyle = {\r\n top: 100 - unreadPercent * 100 + '%',\r\n height: unreadPercent * 100 + '%',\r\n display: unreadCount == 0 && 'none',\r\n };\r\n\r\n if (vnode.state.oldStyle) {\r\n $element.css(vnode.state.oldStyle).animate(newStyle);\r\n } else {\r\n $element.css(newStyle);\r\n }\r\n\r\n vnode.state.oldStyle = newStyle;\r\n }\r\n\r\n return (\r\n <div className={'PostStreamScrubber Dropdown ' + (this.disabled() ? 'disabled ' : '') + (this.props.className || '')}>\r\n <button className=\"Button Dropdown-toggle\" data-toggle=\"dropdown\">\r\n {viewing} {icon('fas fa-sort')}\r\n </button>\r\n\r\n <div className=\"Dropdown-menu dropdown-menu\">\r\n <div className=\"Scrubber\">\r\n <a className=\"Scrubber-first\" onclick={this.goToFirst.bind(this)}>\r\n {icon('fas fa-angle-double-up')} {app.translator.trans('core.forum.post_scrubber.original_post_link')}\r\n </a>\r\n\r\n <div className=\"Scrubber-scrollbar\">\r\n <div className=\"Scrubber-before\" />\r\n <div className=\"Scrubber-handle\">\r\n <div className=\"Scrubber-bar\" />\r\n <div className=\"Scrubber-info\">\r\n <strong>{viewing}</strong>\r\n <span className=\"Scrubber-description\" onbeforeupdate={() => this.subtree.update()}>\r\n {this.description}\r\n </span>\r\n </div>\r\n </div>\r\n <div className=\"Scrubber-after\" />\r\n\r\n <div className=\"Scrubber-unread\" oncreate={styleUnread} onupdate={styleUnread}>\r\n {app.translator.trans('core.forum.post_scrubber.unread_text', { count: unreadCount })}\r\n </div>\r\n </div>\r\n\r\n <a className=\"Scrubber-last\" onclick={this.goToLast.bind(this)}>\r\n {icon('fas fa-angle-double-down')} {app.translator.trans('core.forum.post_scrubber.now_link')}\r\n </a>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n /**\r\n * Go to the first post in the discussion.\r\n */\r\n goToFirst() {\r\n this.stream.goToFirst();\r\n this.index = 0;\r\n this.renderScrollbar(true);\r\n }\r\n\r\n /**\r\n * Go to the last post in the discussion.\r\n */\r\n goToLast() {\r\n this.stream.goToLast();\r\n this.index = this.count();\r\n this.renderScrollbar(true);\r\n }\r\n\r\n /**\r\n * Get the number of posts in the discussion.\r\n */\r\n count(): number {\r\n return this.stream?.count() || 0;\r\n }\r\n\r\n /**\r\n * When the stream is unpaused, update the scrubber to reflect its position.\r\n */\r\n streamWasUnpaused() {\r\n this.update(window.pageYOffset);\r\n this.renderScrollbar(true);\r\n }\r\n\r\n /**\r\n * Check whether or not the scrubber should be disabled, i.e. if all of the\r\n * posts are visible in the viewport.\r\n */\r\n disabled(): boolean {\r\n return this.visible >= this.count();\r\n }\r\n\r\n /**\r\n * When the page is scrolled, update the scrollbar to reflect the visible\r\n * posts.\r\n */\r\n onscroll(top: number) {\r\n const stream = this.stream;\r\n\r\n if (!stream || stream.paused || !stream.$()) return;\r\n\r\n this.update(top);\r\n this.renderScrollbar();\r\n }\r\n\r\n /**\r\n * Update the index/visible/description properties according to the window's\r\n * current scroll position.\r\n */\r\n update(scrollTop: number = 0) {\r\n const stream = this.stream;\r\n\r\n const marginTop = stream.getMarginTop();\r\n const viewportTop = scrollTop + marginTop;\r\n const viewportHeight = $(window).height() - marginTop;\r\n\r\n // Before looping through all of the posts, we reset the scrollbar\r\n // properties to a 'default' state. These values reflect what would be\r\n // seen if the browser were scrolled right up to the top of the page,\r\n // and the viewport had a height of 0.\r\n const $items = stream.$('.PostStream-item[data-index]');\r\n let index = $items.first().data('index') || 0;\r\n let visible = 0;\r\n let period = '';\r\n\r\n // Now loop through each of the items in the discussion. An 'item' is\r\n // either a single post or a 'gap' of one or more posts that haven't\r\n // been loaded yet.\r\n $items.each(function (this: HTMLElement) {\r\n const $this = $(this);\r\n const top = $this.offset().top;\r\n const height = $this.outerHeight(true);\r\n\r\n // If this item is above the top of the viewport, skip to the next\r\n // one. If it's below the bottom of the viewport, break out of the\r\n // loop.\r\n if (top + height < viewportTop) {\r\n return true;\r\n }\r\n if (top > viewportTop + viewportHeight) {\r\n return false;\r\n }\r\n\r\n // Work out how many pixels of this item are visible inside the viewport.\r\n // Then add the proportion of this item's total height to the index.\r\n const visibleTop = Math.max(0, viewportTop - top);\r\n const visibleBottom = Math.min(height, viewportTop + viewportHeight - top);\r\n const visiblePost = visibleBottom - visibleTop;\r\n\r\n if (top <= viewportTop) {\r\n index = parseFloat($this.data('index')) + visibleTop / height;\r\n }\r\n\r\n if (visiblePost > 0) {\r\n visible += visiblePost / height;\r\n }\r\n\r\n // If this item has a time associated with it, then set the\r\n // scrollbar's current period to a formatted version of this time.\r\n const time = $this.data('time');\r\n if (time) period = time;\r\n\r\n return true;\r\n });\r\n\r\n this.index = index;\r\n this.visible = visible;\r\n this.description = period ? dayjs(period).format('MMMM YYYY') : '';\r\n }\r\n\r\n onremove(vnode) {\r\n super.onremove(vnode);\r\n\r\n this.ondestroy();\r\n }\r\n\r\n oncreate(vnode) {\r\n super.oncreate(vnode);\r\n\r\n // When the post stream begins loading posts at a certain index, we want our\r\n // scrubber scrollbar to jump to that position.\r\n this.stream.on('unpaused', (this.handlers.streamWasUnpaused = this.streamWasUnpaused.bind(this)));\r\n this.stream.on('update', () => this.update());\r\n\r\n this.scrollListener.start();\r\n\r\n // Whenever the window is resized, adjust the height of the scrollbar\r\n // so that it fills the height of the sidebar.\r\n $(window)\r\n .on('resize', (this.handlers.onresize = this.onresize.bind(this)))\r\n .resize();\r\n\r\n // When any part of the whole scrollbar is clicked, we want to jump to\r\n // that position.\r\n this.$('.Scrubber-scrollbar')\r\n .on('click', this.onclick.bind(this))\r\n\r\n // Now we want to make the scrollbar handle draggable. Let's start by\r\n // preventing default browser events from messing things up.\r\n .css({ cursor: 'pointer', 'user-select': 'none' })\r\n .on('dragstart mousedown touchstart', (e) => e.preventDefault());\r\n\r\n this.$('.Scrubber-handle')\r\n .css('cursor', 'move')\r\n .on('mousedown touchstart', this.onmousedown.bind(this) as ZeptoEventHandler)\r\n\r\n // Exempt the scrollbar handle from the 'jump to' click event.\r\n .click((e) => e.stopPropagation());\r\n\r\n // When the mouse moves and when it is released, we pass the\r\n // information that we captured when the mouse was first pressed onto\r\n // some event handlers. These handlers will move the scrollbar/stream-\r\n // content as appropriate.\r\n $(document)\r\n .on('mousemove touchmove', (this.handlers.onmousemove = this.onmousemove.bind(this) as ZeptoEventHandler))\r\n .on('mouseup touchend', (this.handlers.onmouseup = this.onmouseup.bind(this)));\r\n }\r\n\r\n ondestroy() {\r\n this.scrollListener.stop();\r\n\r\n this.stream.off('unpaused', this.handlers.streamWasUnpaused);\r\n\r\n $(window).off('resize', this.handlers.onresize);\r\n\r\n $(document).off('mousemove touchmove', this.handlers.onmousemove).off('mouseup touchend', this.handlers.onmouseup);\r\n }\r\n\r\n /**\r\n * Update the scrollbar's position to reflect the current values of the\r\n * index/visible properties.\r\n */\r\n renderScrollbar(animate?: boolean) {\r\n const percentPerPost = this.percentPerPost();\r\n const index = this.index;\r\n const count = this.count();\r\n const visible = this.visible || 1;\r\n\r\n const $scrubber = this.$();\r\n $scrubber.find('.Scrubber-index').text(formatNumber(Math.min(Math.ceil(index + visible), count)));\r\n $scrubber.find('.Scrubber-description').text(this.description);\r\n $scrubber.toggleClass('disabled', this.disabled());\r\n\r\n const heights: { before?: number; handle?: number; after?: number } = {};\r\n heights.before = Math.max(0, percentPerPost.index * Math.min(index, count - visible));\r\n heights.handle = Math.min(100 - heights.before, percentPerPost.visible * visible);\r\n heights.after = 100 - heights.before - heights.handle;\r\n\r\n const func = animate ? 'animate' : 'css';\r\n for (const part in heights) {\r\n const $part = $scrubber.find(`.Scrubber-${part}`);\r\n $part[func]({ height: heights[part] + '%' }, 'fast');\r\n\r\n // jQuery likes to put overflow:hidden, but because the scrollbar handle\r\n // has a negative margin-left, we need to override.\r\n if (func === 'animate') $part.css('overflow', 'visible');\r\n }\r\n }\r\n\r\n /**\r\n * Get the percentage of the height of the scrubber that should be allocated\r\n * to each post.\r\n *\r\n * @property index The percent per post for posts on either side of\r\n * the visible part of the scrubber.\r\n * @property visible The percent per post for the visible part of the\r\n * scrubber.\r\n */\r\n percentPerPost(): { index: number; visible: number } {\r\n const count = this.count() || 1;\r\n const visible = this.visible || 1;\r\n\r\n // To stop the handle of the scrollbar from getting too small when there\r\n // are many posts, we define a minimum percentage height for the handle\r\n // calculated from a 50 pixel limit. From this, we can calculate the\r\n // minimum percentage per visible post. If this is greater than the actual\r\n // percentage per post, then we need to adjust the 'before' percentage to\r\n // account for it.\r\n const minPercentVisible = (50 / this.$('.Scrubber-scrollbar').outerHeight()) * 100;\r\n const percentPerVisiblePost = Math.max(100 / count, minPercentVisible / visible);\r\n const percentPerPost = count === visible ? 0 : (100 - percentPerVisiblePost * visible) / (count - visible);\r\n\r\n return {\r\n index: percentPerPost,\r\n visible: percentPerVisiblePost,\r\n };\r\n }\r\n\r\n onresize() {\r\n this.scrollListener.update();\r\n\r\n // Adjust the height of the scrollbar so that it fills the height of\r\n // the sidebar and doesn't overlap the footer.\r\n const scrubber = this.$();\r\n const scrollbar = this.$('.Scrubber-scrollbar');\r\n\r\n scrollbar.css(\r\n 'max-height',\r\n $(window).height() -\r\n scrubber.offset().top +\r\n $(window).scrollTop() -\r\n parseInt($('#app').css('padding-bottom'), 10) -\r\n (scrubber.outerHeight() - scrollbar.outerHeight())\r\n );\r\n }\r\n\r\n onmousedown(e: MouseEvent) {\r\n this.mouseStart = window.TouchEvent && e instanceof TouchEvent ? e.touches[0].clientY : e.clientY;\r\n this.indexStart = this.index;\r\n this.dragging = true;\r\n this.stream.paused = true;\r\n $('body').css('cursor', 'move');\r\n }\r\n\r\n onmousemove(e: MouseEvent) {\r\n if (!this.dragging) return;\r\n\r\n let y = window.TouchEvent && e instanceof TouchEvent ? e.touches[0].clientY : e.clientY;\r\n\r\n // Work out how much the mouse has moved by - first in pixels, then\r\n // convert it to a percentage of the scrollbar's height, and then\r\n // finally convert it into an index. Add this delta index onto\r\n // the index at which the drag was started, and then scroll there.\r\n const deltaPixels = y - this.mouseStart;\r\n const deltaPercent = (deltaPixels / this.$('.Scrubber-scrollbar').outerHeight()) * 100;\r\n const deltaIndex = deltaPercent / this.percentPerPost().index || 0;\r\n const newIndex = Math.min(this.indexStart + deltaIndex, this.count() - 1);\r\n\r\n this.index = Math.max(0, newIndex);\r\n this.renderScrollbar();\r\n }\r\n\r\n onmouseup() {\r\n if (!this.dragging) return;\r\n\r\n this.mouseStart = 0;\r\n this.indexStart = 0;\r\n this.dragging = false;\r\n $('body').css('cursor', '');\r\n\r\n this.$().removeClass('open');\r\n\r\n // If the index we've landed on is in a gap, then tell the stream-\r\n // content that we want to load those posts.\r\n const intIndex = Math.floor(this.index);\r\n this.stream.goToIndex(intIndex);\r\n this.renderScrollbar(true);\r\n }\r\n\r\n onclick(e) {\r\n // Calculate the index which we want to jump to based on the click position.\r\n\r\n // 1. Get the offset of the click from the top of the scrollbar, as a\r\n // percentage of the scrollbar's height.\r\n const $scrollbar = this.$('.Scrubber-scrollbar');\r\n const offsetPixels = (e.clientY || e.originalEvent.touches[0].clientY) - $scrollbar.offset().top + $('body').scrollTop();\r\n let offsetPercent = (offsetPixels / $scrollbar.outerHeight()) * 100;\r\n\r\n // 2. We want the handle of the scrollbar to end up centered on the click\r\n // position. Thus, we calculate the height of the handle in percent and\r\n // use that to find a new offset percentage.\r\n offsetPercent = offsetPercent - parseFloat($scrollbar.find('.Scrubber-handle')[0].style.height) / 2;\r\n\r\n // 3. Now we can convert the percentage into an index, and tell the stream-\r\n // content component to jump to that index.\r\n let offsetIndex = offsetPercent / this.percentPerPost().index;\r\n offsetIndex = Math.max(0, Math.min(this.count() - 1, offsetIndex));\r\n this.stream.goToIndex(Math.floor(offsetIndex));\r\n this.index = offsetIndex;\r\n this.renderScrollbar(true);\r\n\r\n this.$().removeClass('open');\r\n }\r\n}\r\n","import Dropdown from './Dropdown';\r\nimport Button from './Button';\r\nimport icon from '../helpers/icon';\r\n\r\n/**\r\n * The `SplitDropdown` component is similar to `Dropdown`, but the first child\r\n * is displayed as its own button prior to the toggle button.\r\n */\r\nexport default class SplitDropdown extends Dropdown {\r\n static initProps(props) {\r\n super.initProps(props);\r\n\r\n props.className += ' Dropdown--split';\r\n props.menuClassName += ' Dropdown-menu--right';\r\n }\r\n\r\n getButton() {\r\n // Make a copy of the props of the first child component. We will assign\r\n // these props to a new button, so that it has exactly the same behaviour as\r\n // the first child.\r\n const firstChild = this.getFirstChild();\r\n const buttonProps = Object.assign({}, firstChild.attrs);\r\n buttonProps.className = classNames(buttonProps.className, 'SplitDropdown-button', 'Button', this.props.buttonClassName);\r\n\r\n return [\r\n Button.component(buttonProps),\r\n <button className={'Dropdown-toggle Button Button--icon ' + this.props.buttonClassName} data-toggle=\"dropdown\">\r\n {icon(this.props.icon, { className: 'Button-icon' })}\r\n {icon('fas fa-caret-down', { className: 'Button-caret' })}\r\n </button>,\r\n ];\r\n }\r\n\r\n /**\r\n * Get the first child. If the first child is an array, the first item in that\r\n * array will be returned.\r\n */\r\n protected getFirstChild() {\r\n let firstChild = this.props.children;\r\n\r\n while (firstChild instanceof Array) firstChild = firstChild[0];\r\n\r\n return firstChild;\r\n }\r\n}\r\n","import Page from './Page';\r\nimport ItemList from '../../common/utils/ItemList';\r\nimport DiscussionHero from './DiscussionHero';\r\nimport PostStream from './PostStream';\r\nimport PostStreamScrubber from './PostStreamScrubber';\r\nimport LoadingIndicator from '../../common/components/LoadingIndicator';\r\nimport SplitDropdown from '../../common/components/SplitDropdown';\r\nimport listItems from '../../common/helpers/listItems';\r\nimport DiscussionControls from '../utils/DiscussionControls';\r\nimport Discussion from '../../common/models/Discussion';\r\nimport Post from '../../common/models/Post';\r\n\r\n/**\r\n * The `DiscussionPage` component displays a whole discussion page, including\r\n * the discussion list pane, the hero, the posts, and the sidebar.\r\n */\r\nexport default class DiscussionPage extends Page {\r\n /**\r\n * The discussion that is being viewed.\r\n */\r\n discussion: Discussion | null = null;\r\n\r\n /**\r\n * The number of the first post that is currently visible in the viewport.\r\n */\r\n near: number | null = null;\r\n\r\n stream!: PostStream;\r\n scrubber!: PostStreamScrubber;\r\n\r\n includedPosts: Post[] = [];\r\n\r\n oninit(vnode) {\r\n super.oninit(vnode);\r\n\r\n this.refresh();\r\n\r\n // If the discussion list has been loaded, then we'll enable the pane (and\r\n // hide it by default). Also, if we've just come from another discussion\r\n // page, then we don't want Mithril to redraw the whole page – if it did,\r\n // then the pane would which would be slow and would cause problems with\r\n // event handlers.\r\n if (app.cache.discussionList) {\r\n // TODO app pane\r\n // app.pane.enable();\r\n // app.pane.hide();\r\n }\r\n\r\n app.history.push('discussion');\r\n\r\n this.bodyClass = 'App--discussion';\r\n }\r\n\r\n onbeforeremove(vnode) {\r\n super.onbeforeremove(vnode);\r\n\r\n // If we have routed to the same discussion as we were viewing previously,\r\n // cancel the unloading of this controller and instead prompt the post\r\n // stream to jump to the new 'near' param.\r\n if (this.discussion) {\r\n const idParam = m.route.param('id');\r\n\r\n if (idParam && idParam.split('-')[0] === this.discussion.id()) {\r\n const near = m.route.param('near') || '1';\r\n\r\n if (near !== String(this.near)) {\r\n this.stream.goToNumber(near);\r\n }\r\n\r\n this.near = null;\r\n\r\n return false;\r\n }\r\n }\r\n\r\n // If we are indeed navigating away from this discussion, then disable the\r\n // discussion list pane. Also, if we're composing a reply to this\r\n // discussion, minimize the composer – unless it's empty, in which case\r\n // we'll just close it.\r\n // TODO pane & composer\r\n // app.pane.disable();\r\n\r\n // if (app.composingReplyTo(this.discussion) && !app.composer.component.content()) {\r\n // app.composer.hide();\r\n // } else {\r\n // app.composer.minimize();\r\n // }\r\n }\r\n\r\n view() {\r\n const discussion = this.discussion;\r\n\r\n // Set up the post stream for this discussion, along with the first page of\r\n // posts we want to display. Tell the stream to scroll down and highlight\r\n // the specific post that was routed to.\r\n const postStream = (\r\n <PostStream\r\n discussion={discussion}\r\n includedPosts={this.includedPosts}\r\n oninit={(vnode) => {\r\n this.stream = vnode.state;\r\n this.scrubber.stream = vnode.state;\r\n\r\n this.stream.on('positionChanged', this.positionChanged.bind(this));\r\n this.stream.goToNumber(m.route.param('near') || (this.includedPosts[0] && this.includedPosts[0].number()), true);\r\n }}\r\n />\r\n );\r\n\r\n return (\r\n <div className=\"DiscussionPage\">\r\n {app.cache.discussionList ? (\r\n <div className=\"DiscussionPage-list\" oncreate={this.oncreatePane.bind(this)} onbeforeupdate={() => false}>\r\n {!$('.App-navigation').is(':visible') ? app.cache.discussionList.render() : ''}\r\n </div>\r\n ) : (\r\n ''\r\n )}\r\n\r\n <div className=\"DiscussionPage-discussion\">\r\n {discussion\r\n ? [\r\n DiscussionHero.component({ discussion }),\r\n <div className=\"container\">\r\n <nav className=\"DiscussionPage-nav\">\r\n <ul>{listItems(this.sidebarItems().toArray())}</ul>\r\n </nav>\r\n <div className=\"DiscussionPage-stream\">{postStream}</div>\r\n </div>,\r\n ]\r\n : LoadingIndicator.component({ className: 'LoadingIndicator--block' })}\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n oncreate(vnode) {\r\n super.oncreate(vnode);\r\n\r\n if (this.discussion) {\r\n app.setTitle(this.discussion.title());\r\n }\r\n }\r\n\r\n /**\r\n * Clear and reload the discussion.\r\n */\r\n refresh() {\r\n this.near = Number(m.route.param('near') || 0);\r\n this.discussion = null;\r\n\r\n const preloadedDiscussion = app.preloadedApiDocument();\r\n if (preloadedDiscussion) {\r\n // We must wrap this in a setTimeout because if we are mounting this\r\n // component for the first time on page load, then any calls to m.redraw\r\n // will be ineffective and thus any configs (scroll code) will be run\r\n // before stuff is drawn to the page.\r\n setTimeout(this.show.bind(this, preloadedDiscussion as Discussion), 0);\r\n } else {\r\n const params = this.requestParams();\r\n\r\n app.store.find('discussions', m.route.param('id').split('-')[0], params).then(this.show.bind(this));\r\n }\r\n\r\n m.redraw();\r\n }\r\n\r\n /**\r\n * Get the parameters that should be passed in the API request to get the\r\n * discussion.\r\n */\r\n requestParams(): any {\r\n return {\r\n page: { near: this.near },\r\n };\r\n }\r\n\r\n /**\r\n * Initialize the component to display the given discussion.\r\n */\r\n show(discussion: Discussion) {\r\n this.discussion = discussion;\r\n\r\n app.history.push('discussion', discussion.title());\r\n app.setTitleCount(0);\r\n\r\n // When the API responds with a discussion, it will also include a number of\r\n // posts. Some of these posts are included because they are on the first\r\n // page of posts we want to display (determined by the `near` parameter) –\r\n // others may be included because due to other relationships introduced by\r\n // extensions. We need to distinguish the two so we don't end up displaying\r\n // the wrong posts. We do so by filtering out the posts that don't have\r\n // the 'discussion' relationship linked, then sorting and splicing.\r\n if (discussion.payload && discussion.payload.included) {\r\n const discussionId = discussion.id();\r\n\r\n this.includedPosts = discussion.payload.included\r\n .filter(\r\n (record) =>\r\n record.type === 'posts' &&\r\n record.relationships &&\r\n record.relationships.discussion &&\r\n record.relationships.discussion.data.id === discussionId\r\n )\r\n .map((record) => app.store.getById('posts', record.id))\r\n .sort((a, b) => a.id() - b.id())\r\n .slice(0, 20);\r\n }\r\n\r\n m.redraw();\r\n }\r\n\r\n /**\r\n * Configure the discussion list pane.\r\n */\r\n oncreatePane(vnode) {\r\n const $list = $(vnode.dom);\r\n\r\n // When the mouse enters and leaves the discussions pane, we want to show\r\n // and hide the pane respectively. We also create a 10px 'hot edge' on the\r\n // left of the screen to activate the pane.\r\n\r\n // TODO pane\r\n // const pane = app.pane;\r\n // $list.hover(pane.show.bind(pane), pane.onmouseleave.bind(pane));\r\n //\r\n // const hotEdge = e => {\r\n // if (e.pageX < 10) pane.show();\r\n // };\r\n // $(document).on('mousemove', hotEdge);\r\n // vnode.dom.onunload = () => $(document).off('mousemove', hotEdge);\r\n\r\n // If the discussion we are viewing is listed in the discussion list, then\r\n // we will make sure it is visible in the viewport – if it is not we will\r\n // scroll the list down to it.\r\n const $discussion = $list.find('.DiscussionListItem.active');\r\n if ($discussion.length) {\r\n const listTop = $list.offset().top;\r\n const listBottom = listTop + $list.outerHeight();\r\n const discussionTop = $discussion.offset().top;\r\n const discussionBottom = discussionTop + $discussion.outerHeight();\r\n\r\n if (discussionTop < listTop || discussionBottom > listBottom) {\r\n $list.scrollTop($list.scrollTop() - listTop + discussionTop);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Build an item list for the contents of the sidebar.\r\n */\r\n sidebarItems(): ItemList {\r\n const items = new ItemList();\r\n\r\n items.add(\r\n 'controls',\r\n SplitDropdown.component({\r\n children: DiscussionControls.controls(this.discussion, this).toArray(),\r\n icon: 'fas fa-ellipsis-v',\r\n className: 'App-primaryControl',\r\n buttonClassName: 'Button--primary',\r\n })\r\n );\r\n\r\n items.add('scrubber', <PostStreamScrubber oninit={(vnode) => (this.scrubber = vnode.state)} className=\"App-titleControl\" />, -100);\r\n\r\n return items;\r\n }\r\n\r\n /**\r\n * When the posts that are visible in the post stream change (i.e. the user\r\n * scrolls up or down), then we update the URL and mark the posts as read.\r\n */\r\n positionChanged(startNumber: number, endNumber: number) {\r\n const discussion = this.discussion;\r\n\r\n if (!discussion) return;\r\n\r\n // Construct a URL to this discussion with the updated position, then\r\n // replace it into the window's history and our own history stack.\r\n const url = app.route.discussion(discussion, (this.near = startNumber));\r\n\r\n m.route.set(url, true, { replace: true });\r\n\r\n app.history.push('discussion', discussion.title());\r\n\r\n // If the user hasn't read past here before, then we'll update their read\r\n // state and redraw.\r\n if (app.session.user && endNumber > (discussion.lastReadPostNumber() || 0)) {\r\n discussion.save({ lastReadPostNumber: endNumber });\r\n m.redraw();\r\n }\r\n }\r\n}\r\n","import app from '../app';\r\n\r\nimport Modal from '../../common/components/Modal';\r\nimport Button from '../../common/components/Button';\r\nimport Discussion from '../../common/models/Discussion';\r\n\r\n/**\r\n * The 'RenameDiscussionModal' displays a modal dialog with an input to rename a discussion\r\n */\r\nexport default class RenameDiscussionModal extends Modal {\r\n discussion!: Discussion;\r\n currentTitle!: string;\r\n newTitle!: Mithril.Stream<string>;\r\n\r\n oninit(vnode) {\r\n super.oninit(vnode);\r\n\r\n this.discussion = this.props.discussion;\r\n this.currentTitle = this.props.currentTitle;\r\n this.newTitle = m.prop(this.currentTitle);\r\n }\r\n\r\n className() {\r\n return 'RenameDiscussionModal Modal--small';\r\n }\r\n\r\n title() {\r\n return app.translator.transText('core.forum.rename_discussion.title');\r\n }\r\n\r\n content() {\r\n return (\r\n <div className=\"Modal-body\">\r\n <div className=\"Form Form--centered\">\r\n <div className=\"Form-group\">\r\n <input className=\"FormControl\" bidi={this.newTitle} type=\"text\" />\r\n </div>\r\n <div className=\"Form-group\">\r\n {Button.component({\r\n className: 'Button Button--primary Button--block',\r\n type: 'submit',\r\n loading: this.loading,\r\n children: app.translator.trans('core.forum.rename_discussion.submit_button'),\r\n })}\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n onsubmit(e) {\r\n e.preventDefault();\r\n\r\n this.loading = true;\r\n\r\n const title = this.newTitle;\r\n const currentTitle = this.currentTitle;\r\n\r\n // If the title is different to what it was before, then save it. After the\r\n // save has completed, update the post stream as there will be a new post\r\n // indicating that the discussion was renamed.\r\n if (title && title !== currentTitle) {\r\n return this.discussion\r\n .save({ title })\r\n .then(() => {\r\n // if (app.viewingDiscussion(this.discussion)) {\r\n app.current.stream.update();\r\n // }\r\n\r\n m.redraw();\r\n this.hide();\r\n })\r\n .catch(() => {\r\n this.loading = false;\r\n m.redraw();\r\n });\r\n } else {\r\n this.hide();\r\n }\r\n }\r\n}\r\n","import DiscussionPage from '../components/DiscussionPage';\r\n// import ReplyComposer from '../components/ReplyComposer';\r\nimport LogInModal from '../components/LogInModal';\r\nimport Button from '../../common/components/Button';\r\nimport Separator from '../../common/components/Separator';\r\nimport RenameDiscussionModal from '../components/RenameDiscussionModal';\r\nimport ItemList from '../../common/utils/ItemList';\r\nimport extractText from '../../common/utils/extractText';\r\nimport Discussion from '../../common/models/Discussion';\r\n\r\n/**\r\n * The `DiscussionControls` utility constructs a list of buttons for a\r\n * discussion which perform actions on it.\r\n */\r\nexport default {\r\n /**\r\n * Get a list of controls for a discussion.\r\n *\r\n * @param discussion\r\n * @param context The parent component under which the controls menu will\r\n * be displayed\r\n * @public\r\n */\r\n controls(discussion: Discussion, context: any): ItemList {\r\n const items = new ItemList();\r\n\r\n ['user', 'moderation', 'destructive'].forEach((section) => {\r\n const controls = this[section](discussion, context).toArray();\r\n if (controls.length) {\r\n controls.forEach((item) => items.add(item.itemName, item));\r\n items.add(section + 'Separator', Separator.component());\r\n }\r\n });\r\n\r\n return items;\r\n },\r\n\r\n /**\r\n * Get controls for a discussion pertaining to the current user (e.g. reply,\r\n * follow).\r\n *\r\n * @param discussion\r\n * @param context The parent component under which the controls menu will\r\n * be displayed.\r\n * @protected\r\n */\r\n user(discussion: Discussion, context: any): ItemList {\r\n const items = new ItemList();\r\n\r\n // Only add a reply control if this is the discussion's controls dropdown\r\n // for the discussion page itself. We don't want it to show up for\r\n // discussions in the discussion list, etc.\r\n if (context instanceof DiscussionPage) {\r\n items.add(\r\n 'reply',\r\n !app.session.user || discussion.canReply()\r\n ? Button.component({\r\n icon: 'fas fa-reply',\r\n children: app.translator.trans(\r\n app.session.user\r\n ? 'core.forum.discussion_controls.reply_button'\r\n : 'core.forum.discussion_controls.log_in_to_reply_button'\r\n ),\r\n onclick: this.replyAction.bind(discussion, true, false),\r\n })\r\n : Button.component({\r\n icon: 'fas fa-reply',\r\n children: app.translator.trans('core.forum.discussion_controls.cannot_reply_button'),\r\n className: 'disabled',\r\n title: app.translator.transText('core.forum.discussion_controls.cannot_reply_text'),\r\n })\r\n );\r\n }\r\n\r\n return items;\r\n },\r\n\r\n /**\r\n * Get controls for a discussion pertaining to moderation (e.g. rename, lock).\r\n *\r\n * @param discussion\r\n * @param context The parent component under which the controls menu will\r\n * be displayed.\r\n * @protected\r\n */\r\n moderation(discussion, context: any): ItemList {\r\n const items = new ItemList();\r\n\r\n if (discussion.canRename()) {\r\n items.add(\r\n 'rename',\r\n Button.component({\r\n icon: 'fas fa-pencil-alt',\r\n children: app.translator.trans('core.forum.discussion_controls.rename_button'),\r\n onclick: this.renameAction.bind(discussion),\r\n })\r\n );\r\n }\r\n\r\n return items;\r\n },\r\n\r\n /**\r\n * Get controls for a discussion which are destructive (e.g. delete).\r\n *\r\n * @param discussion\r\n * @param context The parent component under which the controls menu will\r\n * be displayed.\r\n * @protected\r\n */\r\n destructive(discussion: Discussion, context: any): ItemList {\r\n const items = new ItemList();\r\n\r\n if (!discussion.isHidden()) {\r\n if (discussion.canHide()) {\r\n items.add(\r\n 'hide',\r\n Button.component({\r\n icon: 'far fa-trash-alt',\r\n children: app.translator.trans('core.forum.discussion_controls.delete_button'),\r\n onclick: this.hideAction.bind(discussion),\r\n })\r\n );\r\n }\r\n } else {\r\n if (discussion.canHide()) {\r\n items.add(\r\n 'restore',\r\n Button.component({\r\n icon: 'fas fa-reply',\r\n children: app.translator.trans('core.forum.discussion_controls.restore_button'),\r\n onclick: this.restoreAction.bind(discussion),\r\n })\r\n );\r\n }\r\n\r\n if (discussion.canDelete()) {\r\n items.add(\r\n 'delete',\r\n Button.component({\r\n icon: 'fas fa-times',\r\n children: app.translator.trans('core.forum.discussion_controls.delete_forever_button'),\r\n onclick: this.deleteAction.bind(discussion),\r\n })\r\n );\r\n }\r\n }\r\n\r\n return items;\r\n },\r\n\r\n /**\r\n * Open the reply composer for the discussion. A promise will be returned,\r\n * which resolves when the composer opens successfully. If the user is not\r\n * logged in, they will be prompted. If they don't have permission to\r\n * reply, the promise will be rejected.\r\n *\r\n * @param goToLast Whether or not to scroll down to the last post if\r\n * the discussion is being viewed.\r\n * @param forceRefresh Whether or not to force a reload of the\r\n * composer component, even if it is already open for this discussion.\r\n */\r\n replyAction(this: Discussion, goToLast: boolean, forceRefresh: boolean): Promise<any> {\r\n return new Promise((resolve, reject) => {\r\n if (app.session.user) {\r\n if (this.canReply()) {\r\n let component = app.composer.component;\r\n if (!app.composingReplyTo(this) || forceRefresh) {\r\n component = new ReplyComposer({\r\n user: app.session.user,\r\n discussion: this,\r\n });\r\n app.composer.load(component);\r\n }\r\n\r\n app.composer.show();\r\n\r\n if (goToLast && app.viewingDiscussion(this) && !app.composer.isFullScreen()) {\r\n app.current.stream.goToNumber('reply');\r\n }\r\n\r\n return resolve(component);\r\n } else {\r\n return reject();\r\n }\r\n }\r\n\r\n app.modal.show(LogInModal);\r\n\r\n reject();\r\n });\r\n },\r\n\r\n /**\r\n * Hide a discussion.\r\n */\r\n hideAction(this: Discussion) {\r\n this.pushAttributes({ hiddenAt: new Date(), hiddenUser: app.session.user });\r\n\r\n return this.save({ isHidden: true });\r\n },\r\n\r\n /**\r\n * Restore a discussion.\r\n */\r\n restoreAction(this: Discussion) {\r\n this.pushAttributes({ hiddenAt: null, hiddenUser: null });\r\n\r\n return this.save({ isHidden: false });\r\n },\r\n\r\n /**\r\n * Delete the discussion after confirming with the user.\r\n */\r\n deleteAction(this: Discussion) {\r\n if (confirm(extractText(app.translator.trans('core.forum.discussion_controls.delete_confirmation')))) {\r\n // If we're currently viewing the discussion that was deleted, go back\r\n // to the previous page.\r\n if (app.viewingDiscussion(this)) {\r\n app.history.back();\r\n }\r\n\r\n return this.delete().then(() => {\r\n // If there is a discussion list in the cache, remove this discussion.\r\n if (app.cache.discussionList) {\r\n app.cache.discussionList.removeDiscussion(this);\r\n m.redraw();\r\n }\r\n });\r\n }\r\n },\r\n\r\n /**\r\n * Rename the discussion.\r\n */\r\n renameAction(this: Discussion) {\r\n return app.modal.show(RenameDiscussionModal, {\r\n currentTitle: this.title(),\r\n discussion: this,\r\n });\r\n },\r\n};\r\n","import Component from '../../common/Component';\r\nimport avatar from '../../common/helpers/avatar';\r\nimport listItems from '../../common/helpers/listItems';\r\nimport highlight from '../../common/helpers/highlight';\r\nimport icon from '../../common/helpers/icon';\r\nimport humanTime from '../../common/utils/humanTime';\r\nimport ItemList from '../../common/utils/ItemList';\r\nimport Dropdown from '../../common/components/Dropdown';\r\nimport SubtreeRetainer from '../../common/utils/SubtreeRetainer';\r\nimport LinkButton from '../../common/components/LinkButton';\r\nimport abbreviateNumber from '../../common/utils/abbreviateNumber';\r\nimport TerminalPost from './TerminalPost';\r\nimport DiscussionControls from '../utils/DiscussionControls';\r\nimport { DiscussionProp } from '../../common/concerns/ComponentProps';\r\n\r\nexport interface DiscussionListItemProps extends DiscussionProp {\r\n params: any;\r\n}\r\n\r\n/**\r\n * The `DiscussionListItem` component shows a single discussion in the\r\n * discussion list.\r\n */\r\nexport default class DiscussionListItem<T extends DiscussionListItemProps = DiscussionListItemProps> extends Component<T> {\r\n /**\r\n * Set up a subtree retainer so that the discussion will not be redrawn\r\n * unless new data comes in.\r\n */\r\n subtree: SubtreeRetainer;\r\n\r\n highlightRegExp?: RegExp;\r\n\r\n oninit(vnode) {\r\n super.oninit(vnode);\r\n\r\n this.subtree = new SubtreeRetainer(\r\n () => this.props.discussion.freshness,\r\n () => {\r\n const time = app.session.user && app.session.user.markedAllAsReadAt();\r\n return time && time.getTime();\r\n },\r\n () => this.active()\r\n );\r\n }\r\n\r\n attrs() {\r\n return {\r\n className: classNames('DiscussionListItem', this.active() && 'active', this.props.discussion.isHidden() && 'DiscussionListItem--hidden'),\r\n };\r\n }\r\n\r\n view() {\r\n const discussion = this.props.discussion;\r\n const user = discussion.user();\r\n const isUnread = discussion.isUnread();\r\n const isRead = discussion.isRead();\r\n const showUnread = !this.showRepliesCount() && isUnread;\r\n let jumpTo = 0;\r\n const controls = DiscussionControls.controls(discussion, this).toArray();\r\n const attrs = this.attrs();\r\n\r\n if (this.props.params.q) {\r\n const post = discussion.mostRelevantPost();\r\n if (post) {\r\n jumpTo = post.number();\r\n }\r\n\r\n const phrase = this.props.params.q;\r\n this.highlightRegExp = new RegExp(phrase + '|' + phrase.trim().replace(/\\s+/g, '|'), 'gi');\r\n } else {\r\n jumpTo = Math.min(discussion.lastPostNumber(), (discussion.lastReadPostNumber() || 0) + 1);\r\n }\r\n\r\n return (\r\n <div {...attrs}>\r\n {controls.length\r\n ? Dropdown.component({\r\n icon: 'fas fa-ellipsis-v',\r\n children: controls,\r\n className: 'DiscussionListItem-controls',\r\n buttonClassName: 'Button Button--icon Button--flat Slidable-underneath Slidable-underneath--right',\r\n })\r\n : ''}\r\n\r\n <a\r\n className={'Slidable-underneath Slidable-underneath--left Slidable-underneath--elastic' + (isUnread ? '' : ' disabled')}\r\n onclick={this.markAsRead.bind(this)}\r\n >\r\n {icon('fas fa-check')}\r\n </a>\r\n\r\n <div className={classNames('DiscussionListItem-content', 'Slidable-content', isUnread && 'unread', isRead && 'read')}>\r\n <LinkButton\r\n href={user ? app.route.user(user) : '#'}\r\n className=\"DiscussionListItem-author\"\r\n title={app.translator.transText('core.forum.discussion_list.started_text', {\r\n user: user,\r\n ago: humanTime(discussion.createdAt()),\r\n })}\r\n oncreate={(vnode) => $(vnode.dom).tooltip({ placement: 'right' })}\r\n >\r\n {avatar(user, { title: '' })}\r\n </LinkButton>\r\n\r\n <ul className=\"DiscussionListItem-badges badges\">{listItems(discussion.badges().toArray())}</ul>\r\n\r\n <LinkButton href={app.route.discussion(discussion, jumpTo)} className=\"DiscussionListItem-main\">\r\n <h3 className=\"DiscussionListItem-title\">{highlight(discussion.title(), this.highlightRegExp)}</h3>\r\n <ul className=\"DiscussionListItem-info\">{listItems(this.infoItems().toArray())}</ul>\r\n </LinkButton>\r\n\r\n <span\r\n className=\"DiscussionListItem-count\"\r\n onclick={this.markAsRead.bind(this)}\r\n title={showUnread ? app.translator.trans('core.forum.discussion_list.mark_as_read_tooltip') : ''}\r\n >\r\n {abbreviateNumber(discussion[showUnread ? 'unreadCount' : 'replyCount']())}\r\n </span>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n oncreate(vnode) {\r\n super.oncreate(vnode);\r\n\r\n // If we're on a touch device, set up the discussion row to be slidable.\r\n // This allows the user to drag the row to either side of the screen to\r\n // reveal controls.\r\n if ('ontouchstart' in window) {\r\n const slidableInstance = slidable(this.$().addClass('Slidable'));\r\n\r\n this.$('.DiscussionListItem-controls').on('hidden.bs.dropdown', () => slidableInstance.reset());\r\n }\r\n }\r\n\r\n onbeforeupdate(vnode) {\r\n super.onbeforeupdate(vnode);\r\n\r\n return this.subtree.update();\r\n }\r\n\r\n /**\r\n * Determine whether or not the discussion is currently being viewed.\r\n */\r\n active(): boolean {\r\n const idParam = m.route.param('id');\r\n\r\n return !!idParam && idParam.split('-')[0] === this.props.discussion.id();\r\n }\r\n\r\n /**\r\n * Determine whether or not information about who started the discussion\r\n * should be displayed instead of information about the most recent reply to\r\n * the discussion.\r\n */\r\n showFirstPost(): boolean {\r\n return ['newest', 'oldest'].indexOf(this.props.params.sort) !== -1;\r\n }\r\n\r\n /**\r\n * Determine whether or not the number of replies should be shown instead of\r\n * the number of unread posts.\r\n */\r\n showRepliesCount(): boolean {\r\n return this.props.params.sort === 'replies';\r\n }\r\n\r\n /**\r\n * Mark the discussion as read.\r\n */\r\n markAsRead() {\r\n const discussion = this.props.discussion;\r\n\r\n if (discussion.isUnread()) {\r\n discussion.save({ lastReadPostNumber: discussion.lastPostNumber() });\r\n m.redraw();\r\n }\r\n }\r\n\r\n /**\r\n * Build an item list of info for a discussion listing. By default this is\r\n * just the first/last post indicator.\r\n */\r\n infoItems(): ItemList {\r\n const items = new ItemList();\r\n\r\n if (this.props.params.q) {\r\n const post = this.props.discussion.mostRelevantPost() || this.props.discussion.firstPost();\r\n\r\n if (post && post.contentType() === 'comment') {\r\n const excerpt = highlight(post.contentPlain(), this.highlightRegExp, 175);\r\n items.add('excerpt', excerpt, -100);\r\n }\r\n } else {\r\n items.add(\r\n 'terminalPost',\r\n TerminalPost.component({\r\n discussion: this.props.discussion,\r\n lastPost: !this.showFirstPost(),\r\n })\r\n );\r\n }\r\n\r\n return items;\r\n }\r\n}\r\n","import Component, { ComponentProps } from '../Component';\r\n\r\nexport interface PlaceholderProps extends ComponentProps {\r\n text: string;\r\n}\r\n\r\n/**\r\n * The `Placeholder` component displays a muted text with some call to action,\r\n * usually used as an empty state.\r\n */\r\nexport default class Placeholder extends Component<PlaceholderProps> {\r\n view() {\r\n return (\r\n <div className=\"Placeholder\">\r\n <p>{this.props.text}</p>\r\n </div>\r\n );\r\n }\r\n}\r\n","import Component, { ComponentProps } from '../../common/Component';\r\nimport DiscussionListItem from './DiscussionListItem';\r\nimport Button from '../../common/components/Button';\r\nimport LoadingIndicator from '../../common/components/LoadingIndicator';\r\nimport Placeholder from '../../common/components/Placeholder';\r\nimport Discussion from '../../common/models/Discussion';\r\n\r\nexport interface DiscussionListProps extends ComponentProps {\r\n /**\r\n * A map of parameters used to construct a refined parameter object\r\n * to send along in the API request to get discussion results.\r\n */\r\n params: any;\r\n}\r\n\r\n/**\r\n * The `DiscussionList` component displays a list of discussions.\r\n */\r\nexport default class DiscussionList<T extends DiscussionListProps = DiscussionListProps> extends Component<T> {\r\n /**\r\n * Whether or not discussion results are loading.\r\n */\r\n loading = true;\r\n\r\n /**\r\n * Whether or not there are more results that can be loaded.\r\n */\r\n moreResults = false;\r\n\r\n /**\r\n * The discussions in the discussion list.\r\n */\r\n discussions: Discussion[] = [];\r\n\r\n oninit(vnode) {\r\n super.oninit(vnode);\r\n\r\n this.refresh();\r\n }\r\n\r\n view() {\r\n const params = this.props.params;\r\n let loading;\r\n\r\n if (this.loading) {\r\n loading = LoadingIndicator.component();\r\n } else if (this.moreResults) {\r\n loading = Button.component({\r\n children: app.translator.trans('core.forum.discussion_list.load_more_button'),\r\n className: 'Button',\r\n onclick: this.loadMore.bind(this),\r\n });\r\n }\r\n\r\n if (this.discussions.length === 0 && !this.loading) {\r\n const text = app.translator.trans('core.forum.discussion_list.empty_text');\r\n return <div className=\"DiscussionList\">{Placeholder.component({ text })}</div>;\r\n }\r\n\r\n return (\r\n <div className={'DiscussionList' + (this.props.params.q ? ' DiscussionList--searchResults' : '')}>\r\n <ul className=\"DiscussionList-discussions\">\r\n {this.discussions.map((discussion) => {\r\n return (\r\n <li key={discussion.id()} data-id={discussion.id()}>\r\n {DiscussionListItem.component({ discussion, params })}\r\n </li>\r\n );\r\n })}\r\n </ul>\r\n <div className=\"DiscussionList-loadMore\">{loading}</div>\r\n </div>\r\n );\r\n }\r\n\r\n /**\r\n * Get the parameters that should be passed in the API request to get\r\n * discussion results.\r\n *\r\n * @api\r\n */\r\n requestParams(): any {\r\n const params = { include: ['user', 'lastPostedUser'], filter: {} };\r\n\r\n params.sort = this.sortMap()[this.props.params.sort];\r\n\r\n if (this.props.params.q) {\r\n params.filter.q = this.props.params.q;\r\n\r\n params.include.push('mostRelevantPost', 'mostRelevantPost.user');\r\n }\r\n\r\n return params;\r\n }\r\n\r\n /**\r\n * Get a map of sort keys (which appear in the URL, and are used for\r\n * translation) to the API sort value that they represent.\r\n */\r\n sortMap() {\r\n const map: any = {};\r\n\r\n if (this.props.params.q) {\r\n map.relevance = '';\r\n }\r\n map.latest = '-lastPostedAt';\r\n map.top = '-commentCount';\r\n map.newest = '-createdAt';\r\n map.oldest = 'createdAt';\r\n\r\n return map;\r\n }\r\n\r\n /**\r\n * Clear and reload the discussion list.\r\n */\r\n public refresh(clear = true) {\r\n if (clear) {\r\n this.loading = true;\r\n this.discussions = [];\r\n }\r\n\r\n return this.loadResults().then(\r\n (results) => {\r\n this.discussions = [];\r\n this.parseResults(results);\r\n },\r\n () => {\r\n this.loading = false;\r\n m.redraw();\r\n }\r\n );\r\n }\r\n\r\n /**\r\n * Load a new page of discussion results.\r\n *\r\n * @param offset The index to start the page at.\r\n */\r\n loadResults(offset?: number): Promise<Discussion[]> {\r\n const preloadedDiscussions = app.preloadedApiDocument();\r\n\r\n if (preloadedDiscussions) {\r\n return Promise.resolve(preloadedDiscussions);\r\n }\r\n\r\n const params = this.requestParams();\r\n params.page = { offset };\r\n params.include = params.include.join(',');\r\n\r\n return app.store.find('discussions', params);\r\n }\r\n\r\n /**\r\n * Load the next page of discussion results.\r\n */\r\n public loadMore() {\r\n this.loading = true;\r\n\r\n this.loadResults(this.discussions.length).then(this.parseResults.bind(this));\r\n }\r\n\r\n /**\r\n * Parse results and append them to the discussion list.\r\n */\r\n parseResults(results: Discussion[]): Discussion[] {\r\n [].push.apply(this.discussions, results);\r\n\r\n this.loading = false;\r\n this.moreResults = !!results.payload.links.next;\r\n\r\n m.redraw();\r\n\r\n return results;\r\n }\r\n\r\n /**\r\n * Remove a discussion from the list if it is present.\r\n */\r\n public removeDiscussion(discussion: Discussion) {\r\n const index = this.discussions.indexOf(discussion);\r\n\r\n if (index !== -1) {\r\n this.discussions.splice(index, 1);\r\n }\r\n }\r\n\r\n /**\r\n * Add a discussion to the top of the list.\r\n */\r\n public addDiscussion(discussion: Discussion) {\r\n this.discussions.unshift(discussion);\r\n }\r\n}\r\n","import Component from '../../common/Component';\r\nimport Button from '../../common/components/Button';\r\n\r\n/**\r\n * The `WelcomeHero` component displays a hero that welcomes the user to the\r\n * forum.\r\n */\r\nexport default class WelcomeHero extends Component {\r\n hidden = !!localStorage.getItem('welcomeHidden');\r\n\r\n view() {\r\n if (this.hidden) return <div />;\r\n\r\n const slideUp = () => this.$().slideUp(this.hide.bind(this));\r\n\r\n return (\r\n <header className=\"Hero WelcomeHero\">\r\n <div class=\"container\">\r\n <Button icon=\"fas fa-times\" className=\"Hero-close Button Button--icon Button--link\" onclick={slideUp} />\r\n\r\n <div className=\"containerNarrow\">\r\n <h2 className=\"Hero-title\">{app.forum.attribute('welcomeTitle')}</h2>\r\n <div className=\"Hero-subtitle\">{m.trust(app.forum.attribute('welcomeMessage'))}</div>\r\n </div>\r\n </div>\r\n </header>\r\n );\r\n }\r\n\r\n /**\r\n * Hide the welcome hero.\r\n */\r\n hide() {\r\n localStorage.setItem('welcomeHidden', 'true');\r\n\r\n this.hidden = true;\r\n }\r\n}\r\n","import { Params } from 'mithril';\r\n\r\nimport { extend } from '../../common/extend';\r\nimport listItems from '../../common/helpers/listItems';\r\nimport Discussion from '../../common/models/Discussion';\r\nimport ItemList from '../../common/utils/ItemList';\r\n\r\nimport Button from '../../common/components/Button';\r\nimport Dropdown from '../../common/components/Dropdown';\r\nimport LinkButton from '../../common/components/LinkButton';\r\nimport SelectDropdown from '../../common/components/SelectDropdown';\r\n// import DiscussionComposer from './DiscussionComposer';\r\nimport DiscussionList from './DiscussionList';\r\nimport DiscussionPage from './DiscussionPage';\r\nimport LogInModal from './LogInModal';\r\nimport Page from './Page';\r\nimport WelcomeHero from './WelcomeHero';\r\n\r\n/**\r\n * The `IndexPage` component displays the index page, including the welcome\r\n * hero, the sidebar, and the discussion list.\r\n */\r\nexport default class IndexPage extends Page {\r\n private lastDiscussion?: Discussion;\r\n\r\n oninit(vnode) {\r\n super.oninit(vnode);\r\n\r\n // If the user is returning from a discussion page, then take note of which\r\n // discussion they have just visited. After the view is rendered, we will\r\n // scroll down so that this discussion is in view.\r\n if (app.previous instanceof DiscussionPage) {\r\n this.lastDiscussion = app.previous.discussion;\r\n }\r\n\r\n // If the user is coming from the discussion list, then they have either\r\n // just switched one of the parameters (filter, sort, search) or they\r\n // probably want to refresh the results. We will clear the discussion list\r\n // cache so that results are reloaded.\r\n if (app.previous instanceof IndexPage) {\r\n app.cache.discussionList = null;\r\n }\r\n\r\n const params = this.params();\r\n\r\n if (app.cache.discussionList) {\r\n // Compare the requested parameters (sort, search query) to the ones that\r\n // are currently present in the cached discussion list. If they differ, we\r\n // will clear the cache and set up a new discussion list component with\r\n // the new parameters.\r\n Object.keys(params).some((key) => {\r\n if (app.cache.discussionList!.props.params[key] !== params[key]) {\r\n app.cache.discussionList = null;\r\n return true;\r\n }\r\n });\r\n }\r\n\r\n if (!app.cache.discussionList) {\r\n app.cache.discussionList = new DiscussionList({ params, oninit: (vnode) => (app.cache.discussionList = vnode.state) });\r\n }\r\n\r\n app.history.push('index', app.translator.transText('core.forum.header.back_to_index_tooltip'));\r\n\r\n this.bodyClass = 'App--index';\r\n }\r\n\r\n onremove(vnode) {\r\n super.onremove(vnode);\r\n\r\n // Save the scroll position so we can restore it when we return to the\r\n // discussion list.\r\n app.cache.scrollTop = $(window).scrollTop();\r\n }\r\n\r\n view() {\r\n if (!app.cache.discussionList) return;\r\n\r\n const discussionList = app.cache.discussionList.render();\r\n\r\n return (\r\n <div className=\"IndexPage\">\r\n {this.hero()}\r\n <div className=\"container\">\r\n <div className=\"sideNavContainer\">\r\n <nav className=\"IndexPage-nav sideNav\">\r\n <ul>{listItems(this.sidebarItems().toArray())}</ul>\r\n </nav>\r\n <div className=\"IndexPage-results sideNavOffset\">\r\n <div className=\"IndexPage-toolbar\">\r\n <ul className=\"IndexPage-toolbar-view\">{listItems(this.viewItems().toArray())}</ul>\r\n <ul className=\"IndexPage-toolbar-action\">{listItems(this.actionItems().toArray())}</ul>\r\n </div>\r\n {discussionList}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n oncreate(vnode) {\r\n super.oncreate(vnode);\r\n\r\n const $app = $('#app');\r\n\r\n extend(vnode.dom, 'onunload', () => $app.css('min-height', ''));\r\n\r\n app.setTitle('');\r\n app.setTitleCount(0);\r\n\r\n // Work out the difference between the height of this hero and that of the\r\n // previous hero. Maintain the same scroll position relative to the bottom\r\n // of the hero so that the sidebar doesn't jump around.\r\n const oldHeroHeight = app.cache.heroHeight;\r\n const heroHeight = (app.cache.heroHeight = this.$('.Hero').outerHeight() || 0);\r\n const scrollTop = app.cache.scrollTop;\r\n\r\n $app.css('min-height', $(window).height() + heroHeight);\r\n\r\n // Scroll to the remembered position. We do this after a short delay so that\r\n // it happens after the browser has done its own \"back button\" scrolling,\r\n // which isn't right. https://github.com/flarum/core/issues/835\r\n const scroll = () => $(window).scrollTop(scrollTop - oldHeroHeight + heroHeight);\r\n scroll();\r\n setTimeout(scroll, 1);\r\n\r\n // If we've just returned from a discussion page, then the constructor will\r\n // have set the `lastDiscussion` property. If this is the case, we want to\r\n // scroll down to that discussion so that it's in view.\r\n if (this.lastDiscussion) {\r\n const $discussion = this.$(`.DiscussionListItem[data-id=\"${this.lastDiscussion.id()}\"]`);\r\n\r\n if ($discussion.length) {\r\n const indexTop = $('#header').outerHeight();\r\n const indexBottom = $(window).height();\r\n const discussionTop = $discussion.offset().top;\r\n const discussionBottom = discussionTop + $discussion.outerHeight();\r\n\r\n if (discussionTop < scrollTop + indexTop || discussionBottom > scrollTop + indexBottom) {\r\n $(window).scrollTop(discussionTop - indexTop);\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Get the component to display as the hero.\r\n */\r\n hero() {\r\n return <WelcomeHero />;\r\n }\r\n\r\n /**\r\n * Build an item list for the sidebar of the index page. By default this is a\r\n * \"New Discussion\" button, and then a DropdownSelect component containing a\r\n * list of navigation items.\r\n */\r\n sidebarItems(): ItemList {\r\n const items = new ItemList();\r\n const canStartDiscussion = app.forum.attribute('canStartDiscussion') || !app.session.user;\r\n\r\n items.add(\r\n 'newDiscussion',\r\n Button.component({\r\n children: app.translator.trans(\r\n canStartDiscussion ? 'core.forum.index.start_discussion_button' : 'core.forum.index.cannot_start_discussion_button'\r\n ),\r\n icon: 'fas fa-edit',\r\n className: 'Button Button--primary IndexPage-newDiscussion',\r\n itemClassName: 'App-primaryControl',\r\n onclick: this.newDiscussionAction.bind(this),\r\n disabled: !canStartDiscussion,\r\n })\r\n );\r\n\r\n items.add(\r\n 'nav',\r\n SelectDropdown.component({\r\n children: this.navItems().toArray(),\r\n buttonClassName: 'Button',\r\n className: 'App-titleControl',\r\n })\r\n );\r\n\r\n return items;\r\n }\r\n\r\n /**\r\n * Build an item list for the navigation in the sidebar of the index page. By\r\n * default this is just the 'All Discussions' link.\r\n */\r\n navItems(): ItemList {\r\n const items = new ItemList();\r\n const params = this.stickyParams();\r\n\r\n items.add(\r\n 'allDiscussions',\r\n LinkButton.component({\r\n href: app.route('index', params),\r\n children: app.translator.trans('core.forum.index.all_discussions_link'),\r\n icon: 'far fa-comments',\r\n }),\r\n 100\r\n );\r\n\r\n return items;\r\n }\r\n\r\n /**\r\n * Build an item list for the part of the toolbar which is concerned with how\r\n * the results are displayed. By default this is just a select box to change\r\n * the way discussions are sorted.\r\n */\r\n viewItems(): ItemList {\r\n const items = new ItemList();\r\n const sortMap = app.cache.discussionList.sortMap();\r\n\r\n const sortOptions = {};\r\n for (const i in sortMap) {\r\n sortOptions[i] = app.translator.trans('core.forum.index_sort.' + i + '_button');\r\n }\r\n\r\n items.add(\r\n 'sort',\r\n Dropdown.component({\r\n buttonClassName: 'Button',\r\n label: sortOptions[this.params().sort] || Object.keys(sortMap).map((key) => sortOptions[key])[0],\r\n children: Object.keys(sortOptions).map((value) => {\r\n const label = sortOptions[value];\r\n const active = (this.params().sort || Object.keys(sortMap)[0]) === value;\r\n\r\n return Button.component({\r\n children: label,\r\n icon: active ? 'fas fa-check' : true,\r\n onclick: this.changeSort.bind(this, value),\r\n active: active,\r\n });\r\n }),\r\n })\r\n );\r\n\r\n return items;\r\n }\r\n\r\n /**\r\n * Build an item list for the part of the toolbar which is about taking action\r\n * on the results. By default this is just a \"mark all as read\" button.\r\n */\r\n actionItems(): ItemList {\r\n const items = new ItemList();\r\n\r\n items.add(\r\n 'refresh',\r\n Button.component({\r\n title: app.translator.transText('core.forum.index.refresh_tooltip'),\r\n icon: 'fas fa-sync',\r\n className: 'Button Button--icon',\r\n onclick: () => {\r\n app.cache.discussionList.refresh();\r\n if (app.session.user) {\r\n app.store.find('users', app.session.user.id());\r\n m.redraw();\r\n }\r\n },\r\n })\r\n );\r\n\r\n if (app.session.user) {\r\n items.add(\r\n 'markAllAsRead',\r\n Button.component({\r\n title: app.translator.transText('core.forum.index.mark_all_as_read_tooltip'),\r\n icon: 'fas fa-check',\r\n className: 'Button Button--icon',\r\n onclick: this.markAllAsRead.bind(this),\r\n })\r\n );\r\n }\r\n\r\n return items;\r\n }\r\n\r\n /**\r\n * Return the current search query, if any. This is implemented to activate\r\n * the search box in the header.\r\n *\r\n * @see Search\r\n */\r\n searching(): string {\r\n return this.params().q;\r\n }\r\n\r\n /**\r\n * Redirect to the index page without a search filter. This is called when the\r\n * 'x' is clicked in the search box in the header.\r\n *\r\n * @see Search\r\n */\r\n clearSearch() {\r\n const params = this.params();\r\n delete params.q;\r\n\r\n m.route.set(app.route(this.props.routeName, params));\r\n }\r\n\r\n /**\r\n * Redirect to the index page using the given sort parameter.\r\n */\r\n changeSort(sort: string) {\r\n const params = this.params();\r\n\r\n if (sort === Object.keys(app.cache.discussionList.sortMap())[0]) {\r\n delete params.sort;\r\n } else {\r\n params.sort = sort;\r\n }\r\n\r\n m.route(app.route(this.props.routeName, params));\r\n }\r\n\r\n /**\r\n * Get URL parameters that stick between filter changes.\r\n *\r\n * @return {Object}\r\n */\r\n stickyParams(): Params {\r\n return {\r\n sort: m.route.param('sort'),\r\n q: m.route.param('q'),\r\n };\r\n }\r\n\r\n /**\r\n * Get parameters to pass to the DiscussionList component.\r\n *\r\n * @return {Object}\r\n */\r\n params() {\r\n const params = this.stickyParams();\r\n\r\n params.filter = m.route.param('filter');\r\n\r\n return params;\r\n }\r\n\r\n /**\r\n * Open the composer for a new discussion or prompt the user to login.\r\n *\r\n * @return {Promise}\r\n */\r\n newDiscussionAction(): Promise<void> {\r\n if (app.session.user) {\r\n // const component = new DiscussionComposer({ user: app.session.user });\r\n\r\n // app.composer.load(component);\r\n // app.composer.show();\r\n\r\n return Promise.resolve();\r\n } else {\r\n app.modal.show(LogInModal);\r\n\r\n return Promise.reject();\r\n }\r\n }\r\n\r\n /**\r\n * Mark all discussions as read.\r\n */\r\n markAllAsRead(): void {\r\n const confirmation = confirm(app.translator.transText('core.forum.index.mark_all_as_read_confirmation'));\r\n\r\n if (confirmation) {\r\n app.session.user.save({ markedAllAsReadAt: new Date() });\r\n }\r\n }\r\n}\r\n","import UserPage from './UserPage';\r\nimport LoadingIndicator from '../../common/components/LoadingIndicator';\r\nimport Button from '../../common/components/Button';\r\nimport Placeholder from '../../common/components/Placeholder';\r\nimport CommentPost from './CommentPost';\r\nimport Post from '../../common/models/Post';\r\n\r\n/**\r\n * The `PostsUserPage` component shows a user's activity feed inside of their\r\n * profile.\r\n */\r\nexport default class PostsUserPage extends UserPage {\r\n /**\r\n * Whether or not the activity feed is currently loading.\r\n */\r\n loading = true;\r\n\r\n /**\r\n * Whether or not there are any more activity items that can be loaded.\r\n */\r\n moreResults = false;\r\n\r\n /**\r\n * The Post models in the feed.\r\n */\r\n posts: Post[] = [];\r\n\r\n /**\r\n * The number of activity items to load per request.\r\n */\r\n loadLimit = 20;\r\n\r\n oninit(vnode) {\r\n super.oninit(vnode);\r\n\r\n this.loadUser(vnode.attrs.username);\r\n }\r\n\r\n onupdate(vnode) {\r\n super.onupdate(vnode);\r\n\r\n this.loadUser(vnode.attrs.username);\r\n }\r\n\r\n content() {\r\n if (this.posts.length === 0 && !this.loading) {\r\n return (\r\n <div className=\"PostsUserPage\">\r\n <Placeholder text={app.translator.trans('core.forum.user.posts_empty_text')} />\r\n </div>\r\n );\r\n }\r\n\r\n let footer;\r\n\r\n if (this.loading) {\r\n footer = LoadingIndicator.component();\r\n } else if (this.moreResults) {\r\n footer = (\r\n <div className=\"PostsUserPage-loadMore\">\r\n {Button.component({\r\n children: app.translator.trans('core.forum.user.posts_load_more_button'),\r\n className: 'Button',\r\n onclick: this.loadMore.bind(this),\r\n })}\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"PostsUserPage\">\r\n <ul className=\"PostsUserPage-list\">\r\n {this.posts.map((post) => (\r\n <li>\r\n <div className=\"PostsUserPage-discussion\">\r\n {app.translator.trans('core.forum.user.in_discussion_text', {\r\n discussion: <m.route.Link href={app.route.post(post)}>{post.discussion().title()}</m.route.Link>,\r\n })}\r\n </div>\r\n {CommentPost.component({ post })}\r\n </li>\r\n ))}\r\n </ul>\r\n <div className=\"PostsUserPage-loadMore\">{footer}</div>\r\n </div>\r\n );\r\n }\r\n\r\n /**\r\n * Initialize the component with a user, and trigger the loading of their\r\n * activity feed.\r\n */\r\n show(user) {\r\n super.show(user);\r\n\r\n this.refresh();\r\n }\r\n\r\n /**\r\n * Clear and reload the user's activity feed.\r\n */\r\n refresh() {\r\n this.loading = true;\r\n this.posts = [];\r\n\r\n m.redraw();\r\n\r\n this.loadResults().then(this.parseResults.bind(this));\r\n }\r\n\r\n /**\r\n * Load a new page of the user's activity feed.\r\n *\r\n * @param offset The position to start getting results from.\r\n */\r\n protected loadResults(offset?: number): Promise<Post[]> {\r\n return app.store.find<Post>('posts', {\r\n filter: {\r\n user: this.user.id(),\r\n type: 'comment',\r\n },\r\n page: { offset, limit: this.loadLimit },\r\n sort: '-createdAt',\r\n });\r\n }\r\n\r\n /**\r\n * Load the next page of results.\r\n */\r\n loadMore() {\r\n this.loading = true;\r\n this.loadResults(this.posts.length).then(this.parseResults.bind(this));\r\n }\r\n\r\n /**\r\n * Parse results and append them to the activity feed.\r\n */\r\n parseResults(results: Post[]): Post[] {\r\n this.loading = false;\r\n\r\n [].push.apply(this.posts, results);\r\n\r\n this.moreResults = results.length >= this.loadLimit;\r\n m.redraw();\r\n\r\n return results;\r\n }\r\n}\r\n","import UserPage from './UserPage';\r\nimport DiscussionList from './DiscussionList';\r\n\r\n/**\r\n * The `DiscussionsUserPage` component shows a discussion list inside of a user\r\n * page.\r\n */\r\nexport default class DiscussionsUserPage extends UserPage {\r\n oninit(vnode) {\r\n super.oninit(vnode);\r\n\r\n this.loadUser(m.route.param('username'));\r\n }\r\n\r\n content() {\r\n return (\r\n <div className=\"DiscussionsUserPage\">\r\n {DiscussionList.component({\r\n params: {\r\n q: `author:${this.user.username()}`,\r\n sort: 'newest',\r\n },\r\n })}\r\n </div>\r\n );\r\n }\r\n}\r\n","import Component, { ComponentProps } from '../Component';\r\nimport listItems from '../helpers/listItems';\r\n\r\nexport interface FieldSetProps extends ComponentProps {\r\n /**\r\n * The title of this group of fields\r\n */\r\n label: string;\r\n}\r\n\r\n/**\r\n * The `FieldSet` component defines a collection of fields, displayed in a list\r\n * underneath a title.\r\n *\r\n * The children should be an array of items to show in the fieldset.\r\n */\r\nexport default class FieldSet extends Component<FieldSetProps> {\r\n view() {\r\n return (\r\n <fieldset className={this.props.className}>\r\n <legend>{this.props.label}</legend>\r\n <ul>{listItems(this.props.children)}</ul>\r\n </fieldset>\r\n );\r\n }\r\n}\r\n","import Component, { ComponentProps } from '../Component';\r\nimport LoadingIndicator from './LoadingIndicator';\r\nimport icon from '../helpers/icon';\r\n\r\nexport interface CheckboxProps extends ComponentProps {\r\n /**\r\n * Whether or not the checkbox is checked\r\n */\r\n state: boolean;\r\n\r\n /**\r\n * Whether or not the checkbox is disabled.\r\n */\r\n disabled: boolean;\r\n\r\n /**\r\n * A callback to run when the checkbox is checked/unchecked.\r\n */\r\n onchange?: Function;\r\n}\r\n\r\n/**\r\n * The `Checkbox` component defines a checkbox input.\r\n */\r\nexport default class Checkbox<T extends CheckboxProps = CheckboxProps> extends Component<CheckboxProps> {\r\n /**\r\n * Whether or not the checkbox's value is in the process of being saved.\r\n */\r\n loading = false;\r\n\r\n view() {\r\n const className = classNames(\r\n 'Checkbox',\r\n this.props.className,\r\n this.props.state ? 'on' : 'off',\r\n this.loading && 'loading',\r\n this.props.disabled && 'disabled'\r\n );\r\n\r\n return (\r\n <label className={className}>\r\n <input\r\n type=\"checkbox\"\r\n checked={this.props.state}\r\n disabled={this.props.disabled}\r\n onchange={m.withAttr('checked', this.onchange.bind(this))}\r\n />\r\n <div className=\"Checkbox-display\">{this.getDisplay()}</div>\r\n {this.props.children}\r\n </label>\r\n );\r\n }\r\n\r\n /**\r\n * Get the template for the checkbox's display (tick/cross icon).\r\n */\r\n protected getDisplay() {\r\n return this.loading ? LoadingIndicator.component({ size: 'tiny' }) : icon(this.props.state ? 'fas fa-check' : 'fas fa-times');\r\n }\r\n\r\n /**\r\n * Run a callback when the state of the checkbox is changed.\r\n */\r\n protected onchange(checked: boolean) {\r\n if (this.props.onchange) this.props.onchange(checked, this);\r\n }\r\n}\r\n","import Checkbox from './Checkbox';\r\n\r\n/**\r\n * The `Switch` component is a `Checkbox`, but with a switch display instead of\r\n * a tick/cross one.\r\n */\r\nexport default class Switch extends Checkbox {\r\n static initProps(props) {\r\n super.initProps(props);\r\n\r\n props.className = `${props.className || ''} Checkbox--switch`;\r\n }\r\n\r\n getDisplay() {\r\n return this.loading ? super.getDisplay() : '';\r\n }\r\n}\r\n","import Component, { ComponentProps } from '../../common/Component';\r\nimport Checkbox from '../../common/components/Checkbox';\r\nimport icon from '../../common/helpers/icon';\r\nimport ItemList from '../../common/utils/ItemList';\r\nimport User from '../../common/models/User';\r\n\r\nexport interface NotificationGridProps extends ComponentProps {\r\n user: User;\r\n}\r\n\r\nexport type NotificationItem = {\r\n /**\r\n * The name of the notification type/method.\r\n */\r\n name: string;\r\n\r\n /**\r\n * The icon to display in the column header/notification grid row.\r\n */\r\n icon: string;\r\n\r\n /**\r\n * The label to display in the column header/notification grid row.\r\n */\r\n label: string;\r\n};\r\n\r\n/**\r\n * The `NotificationGrid` component displays a table of notification types and\r\n * methods, allowing the user to toggle each combination.\r\n */\r\nexport default class NotificationGrid extends Component<NotificationGridProps> {\r\n /**\r\n * Information about the available notification methods.\r\n */\r\n methods = this.notificationMethods().toArray();\r\n\r\n /**\r\n * A map of notification type-method combinations to the checkbox instances\r\n * that represent them.\r\n */\r\n inputs = {};\r\n\r\n /**\r\n * Information about the available notification types.\r\n */\r\n types = this.notificationTypes().toArray();\r\n\r\n oninit(vnode) {\r\n super.oninit(vnode);\r\n\r\n // For each of the notification type-method combinations, create and store a\r\n // new checkbox component instance, which we will render in the view.\r\n this.types.forEach((type) =>\r\n this.methods.forEach((method) => {\r\n const key = this.preferenceKey(type.name, method.name);\r\n const preference = this.props.user.preferences()[key];\r\n\r\n this.inputs[key] = new Checkbox({\r\n state: !!preference,\r\n disabled: typeof preference === 'undefined',\r\n onchange: () => this.toggle([key]),\r\n oninit: (vnode) => (this.inputs[key] = vnode.state),\r\n });\r\n })\r\n );\r\n }\r\n\r\n view() {\r\n return (\r\n <table className=\"NotificationGrid\">\r\n <thead>\r\n <tr>\r\n <td />\r\n {this.methods.map((method) => (\r\n <th className=\"NotificationGrid-groupToggle\" onclick={this.toggleMethod.bind(this, method.name)}>\r\n {icon(method.icon)} {method.label}\r\n </th>\r\n ))}\r\n </tr>\r\n </thead>\r\n\r\n <tbody>\r\n {this.types.map((type) => (\r\n <tr>\r\n <td className=\"NotificationGrid-groupToggle\" onclick={this.toggleType.bind(this, type.name)}>\r\n {icon(type.icon)} {type.label}\r\n </td>\r\n {this.methods.map((method) => (\r\n <td className=\"NotificationGrid-checkbox\">{this.inputs[this.preferenceKey(type.name, method.name)].render()}</td>\r\n ))}\r\n </tr>\r\n ))}\r\n </tbody>\r\n </table>\r\n );\r\n }\r\n\r\n oncreate(vnode) {\r\n super.oncreate(vnode);\r\n\r\n this.$('thead .NotificationGrid-groupToggle').bind('mouseenter mouseleave', function (e) {\r\n const i = parseInt($(this).index(), 10) + 1;\r\n $(this)\r\n .parents('table')\r\n .find('td:nth-child(' + i + ')')\r\n .toggleClass('highlighted', e.type === 'mouseenter');\r\n });\r\n\r\n this.$('tbody .NotificationGrid-groupToggle').bind('mouseenter mouseleave', function (e) {\r\n $(this)\r\n .parent()\r\n .find('td')\r\n .toggleClass('highlighted', e.type === 'mouseenter');\r\n });\r\n }\r\n\r\n /**\r\n * Toggle the state of the given preferences, based on the value of the first\r\n * one.\r\n */\r\n toggle(keys: string[]) {\r\n const user = this.props.user;\r\n const preferences = user.preferences();\r\n const enabled = !preferences[keys[0]];\r\n\r\n keys.forEach((key) => {\r\n const control = this.inputs[key];\r\n\r\n control.loading = true;\r\n control.props.state = enabled;\r\n preferences[key] = control.props.state = enabled;\r\n });\r\n\r\n m.redraw();\r\n\r\n user.save({ preferences }).then(() => {\r\n keys.forEach((key) => (this.inputs[key].loading = false));\r\n\r\n m.redraw();\r\n });\r\n }\r\n\r\n /**\r\n * Toggle all notification types for the given method.\r\n */\r\n toggleMethod(method: string) {\r\n const keys = this.types.map((type) => this.preferenceKey(type.name, method)).filter((key) => !this.inputs[key].props.disabled);\r\n\r\n this.toggle(keys);\r\n }\r\n\r\n /**\r\n * Toggle all notification methods for the given type.\r\n */\r\n toggleType(type: string) {\r\n const keys = this.methods.map((method) => this.preferenceKey(type, method.name)).filter((key) => !this.inputs[key].props.disabled);\r\n\r\n this.toggle(keys);\r\n }\r\n\r\n /**\r\n * Get the name of the preference key for the given notification type-method\r\n * combination.\r\n */\r\n preferenceKey(type: string, method: string): string {\r\n return `notify_${type}_${method}`;\r\n }\r\n\r\n /**\r\n * Build an item list for the notification methods to display in the grid.\r\n *\r\n * @see {NotificationItem}\r\n */\r\n notificationMethods() {\r\n const items = new ItemList<NotificationItem>();\r\n\r\n items.add('alert', {\r\n name: 'alert',\r\n icon: 'fas fa-bell',\r\n label: app.translator.trans('core.forum.settings.notify_by_web_heading'),\r\n });\r\n\r\n items.add('email', {\r\n name: 'email',\r\n icon: 'far fa-envelope',\r\n label: app.translator.trans('core.forum.settings.notify_by_email_heading'),\r\n });\r\n\r\n return items;\r\n }\r\n\r\n /**\r\n * Build an item list for the notification types to display in the grid.\r\n *\r\n * @see {NotificationItem}\r\n */\r\n notificationTypes() {\r\n const items = new ItemList<NotificationItem>();\r\n\r\n items.add('discussionRenamed', {\r\n name: 'discussionRenamed',\r\n icon: 'fas fa-pencil-alt',\r\n label: app.translator.trans('core.forum.settings.notify_discussion_renamed_label'),\r\n });\r\n\r\n return items;\r\n }\r\n}\r\n","import Modal from '../../common/components/Modal';\r\nimport Button from '../../common/components/Button';\r\n\r\n/**\r\n * The `ChangePasswordModal` component shows a modal dialog which allows the\r\n * user to send themself a password reset email.\r\n */\r\nexport default class ChangePasswordModal extends Modal {\r\n className() {\r\n return 'ChangePasswordModal Modal--small';\r\n }\r\n\r\n title() {\r\n return app.translator.transText('core.forum.change_password.title');\r\n }\r\n\r\n content() {\r\n return (\r\n <div className=\"Modal-body\">\r\n <div className=\"Form Form--centered\">\r\n <p className=\"helpText\">{app.translator.trans('core.forum.change_password.text')}</p>\r\n <div className=\"Form-group\">\r\n {Button.component({\r\n className: 'Button Button--primary Button--block',\r\n type: 'submit',\r\n loading: this.loading,\r\n children: app.translator.trans('core.forum.change_password.send_button'),\r\n })}\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n onsubmit(e) {\r\n e.preventDefault();\r\n\r\n this.loading = true;\r\n\r\n app.request({\r\n method: 'POST',\r\n url: app.forum.attribute('apiUrl') + '/forgot',\r\n body: { email: app.session.user.email() },\r\n }).then(this.hide.bind(this), this.loaded.bind(this));\r\n }\r\n}\r\n","import Modal from '../../common/components/Modal';\r\nimport Button from '../../common/components/Button';\r\n\r\n/**\r\n * The `ChangeEmailModal` component shows a modal dialog which allows the user\r\n * to change their email address.\r\n */\r\nexport default class ChangeEmailModal extends Modal {\r\n /**\r\n * Whether or not the email has been changed successfully.\r\n */\r\n success = false;\r\n\r\n /**\r\n * The value of the email input.\r\n */\r\n email = m.prop(app.session.user.email());\r\n\r\n /**\r\n * The value of the password input.\r\n */\r\n password = m.prop('');\r\n\r\n className() {\r\n return 'ChangeEmailModal Modal--small';\r\n }\r\n\r\n title() {\r\n return app.translator.transText('core.forum.change_email.title');\r\n }\r\n\r\n content() {\r\n if (this.success) {\r\n return (\r\n <div className=\"Modal-body\">\r\n <div className=\"Form Form--centered\">\r\n <p className=\"helpText\">\r\n {app.translator.trans('core.forum.change_email.confirmation_message', { email: <strong>{this.email()}</strong> })}\r\n </p>\r\n <div className=\"Form-group\">\r\n <Button className=\"Button Button--primary Button--block\" onclick={this.hide.bind(this)}>\r\n {app.translator.trans('core.forum.change_email.dismiss_button')}\r\n </Button>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"Modal-body\">\r\n <div className=\"Form Form--centered\">\r\n <div className=\"Form-group\">\r\n <input\r\n type=\"email\"\r\n name=\"email\"\r\n className=\"FormControl\"\r\n placeholder={app.session.user.email()}\r\n bidi={this.email}\r\n disabled={this.loading}\r\n />\r\n </div>\r\n <div className=\"Form-group\">\r\n <input\r\n type=\"password\"\r\n name=\"password\"\r\n className=\"FormControl\"\r\n placeholder={app.translator.transText('core.forum.change_email.confirm_password_placeholder')}\r\n bidi={this.password}\r\n disabled={this.loading}\r\n />\r\n </div>\r\n <div className=\"Form-group\">\r\n {Button.component({\r\n className: 'Button Button--primary Button--block',\r\n type: 'submit',\r\n loading: this.loading,\r\n children: app.translator.trans('core.forum.change_email.submit_button'),\r\n })}\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n onsubmit(e) {\r\n e.preventDefault();\r\n\r\n // If the user hasn't actually entered a different email address, we don't\r\n // need to do anything. Woot!\r\n if (this.email() === app.session.user.email()) {\r\n this.hide();\r\n return;\r\n }\r\n\r\n this.loading = true;\r\n\r\n app.session.user\r\n .save(\r\n { email: this.email() },\r\n {\r\n errorHandler: this.onerror.bind(this),\r\n meta: { password: this.password() },\r\n }\r\n )\r\n .then(() => (this.success = true))\r\n .catch(() => {})\r\n .then(this.loaded.bind(this));\r\n }\r\n\r\n onerror(error) {\r\n if (error.status === 401) {\r\n error.alert.children = app.translator.trans('core.forum.change_email.incorrect_password_message');\r\n }\r\n\r\n super.onerror(error);\r\n }\r\n}\r\n","import listItems from '../../common/helpers/listItems';\r\nimport ItemList from '../../common/utils/ItemList';\r\nimport Button from '../../common/components/Button';\r\nimport FieldSet from '../../common/components/FieldSet';\r\nimport Switch from '../../common/components/Switch';\r\nimport UserPage from './UserPage';\r\nimport NotificationGrid from './NotificationGrid';\r\nimport ChangePasswordModal from './ChangePasswordModal';\r\nimport ChangeEmailModal from './ChangeEmailModal';\r\n\r\nexport default class SettingsPage extends UserPage {\r\n oninit(vnode) {\r\n super.oninit(vnode);\r\n\r\n this.show(app.session.user);\r\n app.setTitle(app.translator.transText('core.forum.settings.title'));\r\n }\r\n\r\n content() {\r\n return (\r\n <div className=\"SettingsPage\">\r\n <ul>{listItems(this.settingsItems().toArray())}</ul>\r\n </div>\r\n );\r\n }\r\n\r\n /**\r\n * Build an item list for the user's settings controls.\r\n */\r\n settingsItems(): ItemList {\r\n const items = new ItemList();\r\n\r\n items.add(\r\n 'account',\r\n FieldSet.component({\r\n label: app.translator.trans('core.forum.settings.account_heading'),\r\n className: 'Settings-account',\r\n children: this.accountItems().toArray(),\r\n })\r\n );\r\n\r\n items.add(\r\n 'notifications',\r\n FieldSet.component({\r\n label: app.translator.trans('core.forum.settings.notifications_heading'),\r\n className: 'Settings-notifications',\r\n children: this.notificationsItems().toArray(),\r\n })\r\n );\r\n\r\n items.add(\r\n 'privacy',\r\n FieldSet.component({\r\n label: app.translator.trans('core.forum.settings.privacy_heading'),\r\n className: 'Settings-privacy',\r\n children: this.privacyItems().toArray(),\r\n })\r\n );\r\n\r\n return items;\r\n }\r\n\r\n /**\r\n * Build an item list for the user's account settings.\r\n */\r\n accountItems(): ItemList {\r\n const items = new ItemList();\r\n\r\n items.add(\r\n 'changePassword',\r\n Button.component({\r\n children: app.translator.trans('core.forum.settings.change_password_button'),\r\n className: 'Button',\r\n onclick: () => app.modal.show(ChangePasswordModal),\r\n })\r\n );\r\n\r\n items.add(\r\n 'changeEmail',\r\n Button.component({\r\n children: app.translator.trans('core.forum.settings.change_email_button'),\r\n className: 'Button',\r\n onclick: () => app.modal.show(ChangeEmailModal),\r\n })\r\n );\r\n\r\n return items;\r\n }\r\n\r\n /**\r\n * Build an item list for the user's notification settings.\r\n */\r\n notificationsItems(): ItemList {\r\n const items = new ItemList();\r\n\r\n items.add('notificationGrid', NotificationGrid.component({ user: this.user }));\r\n\r\n return items;\r\n }\r\n\r\n /**\r\n * Generate a callback that will save a value to the given preference.\r\n */\r\n preferenceSaver(key: string): Function {\r\n return (value, component) => {\r\n if (component) component.loading = true;\r\n m.redraw();\r\n\r\n this.user.savePreferences({ [key]: value }).then(() => {\r\n if (component) component.loading = false;\r\n m.redraw();\r\n });\r\n };\r\n }\r\n\r\n /**\r\n * Build an item list for the user's privacy settings.\r\n */\r\n privacyItems(): ItemList {\r\n const items = new ItemList();\r\n\r\n items.add(\r\n 'discloseOnline',\r\n Switch.component({\r\n children: app.translator.trans('core.forum.settings.privacy_disclose_online_label'),\r\n state: this.user.preferences().discloseOnline,\r\n onchange: (value, component) => this.preferenceSaver('discloseOnline')(value, component),\r\n })\r\n );\r\n\r\n return items;\r\n }\r\n}\r\n","import app from '../app';\r\n\r\nimport Page from './Page';\r\nimport NotificationList from './NotificationList';\r\n\r\n/**\r\n * The `NotificationsPage` component shows the notifications list. It is only\r\n * used on mobile devices where the notifications dropdown is within the drawer.\r\n */\r\nexport default class NotificationsPage extends Page {\r\n list = (<NotificationList />);\r\n\r\n oninit(vnode) {\r\n super.oninit(vnode);\r\n\r\n app.history.push('notifications');\r\n\r\n this.bodyClass = 'App--notifications';\r\n }\r\n\r\n oncreate(vnode) {\r\n super.oncreate(vnode);\r\n\r\n m.redraw();\r\n }\r\n\r\n view() {\r\n return <div className=\"NotificationsPage\">{this.list}</div>;\r\n }\r\n}\r\n","import Application from '../common/Application';\r\nimport History from './utils/History';\r\nimport Pane from './utils/Pane';\r\n\r\nimport Navigation from '../common/components/Navigation';\r\nimport HeaderPrimary from './components/HeaderPrimary';\r\nimport HeaderSecondary from './components/HeaderSecondary';\r\nimport Page from './components/Page';\r\nimport DiscussionList from './components/DiscussionList';\r\nimport CommentPost from './components/CommentPost';\r\nimport DiscussionRenamedPost from './components/DiscussionRenamedPost';\r\n\r\nimport Notification from '../common/models/Notification';\r\n\r\nimport routes from './routes';\r\n\r\nexport default class Forum extends Application {\r\n /**\r\n * The app's history stack, which keeps track of which routes the user visits\r\n * so that they can easily navigate back to the previous route.\r\n */\r\n history: History = new History();\r\n\r\n /**\r\n * {@inheritdoc}\r\n */\r\n cache: {\r\n notifications?: Notification[][];\r\n discussionList?: DiscussionList | null;\r\n [key: string]: any;\r\n } = {};\r\n\r\n postComponents = {\r\n comment: CommentPost,\r\n discussionRenamed: DiscussionRenamedPost,\r\n };\r\n\r\n previous?: Page;\r\n current?: Page;\r\n\r\n pane!: Pane;\r\n\r\n constructor() {\r\n super();\r\n\r\n routes(this);\r\n }\r\n\r\n mount() {\r\n // Get the configured default route and update that route's path to be '/'.\r\n // Push the homepage as the first route, so that the user will always be\r\n // able to click on the 'back' button to go home, regardless of which page\r\n // they started on.\r\n const defaultRoute = this.forum.attribute('defaultRoute');\r\n let defaultAction = 'index';\r\n\r\n for (const i in this.routes) {\r\n if (this.routes[i].path === defaultRoute) defaultAction = i;\r\n }\r\n\r\n this.routes[defaultAction].path = '/';\r\n this.history.push(defaultAction, this.translator.transText('core.forum.header.back_to_index_tooltip'), '/');\r\n\r\n m.mount(document.getElementById('app-navigation'), new Navigation({ className: 'App-backControl', drawer: true }));\r\n m.mount(document.getElementById('header-navigation'), new Navigation());\r\n m.mount(document.getElementById('header-primary'), new HeaderPrimary());\r\n m.mount(document.getElementById('header-secondary'), new HeaderSecondary());\r\n\r\n this.pane = new Pane(document.getElementById('app'));\r\n // this.composer = m.mount(document.getElementById('composer'), Composer.component());\r\n\r\n m.route.prefix = '';\r\n super.mount(this.forum.attribute('basePath'));\r\n\r\n // alertEmailConfirmation(this);\r\n\r\n // Route the home link back home when clicked. We do not want it to register\r\n // if the user is opening it in a new tab, however.\r\n $('#home-link').click((e: MouseEvent) => {\r\n if (e.ctrlKey || e.metaKey || e.which === 2) return;\r\n e.preventDefault();\r\n this.history.home();\r\n\r\n // Reload the current user so that their unread notification count is refreshed.\r\n if (this.session.user) {\r\n this.store.find('users', this.session.user.id());\r\n m.redraw();\r\n }\r\n });\r\n }\r\n}\r\n","import IndexPage from './components/IndexPage';\r\nimport DiscussionPage from './components/DiscussionPage';\r\nimport PostsUserPage from './components/PostsUserPage';\r\nimport DiscussionsUserPage from './components/DiscussionsUserPage';\r\nimport SettingsPage from './components/SettingsPage';\r\nimport NotificationsPage from './components/NotificationsPage';\r\n\r\nimport Discussion from '../common/models/Discussion';\r\nimport Post from '../common/models/Post';\r\nimport User from '../common/models/User';\r\n\r\nexport default (app) => {\r\n app.routes = {\r\n index: { path: '/all', component: IndexPage },\r\n\r\n discussion: { path: '/d/:id', component: DiscussionPage },\r\n 'discussion.near': { path: '/d/:id/:near', component: DiscussionPage },\r\n\r\n user: { path: '/u/:username', component: PostsUserPage },\r\n 'user.posts': { path: '/u/:username', component: PostsUserPage },\r\n 'user.discussions': { path: '/u/:username/discussions', component: DiscussionsUserPage },\r\n\r\n settings: { path: '/settings', component: SettingsPage },\r\n notifications: { path: '/notifications', component: NotificationsPage },\r\n\r\n 'index.filter': { path: '/:filter', component: IndexPage },\r\n };\r\n\r\n /**\r\n * Generate a URL to a discussion.\r\n */\r\n app.route.discussion = (discussion: Discussion, near?: number): string => {\r\n const slug = discussion?.slug();\r\n const hasNear = near && near !== 1;\r\n\r\n return app.route(hasNear ? 'discussion.near' : 'discussion', {\r\n id: discussion.id() + (slug.trim() ? '-' + slug : ''),\r\n near: hasNear && near,\r\n });\r\n };\r\n\r\n /**\r\n * Generate a URL to a post.\r\n */\r\n app.route.post = (post: Post): string => {\r\n return app.route.discussion(post.discussion(), post.number());\r\n };\r\n\r\n /**\r\n * Generate a URL to a user.\r\n */\r\n app.route.user = (user: User): string => {\r\n return app.route('user', {\r\n username: user.username(),\r\n });\r\n };\r\n};\r\n","import Forum from './Forum';\r\n\r\nconst app = new Forum();\r\n\r\n// @ts-ignore\r\nwindow.app = app;\r\n\r\nexport default app;\r\n","import Component, { ComponentProps } from '../Component';\r\nimport icon from '../helpers/icon';\r\n\r\nexport interface SelectProps extends ComponentProps {\r\n /**\r\n * Disabled state for the input.\r\n */\r\n disabled: boolean;\r\n\r\n /**\r\n * A callback to run when the selected value is changed.\r\n */\r\n onchange?: Function;\r\n\r\n /**\r\n * A map of option values to labels.\r\n */\r\n options: {\r\n [key: string]: string;\r\n };\r\n\r\n /**\r\n * The value of the selected option.\r\n */\r\n value: boolean;\r\n}\r\n\r\n/**\r\n * The `Select` component displays a <select> input, surrounded with some extra\r\n * elements for styling.\r\n */\r\nexport default class Select<T extends SelectProps = SelectProps> extends Component<SelectProps> {\r\n view() {\r\n return (\r\n <span className=\"Select\">\r\n <select\r\n className=\"Select-input FormControl\"\r\n disabled={this.props.disabled}\r\n onchange={m.withAttr('value', this.onchange.bind(this))}\r\n value={this.props.value}\r\n >\r\n {Object.keys(this.props.options).map((key: string) => (\r\n <option value={key}>{this.props.options[key]}</option>\r\n ))}\r\n </select>\r\n {icon('fas fa-sort', { className: 'Select-caret' })}\r\n </span>\r\n );\r\n }\r\n\r\n /**\r\n * Run a callback when the state of the checkbox is changed.\r\n */\r\n protected onchange() {\r\n if (this.props.onchange) this.props.onchange(this);\r\n }\r\n}\r\n","import Application from './Application';\r\nimport Component from './Component';\r\nimport * as extend from './extend';\r\nimport Model from './Model';\r\nimport Session from './Session';\r\nimport Store from './Store';\r\nimport Translator from './Translator';\r\n\r\nimport Evented from './utils/Evented';\r\n// import liveHumanTimes from './utils/liveHumanTimes';\r\nimport ItemList from './utils/ItemList';\r\nimport humanTime from './utils/humanTime';\r\nimport computed from './utils/computed';\r\nimport Drawer from './utils/Drawer';\r\nimport anchorScroll from './utils/anchorScroll';\r\nimport RequestError from './utils/RequestError';\r\nimport abbreviateNumber from './utils/abbreviateNumber';\r\nimport * as string from './utils/string';\r\nimport SubtreeRetainer from './utils/SubtreeRetainer';\r\nimport extract from './utils/extract';\r\nimport ScrollListener from './utils/ScrollListener';\r\nimport stringToColor from './utils/stringToColor';\r\nimport patchMithril from './utils/patchMithril';\r\nimport extractText from './utils/extractText';\r\nimport formatNumber from './utils/formatNumber';\r\nimport mapRoutes from './utils/mapRoutes';\r\n\r\nimport Notification from './models/Notification';\r\nimport User from './models/User';\r\nimport Post from './models/Post';\r\nimport Discussion from './models/Discussion';\r\nimport Group from './models/Group';\r\nimport Forum from './models/Forum';\r\n\r\nimport AlertManager from './components/AlertManager';\r\nimport Switch from './components/Switch';\r\nimport Badge from './components/Badge';\r\nimport LoadingIndicator from './components/LoadingIndicator';\r\nimport Placeholder from './components/Placeholder';\r\nimport Separator from './components/Separator';\r\nimport Dropdown from './components/Dropdown';\r\nimport SplitDropdown from './components/SplitDropdown';\r\nimport RequestErrorModal from './components/RequestErrorModal';\r\nimport FieldSet from './components/FieldSet';\r\nimport Select from './components/Select';\r\nimport Navigation from './components/Navigation';\r\nimport Alert from './components/Alert';\r\nimport LinkButton from './components/LinkButton';\r\nimport Checkbox from './components/Checkbox';\r\nimport SelectDropdown from './components/SelectDropdown';\r\nimport ModalManager from './components/ModalManager';\r\nimport Button from './components/Button';\r\nimport Modal from './components/Modal';\r\nimport GroupBadge from './components/GroupBadge';\r\n\r\nimport fullTime from './helpers/fullTime';\r\nimport avatar from './helpers/avatar';\r\nimport icon from './helpers/icon';\r\nimport humanTimeHelper from './helpers/humanTime';\r\n// import punctuateSeries from './helpers/punctuateSeries';\r\nimport highlight from './helpers/highlight';\r\nimport username from './helpers/username';\r\nimport userOnline from './helpers/userOnline';\r\nimport listItems from './helpers/listItems';\r\n\r\nexport default {\r\n Application: Application,\r\n Component: Component,\r\n extend: extend,\r\n Model: Model,\r\n Session: Session,\r\n Store: Store,\r\n Translator: Translator,\r\n\r\n 'utils/Evented': Evented,\r\n // 'utils/liveHumanTimes': liveHumanTimes,\r\n 'utils/ItemList': ItemList,\r\n 'utils/humanTime': humanTime,\r\n 'utils/computed': computed,\r\n 'utils/Drawer': Drawer,\r\n 'utils/anchorScroll': anchorScroll,\r\n 'utils/RequestError': RequestError,\r\n 'utils/abbreviateNumber': abbreviateNumber,\r\n 'utils/string': string,\r\n 'utils/SubtreeRetainer': SubtreeRetainer,\r\n 'utils/extract': extract,\r\n 'utils/ScrollListener': ScrollListener,\r\n 'utils/stringToColor': stringToColor,\r\n 'utils/patchMithril': patchMithril,\r\n 'utils/extractText': extractText,\r\n 'utils/formatNumber': formatNumber,\r\n 'utils/mapRoutes': mapRoutes,\r\n 'models/Notification': Notification,\r\n 'models/User': User,\r\n 'models/Post': Post,\r\n 'models/Discussion': Discussion,\r\n 'models/Group': Group,\r\n 'models/Forum': Forum,\r\n 'components/AlertManager': AlertManager,\r\n 'components/Switch': Switch,\r\n 'components/Badge': Badge,\r\n 'components/LoadingIndicator': LoadingIndicator,\r\n 'components/Placeholder': Placeholder,\r\n 'components/Separator': Separator,\r\n 'components/Dropdown': Dropdown,\r\n 'components/SplitDropdown': SplitDropdown,\r\n 'components/RequestErrorModal': RequestErrorModal,\r\n 'components/FieldSet': FieldSet,\r\n 'components/Select': Select,\r\n 'components/Navigation': Navigation,\r\n 'components/Alert': Alert,\r\n 'components/LinkButton': LinkButton,\r\n 'components/Checkbox': Checkbox,\r\n 'components/SelectDropdown': SelectDropdown,\r\n 'components/ModalManager': ModalManager,\r\n 'components/Button': Button,\r\n 'components/Modal': Modal,\r\n 'components/GroupBadge': GroupBadge,\r\n\r\n 'helpers/fullTime': fullTime,\r\n 'helpers/avatar': avatar,\r\n 'helpers/icon': icon,\r\n 'helpers/humanTime': humanTimeHelper,\r\n // 'helpers/punctuateSeries': punctuateSeries,\r\n 'helpers/highlight': highlight,\r\n 'helpers/username': username,\r\n 'helpers/userOnline': userOnline,\r\n 'helpers/listItems': listItems,\r\n};\r\n","import compat from '../common/compat';\r\n\r\nimport Forum from './Forum';\r\n\r\nimport IndexPage from './components/IndexPage';\r\n\r\nexport default Object.assign(compat, {\r\n 'components/IndexPage': IndexPage,\r\n Forum: Forum,\r\n}) as any;\r\n","import 'expose-loader?ColorThief!colorthief/dist/color-thief.umd';\r\n\r\nimport app from './app';\r\n\r\nexport { app };\r\n\r\n// Export compat API\r\nimport compat from './compat';\r\n\r\ncompat.app = app;\r\n\r\nexport { compat };\r\n"],"sourceRoot":""}