From dfedd585f5d8d1a95b1061163e24b81efd2a9dd1 Mon Sep 17 00:00:00 2001 From: David Sevilla Martin Date: Fri, 31 Jan 2020 17:17:46 -0500 Subject: [PATCH] add prettier config and prettify javascript --- js/admin.ts | 2 +- js/dist/admin.js.map | 2 +- js/dist/forum.js | 2 +- js/dist/forum.js.map | 2 +- js/forum.ts | 2 +- js/package.json | 2 +- js/shims.d.ts | 2 +- js/src/common/Application.ts | 235 ++++---- js/src/common/Bus.ts | 2 +- js/src/common/Component.ts | 12 +- js/src/common/Model.ts | 496 ++++++++--------- js/src/common/Session.ts | 65 +-- js/src/common/Store.ts | 251 ++++----- js/src/common/Translator.ts | 2 +- js/src/common/compat.ts | 4 +- js/src/common/components/Alert.tsx | 65 +-- js/src/common/components/Badge.tsx | 28 +- js/src/common/components/Button.tsx | 82 +-- js/src/common/components/Dropdown.tsx | 175 +++--- js/src/common/components/GroupBadge.ts | 18 +- js/src/common/components/LinkButton.tsx | 40 +- js/src/common/components/LoadingIndicator.tsx | 54 +- js/src/common/components/Modal.tsx | 16 +- js/src/common/components/ModalManager.tsx | 9 +- js/src/common/components/Placeholder.tsx | 4 +- .../common/components/RequestErrorModal.tsx | 24 +- js/src/common/components/SelectDropdown.tsx | 29 +- js/src/common/components/Separator.tsx | 8 +- js/src/common/helpers/avatar.tsx | 42 +- js/src/common/helpers/highlight.ts | 36 +- js/src/common/helpers/icon.tsx | 4 +- js/src/common/helpers/listItems.tsx | 66 +-- js/src/common/helpers/username.tsx | 4 +- js/src/common/models/Discussion.tsx | 136 ++--- js/src/common/models/Forum.ts | 6 +- js/src/common/models/Group.ts | 14 +- js/src/common/models/Notification.ts | 20 +- js/src/common/models/Post.ts | 36 +- js/src/common/models/User.ts | 151 +++--- js/src/common/utils/Drawer.ts | 74 +-- js/src/common/utils/RequestError.ts | 22 +- js/src/common/utils/computed.ts | 43 +- js/src/common/utils/extractText.ts | 14 +- js/src/common/utils/humanTime.ts | 50 +- js/src/common/utils/patchMithril.ts | 13 +- js/src/common/utils/patchZepto.ts | 170 +++--- js/src/common/utils/string.ts | 28 +- js/src/common/utils/stringToColor.ts | 88 +-- js/src/forum/Forum.ts | 134 ++--- js/src/forum/components/AvatarEditor.tsx | 378 ++++++------- js/src/forum/components/CommentPost.tsx | 48 +- .../components/DiscussionsSearchSource.tsx | 80 +-- js/src/forum/components/HeaderPrimary.tsx | 22 +- js/src/forum/components/HeaderSecondary.tsx | 124 +++-- js/src/forum/components/LogInButtons.tsx | 4 +- js/src/forum/components/LogInModal.tsx | 117 ++-- js/src/forum/components/NotificationList.tsx | 337 ++++++------ .../components/NotificationsDropdown.tsx | 120 ++--- js/src/forum/components/Page.tsx | 40 +- js/src/forum/components/Post.tsx | 37 +- js/src/forum/components/PostUser.tsx | 19 +- js/src/forum/components/PostsUserPage.tsx | 228 ++++---- js/src/forum/components/Search.tsx | 506 +++++++++--------- js/src/forum/components/SearchSource.ts | 4 +- js/src/forum/components/SessionDropdown.tsx | 137 ++--- js/src/forum/components/UserCard.tsx | 139 +++-- js/src/forum/components/UserPage.tsx | 270 +++++----- js/src/forum/components/UsersSearchSource.tsx | 80 +-- js/src/forum/utils/History.ts | 156 +++--- js/src/forum/utils/KeyboardNavigatable.ts | 222 ++++---- js/src/forum/utils/PostControls.tsx | 61 ++- js/src/forum/utils/UserControls.ts | 184 ++++--- js/src/forum/utils/affixSidebar.ts | 18 +- js/webpack.config.js | 24 +- 74 files changed, 3132 insertions(+), 3007 deletions(-) diff --git a/js/admin.ts b/js/admin.ts index 9f8151ec6..fd107337a 100644 --- a/js/admin.ts +++ b/js/admin.ts @@ -8,4 +8,4 @@ */ export * from './src/common'; -export * from './src/admin'; \ No newline at end of file +export * from './src/admin'; diff --git a/js/dist/admin.js.map b/js/dist/admin.js.map index f2731e2d9..0705d6553 100644 --- a/js/dist/admin.js.map +++ b/js/dist/admin.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack://@flarum/core/webpack/bootstrap","webpack://@flarum/core/./node_modules/@babel/runtime/helpers/esm/extends.js","webpack://@flarum/core/./src/common/Component.ts","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/./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/utils/patchMithril.ts","webpack://@flarum/core/./src/common/index.ts","webpack://@flarum/core/../../src/utils/debounce.js","webpack://@flarum/core/../../src/utils/isBrowser.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/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/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/includeScroll.js","webpack://@flarum/core/../../src/utils/getFixedPositionOffsetParent.js","webpack://@flarum/core/../../src/utils/getBoundaries.js","webpack://@flarum/core/../../src/utils/getViewportOffsetRectRelativeToArtbitraryNode.js","webpack://@flarum/core/../../src/utils/isFixed.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/./admin.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","_extends","assign","target","arguments","length","source","apply","this","Component","element","props","view","vnode","Error","oninit","setProps","attrs","oncreate","dom","onbeforeupdate","onupdate","onbeforeremove","onremove","$","selector","$element","find","component","children","componentProps","initProps","constructor","g","Function","e","window","Vnode","tag","text","domSize","undefined","state","events","instance","normalize","node","Array","isArray","normalizeChildren","String","input","isKeyed","TypeError","render","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","hyperscriptVnode","selectorParser","selectorCache","hasOwn","isEmpty","hasClass","className","class","newAttrs","execSelector","match","classes","exec","type","id","push","attrValue","join","compileSelector","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","args","destructure","keys","forEach","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","top","getBoundingClientRect","loop","timeCurrent","scrollTo","setAttribute","focus","done","options","scrollY","pageYOffset","document","querySelector","jumper","DEFAULT_OPTIONS","Tooltip","reference","title","allowHtml","tooltipGenerator","tooltipNode","Math","titleNode","functionToCheck","getType","titleText","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","side","css","expr","tagName","hover","leave","on","animatedScrollTop","to","fx","speeds","_default","jump","extend","special","bindBeforeSpecialEvents","eventName","el","specialEvent","_init","originalHandler","$target","trigger","setup","mo","_m","dayjs","relativeTime","localizedFormat","comp","writable","concat","bidi","route","href","Link","withAttr","cb","getAttribute","prop","longerTimeoutBrowsers","timeoutDuration","isBrowser","navigator","called","scheduled","isFunction","getStyleComputedProperty","getParentNode","getScrollParent","overflow","overflowX","overflowY","isIE11","isIE10","isIE","version","getOffsetParent","noOffsetParent","offsetParent","nodeName","getRoot","findCommonOffsetParent","element1","element2","order","Node","end","range","commonAncestorContainer","element1root","getScroll","upperSide","html","getBordersSize","styles","axis","sideA","sideB","parseFloat","getSize","body","computedStyle","getWindowSizes","getComputedStyle","getClientRect","offsets","height","rect","scrollTop","scrollLeft","sizes","width","horizScrollbar","vertScrollbar","getOffsetRectRelativeToArbitraryNode","parent","fixedPosition","runIsIE","isHTML","childrenRect","parentRect","scrollParent","borderTopWidth","borderLeftWidth","marginTop","marginLeft","subtract","modifier","includeScroll","getFixedPositionOffsetParent","getBoundaries","boundaries","left","excludeScroll","relativeOffset","getViewportOffsetRectRelativeToArtbitraryNode","boundariesNode","isFixed","parentNode","isPaddingNumber","padding","computeAutoPlacement","rects","refRect","bottom","sortedAreas","getArea","a","filteredAreas","filter","computedPlacement","variation","getReferenceOffsets","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","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","jsonType","htmlType","blankRE","originAnchor","triggerGlobal","settings","triggerAndReturn","ajaxBeforeSend","xhr","beforeSend","ajaxSuccess","deferred","success","resolveWith","ajaxComplete","ajaxError","rejectWith","status","complete","ajaxStop","appendQuery","parseArguments","dataType","location","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","ms","Q","weekdays","months","pl","date","D","locale","$L","$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","animate","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__","backdrop","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","merge","streams","scan","acc","origin","stream","combine","scanMerge","tuples","seed","tuple","changed","warnedHalt","dependentStreams","dependentFns","_changing","_state","_parents","_map","ignoreInitial","s1","s2","_unregisterChild","childIndex","mappers","endStream","mapper"],"mappings":"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","file":"admin.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 = 143);\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}","import Mithril from 'mithril';\n\nexport type ComponentProps = {\n children?: Mithril.Children,\n\n className?: string;\n\n [key: string]: any;\n}\n\nexport default class Component {\n element: HTMLElement;\n\n props = {};\n\n view(vnode) {\n throw new Error('Component#view must be implemented by subclass');\n }\n\n oninit(vnode) {\n this.setProps(vnode.attrs);\n }\n\n oncreate(vnode) {\n this.setProps(vnode.attrs);\n this.element = vnode.dom;\n }\n\n onbeforeupdate(vnode) {\n this.setProps(vnode.attrs);\n }\n\n onupdate(vnode) {\n this.setProps(vnode.attrs);\n }\n\n onbeforeremove(vnode) {\n this.setProps(vnode.attrs);\n }\n\n onremove(vnode) {\n this.setProps(vnode.attrs);\n }\n\n /**\n * Returns a jQuery object for this component's element. If you pass in a\n * selector string, this method will return a jQuery object, using the current\n * element as its buffer.\n *\n * For example, calling `component.$('li')` will return a jQuery object\n * containing all of the `li` elements inside the DOM element of this\n * component.\n *\n * @param {String} [selector] a jQuery-compatible selector string\n * @returns {jQuery} the jQuery object for the DOM node\n * @final\n */\n $(selector?: string) {\n const $element = $(this.element);\n\n return selector ? $element.find(selector) : $element;\n }\n\n static component(props: ComponentProps|any = {}, children?: Mithril.Children) {\n const componentProps: ComponentProps = Object.assign({}, props);\n\n if (children) componentProps.children = children;\n\n return m(this, componentProps);\n }\n\n static initProps(props: ComponentProps = {}) {}\n\n private setProps(props: T) {\n (this.constructor as typeof Component).initProps(props);\n\n this.props = props;\n }\n}\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","\"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.
\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 () {\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\r\n .on('mouseenter', hover)\r\n .on('mouseleave', leave || hover);\r\n};\r\n\r\n// add animated scroll\r\n$.fn.animatedScrollTop = 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// 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// @ts-ignore\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\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\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 m from 'mithril';\nimport prop from 'mithril/stream';\n\nimport Component from '../Component';\n\nexport default () => {\n const mo = window['m'];\n\n const _m = function (comp, ...args) {\n if (!arguments[1]) arguments[1] = {};\n\n if (comp.prototype && comp.prototype instanceof Component) {\n let children = args.slice(1);\n if (children.length === 1 && Array.isArray(children[0])) {\n children = children[0];\n }\n\n if (children) {\n Object.defineProperty(arguments[1], 'children', {\n writable: true,\n });\n\n arguments[1].children = (arguments[1].children || []).concat(children);\n }\n }\n\n const node = mo.apply(this, arguments);\n\n if (!node.attrs) node.attrs = {};\n\n if (node.attrs.bidi) {\n m.bidi(node, node.attrs.bidi);\n }\n\n if (node.attrs.route) {\n node.attrs.href = node.attrs.route;\n node.attrs.tag = m.route.Link;\n\n delete node.attrs.route;\n }\n\n return node;\n };\n\n Object.keys(mo).forEach(key => _m[key] = mo[key]);\n\n _m.withAttr = (key: string, cb: Function) => function () {\n cb(this.getAttribute(key) || this[key]);\n };\n\n _m.prop = prop;\n\n window['m'] = _m;\n}\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","import isBrowser from './isBrowser';\n\nconst longerTimeoutBrowsers = ['Edge', 'Trident', 'Firefox'];\nlet timeoutDuration = 0;\nfor (let i = 0; i < longerTimeoutBrowsers.length; i += 1) {\n if (isBrowser && navigator.userAgent.indexOf(longerTimeoutBrowsers[i]) >= 0) {\n timeoutDuration = 1;\n break;\n }\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","export default typeof window !== 'undefined' && typeof document !== 'undefined';\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","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","/*\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`], 10) +\n parseFloat(styles[`border${sideB}Width`], 10)\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.right - result.left;\n const height =\n sizes.height || element.clientHeight || result.bottom - result.top;\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, 10);\n const borderLeftWidth = parseFloat(styles.borderLeftWidth, 10);\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, 10);\n const marginLeft = parseFloat(styles.marginLeft, 10);\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 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","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 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, 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 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 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';\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, 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.
\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 explicity 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 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.
\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.
\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.
\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.
\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.
\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.
\n * It will read the variation of the `placement` property.
\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.
\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.
\n * The latter is a deprecated method because it leads to confusion and will be\n * removed in v2.
\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.
\n * We can say it has \"escaped the boundaries\" — or just \"escaped\".
\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.
\n * These can be overridden using the `options` argument of Popper.js.
\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.
\n * By default, it is set to no-op.
\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.
\n * By default, it is set to no-op.
\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}`], 10);\n const popperBorderSide = parseFloat(css[`border${sideCapitalized}Width`], 10);\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=n.$locale().relativeTime,a=[{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\"}],f=a.length,s=0;s0&&(l=a[s-1]),i=u[l.l].replace(\"%d\",h);break}}return t?i:(d>0?u.future:u.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>\")\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>/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 $('
').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\",a=\"quarter\",o=\"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:o,w:s,d:i,h:r,m:e,s:n,ms:t,Q:a}[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||(l=r),r},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})};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) 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 = \"ij\"\n\t\t// console.log(div.innerHTML)\n\t\t// --> \"ij\", no 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 = \"\" + vnode.children + \"\"\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.3\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>>0;if(\"function\"!=typeof t)throw new TypeError(t+\" is not a function\");for(1 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","/*\r\n * This file is part of Flarum.\r\n *\r\n * (c) Toby Zerner \r\n *\r\n * For the full copyright and license information, please view the LICENSE\r\n * file that was distributed with this source code.\r\n */\r\n\r\nexport * from './src/common';\r\nexport * from './src/admin';"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack://@flarum/core/webpack/bootstrap","webpack://@flarum/core/./node_modules/@babel/runtime/helpers/esm/extends.js","webpack://@flarum/core/./src/common/Component.ts","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/./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/utils/patchMithril.ts","webpack://@flarum/core/./src/common/index.ts","webpack://@flarum/core/../../src/utils/debounce.js","webpack://@flarum/core/../../src/utils/isBrowser.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/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/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/includeScroll.js","webpack://@flarum/core/../../src/utils/getFixedPositionOffsetParent.js","webpack://@flarum/core/../../src/utils/getBoundaries.js","webpack://@flarum/core/../../src/utils/getViewportOffsetRectRelativeToArtbitraryNode.js","webpack://@flarum/core/../../src/utils/isFixed.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/./admin.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","_extends","assign","target","arguments","length","source","apply","this","Component","element","props","view","vnode","Error","oninit","setProps","attrs","oncreate","dom","onbeforeupdate","onupdate","onbeforeremove","onremove","$","selector","$element","find","component","children","componentProps","initProps","constructor","g","Function","e","window","Vnode","tag","text","domSize","undefined","state","events","instance","normalize","node","Array","isArray","normalizeChildren","String","input","isKeyed","TypeError","render","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","hyperscriptVnode","selectorParser","selectorCache","hasOwn","isEmpty","hasClass","className","class","newAttrs","execSelector","match","classes","exec","type","id","push","attrValue","join","compileSelector","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","args","destructure","keys","forEach","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","top","getBoundingClientRect","loop","timeCurrent","scrollTo","setAttribute","focus","done","options","scrollY","pageYOffset","document","querySelector","jumper","DEFAULT_OPTIONS","Tooltip","reference","title","allowHtml","tooltipGenerator","tooltipNode","Math","titleNode","functionToCheck","getType","titleText","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","animatedScrollTop","to","fx","speeds","_default","jump","extend","special","bindBeforeSpecialEvents","eventName","el","specialEvent","_init","originalHandler","$target","trigger","setup","mo","_m","dayjs","relativeTime","localizedFormat","comp","writable","concat","bidi","route","href","Link","withAttr","cb","getAttribute","prop","longerTimeoutBrowsers","timeoutDuration","isBrowser","navigator","called","scheduled","isFunction","getStyleComputedProperty","getParentNode","getScrollParent","overflow","overflowX","overflowY","isIE11","isIE10","isIE","version","getOffsetParent","noOffsetParent","offsetParent","nodeName","getRoot","findCommonOffsetParent","element1","element2","order","Node","end","range","commonAncestorContainer","element1root","getScroll","upperSide","html","getBordersSize","styles","axis","sideA","sideB","parseFloat","getSize","body","computedStyle","getWindowSizes","getComputedStyle","getClientRect","offsets","rect","scrollTop","scrollLeft","sizes","horizScrollbar","vertScrollbar","getOffsetRectRelativeToArbitraryNode","parent","fixedPosition","runIsIE","isHTML","childrenRect","parentRect","scrollParent","borderTopWidth","borderLeftWidth","marginTop","marginLeft","subtract","modifier","includeScroll","getFixedPositionOffsetParent","getBoundaries","boundaries","left","excludeScroll","relativeOffset","getViewportOffsetRectRelativeToArtbitraryNode","boundariesNode","isFixed","parentNode","isPaddingNumber","padding","computeAutoPlacement","rects","refRect","bottom","sortedAreas","getArea","a","filteredAreas","filter","computedPlacement","variation","getReferenceOffsets","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","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","jsonType","htmlType","blankRE","originAnchor","triggerGlobal","settings","triggerAndReturn","ajaxBeforeSend","xhr","beforeSend","ajaxSuccess","deferred","success","resolveWith","ajaxComplete","ajaxError","rejectWith","status","complete","ajaxStop","appendQuery","parseArguments","dataType","location","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","ms","Q","weekdays","months","pl","date","D","locale","$L","$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","animate","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__","backdrop","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","merge","streams","scan","acc","origin","stream","combine","scanMerge","tuples","seed","tuple","changed","warnedHalt","dependentStreams","dependentFns","_changing","_state","_parents","_map","ignoreInitial","s1","s2","_unregisterChild","childIndex","mappers","endStream","mapper"],"mappings":"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","file":"admin.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 = 143);\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}","import Mithril from 'mithril';\n\nexport type ComponentProps = {\n children?: Mithril.Children;\n\n className?: string;\n\n [key: string]: any;\n};\n\nexport default class Component {\n element: HTMLElement;\n\n props = {};\n\n view(vnode) {\n throw new Error('Component#view must be implemented by subclass');\n }\n\n oninit(vnode) {\n this.setProps(vnode.attrs);\n }\n\n oncreate(vnode) {\n this.setProps(vnode.attrs);\n this.element = vnode.dom;\n }\n\n onbeforeupdate(vnode) {\n this.setProps(vnode.attrs);\n }\n\n onupdate(vnode) {\n this.setProps(vnode.attrs);\n }\n\n onbeforeremove(vnode) {\n this.setProps(vnode.attrs);\n }\n\n onremove(vnode) {\n this.setProps(vnode.attrs);\n }\n\n /**\n * Returns a jQuery object for this component's element. If you pass in a\n * selector string, this method will return a jQuery object, using the current\n * element as its buffer.\n *\n * For example, calling `component.$('li')` will return a jQuery object\n * containing all of the `li` elements inside the DOM element of this\n * component.\n *\n * @param selector a jQuery-compatible selector string\n * @final\n */\n $(selector?: string): ZeptoCollection {\n const $element = $(this.element);\n\n return selector ? $element.find(selector) : $element;\n }\n\n static component(props: ComponentProps | any = {}, children?: Mithril.Children) {\n const componentProps: ComponentProps = Object.assign({}, props);\n\n if (children) componentProps.children = children;\n\n return m(this, componentProps);\n }\n\n static initProps(props: ComponentProps = {}) {}\n\n private setProps(props: T) {\n (this.constructor as typeof Component).initProps(props);\n\n this.props = props;\n }\n}\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","\"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.
\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';\nimport Tooltip from 'tooltip.js';\n\n// add $.fn.tooltip\n$.fn.tooltip = function(option) {\n return this.each(function() {\n const $this = $(this);\n let data = $this.data('bs.tooltip');\n const options = (typeof option === 'object' && option) || {};\n\n if ($this.attr('title')) {\n options.title = $this.attr('title');\n $this.removeAttr('title');\n $this.attr('data-original-title', options.title);\n }\n\n if (option === 'destroy') option = 'dispose';\n\n if (!data && ['dispose', 'hide'].includes(option)) return;\n\n if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options)));\n if (typeof option === 'string' && data[option]) data[option]();\n });\n};\n\n// add $.fn.outerWidth and $.fn.outerHeight\n['width', 'height'].forEach(function(dimension) {\n const Dimension = dimension.replace(/./, function(m) {\n return m[0].toUpperCase();\n });\n\n $.fn[`outer${Dimension}`] = function(margin) {\n const elem = this;\n\n if (elem) {\n const sides = { width: ['left', 'right'], height: ['top', 'bottom'] };\n let size = elem[dimension]();\n\n sides[dimension].forEach(function(side) {\n if (margin) size += parseInt(elem.css('margin-' + side), 10);\n });\n\n return size;\n } else {\n return null;\n }\n };\n});\n\n// allow use of $(':input')\n// @ts-ignore\n$.expr[':']['input'] = function() {\n if ('disabled' in this || ['INPUT', 'SELECT', 'TEXTAREA', 'BUTTON'].includes(this.tagName)) return this;\n};\n\n// add $().hover() method\n$.fn.hover = function(hover, leave) {\n return this.on('mouseenter', hover).on('mouseleave', leave || hover);\n};\n\n// add animated scroll\n$.fn.animatedScrollTop = function(to, duration = $.fx.speeds._default, callback) {\n if (typeof to === 'number') to -= window.scrollY || window.pageYOffset;\n\n jump(to, {\n duration: $.fx.speeds[duration] || duration,\n callback,\n });\n\n return this;\n};\n\n// required for compatibility with jquery plugins\n// ex: bootstrap plugins\n$.fn.extend = $.extend.bind($);\n\n/**\n * Enable special events on Zepto\n * @license Original Copyright 2013 Enideo. Released under dual MIT and GPL licenses.\n */\n// @ts-ignore\n$.event.special = $.event.special || {};\n\nconst bindBeforeSpecialEvents = $.fn.bind;\n\n$.fn.bind = function(eventName, data, callback) {\n const el = this;\n\n if (!callback) {\n callback = data;\n data = null;\n }\n\n $.each(eventName.split(/\\s/), (key: string, value: any): boolean => {\n value = value.split(/\\./)[0];\n\n if (value in $.event.special) {\n let specialEvent = $.event.special[value];\n\n /// init enable special events on Zepto\n if (!specialEvent._init) {\n specialEvent._init = true;\n\n /// intercept and replace the special event handler to add functionality\n specialEvent.originalHandler = specialEvent.handler;\n specialEvent.handler = function() {\n /// make event argument writable, like on jQuery\n const args = Array.prototype.slice.call(arguments);\n\n args[0] = $.extend({}, args[0]);\n\n /// define the event handle, $.event.dispatch is only for newer versions of jQuery\n $.event.handle = function() {\n /// make context of trigger the event element\n const args = Array.prototype.slice.call(arguments);\n const event = args[0];\n const $target = $(event.target);\n\n $target.trigger.apply($target, arguments);\n };\n\n specialEvent.originalHandler.apply(this, args);\n };\n }\n\n /// setup special events on Zepto\n specialEvent.setup.apply(el, [data]);\n }\n\n return true;\n });\n\n return bindBeforeSpecialEvents.apply(this, [eventName, callback]);\n};\n","import m from 'mithril';\nimport prop from 'mithril/stream';\n\nimport Component from '../Component';\n\nexport default () => {\n const mo = window['m'];\n\n const _m = function(comp, ...args) {\n if (!arguments[1]) arguments[1] = {};\n\n if (comp.prototype && comp.prototype instanceof Component) {\n let children = args.slice(1);\n if (children.length === 1 && Array.isArray(children[0])) {\n children = children[0];\n }\n\n if (children) {\n Object.defineProperty(arguments[1], 'children', {\n writable: true,\n });\n\n arguments[1].children = (arguments[1].children || []).concat(children);\n }\n }\n\n const node = mo.apply(this, arguments);\n\n if (!node.attrs) node.attrs = {};\n\n if (node.attrs.bidi) {\n m.bidi(node, node.attrs.bidi);\n }\n\n if (node.attrs.route) {\n node.attrs.href = node.attrs.route;\n node.attrs.tag = m.route.Link;\n\n delete node.attrs.route;\n }\n\n return node;\n };\n\n Object.keys(mo).forEach(key => (_m[key] = mo[key]));\n\n _m.withAttr = (key: string, cb: Function) =>\n function() {\n cb(this.getAttribute(key) || this[key]);\n };\n\n _m.prop = prop;\n\n window['m'] = _m;\n};\n","import 'expose-loader?jQuery!zepto';\nimport 'expose-loader?moment!expose-loader?dayjs!dayjs';\nimport 'expose-loader?m!mithril';\nimport 'expose-loader?m.bidi!m.attrs.bidi';\nimport 'expose-loader?Mousetrap!mousetrap';\nimport 'expose-loader?classNames!classNames';\n\nimport 'zepto/src/selector';\nimport 'zepto/src/data';\nimport 'zepto/src/fx';\nimport 'zepto/src/fx_methods';\n\nimport './utils/patchZepto';\n\nimport 'hc-sticky';\nimport 'bootstrap/js/dropdown';\nimport 'bootstrap/js/transition';\n\nimport relativeTime from 'dayjs/plugin/relativeTime';\nimport localizedFormat from 'dayjs/plugin/localizedFormat';\n\ndayjs.extend(relativeTime);\ndayjs.extend(localizedFormat);\n\nimport patchMithril from './utils/patchMithril';\n\npatchMithril();\n\n// import * as Extend from './extend/index';\n\n// export { Extend };\n","import isBrowser from './isBrowser';\n\nconst longerTimeoutBrowsers = ['Edge', 'Trident', 'Firefox'];\nlet timeoutDuration = 0;\nfor (let i = 0; i < longerTimeoutBrowsers.length; i += 1) {\n if (isBrowser && navigator.userAgent.indexOf(longerTimeoutBrowsers[i]) >= 0) {\n timeoutDuration = 1;\n break;\n }\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","export default typeof window !== 'undefined' && typeof document !== 'undefined';\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","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","/*\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`], 10) +\n parseFloat(styles[`border${sideB}Width`], 10)\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.right - result.left;\n const height =\n sizes.height || element.clientHeight || result.bottom - result.top;\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, 10);\n const borderLeftWidth = parseFloat(styles.borderLeftWidth, 10);\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, 10);\n const marginLeft = parseFloat(styles.marginLeft, 10);\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 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","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 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, 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 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 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';\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, 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.
\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 explicity 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 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.
\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.
\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.
\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.
\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.
\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.
\n * It will read the variation of the `placement` property.
\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.
\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.
\n * The latter is a deprecated method because it leads to confusion and will be\n * removed in v2.
\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.
\n * We can say it has \"escaped the boundaries\" — or just \"escaped\".
\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.
\n * These can be overridden using the `options` argument of Popper.js.
\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.
\n * By default, it is set to no-op.
\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.
\n * By default, it is set to no-op.
\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}`], 10);\n const popperBorderSide = parseFloat(css[`border${sideCapitalized}Width`], 10);\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=n.$locale().relativeTime,a=[{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\"}],f=a.length,s=0;s0&&(l=a[s-1]),i=u[l.l].replace(\"%d\",h);break}}return t?i:(d>0?u.future:u.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>\")\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>/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 $('
').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\",a=\"quarter\",o=\"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:o,w:s,d:i,h:r,m:e,s:n,ms:t,Q:a}[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||(l=r),r},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})};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) 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 = \"ij\"\n\t\t// console.log(div.innerHTML)\n\t\t// --> \"ij\", no 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 = \"\" + vnode.children + \"\"\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.3\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>>0;if(\"function\"!=typeof t)throw new TypeError(t+\" is not a function\");for(1 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","/*\n * This file is part of Flarum.\n *\n * (c) Toby Zerner \n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nexport * from './src/common';\nexport * from './src/admin';\n"],"sourceRoot":""} \ No newline at end of file diff --git a/js/dist/forum.js b/js/dist/forum.js index 0f6291042..b690c29d9 100644 --- a/js/dist/forum.js +++ b/js/dist/forum.js @@ -68,5 +68,5 @@ var n="undefined"!=typeof window&&"undefined"!=typeof document,r=["Edge","Triden * Plugin URL: https://github.com/somewebmedia/hc-sticky * Description: Cross-browser plugin that makes any element on your page visible while you scroll * License: MIT - */!function(e,r){if("object"==typeof t.exports){if(!e.document)throw new Error("HC-Sticky requires a browser to run.");t.exports=r(e)}else"function"==typeof define&&n(60)?define("hcSticky",[],r(e)):r(e)}("undefined"!=typeof window?window:void 0,(function(t){var n={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"},r=function(t,e,n){console.log("%c! HC Sticky:%c "+t+"%c "+n+" is now deprecated and will be removed. Use%c "+e+"%c instead.","color: red","color: darkviolet","color: black","color: darkviolet","color: black")},o=t.document,i=function i(a,s){var c=this;if("string"==typeof a&&(a=o.querySelector(a)),!a)return!1;s.queries&&r("queries","responsive","option"),s.queryFlow&&r("queryFlow","mobileFirst","option");var u={},l=i.Helpers,f=a.parentNode;"static"===l.getStyle(f,"position")&&(f.style.position="relative");var p=function(){var t=0>>0;if("function"!=typeof t)throw new TypeError(t+" is not a function");for(10&&c--,40==e.which&&c-1&&(e=t[o][1](e,n()))})),e}),n);return o(e),o},n["fantasy-land/of"]=n;var e=!1;function n(t){var e,o=[],a=[];function s(e){return arguments.length&&e!==n.SKIP&&(t=e,i(s)&&(s._changing(),s._state="active",o.forEach((function(e,n){e(a[n](t))})))),t}return s.constructor=n,s._state=arguments.length&&t!==n.SKIP?"active":"pending",s._parents=[],s._changing=function(){i(s)&&(s._state="changing"),o.forEach((function(t){t._changing()}))},s._map=function(e,r){var i=r?n():n(e(t));return i._parents.push(s),o.push(i),a.push(e),i},s.map=function(t){return s._map(t,"active"!==s._state)},s.toJSON=function(){return null!=t&&"function"==typeof t.toJSON?t.toJSON():t},s["fantasy-land/map"]=s.map,s["fantasy-land/ap"]=function(t){return r((function(t,e){return t()(e())}),[t,s])},s._unregisterChild=function(t){var e=o.indexOf(t);-1!==e&&(o.splice(e,1),a.splice(e,1))},Object.defineProperty(s,"end",{get:function(){return e||((e=n()).map((function(t){return!0===t&&(s._parents.forEach((function(t){t._unregisterChild(s)})),s._state="ended",s._parents.length=o.length=a.length=0),t})),e)}}),s}function r(t,e){var r=e.every((function(t){if(t.constructor!==n)throw new Error("Ensure that each item passed to stream.combine/stream.merge/lift is a stream");return"active"===t._state})),o=r?n(t.apply(null,e.concat([e]))):n(),i=[],a=e.map((function(n){return n._map((function(a){return i.push(n),(r||e.every((function(t){return"pending"!==t._state})))&&(r=!0,o(t.apply(null,e.concat([i]))),i=[]),a}),!0)})),s=o.end.map((function(t){!0===t&&(a.forEach((function(t){t.end(!0)})),s.end(!0))}));return o}function o(t){return r((function(){return t.map((function(t){return t()}))}),t)}function i(t){return"pending"===t._state||"active"===t._state||"changing"===t._state}Object.defineProperty(n,"HALT",{get:function(){return e||console.log("HALT is deprecated and has been renamed to SKIP"),e=!0,n.SKIP}}),t.exports=n}()},function(t,e,n){var r=n(24).Symbol;t.exports=r},function(t,e){t.exports=function(t){var e=typeof t;return null!=t&&("object"==e||"function"==e)}},function(t,e,n){var r=n(23),o=n(25),i="[object Symbol]";t.exports=function(t){return"symbol"==typeof t||o(t)&&r(t)==i}},function(t,e,n){var r=n(115),o=n(119);t.exports=function(t,e){var n=o(t,e);return r(n)?n:void 0}},function(t,e,n){(function(e){var n="object"==typeof e&&e&&e.Object===Object&&e;t.exports=n}).call(this,n(2))},function(t,e){t.exports=function(t){return t.webpackPolyfill||(t.deprecate=function(){},t.paths=[],t.children||(t.children=[]),Object.defineProperty(t,"loaded",{enumerable:!0,get:function(){return t.l}}),Object.defineProperty(t,"id",{enumerable:!0,get:function(){return t.i}}),t.webpackPolyfill=1),t}},function(t,e){var n=9007199254740991,r=/^(?:0|[1-9]\d*)$/;t.exports=function(t,e){var o=typeof t;return!!(e=null==e?n:e)&&("number"==o||"symbol"!=o&&r.test(t))&&t>-1&&t%1==0&&t-1&&t%1==0&&t<=n}},function(t,e,n){var r=n(73),o=n(71);t.exports=function(t){return null!=t&&o(t.length)&&!r(t)}},function(t,e,n){var r=n(23),o=n(65),i="[object AsyncFunction]",a="[object Function]",s="[object GeneratorFunction]",c="[object Proxy]";t.exports=function(t){if(!o(t))return!1;var e=r(t);return e==a||e==s||e==i||e==c}},function(t,e,n){var r=n(17),o=n(107),i=n(108),a=n(136);t.exports=function(t,e){return r(t)?t:o(t,e)?[t]:i(a(t))}},function(t,e){t.exports=function(t,e){return t===e||t!=t&&e!=e}},function(t,e,n){var r=n(66),o=1/0;t.exports=function(t){if("string"==typeof t||r(t))return t;var e=t+"";return"0"==e&&1/t==-o?"-0":e}},,function(t,e,n){var r=n(81),o=n(82),i=n(104),a=n(17);t.exports=function(t,e){return(a(t)?r:o)(t,i(e))}},function(t,e,n){var r=n(106);t.exports=function(t,e,n){var o=null==t?void 0:r(t,e);return void 0===o?n:o}},function(t,e,n){var r=n(139);t.exports=function(t,e,n){return null==t?t:r(t,e,n)}},function(t,e){t.exports=function(t,e){for(var n=-1,r=null==t?0:t.length;++n-1}},function(t,e,n){var r=n(27);t.exports=function(t,e){var n=this.__data__,o=r(n,t);return o<0?(++this.size,n.push([t,e])):n[o][1]=e,this}},function(t,e,n){var r=n(67)(n(24),"Map");t.exports=r},function(t,e,n){var r=n(28);t.exports=function(t){var e=r(this,t).delete(t);return this.size-=e?1:0,e}},function(t,e){t.exports=function(t){var e=typeof t;return"string"==e||"number"==e||"symbol"==e||"boolean"==e?"__proto__"!==t:null===t}},function(t,e,n){var r=n(28);t.exports=function(t){return r(this,t).get(t)}},function(t,e,n){var r=n(28);t.exports=function(t){return r(this,t).has(t)}},function(t,e,n){var r=n(28);t.exports=function(t,e){var n=r(this,t),o=n.size;return n.set(t,e),this.size+=n.size==o?0:1,this}},function(t,e,n){var r=n(137);t.exports=function(t){return null==t?"":r(t)}},function(t,e,n){var r=n(64),o=n(138),i=n(17),a=n(66),s=1/0,c=r?r.prototype:void 0,u=c?c.toString:void 0;t.exports=function t(e){if("string"==typeof e)return e;if(i(e))return o(e,t)+"";if(a(e))return u?u.call(e):"";var n=e+"";return"0"==n&&1/e==-s?"-0":n}},function(t,e){t.exports=function(t,e){for(var n=-1,r=null==t?0:t.length,o=Array(r);++n)","gi")),o=[],i=[o];return r.forEach((function(t){var n=t.match(new RegExp("{([a-z0-9_]+)}|<(/?)([a-z0-9_]+)>","i"));if(n){if(n[1])i[0].push(e[n[1]]);else if(n[3])if(n[2])i.shift();else{var r=e[n[3]]||{tag:n[3],children:[]};i[0].push(r),i.unshift(r.children||r)}}else i[0].push({tag:"span",text:t})})),o.filter((function(t){return t}))},t}(),y=function(){function t(t,e){this.user=void 0,this.csrfToken=void 0,this.user=t,this.csrfToken=e}var e=t.prototype;return e.login=function(t,e){return void 0===e&&(e={}),app.request(Object(i.a)({method:"POST",url:app.forum.attribute("baseUrl")+"/login",body:t},e))},e.logout=function(){window.location.href=app.forum.attribute("baseUrl")+"/logout?token="+this.csrfToken},t}(),b=function(){function t(t){this.data={},this.models=void 0,this.models=t}var e=t.prototype;return e.pushPayload=function(t){t.included&&t.included.map(this.pushObject.bind(this));var e=t.data instanceof Array?t.data.map(this.pushObject.bind(this)):this.pushObject(t.data);return e.payload=t,e},e.pushObject=function(t){if(!this.models[t.type])return null;var e=this.data[t.type]=this.data[t.type]||{};return e[t.id]?e[t.id].pushData(t):e[t.id]=this.createRecord(t.type,t),e[t.id].exists=!0,e[t.id]},e.find=function(t,e,n,r){void 0===n&&(n={}),void 0===r&&(r={});var o=n,a=app.forum.attribute("apiUrl")+"/"+t;return e instanceof Array?a+="?filter[id]="+e.join(","):"object"==typeof e?o=e:e&&(a+="/"+e),app.request(Object(i.a)({method:"GET",url:a,body:o},r)).then(this.pushPayload.bind(this))},e.getById=function(t,e){return this.data[t]&&this.data[t][e]},e.getBy=function(t,e,n){return this.all(t).filter((function(t){return t[e]()===n}))[0]},e.all=function(t){var e=this.data[t];return e?Object.keys(e).map((function(t){return e[t]})):[]},e.remove=function(t){delete this.data[t.data.type][t.id()]},e.createRecord=function(t,e){return void 0===e&&(e={}),e.type=e.type||t,new this.models[t](e,this)},t}();function w(t,e,n){var r=t[e];t[e]=function(){for(var e=arguments.length,o=new Array(e),i=0;i").addClass("drawer-backdrop fade").appendTo("body").click((function(){return t.hide()})),setTimeout((function(){return t.$backdrop.addClass("in")}))},t}(),N=function(t,e,n,r){this.status=void 0,this.responseText=void 0,this.options=void 0,this.xhr=void 0,this.response=void 0,this.alert=void 0,this.status=t,this.responseText=e,this.options=n,this.xhr=r;try{this.response=JSON.parse(e)}catch(t){this.response=null}this.alert=null},E=function(){function t(t,e){void 0===t&&(t={}),void 0===e&&(e=null),this.data=void 0,this.freshness=void 0,this.exists=void 0,this.store=void 0,this.data=t,this.store=e,this.freshness=new Date,this.exists=!1}var e=t.prototype;return e.id=function(){return this.data.id},e.attribute=function(t){return this.data.attributes[t]},e.pushData=function(e){for(var n in e)if("object"==typeof e[n])for(var r in this.data[n]=this.data[n]||{},e[n])e[n][r]instanceof t&&(e[n][r]={data:t.getIdentifier(e[n][r])}),this.data[n][r]=e[n][r];else this.data[n]=e[n];this.freshness=new Date},e.pushAttributes=function(t){this.pushData({attributes:t})},e.save=function(e,n){var r=this;void 0===n&&(n={});var o={type:this.data.type,id:this.data.id,attributes:e,relationships:void 0};if(e.relationships){for(var a in o.relationships={},e.relationships){var s=e.relationships[a];o.relationships[a]={data:s instanceof Array?s.map(t.getIdentifier):t.getIdentifier(s)}}delete e.relationships}var c=this.copyData();this.pushData(o);var u={data:o};return n.meta&&(u.meta=n.meta),app.request(Object(i.a)({method:this.exists?"PATCH":"POST",url:app.forum.attribute("apiUrl")+this.apiEndpoint(),body:u},n)).then((function(t){return r.store.data[t.data.type]=r.store.data[t.data.type]||{},r.store.data[t.data.type][t.data.id]=r,r.store.pushPayload(t)}),(function(t){throw r.pushData(c),m.redraw(),t}))},e.delete=function(t,e){var n=this;return void 0===t&&(t={}),void 0===e&&(e={}),this.exists?app.request(Object(i.a)({method:"DELETE",url:app.forum.attribute("apiUrl")+this.apiEndpoint(),body:t},e)).then((function(){n.exists=!1,n.store.remove(n)})):Promise.resolve()},e.apiEndpoint=function(){return"/"+this.data.type+(this.exists?"/"+this.data.id:"")},e.copyData=function(){return JSON.parse(JSON.stringify(this.data))},t.attribute=function(t,e){return function(){var n=this.data.attributes&&this.data.attributes[t];return e?e(n):n}},t.hasOne=function(t){return function(){if(this.data.relationships){var e=this.data.relationships[t];if(e)return app.store.getById(e.data.type,e.data.id)}return!1}},t.hasMany=function(t){return function(){if(this.data.relationships){var e=this.data.relationships[t];if(e)return e.data.map((function(t){return app.store.getById(t.type,t.id)}))}return!1}},t.transformDate=function(t){return t?new Date(t):null},t.getIdentifier=function(t){return{type:t.data.type,id:t.data.id}},t}(),C=function(t){function e(){return t.apply(this,arguments)||this}return o(e,t),e.prototype.apiEndpoint=function(){return"/"},e}(E);function T(t,e){var n,r=Array.from(t),o={};return function(){var t=this,i=!1;return r.forEach((function(e){var n="function"==typeof t[e]?t[e]():t[e];o[e]!==n&&(i=!0,o[e]=n)})),i&&(n=e.apply(this,r.map((function(t){return o[t]})))),n}}var O=function(t,e){this.content=void 0,this.priority=void 0,this.key=0,this.content=t,this.priority=e},_=function(){function t(){this.items={}}var e=t.prototype;return e.isEmpty=function(){for(var t in this.items)if(this.items.hasOwnProperty(t))return!1;return!0},e.has=function(t){return!!this.items[t]},e.get=function(t){var e;return null===(e=this.items[t])||void 0===e?void 0:e.content},e.add=function(t,e,n){return void 0===n&&(n=0),this.items[t]=new O(e,n),this},e.toArray=function(){var t=[];for(var e in this.items)this.items.hasOwnProperty(e)&&null!==this.items[e]&&this.items[e]instanceof O&&(this.items[e].content=Object(this.items[e].content),this.items[e].content.itemName=e,t.push(this.items[e]),this.items[e].key=t.length);return t.sort((function(t,e){return t.priority===e.priority?t.key-e.key:t.priority>e.priority?-1:1})).map((function(t){return t.content}))},t}(),S=n(1);function A(t,e){return void 0===e&&(e={}),e.className="icon "+t+" "+(e.className||""),m("i",e)}var j=function(t){function e(){return t.apply(this,arguments)||this}o(e,t);var n=e.prototype;return n.view=function(t){var e=t.attrs,n=d(e,"type"),r=d(e,"icon");return e.className="Badge "+(n?"Badge--"+n:"")+" "+(e.className||""),e.title=d(e,"label")||"",m("span",e,r?A(r,{className:"Badge-icon"}):m.trust(" "))},n.oncreate=function(e){t.prototype.oncreate.call(this,e),this.props.label&&this.$().tooltip({container:"body"})},e}(S.a),P=function(t){function e(){for(var e,n=arguments.length,r=new Array(n),o=0;odayjs().subtract(5,"minutes").toDate()},n.badges=function(){var t=new _,e=this.groups();return e&&e.forEach((function(e){t.add("group"+e.id(),D.component({group:e}))})),t},n.calculateAvatarColor=function(){var t=new Image,e=this;t.onload=function(){var t=new ColorThief;e.avatarColor=t.getColor(this),e.freshness=new Date,m.redraw()},t.crossOrigin="anonymous",t.src=this.avatarUrl()},n.savePreferences=function(t){var e=this.preferences();return Object(i.a)(e,t),this.save({preferences:e})},e}(E);function I(t){var e=t.replace(/(<\/p>|
)/g,"$1  ").replace(/]*>/gi," "),n=$("
").html(e);return n.find(I.removeSelectors.join(",")).remove(),n.text().replace(/\s+/g," ").trim()}I.removeSelectors=["blockquote","script"];var B=function(t){function e(){for(var e,n=arguments.length,r=new Array(n),o=0;o=0||(o[n]=t[n]);return o}(e,["children"]);r.className=r.className||"",r.type=r.type||"button",r.title&&!this.props.children&&(r["aria-label"]=r.title),!r.title&&this.props.children&&(r.title=h(this.props.children));var o=d(r,"icon");o&&(r.className+=" hasIcon");var i=d(r,"loading");return(r.disabled||i)&&(r.className+=" "+classNames("disabled",i&&"loading"),delete r.onclick),m("button",r,this.getButtonContent(o,r.loading,n))},n.getButtonContent=function(t,e,n){return[t&&!0!==t?A(t,{className:"Button-icon"}):"",n?m("span",{className:"Button-label"},n):"",e?K.component({size:"tiny",className:"LoadingIndicator--inline"}):""]},e}(S.a),J=function(t){function e(){return t.apply(this,arguments)||this}return o(e,t),e.prototype.view=function(){return m("li",{className:"Dropdown-separator"})},e}(S.a);function G(t){return(null==t?void 0:t.tag)===J}function X(t){return t instanceof Array||(t=[t]),function(t){var e,n=[];return t.forEach((function(r,o){(!G(r)||e&&!G(e)&&o!==t.length-1)&&(e=r,n.push(r))})),n}(t).map((function(t){var e=t.component&&t.component.isListItem,n=t.component&&t.component.isActive&&t.component.isActive(t.props),r=t.props?t.props.itemClassName:t.itemClassName;return e&&(t.attrs=t.attrs||{},t.attrs.key=t.attrs.key||t.itemName),e?t:m("li",{className:classNames([t.itemName?"item-"+t.itemName:"",r,n?"active":""]),key:t.itemName},t)}))}J.isListItem=!0;var Q,tt,et,nt,rt,ot=function(t){function e(){return t.apply(this,arguments)||this}return o(e,t),e.prototype.view=function(){var t=Object(i.a)({},this.props),e=d(t,"type");t.className="Alert Alert--"+e+" "+(t.className||"");var n=d(t,"children"),r=d(t,"controls")||[],o=d(t,"dismissible"),a=d(t,"ondismiss"),s=[];return(o||void 0===o)&&s.push(m(Z,{icon:"fas fa-times",className:"Button Button--link Button--icon Alert-dismiss",onclick:a})),m("div",t,m("span",{className:"Alert-body"},n),m("ul",{className:"Alert-controls"},X(r.concat(s))))},e}(S.a),it=(Q=["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^="-"])'],tt=function(){function t(t){var e=t.targetModal,n=t.triggers,r=void 0===n?[]:n,o=t.onShow,i=void 0===o?function(){}:o,a=t.onClose,s=void 0===a?function(){}:a,c=t.openTrigger,u=void 0===c?"data-micromodal-trigger":c,l=t.closeTrigger,f=void 0===l?"data-micromodal-close":l,p=t.disableScroll,d=void 0!==p&&p,h=t.disableFocus,m=void 0!==h&&h,v=t.awaitCloseAnimation,g=void 0!==v&&v,y=t.awaitOpenAnimation,b=void 0!==y&&y,w=t.debugMode,x=void 0!==w&&w;this.modal=document.getElementById(e),this.config={debugMode:x,disableScroll:d,openTrigger:u,closeTrigger:f,onShow:i,onClose:s,awaitCloseAnimation:g,awaitOpenAnimation:b,disableFocus:m},r.length>0&&this.registerTriggers.apply(this,r),this.onClick=this.onClick.bind(this),this.onKeydown=this.onKeydown.bind(this)}var e=t.prototype;return e.registerTriggers=function(){for(var t=this,e=arguments.length,n=new Array(e),r=0;r
'),!1},rt=function(t,e){if(function(t){t.length<=0&&(console.warn("MicroModal: ❗Please specify at least one %c'micromodal-trigger'","background-color: #f8f9fa;color: #50596c;font-weight: bold;","data attribute."),console.warn("%cExample:","background-color: #f8f9fa;color: #50596c;font-weight: bold;",''))}(t),!e)return!0;for(var n in e)nt(n);return!0},{init:function(t){var e=Object(i.a)({},{openTrigger:"data-micromodal-trigger"},t),n=[].concat(document.querySelectorAll("["+e.openTrigger+"]")),r=function(t,e){var n=[];return t.forEach((function(t){var r=t.attributes[e].value;void 0===n[r]&&(n[r]=[]),n[r].push(t)})),n}(n,e.openTrigger);if(!0!==e.debugMode||!1!==rt(n,r))for(var o in r){var a=r[o];e.targetModal=o,e.triggers=[].concat(a),et=new tt(e)}},show:function(t,e){var n=e||{};n.targetModal=t,!0===n.debugMode&&!1===nt(t)||(et=new tt(n)).showModal()},close:function(t){t?et.closeModalById(t):et.closeModal()}}),at=function(t){function e(){for(var e,n=arguments.length,r=new Array(n),o=0;o").addClass("modal-backdrop").appendTo("body"),it.show("Modal",{awaitCloseAnimation:!0,onClose:function(){$(".modal-backdrop").fadeOut(200,(function(){this.remove()})),n.showing=!1}}),this.onready()},n.onclick=function(t){t.target===this.element&&this.close()},n.close=function(){this.showing&&(this.hideTimeout=setTimeout((function(){return it.close("Modal")})))},n.clear=function(){this.component&&this.component.onhide(),this.component=null,m.redraw()},n.onready=function(){var t;(null===(t=this.component)||void 0===t?void 0:t.onready)&&this.component.onready()},e}(S.a),ct=function(t){function e(){return t.apply(this,arguments)||this}o(e,t);var n=e.prototype;return n.className=function(){return"RequestErrorModal Modal--large"},n.title=function(){return this.props.error.xhr?this.props.error.xhr.status+" "+this.props.error.xhr.statusText:""},n.content=function(){var t;try{t=JSON.stringify(JSON.parse(this.props.error.responseText),null,2)}catch(e){t=this.props.error.responseText}return m("div",{className:"Modal-body"},m("pre",null,this.props.error.options.method," ",this.props.error.options.url,m("br",null),m("br",null),t))},e}(at),ut=function(){function t(){this.forum=void 0,this.data=void 0,this.translator=new g,this.bus=new p,this.session=void 0,this.store=new b({forums:C,users:L,discussions:P,posts:B,groups:R,notifications:U}),this.drawer=new k,this.modal=void 0,this.cache={notifications:null},this.routes={},this.title="",this.titleCount=0,this.requestError=null}var e=t.prototype;return e.mount=function(t){void 0===t&&(t=""),m.mount(document.getElementById("modal"),new st),m.route(document.getElementById("content"),t+"/",function(t,e){void 0===e&&(e="");var n={};for(var r in t){var o=t[r];o.component&&(o.component.attrs||(o.component.attrs={}),o.component.attrs.routeName=r),n[e+o.path]=o.component}return n}(this.routes,t))},e.boot=function(t){this.data=t,this.store.pushPayload({data:this.data.resources}),this.forum=this.store.getById("forums",1),this.session=new y(this.store.getById("users",this.data.session.userId),this.data.session.csrfToken),this.locale(),this.plugins(),this.setupRoutes(),this.mount(),this.bus.dispatch("app.booting")},e.locale=function(){this.translator.locale=this.data.locale,this.bus.dispatch("app.locale")},e.plugins=function(){this.bus.dispatch("app.plugins")},e.setupRoutes=function(){this.bus.dispatch("app.routes")},e.preloadedApiDocument=function(){if(this.data.apiDocument){var t=this.store.pushPayload(this.data.apiDocument);return this.data.apiDocument=null,t}return null},e.setTitle=function(t){this.title=t,this.updateTitle()},e.setTitleCount=function(t){this.titleCount=t,this.updateTitle()},e.updateTitle=function(){document.title=(this.titleCount?"("+this.titleCount+") ":"")+(this.title?this.title+" - ":"")+this.forum.attribute("title")},e.route=function(t,e){void 0===e&&(e={});var n=this.routes[t];if(!n)throw new Error("Route '"+t+"' does not exist");var r=n.path.replace(/:([^\/]+)/g,(function(t,n){return d(e,n)})),o=m.buildQueryString(e);return(""===m.route.prefix?this.forum.attribute("basePath"):"")+r+(o?"?"+o:"")},e.request=function(t){var e=this,n=Object(i.a)({},t);if(n.background=n.background||!0,w(n,"config",(function(t,n){return n.setRequestHeader("X-CSRF-Token",e.session.csrfToken)})),"GET"!==n.method&&"POST"!==n.method){var r=n.method;w(n,"config",(function(t,e){return e.setRequestHeader("X-HTTP-Method-Override",r)})),n.method="POST"}n.deserialize=n.deserialize||function(t){return t},n.errorHandler=n.errorHandler||function(t){throw t};var o=n.extract;return n.extract=function(t){var e;e=o?o(t.responseText):t.responseText||null;var r=t.status;if(r<200||r>299)throw new N(r,e,n,t);if(t.getResponseHeader){var i=t.getResponseHeader("X-CSRF-Token");i&&(app.session.csrfToken=i)}try{return JSON.parse(e)}catch(r){throw new N(500,e,n,t)}},m.request(n).then((function(t){return t}),(function(t){var r;switch(e.requestError=t,t.status){case 422:r=t.response.errors.map((function(t){return[t.detail,m("br")]})).reduce((function(t,e){return t.concat(e)}),[]).slice(0,-1);break;case 401:case 403:r=e.translator.trans("core.lib.error.permission_denied_message");break;case 404:case 410:r=e.translator.trans("core.lib.error.not_found_message");break;case 429:r=e.translator.trans("core.lib.error.rate_limit_exceeded_message");break;default:r=e.translator.trans("core.lib.error.generic_message")}var o=app.forum.attribute("debug");t.alert=ot.component({type:"error",children:r,controls:o&&[Z.component({className:"Button Button--link",onclick:e.showDebug.bind(e,t),children:"DEBUG"})]});try{n.errorHandler(t)}catch(t){console.error(t)}return Promise.reject(t)}))},e.showDebug=function(t){this.modal.show(ct.component({error:t}))},t}(),lt=function(){function t(){this.stack=[]}var e=t.prototype;return e.getCurrent=function(){return this.stack[this.stack.length-1]},e.getPrevious=function(){return this.stack[this.stack.length-2]},e.push=function(t,e,n){void 0===n&&(n=m.route.get());var r=this.stack[this.stack.length-2];r&&r.name===t&&this.stack.pop();var o=this.getCurrent();o&&o.name===t?Object(i.a)(o,{url:n,title:e}):this.stack.push({name:t,url:n,title:e})},e.canGoBack=function(){return this.stack.length>1},e.back=function(){if(!this.canGoBack())return this.home();this.stack.pop(),m.route.set(this.getCurrent().url)},e.backUrl=function(){return this.stack[this.stack.length-2].url},e.home=function(){this.stack.splice(0),m.route.set("/")},t}(),ft=function(t){function e(){return t.apply(this,arguments)||this}o(e,t);var n=e.prototype;return n.view=function(){return m("ul",{className:"Header-controls"},X(this.items().toArray()))},n.items=function(){return new _},e}(S.a),pt=function(t){function e(){for(var e,n=arguments.length,r=new Array(n),o=0;o .Dropdown-toggle").dropdown(),this.element.addEventListener("shown.bs.dropdown",(function(){n.showing=!0,n.props.onshow&&n.props.onshow(),m.redraw();var t=n.$(".Dropdown-menu"),e=t.hasClass("Dropdown-menu--right");t.removeClass("Dropdown-menu--top Dropdown-menu--right"),t.toggleClass("Dropdown-menu--top",t.offset().top+t.height()>$(window).scrollTop()+$(window).height()),t.offset().top<0&&t.removeClass("Dropdown-menu--top"),t.toggleClass("Dropdown-menu--right",e||t.offset().left+t.width()>$(window).scrollLeft()+$(window).width())})),this.element.addEventListener("hidden.bs.dropdown",(function(){n.showing=!1,n.props.onhide&&n.props.onhide(),m.redraw()}))},n.getButton=function(){return m("button",{className:"Dropdown-toggle "+this.props.buttonClassName,"data-toggle":"dropdown",onclick:this.props.onclick},this.getButtonContent())},n.getButtonContent=function(){var t=this.props;return[t.icon?A(t.icon,{className:"Button-icon"}):"",m("span",{className:"Button-label"},t.label),t.caretIcon?A(t.caretIcon,{className:"Button-caret"}):""]},n.getMenu=function(t){return m("ul",{className:"Dropdown-menu dropdown-menu "+this.props.menuClassName},t)},e}(S.a),mt=function(t){function e(){return t.apply(this,arguments)||this}o(e,t),e.initProps=function(t){t.active=this.isActive(t)};var n=e.prototype;return n.view=function(e){var n=t.prototype.view.call(this,e);return n.tag=m.route.Link,n},n.onupdate=function(n){t.prototype.onupdate.call(this,n),this.props.active=e.isActive(this.props)},e.isActive=function(t){return void 0!==t.active?t.active:m.route.get()===t.href},e}(Z),vt=function(t){function e(){return t.apply(this,arguments)||this}o(e,t),e.initProps=function(e){t.initProps.call(this,e),e.className="SessionDropdown",e.buttonClassName="Button Button--user Button--flat",e.menuClassName="Dropdown-menu--right"};var n=e.prototype;return n.view=function(){return this.props.children=this.items().toArray(),t.prototype.view.call(this)},n.getButtonContent=function(){var t=app.session.user;return[dt(t)," ",m("span",{className:"Button-label"},v(t))]},n.items=function(){var t=new _,e=app.session.user;return t.add("profile",mt.component({icon:"fas fa-user",children:app.translator.trans("core.forum.header.profile_button"),href:app.route.user(e)}),100),app.forum.attribute("adminUrl")&&t.add("administration",mt.component({icon:"fas fa-wrench",children:app.translator.trans("core.forum.header.admin_button"),href:app.forum.attribute("adminUrl"),target:"_blank",config:function(){}}),0),t.add("separator",J.component(),-90),t.add("logOut",Z.component({icon:"fas fa-sign-out-alt",children:app.translator.trans("core.forum.header.log_out_button"),onclick:app.session.logout.bind(app.session)}),-100),t},e}(ht),gt=function(t){function e(){return t.apply(this,arguments)||this}return o(e,t),e.initProps=function(e){e.caretIcon=void 0!==e.caretIcon?e.caretIcon:"fas fa-sort",t.initProps.call(this,e),e.className+=" Dropdown--select"},e.prototype.getButtonContent=function(){var t=this.props.children.filter((function(t){return t.attrs.active}))[0],e=t&&t.attrs.children||this.props.defaultLabel;return e instanceof Array&&(e=e[0]),[m("span",{className:"Button-label"},e),A(this.props.caretIcon,{className:"Button-caret"})]},e}(ht),yt=function(t){function e(){for(var e,n=arguments.length,r=new Array(n),o=0;o=i+a&&n.loadMore()},o.on("scroll",this.scrollHandler)},n.onremove=function(e){t.prototype.onremove.call(this,e),this.$scrollParent.off("scroll",this.scrollHandler)},n.load=function(){app.session.user.newNotificationCount()&&delete app.cache.notifications,app.cache.notifications||(app.session.user.pushAttributes({newNotificationCount:0}),this.loadMore())},n.loadMore=function(){var t=this;this.loading=!0,m.redraw();var e=app.cache.notifications?{page:{offset:10*app.cache.notifications.length}}:null;return app.store.find("notifications",e).then(this.parseResults.bind(this)).catch((function(){})).then((function(){t.loading=!1,m.redraw()}))},n.parseResults=function(t){return app.cache.notifications=app.cache.notifications||[],t.length&&app.cache.notifications.push(t),this.moreResults=!!t.payload.links.next,t},n.markAllAsRead=function(){app.cache.notifications&&(app.session.user.pushAttributes({unreadNotificationCount:0}),app.cache.notifications.forEach((function(t){t.forEach((function(t){return t.pushAttributes({isRead:!0})}))})),app.request({url:app.forum.attribute("apiUrl")+"/notifications/read",method:"POST"}))},e}(S.a),bt=function(t){function e(){for(var e,n=arguments.length,r=new Array(n),o=0;o0?"...":"")+t.substring(n,n+e)+(t.length>n+e?"...":"")}(o,n,i)),o=$("
").text(o).html(),e&&(o=o.replace(r,"$&")),m.trust(o)}var kt=function(){},Nt=function(t){function e(){for(var e,n=arguments.length,r=new Array(n),o=0;o li:not(.Dropdown-header)",(function(){r.setIndex(r.selectableItems().index(this))}));var o=this.$("input");this.navigator=new wt,this.navigator.onUp((function(){return n.setIndex(n.getCurrentNumericIndex()-1,!0)})).onDown((function(){return n.setIndex(n.getCurrentNumericIndex()+1,!0)})).onSelect(this.selectResult.bind(this)).onCancel(this.clear.bind(this)).bindTo(o),o.on("input focus",(function(){var t=this.value.toLowerCase();t&&(clearTimeout(r.searchTimeout),r.searchTimeout=setTimeout((function(){-1===r.searched.indexOf(t)&&(t.length>=3&&r.sources.map((function(e){e.search&&(r.loadingSources++,e.search(t).then((function(){r.loadingSources=Math.max(0,r.loadingSources-1),m.redraw()})))})),r.searched.push(t),m.redraw())}),250))})).on("focus",(function(){$(this).one("mouseup",(function(t){return t.preventDefault()})).select()}))},n.getCurrentSearch=function(){return app.current&&"function"==typeof app.current.searching&&app.current.searching()},n.selectResult=function(){clearTimeout(this.searchTimeout),this.loadingSources=0,this.value()?m.route.set(this.getItem(this.index).find("a").attr("href")):this.clear(),this.$("input").blur()},n.clear=function(){this.value(""),this.getCurrentSearch()?app.current.clearSearch():m.redraw()},n.sourceItems=function(){var t=new _;return app.forum.attribute("canViewDiscussions")&&t.add("discussions",new Nt),app.forum.attribute("canViewUserList")&&t.add("users",new Et),t},n.selectableItems=function(){return this.$(".Search-results > li:not(.Dropdown-header)")},n.getCurrentNumericIndex=function(){return this.selectableItems().index(this.getItem(this.index))},n.getItem=function(t){var e=this.selectableItems(),n=e.filter('[data-index="'+t+'"]');return n.length||(n=e.eq(t)),n},n.setIndex=function(t,e){var n=this.selectableItems(),r=n.parent(),o=t;t<0?o=n.length-1:t>=n.length&&(o=0);var i=n.removeClass("active").eq(o).addClass("active");if(this.index=i.attr("data-index")||o,e){var a,s=r.scrollTop(),c=r.offset().top,u=c+r.outerHeight(),l=i.offset().top,f=l+i.outerHeight();lu&&(a=s-u+f+parseInt(r.css("padding-bottom"),10)),void 0!==a&&r.animate({scrollTop:a},100)}},e}(S.a),Tt=function(t){function e(){return t.apply(this,arguments)||this}o(e,t);var n=e.prototype;return n.view=function(){return m("ul",{className:"Header-controls"},X(this.items().toArray()))},n.items=function(){var t=new _;if(t.add("search",Ct.component(),30),app.forum.attribute("showLanguageSelector")&&Object.keys(app.data.locales).length>1){var e=[],n=function(t){e.push(Z.component({active:app.data.locale===t,children:app.data.locales[t],icon:app.data.locale!==t||"fas fa-check",onclick:function(){app.session.user?app.session.user.savePreferences({locale:t}).then((function(){return window.location.reload()})):(document.cookie="locale="+t+"; path=/; expires=Tue, 19 Jan 2038 03:14:07 GMT",window.location.reload())}}))};for(var r in app.data.locales)n(r);t.add("locale",gt.component({children:e,buttonClassName:"Button Button--link"}),20)}return app.session.user?(t.add("notifications",bt.component(),10),t.add("session",vt.component(),0)):(app.forum.attribute("allowSignUp")&&t.add("signUp",Z.component({children:app.translator.trans("core.forum.header.sign_up_link"),className:"Button Button--link",onclick:function(){return app.modal.show(new SignUpModal)}}),10),t.add("logIn",Z.component({children:app.translator.trans("core.forum.header.log_in_link"),className:"Button Button--link",onclick:function(){return app.modal.show(new pt)}}),0)),t},e}(S.a),Ot=function(t){function e(){return t.apply(this,arguments)||this}o(e,t);var n=e.prototype;return n.oninit=function(){console.log("IndexPage#oninit")},n.view=function(){return m("div",{class:"container"},m("h1",null,"hi"))},e}(S.a),_t=function(t){function e(){for(var e,n=arguments.length,r=new Array(n),o=0;o ul")[0];$(window).off(".affix"),new hcSticky(o,{stickTo:e,top:r.outerHeight(!0)+parseInt(n.css("margin-top"),10)})}function At(t){var e=dayjs(t),n=dayjs();e.isAfter(n)&&(e=n);return e.diff(dayjs())<-2592e6?e.year()===dayjs().year()?e.format("D MMM"):e.format("MMM 'YY"):e.fromNow()}var jt={controls:function(t,e){var n=this,r=new _;return["user","moderation","destructive"].forEach((function(o){var i=n[o+"Controls"](t,e).toArray();i.length&&(i.forEach((function(t){return r.add(t.itemName,t)})),r.add(o+"Separator",J.component()))})),r},userControls:function(){return new _},moderationControls:function(t){var e=new _;return t.canEdit()&&e.add("edit",Z.component({icon:"fas fa-pencil-alt",children:app.translator.trans("core.forum.user_controls.edit_button"),onclick:this.editAction.bind(this,t)})),e},destructiveControls:function(t){var e=new _;return"1"!==t.id()&&t.canDelete()&&e.add("delete",Z.component({icon:"fas fa-times",children:app.translator.trans("core.forum.user_controls.delete_button"),onclick:this.deleteAction.bind(this,t)})),e},deleteAction:function(t){var e=this;confirm(app.translator.trans("core.forum.user_controls.delete_confirmation"))&&t.delete().then((function(){e.showDeletionAlert(t,"success"),app.current instanceof Dt&&app.current.user===t?app.history.back():window.location.reload()})).catch((function(){return e.showDeletionAlert(t,"error")}))},showDeletionAlert:function(t,e){var n=t.data.attributes,r=n.username,o=n.email,i="core.forum.user_controls.delete_"+e+"_message";app.alerts.show(ot.component({type:e,children:app.translator.trans(i,{username:r,email:o})}))},editAction:function(t){app.modal.show(new EditUserModal({user:t}))}},Pt=function(t){function e(){for(var e,n=arguments.length,r=new Array(n),o=0;o').appendTo("body").hide().click().on("change",(function(e){t.upload($(e.target)[0].files[0])}))}},n.upload=function(t){if(!this.loading){var e=this.props.user,n=new FormData;data.append("avatar",t),this.loading=!0,m.redraw(),app.request({method:"POST",url:app.forum.attribute("apiUrl")+"/users/"+e.id()+"/avatar",serialize:function(t){return t},body:n}).then(this.success.bind(this),this.failure.bind(this))}},n.remove=function(){var t=this.props.user;this.loading=!0,m.redraw(),app.request({method:"DELETE",url:app.forum.attribute("apiUrl")+"/users/"+t.id()+"/avatar"}).then(this.success.bind(this),this.failure.bind(this))},n.success=function(t){app.store.pushPayload(t),delete this.props.user.avatarColor,this.loading=!1,m.redraw()},n.failure=function(t){this.loading=!1,m.redraw()},e}(S.a),Mt=function(t){function e(){return t.apply(this,arguments)||this}o(e,t);var n=e.prototype;return n.view=function(){var t=this.props.user,e=jt.controls(t,this).toArray(),n=t.color(),r=t.badges().toArray();return m("div",{className:"UserCard "+(this.props.className||""),style:n?{backgroundColor:n}:""},m("div",{className:"darkenBackground"},m("div",{className:"container"},e.length?ht.component({children:e,className:"UserCard-controls App-primaryControl",menuClassName:"Dropdown-menu--right",buttonClassName:this.props.controlsButtonClassName,label:app.translator.trans("core.forum.user_controls.button"),icon:"fas fa-ellipsis-v"}):"",m("div",{className:"UserCard-profile"},m("h2",{className:"UserCard-identity"},this.props.editable?[Pt.component({user:t,className:"UserCard-avatar"}),v(t)]:m(m.route.Link,{href:app.route.user(t)},m("div",{className:"UserCard-avatar"},dt(t)),v(t))),r.length?m("ul",{className:"UserCard-badges badges"},X(r)):"",m("ul",{className:"UserCard-info"},X(this.infoItems().toArray()))))))},n.infoItems=function(){var t=new _,e=this.props.user,n=e.lastSeenAt();if(n){var r=e.isOnline();t.add("lastSeen",m("span",{className:"UserCard-lastSeen"+(r?" online":"")},r?[A("fas fa-circle")," ",app.translator.trans("core.forum.user.online_text")]:[A("far fa-clock")," ",At(n)]))}return t.add("joined",app.translator.trans("core.forum.user.joined_date_text",{ago:At(e.joinTime())})),t},e}(S.a),Dt=function(t){function e(){for(var e,n=arguments.length,r=new Array(n),o=0;o=this.loadLimit,m.redraw(),t},e}(Dt),Ht=function(t){function e(){for(var e,n=arguments.length,r=new Array(n),o=0;o>>0;if("function"!=typeof t)throw new TypeError(t+" is not a function");for(10&&c--,40==e.which&&c-1&&(e=t[o][1](e,n()))})),e}),n);return o(e),o},n["fantasy-land/of"]=n;var e=!1;function n(t){var e,o=[],a=[];function s(e){return arguments.length&&e!==n.SKIP&&(t=e,i(s)&&(s._changing(),s._state="active",o.forEach((function(e,n){e(a[n](t))})))),t}return s.constructor=n,s._state=arguments.length&&t!==n.SKIP?"active":"pending",s._parents=[],s._changing=function(){i(s)&&(s._state="changing"),o.forEach((function(t){t._changing()}))},s._map=function(e,r){var i=r?n():n(e(t));return i._parents.push(s),o.push(i),a.push(e),i},s.map=function(t){return s._map(t,"active"!==s._state)},s.toJSON=function(){return null!=t&&"function"==typeof t.toJSON?t.toJSON():t},s["fantasy-land/map"]=s.map,s["fantasy-land/ap"]=function(t){return r((function(t,e){return t()(e())}),[t,s])},s._unregisterChild=function(t){var e=o.indexOf(t);-1!==e&&(o.splice(e,1),a.splice(e,1))},Object.defineProperty(s,"end",{get:function(){return e||((e=n()).map((function(t){return!0===t&&(s._parents.forEach((function(t){t._unregisterChild(s)})),s._state="ended",s._parents.length=o.length=a.length=0),t})),e)}}),s}function r(t,e){var r=e.every((function(t){if(t.constructor!==n)throw new Error("Ensure that each item passed to stream.combine/stream.merge/lift is a stream");return"active"===t._state})),o=r?n(t.apply(null,e.concat([e]))):n(),i=[],a=e.map((function(n){return n._map((function(a){return i.push(n),(r||e.every((function(t){return"pending"!==t._state})))&&(r=!0,o(t.apply(null,e.concat([i]))),i=[]),a}),!0)})),s=o.end.map((function(t){!0===t&&(a.forEach((function(t){t.end(!0)})),s.end(!0))}));return o}function o(t){return r((function(){return t.map((function(t){return t()}))}),t)}function i(t){return"pending"===t._state||"active"===t._state||"changing"===t._state}Object.defineProperty(n,"HALT",{get:function(){return e||console.log("HALT is deprecated and has been renamed to SKIP"),e=!0,n.SKIP}}),t.exports=n}()},function(t,e,n){var r=n(24).Symbol;t.exports=r},function(t,e){t.exports=function(t){var e=typeof t;return null!=t&&("object"==e||"function"==e)}},function(t,e,n){var r=n(23),o=n(25),i="[object Symbol]";t.exports=function(t){return"symbol"==typeof t||o(t)&&r(t)==i}},function(t,e,n){var r=n(115),o=n(119);t.exports=function(t,e){var n=o(t,e);return r(n)?n:void 0}},function(t,e,n){(function(e){var n="object"==typeof e&&e&&e.Object===Object&&e;t.exports=n}).call(this,n(2))},function(t,e){t.exports=function(t){return t.webpackPolyfill||(t.deprecate=function(){},t.paths=[],t.children||(t.children=[]),Object.defineProperty(t,"loaded",{enumerable:!0,get:function(){return t.l}}),Object.defineProperty(t,"id",{enumerable:!0,get:function(){return t.i}}),t.webpackPolyfill=1),t}},function(t,e){var n=9007199254740991,r=/^(?:0|[1-9]\d*)$/;t.exports=function(t,e){var o=typeof t;return!!(e=null==e?n:e)&&("number"==o||"symbol"!=o&&r.test(t))&&t>-1&&t%1==0&&t-1&&t%1==0&&t<=n}},function(t,e,n){var r=n(73),o=n(71);t.exports=function(t){return null!=t&&o(t.length)&&!r(t)}},function(t,e,n){var r=n(23),o=n(65),i="[object AsyncFunction]",a="[object Function]",s="[object GeneratorFunction]",c="[object Proxy]";t.exports=function(t){if(!o(t))return!1;var e=r(t);return e==a||e==s||e==i||e==c}},function(t,e,n){var r=n(17),o=n(107),i=n(108),a=n(136);t.exports=function(t,e){return r(t)?t:o(t,e)?[t]:i(a(t))}},function(t,e){t.exports=function(t,e){return t===e||t!=t&&e!=e}},function(t,e,n){var r=n(66),o=1/0;t.exports=function(t){if("string"==typeof t||r(t))return t;var e=t+"";return"0"==e&&1/t==-o?"-0":e}},,function(t,e,n){var r=n(81),o=n(82),i=n(104),a=n(17);t.exports=function(t,e){return(a(t)?r:o)(t,i(e))}},function(t,e,n){var r=n(106);t.exports=function(t,e,n){var o=null==t?void 0:r(t,e);return void 0===o?n:o}},function(t,e,n){var r=n(139);t.exports=function(t,e,n){return null==t?t:r(t,e,n)}},function(t,e){t.exports=function(t,e){for(var n=-1,r=null==t?0:t.length;++n-1}},function(t,e,n){var r=n(27);t.exports=function(t,e){var n=this.__data__,o=r(n,t);return o<0?(++this.size,n.push([t,e])):n[o][1]=e,this}},function(t,e,n){var r=n(67)(n(24),"Map");t.exports=r},function(t,e,n){var r=n(28);t.exports=function(t){var e=r(this,t).delete(t);return this.size-=e?1:0,e}},function(t,e){t.exports=function(t){var e=typeof t;return"string"==e||"number"==e||"symbol"==e||"boolean"==e?"__proto__"!==t:null===t}},function(t,e,n){var r=n(28);t.exports=function(t){return r(this,t).get(t)}},function(t,e,n){var r=n(28);t.exports=function(t){return r(this,t).has(t)}},function(t,e,n){var r=n(28);t.exports=function(t,e){var n=r(this,t),o=n.size;return n.set(t,e),this.size+=n.size==o?0:1,this}},function(t,e,n){var r=n(137);t.exports=function(t){return null==t?"":r(t)}},function(t,e,n){var r=n(64),o=n(138),i=n(17),a=n(66),s=1/0,c=r?r.prototype:void 0,u=c?c.toString:void 0;t.exports=function t(e){if("string"==typeof e)return e;if(i(e))return o(e,t)+"";if(a(e))return u?u.call(e):"";var n=e+"";return"0"==n&&1/e==-s?"-0":n}},function(t,e){t.exports=function(t,e){for(var n=-1,r=null==t?0:t.length,o=Array(r);++n)","gi")),o=[],i=[o];return r.forEach((function(t){var n=t.match(new RegExp("{([a-z0-9_]+)}|<(/?)([a-z0-9_]+)>","i"));if(n){if(n[1])i[0].push(e[n[1]]);else if(n[3])if(n[2])i.shift();else{var r=e[n[3]]||{tag:n[3],children:[]};i[0].push(r),i.unshift(r.children||r)}}else i[0].push({tag:"span",text:t})})),o.filter((function(t){return t}))},t}(),y=function(){function t(t,e){this.user=void 0,this.csrfToken=void 0,this.user=t,this.csrfToken=e}var e=t.prototype;return e.login=function(t,e){return void 0===e&&(e={}),app.request(Object(i.a)({method:"POST",url:app.forum.attribute("baseUrl")+"/login",body:t},e))},e.logout=function(){window.location.href=app.forum.attribute("baseUrl")+"/logout?token="+this.csrfToken},t}(),b=function(){function t(t){this.data={},this.models=void 0,this.models=t}var e=t.prototype;return e.pushPayload=function(t){t.included&&t.included.map(this.pushObject.bind(this));var e=t.data instanceof Array?t.data.map(this.pushObject.bind(this)):this.pushObject(t.data);return e.payload=t,e},e.pushObject=function(t){if(!this.models[t.type])return null;var e=this.data[t.type]=this.data[t.type]||{};return e[t.id]?e[t.id].pushData(t):e[t.id]=this.createRecord(t.type,t),e[t.id].exists=!0,e[t.id]},e.find=function(t,e,n,r){void 0===n&&(n={}),void 0===r&&(r={});var o=n,a=app.forum.attribute("apiUrl")+"/"+t;return e instanceof Array?a+="?filter[id]="+e.join(","):"object"==typeof e?o=e:e&&(a+="/"+e),app.request(Object(i.a)({method:"GET",url:a,params:o},r)).then(this.pushPayload.bind(this))},e.getById=function(t,e){return this.data[t]&&this.data[t][e]},e.getBy=function(t,e,n){return this.all(t).filter((function(t){return t[e]()===n}))[0]},e.all=function(t){var e=this.data[t];return e?Object.keys(e).map((function(t){return e[t]})):[]},e.remove=function(t){delete this.data[t.data.type][t.id()]},e.createRecord=function(t,e){return void 0===e&&(e={}),e.type=e.type||t,new this.models[t](e,this)},t}();function w(t,e,n){var r=t[e];t[e]=function(){for(var e=arguments.length,o=new Array(e),i=0;i").addClass("drawer-backdrop fade").appendTo("body").click((function(){return t.hide()})),setTimeout((function(){return t.$backdrop.addClass("in")}))},t}(),N=function(t,e,n,r){this.status=void 0,this.responseText=void 0,this.options=void 0,this.xhr=void 0,this.response=void 0,this.alert=void 0,this.status=t,this.responseText=e,this.options=n,this.xhr=r;try{this.response=JSON.parse(e)}catch(t){this.response=null}this.alert=null},E=function(){function t(t,e){void 0===t&&(t={}),void 0===e&&(e=null),this.data=void 0,this.freshness=void 0,this.exists=void 0,this.store=void 0,this.data=t,this.store=e,this.freshness=new Date,this.exists=!1}var e=t.prototype;return e.id=function(){return this.data.id},e.attribute=function(t){return this.data.attributes[t]},e.pushData=function(e){for(var n in e)if("object"==typeof e[n])for(var r in this.data[n]=this.data[n]||{},e[n])e[n][r]instanceof t&&(e[n][r]={data:t.getIdentifier(e[n][r])}),this.data[n][r]=e[n][r];else this.data[n]=e[n];this.freshness=new Date},e.pushAttributes=function(t){this.pushData({attributes:t})},e.save=function(e,n){var r=this;void 0===n&&(n={});var o={type:this.data.type,id:this.data.id,attributes:e,relationships:void 0};if(e.relationships){for(var a in o.relationships={},e.relationships){var s=e.relationships[a];o.relationships[a]={data:s instanceof Array?s.map(t.getIdentifier):t.getIdentifier(s)}}delete e.relationships}var c=this.copyData();this.pushData(o);var u={data:o};return n.meta&&(u.meta=n.meta),app.request(Object(i.a)({method:this.exists?"PATCH":"POST",url:app.forum.attribute("apiUrl")+this.apiEndpoint(),body:u},n)).then((function(t){return r.store.data[t.data.type]=r.store.data[t.data.type]||{},r.store.data[t.data.type][t.data.id]=r,r.store.pushPayload(t)}),(function(t){throw r.pushData(c),m.redraw(),t}))},e.delete=function(t,e){var n=this;return void 0===t&&(t={}),void 0===e&&(e={}),this.exists?app.request(Object(i.a)({method:"DELETE",url:app.forum.attribute("apiUrl")+this.apiEndpoint(),body:t},e)).then((function(){n.exists=!1,n.store.remove(n)})):Promise.resolve()},e.apiEndpoint=function(){return"/"+this.data.type+(this.exists?"/"+this.data.id:"")},e.copyData=function(){return JSON.parse(JSON.stringify(this.data))},t.attribute=function(t,e){return function(){var n=this.data.attributes&&this.data.attributes[t];return e?e(n):n}},t.hasOne=function(t){return function(){if(this.data.relationships){var e=this.data.relationships[t];if(e)return app.store.getById(e.data.type,e.data.id)}return!1}},t.hasMany=function(t){return function(){if(this.data.relationships){var e=this.data.relationships[t];if(e)return e.data.map((function(t){return app.store.getById(t.type,t.id)}))}return!1}},t.transformDate=function(t){return t?new Date(t):null},t.getIdentifier=function(t){return{type:t.data.type,id:t.data.id}},t}(),C=function(t){function e(){return t.apply(this,arguments)||this}return o(e,t),e.prototype.apiEndpoint=function(){return"/"},e}(E);function T(t,e){var n,r=Array.from(t),o={};return function(){var t=this,i=!1;return r.forEach((function(e){var n="function"==typeof t[e]?t[e]():t[e];o[e]!==n&&(i=!0,o[e]=n)})),i&&(n=e.apply(this,r.map((function(t){return o[t]})))),n}}var O=function(t,e){this.content=void 0,this.priority=void 0,this.key=0,this.content=t,this.priority=e},_=function(){function t(){this.items={}}var e=t.prototype;return e.isEmpty=function(){for(var t in this.items)if(this.items.hasOwnProperty(t))return!1;return!0},e.has=function(t){return!!this.items[t]},e.get=function(t){var e;return null===(e=this.items[t])||void 0===e?void 0:e.content},e.add=function(t,e,n){return void 0===n&&(n=0),this.items[t]=new O(e,n),this},e.toArray=function(){var t=[];for(var e in this.items)this.items.hasOwnProperty(e)&&null!==this.items[e]&&this.items[e]instanceof O&&(this.items[e].content=Object(this.items[e].content),this.items[e].content.itemName=e,t.push(this.items[e]),this.items[e].key=t.length);return t.sort((function(t,e){return t.priority===e.priority?t.key-e.key:t.priority>e.priority?-1:1})).map((function(t){return t.content}))},t}(),S=n(1);function A(t,e){return void 0===e&&(e={}),e.className="icon "+t+" "+(e.className||""),m("i",e)}var j=function(t){function e(){return t.apply(this,arguments)||this}o(e,t);var n=e.prototype;return n.view=function(t){var e=t.attrs,n=d(e,"type"),r=d(e,"icon");return e.className="Badge "+(n?"Badge--"+n:"")+" "+(e.className||""),e.title=d(e,"label")||"",m("span",e,r?A(r,{className:"Badge-icon"}):m.trust(" "))},n.oncreate=function(e){t.prototype.oncreate.call(this,e),this.props.label&&this.$().tooltip({container:"body"})},e}(S.a),P=function(t){function e(){for(var e,n=arguments.length,r=new Array(n),o=0;odayjs().subtract(5,"minutes").toDate()},n.badges=function(){var t=new _,e=this.groups();return e&&e.forEach((function(e){t.add("group"+e.id(),D.component({group:e}))})),t},n.calculateAvatarColor=function(){var t=new Image,e=this;t.onload=function(){var t=new ColorThief;e.avatarColor=t.getColor(this),e.freshness=new Date,m.redraw()},t.crossOrigin="anonymous",t.src=this.avatarUrl()},n.savePreferences=function(t){var e=this.preferences();return Object(i.a)(e,t),this.save({preferences:e})},e}(E);function I(t){var e=t.replace(/(<\/p>|
)/g,"$1  ").replace(/]*>/gi," "),n=$("
").html(e);return n.find(I.removeSelectors.join(",")).remove(),n.text().replace(/\s+/g," ").trim()}I.removeSelectors=["blockquote","script"];var B=function(t){function e(){for(var e,n=arguments.length,r=new Array(n),o=0;o=0||(o[n]=t[n]);return o}(t,["children"]);n.className=n.className||"",n.type=n.type||"button",n.title&&!this.props.children&&(n["aria-label"]=n.title),!n.title&&this.props.children&&(n.title=h(this.props.children));var r=d(n,"icon");r&&(n.className+=" hasIcon");var o=d(n,"loading");return(n.disabled||o)&&(n.className+=" "+classNames("disabled",o&&"loading"),delete n.onclick),m("button",n,this.getButtonContent(r,n.loading,e))},n.getButtonContent=function(t,e,n){return[t&&!0!==t?A(t,{className:"Button-icon"}):"",n?m("span",{className:"Button-label"},n):"",e?K.component({size:"tiny",className:"LoadingIndicator--inline"}):""]},e}(S.a),J=function(t){function e(){return t.apply(this,arguments)||this}return o(e,t),e.prototype.view=function(){return m("li",{className:"Dropdown-separator"})},e}(S.a);function G(t){return(null==t?void 0:t.tag)===J}function X(t){return t instanceof Array||(t=[t]),function(t){var e,n=[];return t.forEach((function(r,o){(!G(r)||e&&!G(e)&&o!==t.length-1)&&(e=r,n.push(r))})),n}(t).map((function(t){var e,n,r,o,i=null===(e=t.tag)||void 0===e?void 0:e.isListItem,a=(null===(n=t.tag)||void 0===n?void 0:n.isActive)&&t.tag.isActive(t.attrs),s=(null===(r=t.attrs)||void 0===r?void 0:r.itemClassName)||t.itemClassName;i&&(t.attrs=t.attrs||{},t.attrs.key=t.attrs.key||t.itemName,t.key=t.attrs.key);var c=i?t:m("li",{className:classNames(s,[t.itemName&&"item-"+t.itemName,a&&"active"]),key:(null===(o=t.attrs)||void 0===o?void 0:o.key)||t.itemName},t);return c.state=c.state||{},c}))}J.isListItem=!0;var Q,tt,et,nt,rt,ot=function(t){function e(){return t.apply(this,arguments)||this}return o(e,t),e.prototype.view=function(){var t=Object(i.a)({},this.props),e=d(t,"type");t.className="Alert Alert--"+e+" "+(t.className||"");var n=d(t,"children"),r=d(t,"controls")||[],o=d(t,"dismissible"),a=d(t,"ondismiss"),s=[];return(o||void 0===o)&&s.push(m(Z,{icon:"fas fa-times",className:"Button Button--link Button--icon Alert-dismiss",onclick:a})),m("div",t,m("span",{className:"Alert-body"},n),m("ul",{className:"Alert-controls"},X(r.concat(s))))},e}(S.a),it=(Q=["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^="-"])'],tt=function(){function t(t){var e=t.targetModal,n=t.triggers,r=void 0===n?[]:n,o=t.onShow,i=void 0===o?function(){}:o,a=t.onClose,s=void 0===a?function(){}:a,c=t.openTrigger,u=void 0===c?"data-micromodal-trigger":c,l=t.closeTrigger,f=void 0===l?"data-micromodal-close":l,p=t.disableScroll,d=void 0!==p&&p,h=t.disableFocus,m=void 0!==h&&h,v=t.awaitCloseAnimation,g=void 0!==v&&v,y=t.awaitOpenAnimation,b=void 0!==y&&y,w=t.debugMode,x=void 0!==w&&w;this.modal=document.getElementById(e),this.config={debugMode:x,disableScroll:d,openTrigger:u,closeTrigger:f,onShow:i,onClose:s,awaitCloseAnimation:g,awaitOpenAnimation:b,disableFocus:m},r.length>0&&this.registerTriggers.apply(this,r),this.onClick=this.onClick.bind(this),this.onKeydown=this.onKeydown.bind(this)}var e=t.prototype;return e.registerTriggers=function(){for(var t=this,e=arguments.length,n=new Array(e),r=0;r
'),!1},rt=function(t,e){if(function(t){t.length<=0&&(console.warn("MicroModal: ❗Please specify at least one %c'micromodal-trigger'","background-color: #f8f9fa;color: #50596c;font-weight: bold;","data attribute."),console.warn("%cExample:","background-color: #f8f9fa;color: #50596c;font-weight: bold;",''))}(t),!e)return!0;for(var n in e)nt(n);return!0},{init:function(t){var e=Object(i.a)({},{openTrigger:"data-micromodal-trigger"},t),n=[].concat(document.querySelectorAll("["+e.openTrigger+"]")),r=function(t,e){var n=[];return t.forEach((function(t){var r=t.attributes[e].value;void 0===n[r]&&(n[r]=[]),n[r].push(t)})),n}(n,e.openTrigger);if(!0!==e.debugMode||!1!==rt(n,r))for(var o in r){var a=r[o];e.targetModal=o,e.triggers=[].concat(a),et=new tt(e)}},show:function(t,e){var n=e||{};n.targetModal=t,!0===n.debugMode&&!1===nt(t)||(et=new tt(n)).showModal()},close:function(t){t?et.closeModalById(t):et.closeModal()}}),at=function(t){function e(){for(var e,n=arguments.length,r=new Array(n),o=0;o").addClass("modal-backdrop").appendTo("body"),it.show("Modal",{awaitCloseAnimation:!0,onClose:function(){$(".modal-backdrop").fadeOut(200,(function(){this.remove()})),n.showing=!1}}),this.onready()},n.onclick=function(t){t.target===this.element&&this.close()},n.close=function(){this.showing&&(this.hideTimeout=setTimeout((function(){return it.close("Modal")})))},n.clear=function(){this.component&&this.component.onhide(),this.component=null,m.redraw()},n.onready=function(){var t;(null===(t=this.component)||void 0===t?void 0:t.onready)&&this.component.onready()},e}(S.a),ct=function(t){function e(){return t.apply(this,arguments)||this}o(e,t);var n=e.prototype;return n.className=function(){return"RequestErrorModal Modal--large"},n.title=function(){return this.props.error.xhr?this.props.error.xhr.status+" "+this.props.error.xhr.statusText:""},n.content=function(){var t;try{t=JSON.stringify(JSON.parse(this.props.error.responseText),null,2)}catch(e){t=this.props.error.responseText}return m("div",{className:"Modal-body"},m("pre",null,this.props.error.options.method," ",this.props.error.options.url,m("br",null),m("br",null),t))},e}(at),ut=function(){function t(){this.forum=void 0,this.data=void 0,this.translator=new g,this.bus=new p,this.session=void 0,this.store=new b({forums:C,users:L,discussions:P,posts:B,groups:R,notifications:U}),this.drawer=new k,this.modal=void 0,this.cache={notifications:null},this.routes={},this.title="",this.titleCount=0,this.requestError=null}var e=t.prototype;return e.mount=function(t){void 0===t&&(t=""),m.mount(document.getElementById("modal"),new st),m.route(document.getElementById("content"),t+"/",function(t,e){void 0===e&&(e="");var n={};for(var r in t){var o=t[r];o.component&&(o.component.attrs||(o.component.attrs={}),o.component.attrs.routeName=r),n[e+o.path]=o.component}return n}(this.routes,t))},e.boot=function(t){this.data=t,this.store.pushPayload({data:this.data.resources}),this.forum=this.store.getById("forums",1),this.session=new y(this.store.getById("users",this.data.session.userId),this.data.session.csrfToken),this.locale(),this.plugins(),this.setupRoutes(),this.mount(),this.bus.dispatch("app.booting")},e.locale=function(){this.translator.locale=this.data.locale,this.bus.dispatch("app.locale")},e.plugins=function(){this.bus.dispatch("app.plugins")},e.setupRoutes=function(){this.bus.dispatch("app.routes")},e.preloadedApiDocument=function(){if(this.data.apiDocument){var t=this.store.pushPayload(this.data.apiDocument);return this.data.apiDocument=null,t}return null},e.setTitle=function(t){this.title=t,this.updateTitle()},e.setTitleCount=function(t){this.titleCount=t,this.updateTitle()},e.updateTitle=function(){document.title=(this.titleCount?"("+this.titleCount+") ":"")+(this.title?this.title+" - ":"")+this.forum.attribute("title")},e.route=function(t,e){void 0===e&&(e={});var n=this.routes[t];if(!n)throw new Error("Route '"+t+"' does not exist");var r=n.path.replace(/:([^\/]+)/g,(function(t,n){return d(e,n)})),o=m.buildQueryString(e);return(""===m.route.prefix?this.forum.attribute("basePath"):"")+r+(o?"?"+o:"")},e.request=function(t){var e=this,n=Object(i.a)({},t);if(n.background=n.background||!0,w(n,"config",(function(t,n){return n.setRequestHeader("X-CSRF-Token",e.session.csrfToken)})),"GET"!==n.method&&"POST"!==n.method){var r=n.method;w(n,"config",(function(t,e){return e.setRequestHeader("X-HTTP-Method-Override",r)})),n.method="POST"}n.deserialize=n.deserialize||function(t){return t},n.errorHandler=n.errorHandler||function(t){throw t};var o=n.extract;return n.extract=function(t){var e;e=o?o(t.responseText):t.responseText||null;var r=t.status;if(r<200||r>299)throw new N(r,e,n,t);if(t.getResponseHeader){var i=t.getResponseHeader("X-CSRF-Token");i&&(app.session.csrfToken=i)}try{return JSON.parse(e)}catch(r){throw new N(500,e,n,t)}},m.request(n).then((function(t){return t}),(function(t){var r;switch(e.requestError=t,t.status){case 422:r=t.response.errors.map((function(t){return[t.detail,m("br")]})).reduce((function(t,e){return t.concat(e)}),[]).slice(0,-1);break;case 401:case 403:r=e.translator.trans("core.lib.error.permission_denied_message");break;case 404:case 410:r=e.translator.trans("core.lib.error.not_found_message");break;case 429:r=e.translator.trans("core.lib.error.rate_limit_exceeded_message");break;default:r=e.translator.trans("core.lib.error.generic_message")}var o=app.forum.attribute("debug");t.alert=ot.component({type:"error",children:r,controls:o&&[Z.component({className:"Button Button--link",onclick:e.showDebug.bind(e,t),children:"DEBUG"})]});try{n.errorHandler(t)}catch(t){console.error(t)}return Promise.reject(t)}))},e.showDebug=function(t){this.modal.show(ct.component({error:t}))},t}(),lt=function(){function t(){this.stack=[]}var e=t.prototype;return e.getCurrent=function(){return this.stack[this.stack.length-1]},e.getPrevious=function(){return this.stack[this.stack.length-2]},e.push=function(t,e,n){void 0===n&&(n=m.route.get());var r=this.stack[this.stack.length-2];r&&r.name===t&&this.stack.pop();var o=this.getCurrent();o&&o.name===t?Object(i.a)(o,{url:n,title:e}):this.stack.push({name:t,url:n,title:e})},e.canGoBack=function(){return this.stack.length>1},e.back=function(){if(!this.canGoBack())return this.home();this.stack.pop(),m.route.set(this.getCurrent().url)},e.backUrl=function(){return this.stack[this.stack.length-2].url},e.home=function(){this.stack.splice(0),m.route.set("/")},t}(),ft=function(t){function e(){return t.apply(this,arguments)||this}o(e,t);var n=e.prototype;return n.view=function(){return m("ul",{className:"Header-controls"},X(this.items().toArray()))},n.items=function(){return new _},e}(S.a),pt=function(t){function e(){return t.apply(this,arguments)||this}o(e,t);var n=e.prototype;return n.view=function(){return m("div",{className:"LogInButtons"},this.items().toArray())},n.items=function(){return new _},e}(S.a),dt=function(t){function e(){for(var e,n=arguments.length,r=new Array(n),o=0;o .Dropdown-toggle").dropdown(),this.element.addEventListener("shown.bs.dropdown",(function(){n.showing=!0,n.props.onshow&&n.props.onshow(),m.redraw();var t=n.$(".Dropdown-menu"),e=t.hasClass("Dropdown-menu--right");t.removeClass("Dropdown-menu--top Dropdown-menu--right"),t.toggleClass("Dropdown-menu--top",t.offset().top+t.height()>$(window).scrollTop()+$(window).height()),t.offset().top<0&&t.removeClass("Dropdown-menu--top"),t.toggleClass("Dropdown-menu--right",e||t.offset().left+t.width()>$(window).scrollLeft()+$(window).width())})),this.element.addEventListener("hidden.bs.dropdown",(function(){n.showing=!1,n.props.onhide&&n.props.onhide(),m.redraw()}))},n.getButton=function(){return m("button",{className:"Dropdown-toggle "+this.props.buttonClassName,"data-toggle":"dropdown",onclick:this.props.onclick},this.getButtonContent())},n.getButtonContent=function(){var t=this.props;return[t.icon?A(t.icon,{className:"Button-icon"}):"",m("span",{className:"Button-label"},t.label),t.caretIcon?A(t.caretIcon,{className:"Button-caret"}):""]},n.getMenu=function(t){return m("ul",{className:"Dropdown-menu dropdown-menu "+this.props.menuClassName},t)},e}(S.a),vt=function(t){function e(){return t.apply(this,arguments)||this}return o(e,t),e.initProps=function(t){t.active=this.isActive(t)},e.prototype.view=function(){var e=t.prototype.view.call(this);return e.tag=m.route.Link,e.attrs.active=String(e.attrs.active),e},e.isActive=function(t){return void 0!==t.active?t.active:m.route.get()===t.href},e}(Z),gt=function(t){function e(){return t.apply(this,arguments)||this}o(e,t),e.initProps=function(e){t.initProps.call(this,e),e.className="SessionDropdown",e.buttonClassName="Button Button--user Button--flat",e.menuClassName="Dropdown-menu--right"};var n=e.prototype;return n.view=function(){return this.props.children=this.items().toArray(),t.prototype.view.call(this)},n.getButtonContent=function(){var t=app.session.user;return[ht(t)," ",m("span",{className:"Button-label"},v(t))]},n.items=function(){var t=new _,e=app.session.user;return t.add("profile",vt.component({icon:"fas fa-user",children:app.translator.trans("core.forum.header.profile_button"),href:app.route.user(e)}),100),t.add("settings",vt.component({icon:"fas fa-cog",children:app.translator.trans("core.forum.header.settings_button"),href:app.route("settings")}),50),app.forum.attribute("adminUrl")&&t.add("administration",vt.component({icon:"fas fa-wrench",children:app.translator.trans("core.forum.header.admin_button"),href:app.forum.attribute("adminUrl"),target:"_blank"}),0),t.add("separator",J.component(),-90),t.add("logOut",Z.component({icon:"fas fa-sign-out-alt",children:app.translator.trans("core.forum.header.log_out_button"),onclick:app.session.logout.bind(app.session)}),-100),t},e}(mt),yt=function(t){function e(){return t.apply(this,arguments)||this}return o(e,t),e.initProps=function(e){e.caretIcon=void 0!==e.caretIcon?e.caretIcon:"fas fa-sort",t.initProps.call(this,e),e.className+=" Dropdown--select"},e.prototype.getButtonContent=function(){var t=this.props.children.filter((function(t){return t.attrs.active}))[0],e=t&&t.attrs.children||this.props.defaultLabel;return e instanceof Array&&(e=e[0]),[m("span",{className:"Button-label"},e),A(this.props.caretIcon,{className:"Button-caret"})]},e}(mt),bt=function(t){function e(){for(var e,n=arguments.length,r=new Array(n),o=0;o=i+a&&n.loadMore()},o.on("scroll",this.scrollHandler)},n.onremove=function(e){t.prototype.onremove.call(this,e),this.$scrollParent.off("scroll",this.scrollHandler)},n.load=function(){app.session.user.newNotificationCount()&&delete app.cache.notifications,app.cache.notifications||(app.session.user.pushAttributes({newNotificationCount:0}),this.loadMore())},n.loadMore=function(){var t=this;this.loading=!0,m.redraw();var e=app.cache.notifications?{page:{offset:10*app.cache.notifications.length}}:null;return app.store.find("notifications",e).then(this.parseResults.bind(this)).catch((function(){})).then((function(){t.loading=!1,m.redraw()}))},n.parseResults=function(t){return app.cache.notifications=app.cache.notifications||[],t.length&&app.cache.notifications.push(t),this.moreResults=!!t.payload.links.next,t},n.markAllAsRead=function(){app.cache.notifications&&(app.session.user.pushAttributes({unreadNotificationCount:0}),app.cache.notifications.forEach((function(t){t.forEach((function(t){return t.pushAttributes({isRead:!0})}))})),app.request({url:app.forum.attribute("apiUrl")+"/notifications/read",method:"POST"}))},e}(S.a),wt=function(t){function e(){for(var e,n=arguments.length,r=new Array(n),o=0;o0?"...":"")+t.substring(n,n+e)+(t.length>n+e?"...":"")}(o,n,i)),o=$("
").text(o).html(),e&&(o=o.replace(r,"$&")),m.trust(o)}var Nt=function(){},Et=function(t){function e(){for(var e,n=arguments.length,r=new Array(n),o=0;o li:not(.Dropdown-header)",(function(){r.setIndex(r.selectableItems().index(this))}));var o=this.$("input");this.navigator=new xt,this.navigator.onUp((function(){return n.setIndex(n.getCurrentNumericIndex()-1,!0)})).onDown((function(){return n.setIndex(n.getCurrentNumericIndex()+1,!0)})).onSelect(this.selectResult.bind(this)).onCancel(this.clear.bind(this)).bindTo(o),o.on("input focus",(function(){var t=this.value.toLowerCase();t&&(clearTimeout(r.searchTimeout),r.searchTimeout=setTimeout((function(){-1===r.searched.indexOf(t)&&(t.length>=3&&r.sources.map((function(e){e.search&&(r.loadingSources++,e.search(t).then((function(){r.loadingSources=Math.max(0,r.loadingSources-1),m.redraw()})))})),r.searched.push(t),m.redraw())}),250))})).on("focus",(function(){$(this).one("mouseup",(function(t){return t.preventDefault()})).select()}))},n.getCurrentSearch=function(){return app.current&&"function"==typeof app.current.searching&&app.current.searching()},n.selectResult=function(){clearTimeout(this.searchTimeout),this.loadingSources=0,this.value()?m.route.set(this.getItem(this.index).find("a").attr("href")):this.clear(),this.$("input").blur()},n.clear=function(){this.value(""),this.getCurrentSearch()?app.current.clearSearch():m.redraw()},n.sourceItems=function(){var t=new _;return app.forum.attribute("canViewDiscussions")&&t.add("discussions",new Et),app.forum.attribute("canViewUserList")&&t.add("users",new Ct),t},n.selectableItems=function(){return this.$(".Search-results > li:not(.Dropdown-header)")},n.getCurrentNumericIndex=function(){return this.selectableItems().index(this.getItem(this.index))},n.getItem=function(t){var e=this.selectableItems(),n=e.filter('[data-index="'+t+'"]');return n.length||(n=e.eq(t)),n},n.setIndex=function(t,e){var n=this.selectableItems(),r=n.parent(),o=t;t<0?o=n.length-1:t>=n.length&&(o=0);var i=n.removeClass("active").eq(o).addClass("active");if(this.index=i.attr("data-index")||o,e){var a,s=r.scrollTop(),c=r.offset().top,u=c+r.outerHeight(),l=i.offset().top,f=l+i.outerHeight();lu&&(a=s-u+f+parseInt(r.css("padding-bottom"),10)),void 0!==a&&r.animate({scrollTop:a},100)}},e}(S.a),Ot=function(t){function e(){return t.apply(this,arguments)||this}o(e,t);var n=e.prototype;return n.view=function(){return m("ul",{className:"Header-controls"},X(this.items().toArray()))},n.items=function(){var t=new _;if(t.add("search",Tt.component(),30),app.forum.attribute("showLanguageSelector")&&Object.keys(app.data.locales).length>1){var e=[],n=function(t){e.push(Z.component({active:app.data.locale===t,children:app.data.locales[t],icon:app.data.locale!==t||"fas fa-check",onclick:function(){app.session.user?app.session.user.savePreferences({locale:t}).then((function(){return window.location.reload()})):(document.cookie="locale="+t+"; path=/; expires=Tue, 19 Jan 2038 03:14:07 GMT",window.location.reload())}}))};for(var r in app.data.locales)n(r);t.add("locale",yt.component({children:e,buttonClassName:"Button Button--link"}),20)}return app.session.user?(t.add("notifications",wt.component(),10),t.add("session",gt.component(),0)):(app.forum.attribute("allowSignUp")&&t.add("signUp",Z.component({children:app.translator.trans("core.forum.header.sign_up_link"),className:"Button Button--link",onclick:function(){return app.modal.show(new SignUpModal)}}),10),t.add("logIn",Z.component({children:app.translator.trans("core.forum.header.log_in_link"),className:"Button Button--link",onclick:function(){return app.modal.show(new dt)}}),0)),t},e}(S.a),_t=function(t){function e(){return t.apply(this,arguments)||this}o(e,t);var n=e.prototype;return n.oninit=function(){console.log("IndexPage#oninit")},n.view=function(){return m("div",{class:"container"},m("h1",null,"hi"))},e}(S.a),St=function(t){function e(){for(var e,n=arguments.length,r=new Array(n),o=0;o ul")[0];$(window).off(".affix"),new hcSticky(o,{stickTo:e,top:r.outerHeight(!0)+parseInt(n.css("margin-top"),10)})}function jt(t){var e=dayjs(t),n=dayjs();e.isAfter(n)&&(e=n);return e.diff(dayjs())<-2592e6?e.year()===dayjs().year()?e.format("D MMM"):e.format("MMM 'YY"):e.fromNow()}var Pt={controls:function(t,e){var n=this,r=new _;return["user","moderation","destructive"].forEach((function(o){var i=n[o+"Controls"](t,e).toArray();i.length&&(i.forEach((function(t){return r.add(t.itemName,t)})),r.add(o+"Separator",J.component()))})),r},userControls:function(){return new _},moderationControls:function(t){var e=new _;return t.canEdit()&&e.add("edit",Z.component({icon:"fas fa-pencil-alt",children:app.translator.trans("core.forum.user_controls.edit_button"),onclick:this.editAction.bind(this,t)})),e},destructiveControls:function(t){var e=new _;return"1"!==t.id()&&t.canDelete()&&e.add("delete",Z.component({icon:"fas fa-times",children:app.translator.trans("core.forum.user_controls.delete_button"),onclick:this.deleteAction.bind(this,t)})),e},deleteAction:function(t){var e=this;confirm(app.translator.transText("core.forum.user_controls.delete_confirmation"))&&t.delete().then((function(){e.showDeletionAlert(t,"success"),app.current instanceof Lt&&app.current.user===t?app.history.back():window.location.reload()})).catch((function(){return e.showDeletionAlert(t,"error")}))},showDeletionAlert:function(t,e){var n=t.data.attributes,r=n.username,o=n.email,i="core.forum.user_controls.delete_"+e+"_message";app.alerts.show(ot.component({type:e,children:app.translator.trans(i,{username:r,email:o})}))},editAction:function(t){app.modal.show(new EditUserModal({user:t}))}},Mt=function(t){function e(){for(var e,n=arguments.length,r=new Array(n),o=0;o').appendTo("body").hide().click().on("change",(function(e){t.upload($(e.target)[0].files[0])}))}},n.upload=function(t){if(!this.loading){var e=this.props.user,n=new FormData;data.append("avatar",t),this.loading=!0,m.redraw(),app.request({method:"POST",url:app.forum.attribute("apiUrl")+"/users/"+e.id()+"/avatar",serialize:function(t){return t},body:n}).then(this.success.bind(this),this.failure.bind(this))}},n.remove=function(){var t=this.props.user;this.loading=!0,m.redraw(),app.request({method:"DELETE",url:app.forum.attribute("apiUrl")+"/users/"+t.id()+"/avatar"}).then(this.success.bind(this),this.failure.bind(this))},n.success=function(t){app.store.pushPayload(t),delete this.props.user.avatarColor,this.loading=!1,m.redraw()},n.failure=function(t){this.loading=!1,m.redraw()},e}(S.a),Dt=function(t){function e(){return t.apply(this,arguments)||this}o(e,t);var n=e.prototype;return n.view=function(){var t=this.props.user,e=Pt.controls(t,this).toArray(),n=t.color(),r=t.badges().toArray();return m("div",{className:"UserCard "+(this.props.className||""),style:n?{backgroundColor:n}:""},m("div",{className:"darkenBackground"},m("div",{className:"container"},e.length?mt.component({children:e,className:"UserCard-controls App-primaryControl",menuClassName:"Dropdown-menu--right",buttonClassName:this.props.controlsButtonClassName,label:app.translator.trans("core.forum.user_controls.button"),icon:"fas fa-ellipsis-v"}):"",m("div",{className:"UserCard-profile"},m("h2",{className:"UserCard-identity"},this.props.editable?[Mt.component({user:t,className:"UserCard-avatar"}),v(t)]:m(m.route.Link,{href:app.route.user(t)},m("div",{className:"UserCard-avatar"},ht(t)),v(t))),r.length?m("ul",{className:"UserCard-badges badges"},X(r)):"",m("ul",{className:"UserCard-info"},X(this.infoItems().toArray()))))))},n.infoItems=function(){var t=new _,e=this.props.user,n=e.lastSeenAt();if(n){var r=e.isOnline();t.add("lastSeen",m("span",{className:"UserCard-lastSeen"+(r?" online":"")},r?[A("fas fa-circle")," ",app.translator.trans("core.forum.user.online_text")]:[A("far fa-clock")," ",jt(n)]))}return t.add("joined",app.translator.trans("core.forum.user.joined_date_text",{ago:jt(e.joinTime())})),t},e}(S.a),Lt=function(t){function e(){for(var e,n=arguments.length,r=new Array(n),o=0;o=this.loadLimit,m.redraw(),t},e}(Lt),zt=function(t){function e(){for(var e,n=arguments.length,r=new Array(n),o=0;o {\n element: HTMLElement;\n\n props = {};\n\n view(vnode) {\n throw new Error('Component#view must be implemented by subclass');\n }\n\n oninit(vnode) {\n this.setProps(vnode.attrs);\n }\n\n oncreate(vnode) {\n this.setProps(vnode.attrs);\n this.element = vnode.dom;\n }\n\n onbeforeupdate(vnode) {\n this.setProps(vnode.attrs);\n }\n\n onupdate(vnode) {\n this.setProps(vnode.attrs);\n }\n\n onbeforeremove(vnode) {\n this.setProps(vnode.attrs);\n }\n\n onremove(vnode) {\n this.setProps(vnode.attrs);\n }\n\n /**\n * Returns a jQuery object for this component's element. If you pass in a\n * selector string, this method will return a jQuery object, using the current\n * element as its buffer.\n *\n * For example, calling `component.$('li')` will return a jQuery object\n * containing all of the `li` elements inside the DOM element of this\n * component.\n *\n * @param {String} [selector] a jQuery-compatible selector string\n * @returns {jQuery} the jQuery object for the DOM node\n * @final\n */\n $(selector?: string) {\n const $element = $(this.element);\n\n return selector ? $element.find(selector) : $element;\n }\n\n static component(props: ComponentProps|any = {}, children?: Mithril.Children) {\n const componentProps: ComponentProps = Object.assign({}, props);\n\n if (children) componentProps.children = children;\n\n return m(this, componentProps);\n }\n\n static initProps(props: ComponentProps = {}) {}\n\n private setProps(props: T) {\n (this.constructor as typeof Component).initProps(props);\n\n this.props = props;\n }\n}\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","\"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","/**\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","// 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.
\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 () {\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\r\n .on('mouseenter', hover)\r\n .on('mouseleave', leave || hover);\r\n};\r\n\r\n// add animated scroll\r\n$.fn.animatedScrollTop = 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// 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// @ts-ignore\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\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\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 m from 'mithril';\nimport prop from 'mithril/stream';\n\nimport Component from '../Component';\n\nexport default () => {\n const mo = window['m'];\n\n const _m = function (comp, ...args) {\n if (!arguments[1]) arguments[1] = {};\n\n if (comp.prototype && comp.prototype instanceof Component) {\n let children = args.slice(1);\n if (children.length === 1 && Array.isArray(children[0])) {\n children = children[0];\n }\n\n if (children) {\n Object.defineProperty(arguments[1], 'children', {\n writable: true,\n });\n\n arguments[1].children = (arguments[1].children || []).concat(children);\n }\n }\n\n const node = mo.apply(this, arguments);\n\n if (!node.attrs) node.attrs = {};\n\n if (node.attrs.bidi) {\n m.bidi(node, node.attrs.bidi);\n }\n\n if (node.attrs.route) {\n node.attrs.href = node.attrs.route;\n node.attrs.tag = m.route.Link;\n\n delete node.attrs.route;\n }\n\n return node;\n };\n\n Object.keys(mo).forEach(key => _m[key] = mo[key]);\n\n _m.withAttr = (key: string, cb: Function) => function () {\n cb(this.getAttribute(key) || this[key]);\n };\n\n _m.prop = prop;\n\n window['m'] = _m;\n}\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","import isBrowser from './isBrowser';\n\nconst longerTimeoutBrowsers = ['Edge', 'Trident', 'Firefox'];\nlet timeoutDuration = 0;\nfor (let i = 0; i < longerTimeoutBrowsers.length; i += 1) {\n if (isBrowser && navigator.userAgent.indexOf(longerTimeoutBrowsers[i]) >= 0) {\n timeoutDuration = 1;\n break;\n }\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","export default typeof window !== 'undefined' && typeof document !== 'undefined';\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","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","/*\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`], 10) +\n parseFloat(styles[`border${sideB}Width`], 10)\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.right - result.left;\n const height =\n sizes.height || element.clientHeight || result.bottom - result.top;\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, 10);\n const borderLeftWidth = parseFloat(styles.borderLeftWidth, 10);\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, 10);\n const marginLeft = parseFloat(styles.marginLeft, 10);\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 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","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 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, 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 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 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';\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, 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.
\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 explicity 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 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.
\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.
\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.
\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.
\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.
\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.
\n * It will read the variation of the `placement` property.
\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.
\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.
\n * The latter is a deprecated method because it leads to confusion and will be\n * removed in v2.
\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.
\n * We can say it has \"escaped the boundaries\" — or just \"escaped\".
\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.
\n * These can be overridden using the `options` argument of Popper.js.
\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.
\n * By default, it is set to no-op.
\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.
\n * By default, it is set to no-op.
\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}`], 10);\n const popperBorderSide = parseFloat(css[`border${sideCapitalized}Width`], 10);\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=n.$locale().relativeTime,a=[{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\"}],f=a.length,s=0;s0&&(l=a[s-1]),i=u[l.l].replace(\"%d\",h);break}}return t?i:(d>0?u.future:u.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","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 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","/**\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 getNative = require('./_getNative');\n\n/* Built-in method references that are verified to be native. */\nvar nativeCreate = getNative(Object, 'create');\n\nmodule.exports = nativeCreate;\n","var eq = require('./eq');\n\n/**\n * Gets the index at which the `key` is found in `array` of key-value pairs.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} key The key to search for.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction assocIndexOf(array, key) {\n var length = array.length;\n while (length--) {\n if (eq(array[length][0], key)) {\n return length;\n }\n }\n return -1;\n}\n\nmodule.exports = assocIndexOf;\n","var isKeyable = require('./_isKeyable');\n\n/**\n * Gets the data for `map`.\n *\n * @private\n * @param {Object} map The map to query.\n * @param {string} key The reference key.\n * @returns {*} Returns the map data.\n */\nfunction getMapData(map, key) {\n var data = map.__data__;\n return isKeyable(key)\n ? data[typeof key == 'string' ? 'string' : 'hash']\n : data.map;\n}\n\nmodule.exports = getMapData;\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>\")\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>/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 $('
').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\",a=\"quarter\",o=\"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:o,w:s,d:i,h:r,m:e,s:n,ms:t,Q:a}[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||(l=r),r},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})};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) 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 = \"ij\"\n\t\t// console.log(div.innerHTML)\n\t\t// --> \"ij\", no 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 = \"\" + vnode.children + \"\"\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.3\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>>0;if(\"function\"!=typeof t)throw new TypeError(t+\" is not a function\");for(1 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 the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\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 object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return value != null && (type == 'object' || type == 'function');\n}\n\nmodule.exports = isObject;\n","var baseGetTag = require('./_baseGetTag'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar symbolTag = '[object Symbol]';\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or 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 a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n return typeof value == 'symbol' ||\n (isObjectLike(value) && baseGetTag(value) == symbolTag);\n}\n\nmodule.exports = isSymbol;\n","var baseIsNative = require('./_baseIsNative'),\n getValue = require('./_getValue');\n\n/**\n * Gets the native function at `key` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the method to get.\n * @returns {*} Returns the function if it's native, else `undefined`.\n */\nfunction getNative(object, key) {\n var value = getValue(object, key);\n return baseIsNative(value) ? value : undefined;\n}\n\nmodule.exports = getNative;\n","/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\nmodule.exports = freeGlobal;\n","module.exports = function(module) {\n\tif (!module.webpackPolyfill) {\n\t\tmodule.deprecate = function() {};\n\t\tmodule.paths = [];\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\tmodule.webpackPolyfill = 1;\n\t}\n\treturn module;\n};\n","/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/** Used to detect unsigned integer values. */\nvar reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n/**\n * Checks if `value` is a valid array-like index.\n *\n * @private\n * @param {*} value The value to check.\n * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n */\nfunction isIndex(value, length) {\n var type = typeof value;\n length = length == null ? MAX_SAFE_INTEGER : length;\n\n return !!length &&\n (type == 'number' ||\n (type != 'symbol' && reIsUint.test(value))) &&\n (value > -1 && value % 1 == 0 && value < length);\n}\n\nmodule.exports = isIndex;\n","/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This method is loosely based on\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\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 a valid length, else `false`.\n * @example\n *\n * _.isLength(3);\n * // => true\n *\n * _.isLength(Number.MIN_VALUE);\n * // => false\n *\n * _.isLength(Infinity);\n * // => false\n *\n * _.isLength('3');\n * // => false\n */\nfunction isLength(value) {\n return typeof value == 'number' &&\n value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n}\n\nmodule.exports = isLength;\n","var isFunction = require('./isFunction'),\n isLength = require('./isLength');\n\n/**\n * Checks if `value` is array-like. A value is considered array-like if it's\n * not a function and has a `value.length` that's an integer greater than or\n * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\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 array-like, else `false`.\n * @example\n *\n * _.isArrayLike([1, 2, 3]);\n * // => true\n *\n * _.isArrayLike(document.body.children);\n * // => true\n *\n * _.isArrayLike('abc');\n * // => true\n *\n * _.isArrayLike(_.noop);\n * // => false\n */\nfunction isArrayLike(value) {\n return value != null && isLength(value.length) && !isFunction(value);\n}\n\nmodule.exports = isArrayLike;\n","var baseGetTag = require('./_baseGetTag'),\n isObject = require('./isObject');\n\n/** `Object#toString` result references. */\nvar asyncTag = '[object AsyncFunction]',\n funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]',\n proxyTag = '[object Proxy]';\n\n/**\n * Checks if `value` is classified as a `Function` 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 a function, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n if (!isObject(value)) {\n return false;\n }\n // The use of `Object#toString` avoids issues with the `typeof` operator\n // in Safari 9 which returns 'object' for typed arrays and other constructors.\n var tag = baseGetTag(value);\n return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;\n}\n\nmodule.exports = isFunction;\n","var isArray = require('./isArray'),\n isKey = require('./_isKey'),\n stringToPath = require('./_stringToPath'),\n toString = require('./toString');\n\n/**\n * Casts `value` to a path array if it's not one.\n *\n * @private\n * @param {*} value The value to inspect.\n * @param {Object} [object] The object to query keys on.\n * @returns {Array} Returns the cast property path array.\n */\nfunction castPath(value, object) {\n if (isArray(value)) {\n return value;\n }\n return isKey(value, object) ? [value] : stringToPath(toString(value));\n}\n\nmodule.exports = castPath;\n","/**\n * Performs a\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * comparison between two values to determine if they are equivalent.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.eq(object, object);\n * // => true\n *\n * _.eq(object, other);\n * // => false\n *\n * _.eq('a', 'a');\n * // => true\n *\n * _.eq('a', Object('a'));\n * // => false\n *\n * _.eq(NaN, NaN);\n * // => true\n */\nfunction eq(value, other) {\n return value === other || (value !== value && other !== other);\n}\n\nmodule.exports = eq;\n","var isSymbol = require('./isSymbol');\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/**\n * Converts `value` to a string key if it's not a string or symbol.\n *\n * @private\n * @param {*} value The value to inspect.\n * @returns {string|symbol} Returns the key.\n */\nfunction toKey(value) {\n if (typeof value == 'string' || isSymbol(value)) {\n return value;\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\nmodule.exports = toKey;\n","var arrayEach = require('./_arrayEach'),\n baseEach = require('./_baseEach'),\n castFunction = require('./_castFunction'),\n isArray = require('./isArray');\n\n/**\n * Iterates over elements of `collection` and invokes `iteratee` for each element.\n * The iteratee is invoked with three arguments: (value, index|key, collection).\n * Iteratee functions may exit iteration early by explicitly returning `false`.\n *\n * **Note:** As with other \"Collections\" methods, objects with a \"length\"\n * property are iterated like arrays. To avoid this behavior use `_.forIn`\n * or `_.forOwn` for object iteration.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @alias each\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Array|Object} Returns `collection`.\n * @see _.forEachRight\n * @example\n *\n * _.forEach([1, 2], function(value) {\n * console.log(value);\n * });\n * // => Logs `1` then `2`.\n *\n * _.forEach({ 'a': 1, 'b': 2 }, function(value, key) {\n * console.log(key);\n * });\n * // => Logs 'a' then 'b' (iteration order is not guaranteed).\n */\nfunction forEach(collection, iteratee) {\n var func = isArray(collection) ? arrayEach : baseEach;\n return func(collection, castFunction(iteratee));\n}\n\nmodule.exports = forEach;\n","var baseGet = require('./_baseGet');\n\n/**\n * Gets the value at `path` of `object`. If the resolved value is\n * `undefined`, the `defaultValue` is returned in its place.\n *\n * @static\n * @memberOf _\n * @since 3.7.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @param {*} [defaultValue] The value returned for `undefined` resolved values.\n * @returns {*} Returns the resolved value.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n *\n * _.get(object, 'a[0].b.c');\n * // => 3\n *\n * _.get(object, ['a', '0', 'b', 'c']);\n * // => 3\n *\n * _.get(object, 'a.b.c', 'default');\n * // => 'default'\n */\nfunction get(object, path, defaultValue) {\n var result = object == null ? undefined : baseGet(object, path);\n return result === undefined ? defaultValue : result;\n}\n\nmodule.exports = get;\n","var baseSet = require('./_baseSet');\n\n/**\n * Sets the value at `path` of `object`. If a portion of `path` doesn't exist,\n * it's created. Arrays are created for missing index properties while objects\n * are created for all other missing properties. Use `_.setWith` to customize\n * `path` creation.\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 3.7.0\n * @category Object\n * @param {Object} object The object to modify.\n * @param {Array|string} path The path of the property to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns `object`.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n *\n * _.set(object, 'a[0].b.c', 4);\n * console.log(object.a[0].b.c);\n * // => 4\n *\n * _.set(object, ['x', '0', 'y', 'z'], 5);\n * console.log(object.x[0].y.z);\n * // => 5\n */\nfunction set(object, path, value) {\n return object == null ? object : baseSet(object, path, value);\n}\n\nmodule.exports = set;\n","/**\n * A specialized version of `_.forEach` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns `array`.\n */\nfunction arrayEach(array, iteratee) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n if (iteratee(array[index], index, array) === false) {\n break;\n }\n }\n return array;\n}\n\nmodule.exports = arrayEach;\n","var baseForOwn = require('./_baseForOwn'),\n createBaseEach = require('./_createBaseEach');\n\n/**\n * The base implementation of `_.forEach` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array|Object} Returns `collection`.\n */\nvar baseEach = createBaseEach(baseForOwn);\n\nmodule.exports = baseEach;\n","var baseFor = require('./_baseFor'),\n keys = require('./keys');\n\n/**\n * The base implementation of `_.forOwn` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Object} Returns `object`.\n */\nfunction baseForOwn(object, iteratee) {\n return object && baseFor(object, iteratee, keys);\n}\n\nmodule.exports = baseForOwn;\n","var createBaseFor = require('./_createBaseFor');\n\n/**\n * The base implementation of `baseForOwn` which iterates over `object`\n * properties returned by `keysFunc` and invokes `iteratee` for each property.\n * Iteratee functions may exit iteration early by explicitly returning `false`.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @returns {Object} Returns `object`.\n */\nvar baseFor = createBaseFor();\n\nmodule.exports = baseFor;\n","/**\n * Creates a base function for methods like `_.forIn` and `_.forOwn`.\n *\n * @private\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new base function.\n */\nfunction createBaseFor(fromRight) {\n return function(object, iteratee, keysFunc) {\n var index = -1,\n iterable = Object(object),\n props = keysFunc(object),\n length = props.length;\n\n while (length--) {\n var key = props[fromRight ? length : ++index];\n if (iteratee(iterable[key], key, iterable) === false) {\n break;\n }\n }\n return object;\n };\n}\n\nmodule.exports = createBaseFor;\n","var arrayLikeKeys = require('./_arrayLikeKeys'),\n baseKeys = require('./_baseKeys'),\n isArrayLike = require('./isArrayLike');\n\n/**\n * Creates an array of the own enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects. See the\n * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n * for more details.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keys(new Foo);\n * // => ['a', 'b'] (iteration order is not guaranteed)\n *\n * _.keys('hi');\n * // => ['0', '1']\n */\nfunction keys(object) {\n return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);\n}\n\nmodule.exports = keys;\n","var baseTimes = require('./_baseTimes'),\n isArguments = require('./isArguments'),\n isArray = require('./isArray'),\n isBuffer = require('./isBuffer'),\n isIndex = require('./_isIndex'),\n isTypedArray = require('./isTypedArray');\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 * Creates an array of the enumerable property names of the array-like `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @param {boolean} inherited Specify returning inherited property names.\n * @returns {Array} Returns the array of property names.\n */\nfunction arrayLikeKeys(value, inherited) {\n var isArr = isArray(value),\n isArg = !isArr && isArguments(value),\n isBuff = !isArr && !isArg && isBuffer(value),\n isType = !isArr && !isArg && !isBuff && isTypedArray(value),\n skipIndexes = isArr || isArg || isBuff || isType,\n result = skipIndexes ? baseTimes(value.length, String) : [],\n length = result.length;\n\n for (var key in value) {\n if ((inherited || hasOwnProperty.call(value, key)) &&\n !(skipIndexes && (\n // Safari 9 has enumerable `arguments.length` in strict mode.\n key == 'length' ||\n // Node.js 0.10 has enumerable non-index properties on buffers.\n (isBuff && (key == 'offset' || key == 'parent')) ||\n // PhantomJS 2 has enumerable non-index properties on typed arrays.\n (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||\n // Skip index properties.\n isIndex(key, length)\n ))) {\n result.push(key);\n }\n }\n return result;\n}\n\nmodule.exports = arrayLikeKeys;\n","/**\n * The base implementation of `_.times` without support for iteratee shorthands\n * or max array length checks.\n *\n * @private\n * @param {number} n The number of times to invoke `iteratee`.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the array of results.\n */\nfunction baseTimes(n, iteratee) {\n var index = -1,\n result = Array(n);\n\n while (++index < n) {\n result[index] = iteratee(index);\n }\n return result;\n}\n\nmodule.exports = baseTimes;\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\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","var root = require('./_root'),\n stubFalse = require('./stubFalse');\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Built-in value references. */\nvar Buffer = moduleExports ? root.Buffer : undefined;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined;\n\n/**\n * Checks if `value` is a buffer.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.\n * @example\n *\n * _.isBuffer(new Buffer(2));\n * // => true\n *\n * _.isBuffer(new Uint8Array(2));\n * // => false\n */\nvar isBuffer = nativeIsBuffer || stubFalse;\n\nmodule.exports = isBuffer;\n","/**\n * This method returns `false`.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {boolean} Returns `false`.\n * @example\n *\n * _.times(2, _.stubFalse);\n * // => [false, false]\n */\nfunction stubFalse() {\n return false;\n}\n\nmodule.exports = stubFalse;\n","var baseIsTypedArray = require('./_baseIsTypedArray'),\n baseUnary = require('./_baseUnary'),\n nodeUtil = require('./_nodeUtil');\n\n/* Node.js helper references. */\nvar nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;\n\n/**\n * Checks if `value` is classified as a typed array.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n * @example\n *\n * _.isTypedArray(new Uint8Array);\n * // => true\n *\n * _.isTypedArray([]);\n * // => false\n */\nvar isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;\n\nmodule.exports = isTypedArray;\n","var baseGetTag = require('./_baseGetTag'),\n isLength = require('./isLength'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n arrayTag = '[object Array]',\n boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n errorTag = '[object Error]',\n funcTag = '[object Function]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n objectTag = '[object Object]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n weakMapTag = '[object WeakMap]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]',\n float32Tag = '[object Float32Array]',\n float64Tag = '[object Float64Array]',\n int8Tag = '[object Int8Array]',\n int16Tag = '[object Int16Array]',\n int32Tag = '[object Int32Array]',\n uint8Tag = '[object Uint8Array]',\n uint8ClampedTag = '[object Uint8ClampedArray]',\n uint16Tag = '[object Uint16Array]',\n uint32Tag = '[object Uint32Array]';\n\n/** Used to identify `toStringTag` values of typed arrays. */\nvar typedArrayTags = {};\ntypedArrayTags[float32Tag] = typedArrayTags[float64Tag] =\ntypedArrayTags[int8Tag] = typedArrayTags[int16Tag] =\ntypedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =\ntypedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =\ntypedArrayTags[uint32Tag] = true;\ntypedArrayTags[argsTag] = typedArrayTags[arrayTag] =\ntypedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =\ntypedArrayTags[dataViewTag] = typedArrayTags[dateTag] =\ntypedArrayTags[errorTag] = typedArrayTags[funcTag] =\ntypedArrayTags[mapTag] = typedArrayTags[numberTag] =\ntypedArrayTags[objectTag] = typedArrayTags[regexpTag] =\ntypedArrayTags[setTag] = typedArrayTags[stringTag] =\ntypedArrayTags[weakMapTag] = false;\n\n/**\n * The base implementation of `_.isTypedArray` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n */\nfunction baseIsTypedArray(value) {\n return isObjectLike(value) &&\n isLength(value.length) && !!typedArrayTags[baseGetTag(value)];\n}\n\nmodule.exports = baseIsTypedArray;\n","/**\n * The base implementation of `_.unary` without support for storing metadata.\n *\n * @private\n * @param {Function} func The function to cap arguments for.\n * @returns {Function} Returns the new capped function.\n */\nfunction baseUnary(func) {\n return function(value) {\n return func(value);\n };\n}\n\nmodule.exports = baseUnary;\n","var freeGlobal = require('./_freeGlobal');\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Detect free variable `process` from Node.js. */\nvar freeProcess = moduleExports && freeGlobal.process;\n\n/** Used to access faster Node.js helpers. */\nvar nodeUtil = (function() {\n try {\n // Use `util.types` for Node.js 10+.\n var types = freeModule && freeModule.require && freeModule.require('util').types;\n\n if (types) {\n return types;\n }\n\n // Legacy `process.binding('util')` for Node.js < 10.\n return freeProcess && freeProcess.binding && freeProcess.binding('util');\n } catch (e) {}\n}());\n\nmodule.exports = nodeUtil;\n","var isPrototype = require('./_isPrototype'),\n nativeKeys = require('./_nativeKeys');\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 * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction baseKeys(object) {\n if (!isPrototype(object)) {\n return nativeKeys(object);\n }\n var result = [];\n for (var key in Object(object)) {\n if (hasOwnProperty.call(object, key) && key != 'constructor') {\n result.push(key);\n }\n }\n return result;\n}\n\nmodule.exports = baseKeys;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Checks if `value` is likely a prototype object.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\n */\nfunction isPrototype(value) {\n var Ctor = value && value.constructor,\n proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;\n\n return value === proto;\n}\n\nmodule.exports = isPrototype;\n","var overArg = require('./_overArg');\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeKeys = overArg(Object.keys, Object);\n\nmodule.exports = nativeKeys;\n","/**\n * Creates a unary function that invokes `func` with its argument transformed.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {Function} transform The argument transform.\n * @returns {Function} Returns the new function.\n */\nfunction overArg(func, transform) {\n return function(arg) {\n return func(transform(arg));\n };\n}\n\nmodule.exports = overArg;\n","var isArrayLike = require('./isArrayLike');\n\n/**\n * Creates a `baseEach` or `baseEachRight` function.\n *\n * @private\n * @param {Function} eachFunc The function to iterate over a collection.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new base function.\n */\nfunction createBaseEach(eachFunc, fromRight) {\n return function(collection, iteratee) {\n if (collection == null) {\n return collection;\n }\n if (!isArrayLike(collection)) {\n return eachFunc(collection, iteratee);\n }\n var length = collection.length,\n index = fromRight ? length : -1,\n iterable = Object(collection);\n\n while ((fromRight ? index-- : ++index < length)) {\n if (iteratee(iterable[index], index, iterable) === false) {\n break;\n }\n }\n return collection;\n };\n}\n\nmodule.exports = createBaseEach;\n","var identity = require('./identity');\n\n/**\n * Casts `value` to `identity` if it's not a function.\n *\n * @private\n * @param {*} value The value to inspect.\n * @returns {Function} Returns cast function.\n */\nfunction castFunction(value) {\n return typeof value == 'function' ? value : identity;\n}\n\nmodule.exports = castFunction;\n","/**\n * This method returns the first argument it receives.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Util\n * @param {*} value Any value.\n * @returns {*} Returns `value`.\n * @example\n *\n * var object = { 'a': 1 };\n *\n * console.log(_.identity(object) === object);\n * // => true\n */\nfunction identity(value) {\n return value;\n}\n\nmodule.exports = identity;\n","var castPath = require('./_castPath'),\n toKey = require('./_toKey');\n\n/**\n * The base implementation of `_.get` without support for default values.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @returns {*} Returns the resolved value.\n */\nfunction baseGet(object, path) {\n path = castPath(path, object);\n\n var index = 0,\n length = path.length;\n\n while (object != null && index < length) {\n object = object[toKey(path[index++])];\n }\n return (index && index == length) ? object : undefined;\n}\n\nmodule.exports = baseGet;\n","var isArray = require('./isArray'),\n isSymbol = require('./isSymbol');\n\n/** Used to match property names within property paths. */\nvar reIsDeepProp = /\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/,\n reIsPlainProp = /^\\w*$/;\n\n/**\n * Checks if `value` is a property name and not a property path.\n *\n * @private\n * @param {*} value The value to check.\n * @param {Object} [object] The object to query keys on.\n * @returns {boolean} Returns `true` if `value` is a property name, else `false`.\n */\nfunction isKey(value, object) {\n if (isArray(value)) {\n return false;\n }\n var type = typeof value;\n if (type == 'number' || type == 'symbol' || type == 'boolean' ||\n value == null || isSymbol(value)) {\n return true;\n }\n return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||\n (object != null && value in Object(object));\n}\n\nmodule.exports = isKey;\n","var memoizeCapped = require('./_memoizeCapped');\n\n/** Used to match property names within property paths. */\nvar rePropName = /[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))/g;\n\n/** Used to match backslashes in property paths. */\nvar reEscapeChar = /\\\\(\\\\)?/g;\n\n/**\n * Converts `string` to a property path array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the property path array.\n */\nvar stringToPath = memoizeCapped(function(string) {\n var result = [];\n if (string.charCodeAt(0) === 46 /* . */) {\n result.push('');\n }\n string.replace(rePropName, function(match, number, quote, subString) {\n result.push(quote ? subString.replace(reEscapeChar, '$1') : (number || match));\n });\n return result;\n});\n\nmodule.exports = stringToPath;\n","var memoize = require('./memoize');\n\n/** Used as the maximum memoize cache size. */\nvar MAX_MEMOIZE_SIZE = 500;\n\n/**\n * A specialized version of `_.memoize` which clears the memoized function's\n * cache when it exceeds `MAX_MEMOIZE_SIZE`.\n *\n * @private\n * @param {Function} func The function to have its output memoized.\n * @returns {Function} Returns the new memoized function.\n */\nfunction memoizeCapped(func) {\n var result = memoize(func, function(key) {\n if (cache.size === MAX_MEMOIZE_SIZE) {\n cache.clear();\n }\n return key;\n });\n\n var cache = result.cache;\n return result;\n}\n\nmodule.exports = memoizeCapped;\n","var MapCache = require('./_MapCache');\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/**\n * Creates a function that memoizes the result of `func`. If `resolver` is\n * provided, it determines the cache key for storing the result based on the\n * arguments provided to the memoized function. By default, the first argument\n * provided to the memoized function is used as the map cache key. The `func`\n * is invoked with the `this` binding of the memoized function.\n *\n * **Note:** The cache is exposed as the `cache` property on the memoized\n * function. Its creation may be customized by replacing the `_.memoize.Cache`\n * constructor with one whose instances implement the\n * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)\n * method interface of `clear`, `delete`, `get`, `has`, and `set`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to have its output memoized.\n * @param {Function} [resolver] The function to resolve the cache key.\n * @returns {Function} Returns the new memoized function.\n * @example\n *\n * var object = { 'a': 1, 'b': 2 };\n * var other = { 'c': 3, 'd': 4 };\n *\n * var values = _.memoize(_.values);\n * values(object);\n * // => [1, 2]\n *\n * values(other);\n * // => [3, 4]\n *\n * object.a = 2;\n * values(object);\n * // => [1, 2]\n *\n * // Modify the result cache.\n * values.cache.set(object, ['a', 'b']);\n * values(object);\n * // => ['a', 'b']\n *\n * // Replace `_.memoize.Cache`.\n * _.memoize.Cache = WeakMap;\n */\nfunction memoize(func, resolver) {\n if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n var memoized = function() {\n var args = arguments,\n key = resolver ? resolver.apply(this, args) : args[0],\n cache = memoized.cache;\n\n if (cache.has(key)) {\n return cache.get(key);\n }\n var result = func.apply(this, args);\n memoized.cache = cache.set(key, result) || cache;\n return result;\n };\n memoized.cache = new (memoize.Cache || MapCache);\n return memoized;\n}\n\n// Expose `MapCache`.\nmemoize.Cache = MapCache;\n\nmodule.exports = memoize;\n","var mapCacheClear = require('./_mapCacheClear'),\n mapCacheDelete = require('./_mapCacheDelete'),\n mapCacheGet = require('./_mapCacheGet'),\n mapCacheHas = require('./_mapCacheHas'),\n mapCacheSet = require('./_mapCacheSet');\n\n/**\n * Creates a map cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction MapCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `MapCache`.\nMapCache.prototype.clear = mapCacheClear;\nMapCache.prototype['delete'] = mapCacheDelete;\nMapCache.prototype.get = mapCacheGet;\nMapCache.prototype.has = mapCacheHas;\nMapCache.prototype.set = mapCacheSet;\n\nmodule.exports = MapCache;\n","var Hash = require('./_Hash'),\n ListCache = require('./_ListCache'),\n Map = require('./_Map');\n\n/**\n * Removes all key-value entries from the map.\n *\n * @private\n * @name clear\n * @memberOf MapCache\n */\nfunction mapCacheClear() {\n this.size = 0;\n this.__data__ = {\n 'hash': new Hash,\n 'map': new (Map || ListCache),\n 'string': new Hash\n };\n}\n\nmodule.exports = mapCacheClear;\n","var hashClear = require('./_hashClear'),\n hashDelete = require('./_hashDelete'),\n hashGet = require('./_hashGet'),\n hashHas = require('./_hashHas'),\n hashSet = require('./_hashSet');\n\n/**\n * Creates a hash object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Hash(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `Hash`.\nHash.prototype.clear = hashClear;\nHash.prototype['delete'] = hashDelete;\nHash.prototype.get = hashGet;\nHash.prototype.has = hashHas;\nHash.prototype.set = hashSet;\n\nmodule.exports = Hash;\n","var nativeCreate = require('./_nativeCreate');\n\n/**\n * Removes all key-value entries from the hash.\n *\n * @private\n * @name clear\n * @memberOf Hash\n */\nfunction hashClear() {\n this.__data__ = nativeCreate ? nativeCreate(null) : {};\n this.size = 0;\n}\n\nmodule.exports = hashClear;\n","var isFunction = require('./isFunction'),\n isMasked = require('./_isMasked'),\n isObject = require('./isObject'),\n toSource = require('./_toSource');\n\n/**\n * Used to match `RegExp`\n * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n */\nvar reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g;\n\n/** Used to detect host constructors (Safari). */\nvar reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n/** Used for built-in method references. */\nvar funcProto = Function.prototype,\n objectProto = Object.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Used to detect if a method is native. */\nvar reIsNative = RegExp('^' +\n funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\$&')\n .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n);\n\n/**\n * The base implementation of `_.isNative` without bad shim checks.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a native function,\n * else `false`.\n */\nfunction baseIsNative(value) {\n if (!isObject(value) || isMasked(value)) {\n return false;\n }\n var pattern = isFunction(value) ? reIsNative : reIsHostCtor;\n return pattern.test(toSource(value));\n}\n\nmodule.exports = baseIsNative;\n","var coreJsData = require('./_coreJsData');\n\n/** Used to detect methods masquerading as native. */\nvar maskSrcKey = (function() {\n var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n return uid ? ('Symbol(src)_1.' + uid) : '';\n}());\n\n/**\n * Checks if `func` has its source masked.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n */\nfunction isMasked(func) {\n return !!maskSrcKey && (maskSrcKey in func);\n}\n\nmodule.exports = isMasked;\n","var root = require('./_root');\n\n/** Used to detect overreaching core-js shims. */\nvar coreJsData = root['__core-js_shared__'];\n\nmodule.exports = coreJsData;\n","/** Used for built-in method references. */\nvar funcProto = Function.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/**\n * Converts `func` to its source code.\n *\n * @private\n * @param {Function} func The function to convert.\n * @returns {string} Returns the source code.\n */\nfunction toSource(func) {\n if (func != null) {\n try {\n return funcToString.call(func);\n } catch (e) {}\n try {\n return (func + '');\n } catch (e) {}\n }\n return '';\n}\n\nmodule.exports = toSource;\n","/**\n * Gets the value at `key` of `object`.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\nfunction getValue(object, key) {\n return object == null ? undefined : object[key];\n}\n\nmodule.exports = getValue;\n","/**\n * Removes `key` and its value from the hash.\n *\n * @private\n * @name delete\n * @memberOf Hash\n * @param {Object} hash The hash to modify.\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction hashDelete(key) {\n var result = this.has(key) && delete this.__data__[key];\n this.size -= result ? 1 : 0;\n return result;\n}\n\nmodule.exports = hashDelete;\n","var nativeCreate = require('./_nativeCreate');\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\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 * Gets the hash value for `key`.\n *\n * @private\n * @name get\n * @memberOf Hash\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction hashGet(key) {\n var data = this.__data__;\n if (nativeCreate) {\n var result = data[key];\n return result === HASH_UNDEFINED ? undefined : result;\n }\n return hasOwnProperty.call(data, key) ? data[key] : undefined;\n}\n\nmodule.exports = hashGet;\n","var nativeCreate = require('./_nativeCreate');\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 * Checks if a hash value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Hash\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction hashHas(key) {\n var data = this.__data__;\n return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);\n}\n\nmodule.exports = hashHas;\n","var nativeCreate = require('./_nativeCreate');\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/**\n * Sets the hash `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Hash\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the hash instance.\n */\nfunction hashSet(key, value) {\n var data = this.__data__;\n this.size += this.has(key) ? 0 : 1;\n data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;\n return this;\n}\n\nmodule.exports = hashSet;\n","var listCacheClear = require('./_listCacheClear'),\n listCacheDelete = require('./_listCacheDelete'),\n listCacheGet = require('./_listCacheGet'),\n listCacheHas = require('./_listCacheHas'),\n listCacheSet = require('./_listCacheSet');\n\n/**\n * Creates an list cache object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction ListCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `ListCache`.\nListCache.prototype.clear = listCacheClear;\nListCache.prototype['delete'] = listCacheDelete;\nListCache.prototype.get = listCacheGet;\nListCache.prototype.has = listCacheHas;\nListCache.prototype.set = listCacheSet;\n\nmodule.exports = ListCache;\n","/**\n * Removes all key-value entries from the list cache.\n *\n * @private\n * @name clear\n * @memberOf ListCache\n */\nfunction listCacheClear() {\n this.__data__ = [];\n this.size = 0;\n}\n\nmodule.exports = listCacheClear;\n","var assocIndexOf = require('./_assocIndexOf');\n\n/** Used for built-in method references. */\nvar arrayProto = Array.prototype;\n\n/** Built-in value references. */\nvar splice = arrayProto.splice;\n\n/**\n * Removes `key` and its value from the list cache.\n *\n * @private\n * @name delete\n * @memberOf ListCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction listCacheDelete(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n return false;\n }\n var lastIndex = data.length - 1;\n if (index == lastIndex) {\n data.pop();\n } else {\n splice.call(data, index, 1);\n }\n --this.size;\n return true;\n}\n\nmodule.exports = listCacheDelete;\n","var assocIndexOf = require('./_assocIndexOf');\n\n/**\n * Gets the list cache value for `key`.\n *\n * @private\n * @name get\n * @memberOf ListCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction listCacheGet(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n return index < 0 ? undefined : data[index][1];\n}\n\nmodule.exports = listCacheGet;\n","var assocIndexOf = require('./_assocIndexOf');\n\n/**\n * Checks if a list cache value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf ListCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction listCacheHas(key) {\n return assocIndexOf(this.__data__, key) > -1;\n}\n\nmodule.exports = listCacheHas;\n","var assocIndexOf = require('./_assocIndexOf');\n\n/**\n * Sets the list cache `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf ListCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the list cache instance.\n */\nfunction listCacheSet(key, value) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n ++this.size;\n data.push([key, value]);\n } else {\n data[index][1] = value;\n }\n return this;\n}\n\nmodule.exports = listCacheSet;\n","var getNative = require('./_getNative'),\n root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar Map = getNative(root, 'Map');\n\nmodule.exports = Map;\n","var getMapData = require('./_getMapData');\n\n/**\n * Removes `key` and its value from the map.\n *\n * @private\n * @name delete\n * @memberOf MapCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction mapCacheDelete(key) {\n var result = getMapData(this, key)['delete'](key);\n this.size -= result ? 1 : 0;\n return result;\n}\n\nmodule.exports = mapCacheDelete;\n","/**\n * Checks if `value` is suitable for use as unique object key.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\n */\nfunction isKeyable(value) {\n var type = typeof value;\n return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')\n ? (value !== '__proto__')\n : (value === null);\n}\n\nmodule.exports = isKeyable;\n","var getMapData = require('./_getMapData');\n\n/**\n * Gets the map value for `key`.\n *\n * @private\n * @name get\n * @memberOf MapCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction mapCacheGet(key) {\n return getMapData(this, key).get(key);\n}\n\nmodule.exports = mapCacheGet;\n","var getMapData = require('./_getMapData');\n\n/**\n * Checks if a map value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf MapCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction mapCacheHas(key) {\n return getMapData(this, key).has(key);\n}\n\nmodule.exports = mapCacheHas;\n","var getMapData = require('./_getMapData');\n\n/**\n * Sets the map `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf MapCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the map cache instance.\n */\nfunction mapCacheSet(key, value) {\n var data = getMapData(this, key),\n size = data.size;\n\n data.set(key, value);\n this.size += data.size == size ? 0 : 1;\n return this;\n}\n\nmodule.exports = mapCacheSet;\n","var baseToString = require('./_baseToString');\n\n/**\n * Converts `value` to a string. An empty string is returned for `null`\n * and `undefined` values. The sign of `-0` is preserved.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n * @example\n *\n * _.toString(null);\n * // => ''\n *\n * _.toString(-0);\n * // => '-0'\n *\n * _.toString([1, 2, 3]);\n * // => '1,2,3'\n */\nfunction toString(value) {\n return value == null ? '' : baseToString(value);\n}\n\nmodule.exports = toString;\n","var Symbol = require('./_Symbol'),\n arrayMap = require('./_arrayMap'),\n isArray = require('./isArray'),\n isSymbol = require('./isSymbol');\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n symbolToString = symbolProto ? symbolProto.toString : undefined;\n\n/**\n * The base implementation of `_.toString` which doesn't convert nullish\n * values to empty strings.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {string} Returns the string.\n */\nfunction baseToString(value) {\n // Exit early for strings to avoid a performance hit in some environments.\n if (typeof value == 'string') {\n return value;\n }\n if (isArray(value)) {\n // Recursively convert values (susceptible to call stack limits).\n return arrayMap(value, baseToString) + '';\n }\n if (isSymbol(value)) {\n return symbolToString ? symbolToString.call(value) : '';\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\nmodule.exports = baseToString;\n","/**\n * A specialized version of `_.map` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n */\nfunction arrayMap(array, iteratee) {\n var index = -1,\n length = array == null ? 0 : array.length,\n result = Array(length);\n\n while (++index < length) {\n result[index] = iteratee(array[index], index, array);\n }\n return result;\n}\n\nmodule.exports = arrayMap;\n","var assignValue = require('./_assignValue'),\n castPath = require('./_castPath'),\n isIndex = require('./_isIndex'),\n isObject = require('./isObject'),\n toKey = require('./_toKey');\n\n/**\n * The base implementation of `_.set`.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {Array|string} path The path of the property to set.\n * @param {*} value The value to set.\n * @param {Function} [customizer] The function to customize path creation.\n * @returns {Object} Returns `object`.\n */\nfunction baseSet(object, path, value, customizer) {\n if (!isObject(object)) {\n return object;\n }\n path = castPath(path, object);\n\n var index = -1,\n length = path.length,\n lastIndex = length - 1,\n nested = object;\n\n while (nested != null && ++index < length) {\n var key = toKey(path[index]),\n newValue = value;\n\n if (index != lastIndex) {\n var objValue = nested[key];\n newValue = customizer ? customizer(objValue, key, nested) : undefined;\n if (newValue === undefined) {\n newValue = isObject(objValue)\n ? objValue\n : (isIndex(path[index + 1]) ? [] : {});\n }\n }\n assignValue(nested, key, newValue);\n nested = nested[key];\n }\n return object;\n}\n\nmodule.exports = baseSet;\n","var baseAssignValue = require('./_baseAssignValue'),\n eq = require('./eq');\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 * Assigns `value` to `key` of `object` if the existing value is not equivalent\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction assignValue(object, key, value) {\n var objValue = object[key];\n if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||\n (value === undefined && !(key in object))) {\n baseAssignValue(object, key, value);\n }\n}\n\nmodule.exports = assignValue;\n","var defineProperty = require('./_defineProperty');\n\n/**\n * The base implementation of `assignValue` and `assignMergeValue` without\n * value checks.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction baseAssignValue(object, key, value) {\n if (key == '__proto__' && defineProperty) {\n defineProperty(object, key, {\n 'configurable': true,\n 'enumerable': true,\n 'value': value,\n 'writable': true\n });\n } else {\n object[key] = value;\n }\n}\n\nmodule.exports = baseAssignValue;\n","var getNative = require('./_getNative');\n\nvar defineProperty = (function() {\n try {\n var func = getNative(Object, 'defineProperty');\n func({}, '', {});\n return func;\n } catch (e) {}\n}());\n\nmodule.exports = defineProperty;\n","export default function _inheritsLoose(subClass, superClass) {\n subClass.prototype = Object.create(superClass.prototype);\n subClass.prototype.constructor = subClass;\n subClass.__proto__ = superClass;\n}","import forEach from 'lodash/forEach';\r\nimport get from 'lodash/get';\r\nimport set from 'lodash/set';\r\n\r\nexport default class Bus {\r\n subscribers = {};\r\n\r\n subscribe(event, callable) {\r\n set(this.subscribers, event + '[]', callable);\r\n }\r\n\r\n dispatch(event, args: any = null) {\r\n forEach(get(this.subscribers, event), function(listener) {\r\n listener(event, args);\r\n });\r\n }\r\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 \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 {name};\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 translations: Translations = {};\r\n locale = null;\r\n\r\n constructor() {\r\n /**\r\n * A map of translation keys to their translated values.\r\n *\r\n * @type {Object}\r\n * @public\r\n */\r\n this.translations = {};\r\n\r\n this.locale = null;\r\n }\r\n\r\n addTranslations(translations) {\r\n Object.assign(this.translations, translations);\r\n }\r\n\r\n trans(id: string, parameters = null) {\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 = null) {\r\n return extractText(this.trans(id, parameters));\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_]+}|)', '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","import User from './models/User';\n\n/**\n * The `Session` class defines the current user session. It stores a reference\n * to the current authenticated user, and provides methods to log in/out.\n */\nexport default class Session {\n /**\n * The current authenticated user.\n */\n user?: User;\n\n /**\n * The CSRF token.\n */\n csrfToken?: string;\n\n constructor(user, csrfToken) {\n this.user = user;\n\n this.csrfToken = csrfToken;\n }\n\n /**\n * Attempt to log in a user.\n */\n login(body: { identification: string, password: string, remember?: string }, options = {}) {\n return app.request(Object.assign({\n method: 'POST',\n url: `${app.forum.attribute('baseUrl')}/login`,\n body\n }, options));\n }\n\n /**\n * Log the user out.\n *\n * @public\n */\n logout() {\n window.location.href = `${app.forum.attribute('baseUrl')}/logout?token=${this.csrfToken}`;\n }\n}\n","import Model from './Model';\n\n/**\n * The `Store` class defines a local data store, and provides methods to\n * retrieve data from the API.\n */\nexport default class Store {\n /**\n * The local data store. A tree of resource types to IDs, such that\n * accessing data[type][id] will return the model for that type/ID.\n */\n data: { [key: string]: { [key: number]: Model }} = {};\n\n /**\n * The model registry. A map of resource types to the model class that\n * should be used to represent resources of that type.\n */\n models: {};\n\n constructor(models) {\n this.models = models;\n }\n\n /**\n * Push resources contained within an API payload into the store.\n *\n * @param payload\n * @return The model(s) representing the resource(s) contained\n * within the 'data' key of the payload.\n */\n pushPayload(payload: { included?: {}[], data?: {}|{}[] }): Model|Model[] {\n if (payload.included) payload.included.map(this.pushObject.bind(this));\n\n const result: any = payload.data instanceof Array\n ? payload.data.map(this.pushObject.bind(this))\n : this.pushObject(payload.data);\n\n // Attach the original payload to the model that we give back. This is\n // useful to consumers as it allows them to access meta information\n // associated with their request.\n result.payload = payload;\n\n return result;\n }\n\n /**\n * Create a model to represent a resource object (or update an existing one),\n * and push it into the store.\n *\n * @param {Object} data The resource object\n * @return The model, or null if no model class has been\n * registered for this resource type.\n */\n pushObject(data): Model {\n if (!this.models[data.type]) return null;\n\n const type = this.data[data.type] = this.data[data.type] || {};\n\n if (type[data.id]) {\n type[data.id].pushData(data);\n } else {\n type[data.id] = this.createRecord(data.type, data);\n }\n\n type[data.id].exists = true;\n\n return type[data.id];\n }\n\n /**\n * Make a request to the API to find record(s) of a specific type.\n *\n * @param type The resource type.\n * @param [id] The ID(s) of the model(s) to retrieve.\n * Alternatively, if an object is passed, it will be handled as the\n * `query` parameter.\n * @param query\n * @param options\n */\n find(type: string, id?: number|number[]|any, query = {}, options = {}): Promise {\n let body = query;\n let url = `${app.forum.attribute('apiUrl')}/${type}`;\n\n if (id instanceof Array) {\n url += `?filter[id]=${id.join(',')}`;\n } else if (typeof id === 'object') {\n body = id;\n } else if (id) {\n url += `/${id}`;\n }\n\n return app.request(Object.assign({\n method: 'GET',\n url,\n body\n }, options)).then(this.pushPayload.bind(this));\n }\n\n /**\n * Get a record from the store by ID.\n *\n * @param type The resource type.\n * @param id The resource ID.\n */\n getById(type: string, id: number): T {\n return this.data[type] && this.data[type][id] as T;\n }\n\n /**\n * Get a record from the store by the value of a model attribute.\n *\n * @param type The resource type.\n * @param key The name of the method on the model.\n * @param value The value of the model attribute.\n */\n getBy(type: string, key: string, value: any): T {\n return this.all(type).filter(model => model[key]() === value)[0];\n }\n\n /**\n * Get all loaded records of a specific type.\n */\n all(type: string): T[] {\n const records = this.data[type];\n\n return records ? Object.keys(records).map(id => records[id]) : [];\n }\n\n /**\n * Remove the given model from the store.\n */\n remove(model: Model) {\n delete this.data[model.data.type][model.id()];\n }\n\n /**\n * Create a new record of the given type.\n *\n * @param {String} type The resource type\n * @param {Object} [data] Any data to initialize the model with\n */\n createRecord(type: string, data: any = {}): T {\n data.type = data.type || type;\n\n return new (this.models[type])(data, this);\n }\n}\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","/**\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\r\n */\r\n show() {\r\n $('#app').addClass('drawerOpen');\r\n\r\n this.$backdrop = $('
')\r\n .addClass('drawer-backdrop fade')\r\n .appendTo('body')\r\n .click(() => this.hide());\r\n\r\n setTimeout(() => 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","/**\n * The `Model` class represents a local data resource. It provides methods to\n * persist changes via the API.\n *\n * @abstract\n */\nimport Store from \"./Store\";\n\nexport default class Model {\n /**\n * The resource object from the API.\n */\n data: any;\n\n /**\n * The time at which the model's data was last updated. Watching the value\n * of this property is a fast way to retain/cache a subtree if data hasn't\n * changed.\n */\n freshness: Date;\n\n /**\n * Whether or not the resource exists on the server.\n */\n exists: boolean;\n\n /**\n * The data store that this resource should be persisted to.\n */\n protected store: Store;\n\n /**\n * @param {Object} data A resource object from the API.\n * @param {Store} store The data store that this model should be persisted to.\n */\n constructor(data = {}, store = null) {\n this.data = data;\n this.store = store;\n\n this.freshness = new Date();\n this.exists = false;\n }\n\n /**\n * Get the model's ID.\n * @final\n */\n id(): string|number {\n return this.data.id;\n }\n\n /**\n * Get one of the model's attributes.\n * @final\n */\n attribute(attribute: string): any {\n return this.data.attributes[attribute];\n }\n\n /**\n * Merge new data into this model locally.\n *\n * @param data A resource object to merge into this model\n * @public\n */\n pushData(data: {}) {\n // Since most of the top-level items in a resource object are objects\n // (e.g. relationships, attributes), we'll need to check and perform the\n // merge at the second level if that's the case.\n for (const key in data) {\n if (typeof data[key] === 'object') {\n this.data[key] = this.data[key] || {};\n\n // For every item in a second-level object, we want to check if we've\n // been handed a Model instance. If so, we will convert it to a\n // relationship data object.\n for (const innerKey in data[key]) {\n if (data[key][innerKey] instanceof Model) {\n data[key][innerKey] = {data: Model.getIdentifier(data[key][innerKey])};\n }\n this.data[key][innerKey] = data[key][innerKey];\n }\n } else {\n this.data[key] = data[key];\n }\n }\n\n // Now that we've updated the data, we can say that the model is fresh.\n // This is an easy way to invalidate retained subtrees etc.\n this.freshness = new Date();\n }\n\n /**\n * Merge new attributes into this model locally.\n *\n * @param {Object} attributes The attributes to merge.\n */\n pushAttributes(attributes: any) {\n this.pushData({attributes});\n }\n\n /**\n * Merge new attributes into this model, both locally and with persistence.\n *\n * @param attributes The attributes to save. If a 'relationships' key\n * exists, it will be extracted and relationships will also be saved.\n * @param [options]\n * @return {Promise}\n */\n save(attributes: any, options: any = {}): Promise {\n const data = {\n type: this.data.type,\n id: this.data.id,\n attributes,\n relationships: undefined\n };\n\n // If a 'relationships' key exists, extract it from the attributes hash and\n // set it on the top-level data object instead. We will be sending this data\n // object to the API for persistence.\n if (attributes.relationships) {\n data.relationships = {};\n\n for (const key in attributes.relationships) {\n const model = attributes.relationships[key];\n\n data.relationships[key] = {\n data: model instanceof Array\n ? model.map(Model.getIdentifier)\n : Model.getIdentifier(model)\n };\n }\n\n delete attributes.relationships;\n }\n\n // Before we update the model's data, we should make a copy of the model's\n // old data so that we can revert back to it if something goes awry during\n // persistence.\n const oldData = this.copyData();\n\n this.pushData(data);\n\n const request = {data};\n if (options.meta) request.meta = options.meta;\n\n return app.request(Object.assign({\n method: this.exists ? 'PATCH' : 'POST',\n url: app.forum.attribute('apiUrl') + this.apiEndpoint(),\n body: request\n }, options)).then(\n // If everything went well, we'll make sure the store knows that this\n // model exists now (if it didn't already), and we'll push the data that\n // the API returned into the store.\n payload => {\n this.store.data[payload.data.type] = this.store.data[payload.data.type] || {};\n this.store.data[payload.data.type][payload.data.id] = this;\n return this.store.pushPayload(payload);\n },\n\n // If something went wrong, though... good thing we backed up our model's\n // old data! We'll revert to that and let others handle the error.\n response => {\n this.pushData(oldData);\n m.redraw();\n throw response;\n }\n );\n }\n\n /**\n * Send a request to delete the resource.\n *\n * @param {Object} body Data to send along with the DELETE request.\n * @param {Object} [options]\n * @return {Promise}\n * @public\n */\n delete(body = {}, options = {}) {\n if (!this.exists) return Promise.resolve();\n\n return app.request(Object.assign({\n method: 'DELETE',\n url: app.forum.attribute('apiUrl') + this.apiEndpoint(),\n body\n }, options)).then(() => {\n this.exists = false;\n this.store.remove(this);\n });\n }\n\n /**\n * Construct a path to the API endpoint for this resource.\n *\n * @return {String}\n * @protected\n */\n apiEndpoint() {\n return '/' + this.data.type + (this.exists ? '/' + this.data.id : '');\n }\n\n copyData() {\n return JSON.parse(JSON.stringify(this.data));\n }\n\n /**\n * Generate a function which returns the value of the given attribute.\n *\n * @param {String} name\n * @param [transform] A function to transform the attribute value\n */\n static attribute(name: string, transform?: Function): () => any {\n return function() {\n const value = this.data.attributes && this.data.attributes[name];\n\n return transform ? transform(value) : value;\n };\n }\n\n /**\n * Generate a function which returns the value of the given has-one\n * relationship.\n *\n * @return false if no information about the\n * relationship exists; undefined if the relationship exists but the model\n * has not been loaded; or the model if it has been loaded.\n */\n static hasOne(name: string): () => Model|boolean {\n return function() {\n if (this.data.relationships) {\n const relationship = this.data.relationships[name];\n\n if (relationship) {\n return app.store.getById(relationship.data.type, relationship.data.id);\n }\n }\n\n return false;\n };\n }\n\n /**\n * Generate a function which returns the value of the given has-many\n * relationship.\n *\n * @return false if no information about the relationship\n * exists; an array if it does, containing models if they have been\n * loaded, and undefined for those that have not.\n */\n static hasMany(name: string): () => []|boolean {\n return function() {\n if (this.data.relationships) {\n const relationship = this.data.relationships[name];\n\n if (relationship) {\n return relationship.data.map(data => app.store.getById(data.type, data.id));\n }\n }\n\n return false;\n };\n }\n\n /**\n * Transform the given value into a Date object.\n */\n static transformDate(value: string): Date {\n return value ? new Date(value) : null;\n }\n\n /**\n * Get a resource identifier object for the given model.\n */\n protected static getIdentifier(model: Model): { type: string, id: string } {\n return {\n type: model.data.type,\n id: model.data.id\n };\n }\n}\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","/**\n * The `computed` utility creates a function that will cache its output until\n * any of the dependent values are dirty.\n *\n * @param {...String} dependentKeys The keys of the dependent values.\n * @param {function} compute The function which computes the value using the\n * dependent values.\n */\nexport default function computed(dependentKeys: string|string[], compute: Function): () => any {\n const keys = Array.from(dependentKeys);\n\n const dependentValues = {};\n let computedValue;\n\n return function() {\n let recompute = false;\n\n // Read all of the dependent values. If any of them have changed since last\n // time, then we'll want to recompute our output.\n keys.forEach(key => {\n const value = typeof this[key] === 'function' ? this[key]() : this[key];\n\n if (dependentValues[key] !== value) {\n recompute = true;\n dependentValues[key] = value;\n }\n });\n\n if (recompute) {\n computedValue = compute.apply(this, keys.map(key => dependentValues[key]));\n }\n\n return computedValue;\n };\n}\n","class Item {\n content: T;\n priority: number;\n key: number = 0;\n\n constructor(content: any, priority: number) {\n this.content = content;\n this.priority = priority;\n }\n}\n\nexport default class ItemList {\n private items: { [key: string]: Item } = {};\n\n /**\n * Check whether the list is empty.\n *\n * @returns {boolean}\n * @public\n */\n isEmpty(): boolean {\n for (const i in this.items) {\n if (this.items.hasOwnProperty(i)) {\n return false;\n }\n }\n\n return true;\n }\n\n /**\n * Check whether an item is present in the list.\n */\n has(key: any): boolean {\n return !!this.items[key];\n }\n\n /**\n * Get the content of an item.\n */\n get(key: any): T {\n return this.items[key]?.content;\n }\n\n /**\n * Add an item to the list.\n *\n * @param {String} key A unique key for the item.\n * @param {*} content The item's content.\n * @param {Integer} [priority] The priority of the item. Items with a higher\n * priority will be positioned before items with a lower priority.\n * @return {ItemList}\n * @public\n */\n add(key: any, content: T, priority = 0) {\n this.items[key] = new Item(content, priority);\n\n return this;\n }\n\n toArray(): T[] {\n const items: Item[] = [];\n\n for (const i in this.items) {\n if (this.items.hasOwnProperty(i)) {\n if (this.items[i] !== null && this.items[i] instanceof Item) {\n this.items[i].content = Object(this.items[i].content);\n\n // @ts-ignore\n this.items[i].content.itemName = i;\n items.push(this.items[i]);\n this.items[i].key = items.length;\n }\n }\n }\n\n return items\n .sort((a, b) => {\n if (a.priority === b.priority) {\n return a.key - b.key;\n } else if (a.priority > b.priority) {\n return -1;\n }\n return 1;\n })\n .map(item => item.content);\n }\n}\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 ;\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 (\r\n \r\n {iconName ? icon(iconName, {className: 'Badge-icon'}) : m.trust(' ')}\r\n \r\n );\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 () => string;\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: number) {\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', );\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(): number[] {\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 = v; g = t; b = p; break;\r\n case 1: r = q; g = v; b = p; break;\r\n case 2: r = p; g = v; b = t; break;\r\n case 3: r = p; g = q; b = v; break;\r\n case 4: r = t; g = p; b = v; break;\r\n case 5: r = v; g = p; b = q; 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\n\r\nexport default class GroupBadge extends Badge {\r\n static initProps(props) {\r\n super.initProps(props);\r\n\r\n if (props.group) {\r\n props.icon = props.group.icon();\r\n props.style = {backgroundColor: props.group.color()};\r\n props.label = typeof props.label === 'undefined' ? props.group.nameSingular() : props.label;\r\n props.type = `group--${props.group.id()}`;\r\n\r\n delete props.group;\r\n }\r\n }\r\n}\r\n","import Model from '../Model';\nimport stringToColor from '../utils/stringToColor';\nimport ItemList from '../utils/ItemList';\nimport computed from '../utils/computed';\nimport GroupBadge from '../components/GroupBadge';\nimport Group from './Group';\n\nexport default class User extends Model {\n username = Model.attribute('username') as () => string;\n\n displayName = Model.attribute('displayName') as () => string;\n email = Model.attribute('email') as () => string;\n isEmailConfirmed = Model.attribute('isEmailConfirmed') as () => boolean;\n password = Model.attribute('password') as () => string;\n\n avatarUrl = Model.attribute('avatarUrl') as () => string;\n preferences = Model.attribute('preferences') as () => string;\n groups = Model.hasMany('groups') as () => Group[];\n\n joinTime = Model.attribute('joinTime', Model.transformDate) as () => Date;\n lastSeenAt = Model.attribute('lastSeenAt', Model.transformDate) as () => Date;\n markedAllAsReadAt = Model.attribute('markedAllAsReadAt', Model.transformDate) as () => Date;\n unreadNotificationCount = Model.attribute('unreadNotificationCount') as () => number;\n newNotificationCount = Model.attribute('newNotificationCount') as () => number;\n\n discussionCount = Model.attribute('discussionCount') as () => number;\n commentCount = Model.attribute('commentCount') as () => number;\n\n canEdit = Model.attribute('canEdit') as () => boolean;\n canDelete = Model.attribute('canDelete') as () => boolean;\n\n avatarColor = null;\n color = computed(['username', 'avatarUrl', 'avatarColor'], function(username, avatarUrl, avatarColor) {\n // If we've already calculated and cached the dominant color of the user's\n // avatar, then we can return that in RGB format. If we haven't, we'll want\n // to calculate it. Unless the user doesn't have an avatar, in which case\n // we generate a color from their username.\n if (avatarColor) {\n return 'rgb(' + avatarColor.join(', ') + ')';\n } else if (avatarUrl) {\n this.calculateAvatarColor();\n return '';\n }\n\n return '#' + stringToColor(username);\n }) as () => string;\n\n isOnline(): boolean {\n return this.lastSeenAt() > dayjs().subtract(5, 'minutes').toDate();\n }\n\n /**\n * Get the Badge components that apply to this user.\n */\n badges(): ItemList {\n const items = new ItemList();\n const groups = this.groups();\n\n if (groups) {\n groups.forEach(group => {\n items.add('group' + group.id(), GroupBadge.component({group}));\n });\n }\n\n return items;\n }\n\n /**\n * Calculate the dominant color of the user's avatar. The dominant color will\n * be set to the `avatarColor` property once it has been calculated.\n *\n * @protected\n */\n calculateAvatarColor() {\n const image = new Image();\n const user = this;\n\n image.onload = function() {\n const colorThief = new ColorThief();\n user.avatarColor = colorThief.getColor(this);\n user.freshness = new Date();\n m.redraw();\n };\n image.crossOrigin = 'anonymous';\n image.src = this.avatarUrl();\n }\n\n /**\n * Update the user's preferences.\n */\n savePreferences(newPreferences: object): Promise {\n const preferences = this.preferences();\n\n Object.assign(preferences, newPreferences);\n\n return > this.save({preferences});\n }\n}\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 ? '...' : '') +\r\n string.substring(start, start + length) +\r\n (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.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\r\n .replace(/(<\\/p>|
)/g, '$1  ')\r\n .replace(/]*>/ig, ' ');\r\n\r\n const dom = $('
').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) || 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\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({}, 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
{m.trust(' ')}
;\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';\nimport icon from '../helpers/icon';\nimport extract from '../utils/extract';\nimport extractText from '../utils/extractText';\nimport LoadingIndicator from './LoadingIndicator';\n\nexport interface ButtonProps extends ComponentProps {\n title?: string,\n type?: string,\n icon?: string,\n\n loading?: boolean,\n disabled?: boolean,\n onclick?: Function\n}\n\n/**\n * The `Button` component defines an element which, when clicked, performs an\n * action. The button may have the following special props:\n *\n * - `icon` The name of the icon class. If specified, the button will be given a\n * 'has-icon' class name.\n * - `disabled` Whether or not the button is disabled. If truthy, the button\n * will be given a 'disabled' class name, and any `onclick` handler will be\n * removed.\n * - `loading` Whether or not the button should be in a disabled loading state.\n *\n * All other props will be assigned as attributes on the button element.\n *\n * Note that a Button has no default class names. This is because a Button can\n * be used to represent any generic clickable control, like a menu item.\n */\nexport default class Button extends Component {\n view(vnode) {\n const { children, ...attrs} = vnode.attrs;\n\n attrs.className = attrs.className || '';\n attrs.type = attrs.type || 'button';\n\n // If a tooltip was provided for buttons without additional content, we also\n // use this tooltip as text for screen readers\n if (attrs.title && !this.props.children) {\n attrs['aria-label'] = attrs.title;\n }\n\n // If nothing else is provided, we use the textual button content as tooltip\n if (!attrs.title && this.props.children) {\n attrs.title = extractText(this.props.children);\n }\n\n const iconName = extract(attrs, 'icon');\n if (iconName) attrs.className += ' hasIcon';\n\n const loading = extract(attrs, 'loading');\n if (attrs.disabled || loading) {\n attrs.className += ' ' + classNames('disabled', loading && 'loading');\n delete attrs.onclick;\n }\n\n return ;\n }\n\n /**\n * Get the template for the button's content.\n */\n protected getButtonContent(iconName?: string|boolean, loading?: boolean, children?: any) : any[] {\n return [\n iconName && iconName !== true ? icon(iconName, {className: 'Button-icon'}) : '',\n children ? {children} : '',\n loading ? LoadingIndicator.component({size: 'tiny', className: 'LoadingIndicator--inline'}) : ''\n ];\n }\n}\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
  • ;\r\n }\r\n}\r\n","import Separator from '../components/Separator';\n\nexport function isSeparator(item) {\n return item?.tag === Separator;\n}\n\nexport function withoutUnnecessarySeparators(items) {\n const newItems = [];\n let prevItem;\n\n items.forEach((item, i) => {\n if (!isSeparator(item) || (prevItem && !isSeparator(prevItem) && i !== items.length - 1)) {\n prevItem = item;\n newItems.push(item);\n }\n });\n\n return newItems;\n}\n\n/**\n * The `listItems` helper wraps a collection of components in
  • tags,\n * stripping out any unnecessary `Separator` components.\n *\n * @param {*} items\n * @return {Array}\n */\nexport default function listItems(items) {\n if (!(items instanceof Array)) items = [items];\n\n return withoutUnnecessarySeparators(items).map(item => {\n const isListItem = item.component && item.component.isListItem;\n const active = item.component && item.component.isActive && item.component.isActive(item.props);\n const className = item.props ? item.props.itemClassName : item.itemClassName;\n\n if (isListItem) {\n item.attrs = item.attrs || {};\n item.attrs.key = item.attrs.key || item.itemName;\n }\n\n return isListItem\n ? item\n :
  • \n {item}\n
  • ;\n });\n}\n","const MicroModal = (() => {\n\n const 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 class Modal {\n constructor({\n targetModal,\n triggers = [],\n onShow = () => {},\n onClose = () => {},\n openTrigger = 'data-micromodal-trigger',\n closeTrigger = 'data-micromodal-close',\n disableScroll = false,\n disableFocus = false,\n awaitCloseAnimation = false,\n awaitOpenAnimation = false,\n debugMode = false\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,\n disableScroll,\n openTrigger,\n closeTrigger,\n onShow,\n onClose,\n awaitCloseAnimation,\n awaitOpenAnimation,\n disableFocus // Register click events only if pre binding eventListeners\n\n };\n if (triggers.length > 0) this.registerTriggers(...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 registerTriggers(...triggers) {\n triggers.filter(Boolean).forEach(trigger => {\n trigger.addEventListener('click', event => this.showModal(event));\n });\n }\n\n showModal() {\n this.activeElement = document.activeElement;\n this.modal.setAttribute('aria-hidden', 'false');\n this.modal.classList.add('is-open');\n this.scrollBehaviour('disable');\n this.addEventListeners();\n\n if (this.config.awaitOpenAnimation) {\n const handler = () => {\n this.modal.removeEventListener('animationend', handler, false);\n this.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);\n }\n\n closeModal() {\n const modal = this.modal;\n this.modal.setAttribute('aria-hidden', 'true');\n this.removeEventListeners();\n this.scrollBehaviour('enable');\n\n if (this.activeElement) {\n this.activeElement.focus();\n }\n\n this.config.onClose(this.modal);\n\n if (this.config.awaitCloseAnimation) {\n this.modal.addEventListener('animationend', function handler() {\n modal.classList.remove('is-open');\n modal.removeEventListener('animationend', handler, false);\n }, false);\n } else {\n modal.classList.remove('is-open');\n }\n }\n\n closeModalById(targetModal) {\n this.modal = document.getElementById(targetModal);\n if (this.modal) this.closeModal();\n }\n\n scrollBehaviour(toggle) {\n if (!this.config.disableScroll) return;\n const body = document.querySelector('body');\n\n switch (toggle) {\n case 'enable':\n Object.assign(body.style, {\n overflow: '',\n height: ''\n });\n break;\n\n case 'disable':\n Object.assign(body.style, {\n overflow: 'hidden',\n height: '100vh'\n });\n break;\n\n default:\n }\n }\n\n addEventListeners() {\n this.modal.addEventListener('touchstart', this.onClick);\n this.modal.addEventListener('click', this.onClick);\n document.addEventListener('keydown', this.onKeydown);\n }\n\n removeEventListeners() {\n this.modal.removeEventListener('touchstart', this.onClick);\n this.modal.removeEventListener('click', this.onClick);\n document.removeEventListener('keydown', this.onKeydown);\n }\n\n onClick(event) {\n if (event.target.hasAttribute(this.config.closeTrigger)) {\n this.closeModal();\n event.preventDefault();\n }\n }\n\n onKeydown(event) {\n if (event.keyCode === 27) this.closeModal(event);\n if (event.keyCode === 9) this.maintainFocus(event);\n }\n\n getFocusableNodes() {\n const nodes = this.modal.querySelectorAll(FOCUSABLE_ELEMENTS);\n return Array(...nodes);\n }\n\n setFocusToFirstNode() {\n if (this.config.disableFocus) return;\n const focusableNodes = this.getFocusableNodes();\n if (focusableNodes.length) focusableNodes[0].focus();\n }\n\n maintainFocus(event) {\n const focusableNodes = this.getFocusableNodes(); // if disableFocus is true\n\n if (!this.modal.contains(document.activeElement)) {\n focusableNodes[0].focus();\n } else {\n const 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 && focusedItemIndex === focusableNodes.length - 1) {\n focusableNodes[0].focus();\n event.preventDefault();\n }\n }\n }\n\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 let 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 const generateTriggerMap = (triggers, triggerAttr) => {\n const triggerMap = [];\n triggers.forEach(trigger => {\n const 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 const validateModalPresence = id => {\n if (!document.getElementById(id)) {\n console.warn(`MicroModal: \\u2757Seems like you have missed %c'${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;', `
    `);\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 const 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;', ``);\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 const validateArgs = (triggers, triggerMap) => {\n validateTriggerPresence(triggers);\n if (!triggerMap) return true;\n\n for (var id in triggerMap) validateModalPresence(id);\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 const init = config => {\n // Create an config object with default openTrigger\n const options = Object.assign({}, {\n openTrigger: 'data-micromodal-trigger'\n }, config); // Collects all the nodes with the trigger\n\n const triggers = [...document.querySelectorAll(`[${options.openTrigger}]`)]; // Makes a mappings of modals with their trigger nodes\n\n const 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 let value = triggerMap[key];\n options.targetModal = key;\n options.triggers = [...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 const show = (targetModal, config) => {\n const options = config || {};\n options.targetModal = targetModal; // Checks if modals and triggers exist in dom\n\n if (options.debugMode === true && validateModalPresence(targetModal) === false) return; // 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 const close = targetModal => {\n targetModal ? activeModal.closeModalById(targetModal) : activeModal.closeModal();\n };\n\n return {\n init,\n show,\n close\n };\n})();\n\nexport default MicroModal;\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 {\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(\r\n \r\n );\r\n }\r\n\r\n return (\r\n
    \r\n \r\n {children}\r\n \r\n
      \r\n {listItems(controls.concat(dismissControl))}\r\n
    \r\n
    \r\n );\r\n }\r\n}\r\n","import Mithril from 'mithril';\n\nimport Component, {ComponentProps} from '../Component';\nimport Button from './Button';\nimport RequestError from \"../utils/RequestError\";\n\n/**\n * The `Modal` component displays a modal dialog, wrapped in a form. Subclasses\n * should implement the `className`, `title`, and `content` methods.\n */\nexport default abstract class Modal extends Component {\n /**\n * An alert component to show below the header.\n */\n alert: Mithril.Vnode;\n\n loading: boolean;\n\n view() {\n if (this.alert) {\n this.alert.attrs.dismissible = false;\n }\n\n return (\n
    \n
    \n {this.isDismissible() ? (\n
    \n {Button.component({\n icon: 'fas fa-times',\n onclick: this.hide.bind(this),\n className: 'Button Button--icon Button--link'\n })}\n
    \n ) : ''}\n\n
    \n
    \n

    {this.title()}

    \n
    \n\n {this.alert &&
    {this.alert}
    }\n\n {this.content()}\n
    \n
    \n
    \n );\n }\n\n oncreate(vnode) {\n super.oncreate(vnode);\n\n app.modal.component = this;\n }\n\n /**\n * Determine whether or not the modal should be dismissible via an 'x' button.\n */\n isDismissible(): boolean {\n return true;\n }\n\n /**\n * Get the class name to apply to the modal.\n */\n abstract className(): string;\n\n /**\n * Get the title of the modal dialog.\n */\n abstract title(): string;\n\n /**\n * Get the content of the modal.\n */\n abstract content();\n\n /**\n * Handle the modal form's submit event.\n */\n onsubmit(e: Event) {}\n\n /**\n * Focus on the first input when the modal is ready to be used.\n */\n onready() {\n this.$('form').find('input, select, textarea').first().focus().select();\n }\n\n onhide() {}\n\n /**\n * Hide the modal.\n */\n hide() {\n app.modal.close();\n }\n\n /**\n * Stop loading.\n */\n loaded() {\n this.loading = false;\n m.redraw();\n }\n\n /**\n * Show an alert describing an error returned from the API, and give focus to\n * the first relevant field.\n */\n onerror(error: RequestError) {\n this.alert = error.alert;\n\n m.redraw();\n\n if (error.status === 422 && error.response.errors) {\n this.$(`form [name=\"${error.response.errors[0].source.pointer.replace('/data/attributes/', '')}\"]`).select();\n } else {\n this.onready();\n }\n }\n}\n","import MicroModal from 'micromodal';\n\nimport Component from '../Component';\nimport Modal from './Modal';\nimport {Vnode} from \"mithril\";\n\n/**\n * The `ModalManager` component manages a modal dialog. Only one modal dialog\n * can be shown at once; loading a new component into the ModalManager will\n * overwrite the previous one.\n */\nexport default class ModalManager extends Component {\n private node: Vnode;\n\n showing: boolean;\n hideTimeout: number;\n component?: Modal;\n\n oncreate(vnode) {\n super.oncreate(vnode);\n\n app.modal = this;\n }\n\n view() {\n return (\n
    \n {this.node}\n
    \n );\n }\n\n /**\n * Show a modal dialog.\n */\n show(component) {\n if (!(component instanceof Modal) && !(component.tag?.prototype instanceof Modal)) {\n throw new Error('The ModalManager component can only show Modal components');\n }\n\n clearTimeout(this.hideTimeout);\n\n this.showing = true;\n this.node = component.tag ? component : m(component);\n\n // if (app.current) app.current.retain = true;\n\n m.redraw();\n\n if (!$('.modal-backdrop').length) {\n $('
    ').addClass('modal-backdrop')\n .appendTo('body');\n }\n\n MicroModal.show('Modal', {\n awaitCloseAnimation: true,\n onClose: () => {\n $('.modal-backdrop').fadeOut(200, function () {\n this.remove();\n });\n\n this.showing = false;\n }\n });\n\n this.onready();\n }\n\n onclick(e) {\n if (e.target === this.element) {\n this.close();\n }\n }\n\n /**\n * Close the modal dialog.\n */\n close() {\n if (!this.showing) return;\n\n // Don't hide the modal immediately, because if the consumer happens to call\n // the `show` method straight after to show another modal dialog, it will\n // cause the new modal dialog to disappear. Instead we will wait for a tiny\n // bit to give the `show` method the opportunity to prevent this from going\n // ahead.\n this.hideTimeout = setTimeout(() => MicroModal.close('Modal'));\n }\n\n /**\n * Clear content from the modal area.\n *\n * @protected\n */\n clear() {\n if (this.component) {\n this.component.onhide();\n }\n\n this.component = null;\n\n // app.current.retain = false;\n\n m.redraw();\n }\n\n /**\n * When the modal dialog is ready to be used, tell it!\n *\n * @protected\n */\n onready() {\n if (this.component?.onready) {\n this.component.onready();\n }\n }\n}\n","import Modal from './Modal';\nimport {ComponentProps} from '../Component';\nimport RequestError from '../utils/RequestError';\n\nexport interface RequestErrorModalProps extends ComponentProps {\n error: RequestError,\n}\n\nexport default class RequestErrorModal extends Modal {\n className(): string {\n return 'RequestErrorModal Modal--large';\n }\n\n title(): string {\n return this.props.error.xhr\n ? `${this.props.error.xhr.status} ${this.props.error.xhr.statusText}`\n : '';\n }\n\n content() {\n let responseText;\n\n try {\n responseText = JSON.stringify(JSON.parse(this.props.error.responseText), null, 2);\n } catch (e) {\n responseText = this.props.error.responseText;\n }\n\n return
    \n
    \n                {this.props.error.options.method} {this.props.error.options.url}

    \n {responseText}\n
    \n
    \n }\n}\n","import Mithril from 'mithril';\n\nimport Bus from './Bus';\nimport Translator from './Translator';\nimport Session from './Session';\nimport Store from './Store';\nimport {extend} from './extend';\n\nimport extract from './utils/extract';\nimport mapRoutes from './utils/mapRoutes';\nimport Drawer from './utils/Drawer';\nimport RequestError from './utils/RequestError';\n\nimport Forum from './models/Forum';\nimport Discussion from './models/Discussion';\nimport User from './models/User';\nimport Post from './models/Post';\nimport Group from './models/Group';\nimport Notification from './models/Notification';\n\nimport Alert from './components/Alert';\nimport Button from './components/Button';\nimport ModalManager from './components/ModalManager';\nimport RequestErrorModal from './components/RequestErrorModal';\n\nexport type ApplicationData = {\n apiDocument: any;\n locale: string;\n locales: any;\n resources: any[];\n session: any;\n};\n\nexport default abstract class Application {\n /**\n * The forum model for this application.\n */\n forum: Forum;\n\n data: ApplicationData;\n\n translator = new Translator();\n bus = new Bus();\n\n /**\n * The app's session.\n */\n session: Session;\n\n /**\n * The app's data store.\n */\n store = new Store({\n forums: Forum,\n users: User,\n discussions: Discussion,\n posts: Post,\n groups: Group,\n notifications: Notification\n });\n\n drawer = new Drawer();\n\n modal: ModalManager;\n\n /**\n * A local cache that can be used to store data at the application level, so\n * that is persists between different routes.\n */\n cache = {\n notifications: null,\n };\n\n routes = {};\n\n title = '';\n titleCount = 0;\n\n /**\n * An Alert that was shown as a result of an AJAX request error. If present,\n * it will be dismissed on the next successful request.\n */\n private requestError: Alert = null;\n\n mount(basePath = '') {\n m.mount(document.getElementById('modal'), new ModalManager());\n\n // this.alerts = m.mount(document.getElementById('alerts'), );\n\n m.route(document.getElementById('content'), basePath + '/', mapRoutes(this.routes, basePath));\n }\n\n boot(payload: any) {\n this.data = payload;\n\n this.store.pushPayload({ data: this.data.resources });\n\n this.forum = this.store.getById('forums', 1);\n\n this.session = new Session(\n this.store.getById('users', this.data.session.userId),\n this.data.session.csrfToken\n );\n\n this.locale();\n this.plugins();\n this.setupRoutes();\n this.mount();\n\n this.bus.dispatch('app.booting');\n }\n\n locale() {\n this.translator.locale = this.data.locale;\n\n this.bus.dispatch('app.locale');\n }\n\n plugins() {\n this.bus.dispatch('app.plugins');\n }\n\n setupRoutes() {\n this.bus.dispatch('app.routes');\n }\n\n /**\n * Get the API response document that has been preloaded into the application.\n */\n preloadedApiDocument() {\n if (this.data.apiDocument) {\n const results = this.store.pushPayload(this.data.apiDocument);\n\n this.data.apiDocument = null;\n\n return results;\n }\n\n return null;\n }\n\n /**\n * Set the of the page.\n */\n setTitle(title: string) {\n this.title = title;\n this.updateTitle();\n }\n\n /**\n * Set a number to display in the <title> of the page.\n */\n setTitleCount(count: number) {\n this.titleCount = count;\n this.updateTitle();\n }\n\n updateTitle() {\n document.title = (this.titleCount ? `(${this.titleCount}) ` : '') +\n (this.title ? this.title + ' - ' : '') +\n this.forum.attribute('title');\n }\n\n /**\n * Construct a URL to the route with the given name.\n */\n route(name: string, params: object = {}): string {\n const route = this.routes[name];\n\n if (!route) throw new Error(`Route '${name}' does not exist`);\n\n const url = route.path.replace(/:([^\\/]+)/g, (m, key) => extract(params, key));\n const queryString = m.buildQueryString(params);\n const prefix = m.route.prefix === '' ? this.forum.attribute('basePath') : '';\n\n return prefix + url + (queryString ? '?' + queryString : '');\n }\n\n /**\n * Make an AJAX request, handling any low-level errors that may occur.\n *\n * @see https://mithril.js.org/request.html\n */\n request(originalOptions: Mithril.RequestOptions|any): Promise<any> {\n const options: Mithril.RequestOptions = Object.assign({}, originalOptions);\n\n // Set some default options if they haven't been overridden. We want to\n // authenticate all requests with the session token. We also want all\n // requests to run asynchronously in the background, so that they don't\n // prevent redraws from occurring.\n options.background = options.background || true;\n\n extend(options, 'config', (result, xhr: XMLHttpRequest) => xhr.setRequestHeader('X-CSRF-Token', this.session.csrfToken));\n\n // If the method is something like PATCH or DELETE, which not all servers\n // and clients support, then we'll send it as a POST request with the\n // intended method specified in the X-HTTP-Method-Override header.\n if (options.method !== 'GET' && options.method !== 'POST') {\n const method = options.method;\n extend(options, 'config', (result, xhr: XMLHttpRequest) => xhr.setRequestHeader('X-HTTP-Method-Override', method));\n options.method = 'POST';\n }\n\n // When we deserialize JSON data, if for some reason the server has provided\n // a dud response, we don't want the application to crash. We'll show an\n // error message to the user instead.\n options.deserialize = options.deserialize || (responseText => responseText);\n\n options.errorHandler = options.errorHandler || (error => {\n throw error;\n });\n\n // When extracting the data from the response, we can check the server\n // response code and show an error message to the user if something's gone\n // awry.\n const original = options.extract;\n options.extract = xhr => {\n let responseText;\n\n if (original) {\n responseText = original(xhr.responseText);\n } else {\n responseText = xhr.responseText || null;\n }\n\n const status = xhr.status;\n\n if (status < 200 || status > 299) {\n throw new RequestError(status, responseText, options, xhr);\n }\n\n if (xhr.getResponseHeader) {\n const csrfToken = xhr.getResponseHeader('X-CSRF-Token');\n if (csrfToken) app.session.csrfToken = csrfToken;\n }\n\n try {\n return JSON.parse(responseText);\n } catch (e) {\n throw new RequestError(500, responseText, options, xhr);\n }\n };\n\n // TODO: ALERT MANAGER\n // if (this.requestError) this.alerts.dismiss(this.requestError.alert);\n\n // Now make the request. If it's a failure, inspect the error that was\n // returned and show an alert containing its contents.\n // const deferred = m.deferred();\n\n // return new Promise((resolve, reject) => )\n\n return m.request(options)\n .then(res => res, error => {\n this.requestError = error;\n\n let children;\n\n switch (error.status) {\n case 422:\n children = error.response.errors\n .map(error => [error.detail, m('br')])\n .reduce((a, b) => a.concat(b), [])\n .slice(0, -1);\n break;\n\n case 401:\n case 403:\n children = this.translator.trans('core.lib.error.permission_denied_message');\n break;\n\n case 404:\n case 410:\n children = this.translator.trans('core.lib.error.not_found_message');\n break;\n\n case 429:\n children = this.translator.trans('core.lib.error.rate_limit_exceeded_message');\n break;\n\n default:\n children = this.translator.trans('core.lib.error.generic_message');\n }\n\n const isDebug = app.forum.attribute('debug');\n\n error.alert = Alert.component({\n type: 'error',\n children,\n controls: isDebug && [\n Button.component({\n className: 'Button Button--link',\n onclick: this.showDebug.bind(this, error),\n children: 'DEBUG', // TODO make translatable\n })\n ]\n });\n\n try {\n options.errorHandler(error);\n } catch (error) {\n console.error(error);\n // this.alerts.show(error.alert);\n }\n\n return Promise.reject(error);\n });\n }\n\n private showDebug(error: RequestError) {\n // this.alerts.dismiss(this.requestError.alert);\n\n this.modal.show(RequestErrorModal.component({error}));\n }\n}\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","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 {String} name The name of the route.\r\n * @param {String} title The title of the route.\r\n * @param {String} [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","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 (\r\n <ul className=\"Header-controls\">\r\n {listItems(this.items().toArray())}\r\n </ul>\r\n );\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 Stream from 'mithril/stream';\n\nimport Modal from '../../common/components/Modal';\nimport {ComponentProps} from '../../common/Component';\nimport ItemList from \"../../common/utils/ItemList\";\nimport Button from \"../../common/components/Button\";\n\nexport interface LogInModalProps extends ComponentProps {\n username?: string;\n password?: string;\n remember?: boolean;\n}\n\n/**\n * The `LogInModal` component displays a modal dialog with a login form.\n *\n * ### Props\n *\n * - `identification`\n * - `password`\n * - `remember`\n */\nexport default class LogInModal extends Modal<LogInModalProps> {\n /**\n * The value of the identification input.\n */\n identification: Stream<string>;\n\n /**\n * The value of the password input.\n */\n password: Stream<string>;\n\n /**\n * The value of the remember me input.\n */\n remember: Stream<string>;\n\n oninit(vnode) {\n super.oninit(vnode);\n\n this.identification = m.prop(this.props.identification || '');\n\n this.password = m.prop(this.props.password || '');\n\n this.remember = m.prop(!!this.props.remember);\n }\n\n className(): string {\n return 'LogInModal Modal--small';\n }\n\n title(): string {\n return app.translator.transText('core.forum.log_in.title');\n }\n\n content() {\n return [\n <div className=\"Modal-body\">\n {this.body()}\n </div>,\n <div className=\"Modal-footer\">\n {this.footer()}\n </div>\n ];\n }\n\n body() {\n return [\n // <LogInButtons/>,\n\n <div className=\"Form Form--centered\">\n {this.fields().toArray()}\n </div>\n ];\n }\n\n fields() {\n const items = new ItemList();\n\n items.add('identification', <div className=\"Form-group\">\n <input className=\"FormControl\" name=\"identification\" type=\"text\" placeholder={app.translator.transText('core.forum.log_in.username_or_email_placeholder')}\n bidi={this.identification}\n disabled={this.loading} />\n </div>, 30);\n\n items.add('password', <div className=\"Form-group\">\n <input className=\"FormControl\" name=\"password\" type=\"password\" placeholder={app.translator.transText('core.forum.log_in.password_placeholder')}\n bidi={this.password}\n disabled={this.loading} />\n </div>, 20);\n\n items.add('remember', <div className=\"Form-group\">\n <div>\n <label className=\"checkbox\">\n <input type=\"checkbox\" bidi={this.remember} disabled={this.loading} />\n {app.translator.trans('core.forum.log_in.remember_me_label')}\n </label>\n </div>\n </div>, 10);\n\n items.add('submit', <div className=\"Form-group\">\n {Button.component({\n className: 'Button Button--primary Button--block',\n type: 'submit',\n loading: this.loading,\n children: app.translator.trans('core.forum.log_in.submit_button')\n })}\n </div>, -10);\n\n return items;\n }\n\n footer() {\n return [\n <p className=\"LogInModal-forgotPassword\">\n <a onclick={this.forgotPassword.bind(this)}>{app.translator.trans('core.forum.log_in.forgot_password_link')}</a>\n </p>,\n\n app.forum.attribute('allowSignUp') && (\n <p className=\"LogInModal-signUp\">\n {app.translator.trans('core.forum.log_in.sign_up_text', {a: <a onclick={this.signUp.bind(this)}/> })}\n </p>\n )\n ];\n }\n\n /**\n * Open the forgot password modal, prefilling it with an email if the user has\n * entered one.\n *\n * @public\n */\n forgotPassword() {\n const email = this.identification();\n const props = email.indexOf('@') !== -1 ? {email} : undefined;\n\n app.modal.show(new ForgotPasswordModal(props));\n }\n\n /**\n * Open the sign up modal, prefilling it with an email/username/password if\n * the user has entered one.\n *\n * @public\n */\n signUp() {\n const props = {password: this.password()};\n const identification = this.identification();\n props[identification.indexOf('@') !== -1 ? 'email' : 'username'] = identification;\n\n // app.modal.show(new SignUpModal(props));\n }\n\n oncreate(vnode) {\n super.oncreate(vnode);\n\n this.$(`[name=\"${this.identification() ? 'password' : 'identification'}\"]`).select();\n }\n\n onsubmit(e) {\n e.preventDefault();\n\n this.loading = true;\n\n const identification = this.identification();\n const password = this.password();\n const remember = this.remember();\n\n app.session.login({identification, password, remember}, {errorHandler: this.onerror.bind(this)})\n .then(\n () => window.location.reload(),\n this.loaded.bind(this)\n );\n }\n\n onerror(error) {\n if (error.status === 401) {\n error.alert.attrs.children = app.translator.trans('core.forum.log_in.invalid_login_message');\n }\n\n super.onerror(error);\n }\n}\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';\nimport icon from '../helpers/icon';\nimport listItems from '../helpers/listItems';\n\nexport interface DropdownProps extends ComponentProps {\n buttonClassName?: string;\n menuClassName?: string;\n label?: string;\n icon?: string;\n caretIcon?: undefined|string;\n\n onhide?: Function;\n onshow?: Function;\n onclick?: Function;\n}\n\n/**\n * The `Dropdown` component displays a button which, when clicked, shows a\n * dropdown menu beneath it.\n *\n * ### Props\n *\n * - `buttonClassName` A class name to apply to the dropdown toggle button.\n * - `menuClassName` A class name to apply to the dropdown menu.\n * - `icon` The name of an icon to show in the dropdown toggle button.\n * - `caretIcon` The name of an icon to show on the right of the button.\n * - `label` The label of the dropdown toggle button. Defaults to 'Controls'.\n * - `onhide`\n * - `onshow`\n *\n * The children will be displayed as a list inside of the dropdown menu.\n */\nexport default class Dropdown<T extends DropdownProps = DropdownProps> extends Component<T> {\n showing: boolean;\n\n static initProps(props: DropdownProps) {\n props.className = props.className || '';\n props.buttonClassName = props.buttonClassName || '';\n props.menuClassName = props.menuClassName || '';\n props.label = props.label || '';\n props.caretIcon = typeof props.caretIcon !== 'undefined' ? props.caretIcon : 'fas fa-caret-down';\n }\n\n view() {\n const items = this.props.children ? listItems(this.props.children) : [];\n\n return (\n <div className={`ButtonGroup Dropdown dropdown ${this.props.className} itemCount${items.length}${this.showing ? ' open' : ''}`}>\n {this.getButton()}\n {this.getMenu(items)}\n </div>\n );\n }\n\n oncreate(vnode) {\n super.oncreate(vnode);\n\n this.$('> .Dropdown-toggle').dropdown();\n\n // When opening the dropdown menu, work out if the menu goes beyond the\n // bottom of the viewport. If it does, we will apply class to make it show\n // above the toggle button instead of below it.\n this.element.addEventListener('shown.bs.dropdown', () => {\n this.showing = true;\n\n if (this.props.onshow) {\n this.props.onshow();\n }\n\n m.redraw();\n\n const $menu = this.$('.Dropdown-menu');\n const isRight = $menu.hasClass('Dropdown-menu--right');\n\n $menu.removeClass('Dropdown-menu--top Dropdown-menu--right');\n\n $menu.toggleClass(\n 'Dropdown-menu--top',\n $menu.offset().top + $menu.height() > $(window).scrollTop() + $(window).height()\n );\n\n if ($menu.offset().top < 0) {\n $menu.removeClass('Dropdown-menu--top');\n }\n\n $menu.toggleClass(\n 'Dropdown-menu--right',\n isRight || $menu.offset().left + $menu.width() > $(window).scrollLeft() + $(window).width()\n );\n });\n\n this.element.addEventListener('hidden.bs.dropdown', () => {\n this.showing = false;\n\n if (this.props.onhide) {\n this.props.onhide();\n }\n\n m.redraw();\n });\n }\n\n /**\n * Get the template for the button.\n */\n protected getButton(): any {\n return (\n <button\n className={'Dropdown-toggle ' + this.props.buttonClassName}\n data-toggle=\"dropdown\"\n onclick={this.props.onclick}>\n {this.getButtonContent()}\n </button>\n );\n }\n\n /**\n * Get the template for the button's content.\n *\n * @return {*}\n */\n protected getButtonContent() {\n const attrs = this.props;\n\n return [\n attrs.icon ? icon(attrs.icon, {className: 'Button-icon'}) : '',\n <span className=\"Button-label\">{attrs.label}</span>,\n attrs.caretIcon ? icon(attrs.caretIcon, {className: 'Button-caret'}) : ''\n ];\n }\n\n protected getMenu(items) {\n return (\n <ul className={'Dropdown-menu dropdown-menu ' + this.props.menuClassName}>\n {items}\n </ul>\n );\n }\n}\n","import Button, {ButtonProps} from './Button';\n\ninterface LinkButtonProps extends ButtonProps {\n active: boolean;\n oncreate: Function;\n href?: string;\n}\n\n/**\n * The `LinkButton` component defines a `Button` which links to a route.\n *\n * ### Props\n *\n * All of the props accepted by `Button`, plus:\n *\n * - `active` Whether or not the page that this button links to is currently\n * active.\n * - `href` The URL to link to. If the current URL `m.route()` matches this,\n * the `active` prop will automatically be set to true.\n */\nexport default class LinkButton extends Button<LinkButtonProps> {\n static initProps(props: LinkButtonProps) {\n props.active = this.isActive(props);\n }\n\n view(vnode) {\n const vdom = super.view(vnode);\n\n vdom.tag = m.route.Link;\n\n return vdom;\n }\n\n onupdate(vnode) {\n super.onupdate(vnode);\n\n this.props.active = LinkButton.isActive(this.props);\n }\n\n /**\n * Determine whether a component with the given props is 'active'.\n */\n static isActive(props: LinkButtonProps): boolean {\n return typeof props.active !== 'undefined'\n ? props.active\n : m.route.get() === props.href;\n }\n}\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 [\r\n avatar(user), ' ',\r\n <span className=\"Button-label\">{username(user)}</span>\r\n ];\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('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('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('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 config: () => {}\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('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 [\r\n <span className=\"Button-label\">{label}</span>,\r\n icon(this.props.caretIcon, {className: 'Button-caret'})\r\n ];\r\n }\r\n}\r\n","import Component from '../../common/Component';\nimport listItems from '../../common/helpers/listItems';\nimport Button from '../../common/components/Button';\nimport LoadingIndicator from '../../common/components/LoadingIndicator';\nimport Notification from '../../common/models/Notification';\nimport Discussion from '../../common/models/Discussion';\n\n/**\n * The `NotificationList` component displays a list of the logged-in user's\n * notifications, grouped by discussion.\n */\nexport default class NotificationList extends Component {\n /**\n * Whether or not the notifications are loading.\n */\n loading: boolean = false;\n\n /**\n * Whether or not there are more results that can be loaded.\n */\n moreResults: boolean = false;\n\n private $scrollParent: ZeptoCollection;\n private scrollHandler: () => void;\n\n view() {\n const pages = app.cache.notifications || [];\n\n return (\n <div className=\"NotificationList\">\n <div className=\"NotificationList-header\">\n <div className=\"App-primaryControl\">\n {Button.component({\n className: 'Button Button--icon Button--link',\n icon: 'fas fa-check',\n title: app.translator.transText('core.forum.notifications.mark_all_as_read_tooltip'),\n onclick: this.markAllAsRead.bind(this)\n })}\n </div>\n\n <h4 className=\"App-titleControl App-titleControl--text\">{app.translator.trans('core.forum.notifications.title')}</h4>\n </div>\n\n <div className=\"NotificationList-content\">\n {pages.length ? pages.map(notifications => {\n const groups = [];\n const discussions = {};\n\n notifications.forEach(notification => {\n const subject = notification.subject();\n\n if (typeof subject === 'undefined') return;\n\n // Get the discussion that this notification is related to. If it's not\n // directly related to a discussion, it may be related to a post or\n // other entity which is related to a discussion.\n let discussion: any = false;\n if (subject instanceof Discussion) discussion = subject;\n else if (subject && subject.discussion) discussion = subject.discussion();\n\n // If the notification is not related to a discussion directly or\n // indirectly, then we will assign it to a neutral group.\n const key = discussion ? discussion.id() : 0;\n discussions[key] = discussions[key] || {discussion: discussion, notifications: []};\n discussions[key].notifications.push(notification);\n\n if (groups.indexOf(discussions[key]) === -1) {\n groups.push(discussions[key]);\n }\n });\n\n return groups.map(group => {\n const badges = group.discussion && group.discussion.badges().toArray();\n\n return (\n <div className=\"NotificationGroup\">\n {group.discussion\n ? (\n <m.route.Link className=\"NotificationGroup-header\"\n href={app.route.discussion(group.discussion)}>\n {badges && badges.length ? <ul className=\"NotificationGroup-badges badges\">{listItems(badges)}</ul> : ''}\n {group.discussion.title()}\n </m.route.Link>\n ) : (\n <div className=\"NotificationGroup-header\">\n {app.forum.attribute('title')}\n </div>\n )}\n\n <ul className=\"NotificationGroup-content\">\n {group.notifications.map(notification => {\n const NotificationComponent = app.notificationComponents[notification.contentType()];\n return NotificationComponent ? <li>{NotificationComponent.component({notification})}</li> : '';\n })}\n </ul>\n </div>\n );\n });\n }) : ''}\n {this.loading\n ? <LoadingIndicator className=\"LoadingIndicator--block\" />\n : (pages.length ? '' : <div className=\"NotificationList-empty\">{app.translator.trans('core.forum.notifications.empty_text')}</div>)}\n </div>\n </div>\n );\n }\n\n oncreate(vnode) {\n super.oncreate(vnode);\n\n const $notifications = this.$('.NotificationList-content');\n const $scrollParent = this.$scrollParent = $notifications.css('overflow') === 'auto' ? $notifications : $(window);\n\n this.scrollHandler = () => {\n const scrollTop = $scrollParent.scrollTop();\n const viewportHeight = $scrollParent.height();\n const contentTop = $scrollParent === $notifications ? 0 : $notifications.offset().top;\n const contentHeight = $notifications[0].scrollHeight;\n\n if (this.moreResults && !this.loading && scrollTop + viewportHeight >= contentTop + contentHeight) {\n this.loadMore();\n }\n };\n\n $scrollParent.on('scroll', this.scrollHandler);\n }\n\n onremove(vnode) {\n super.onremove(vnode);\n\n this.$scrollParent.off('scroll', this.scrollHandler);\n }\n\n /**\n * Load notifications into the application's cache if they haven't already\n * been loaded.\n */\n load() {\n if (app.session.user.newNotificationCount()) {\n delete app.cache.notifications;\n }\n\n if (app.cache.notifications) {\n return;\n }\n\n app.session.user.pushAttributes({newNotificationCount: 0});\n\n this.loadMore();\n }\n\n /**\n * Load the next page of notification results.\n */\n loadMore() {\n this.loading = true;\n m.redraw();\n\n const params = app.cache.notifications ? {page: {offset: app.cache.notifications.length * 10}} : null;\n\n return app.store.find<Notification>('notifications', params)\n .then(this.parseResults.bind(this))\n .catch(() => {})\n .then(() => {\n this.loading = false;\n m.redraw();\n });\n }\n\n /**\n * Parse results and append them to the notification list.\n */\n parseResults(results: Notification[]): Notification[] {\n app.cache.notifications = app.cache.notifications || [];\n\n if (results.length) app.cache.notifications.push(results);\n\n this.moreResults = !!results.payload.links.next;\n\n return results;\n }\n\n /**\n * Mark all of the notifications as read.\n */\n markAllAsRead() {\n if (!app.cache.notifications) return;\n\n app.session.user.pushAttributes({unreadNotificationCount: 0});\n\n app.cache.notifications.forEach(notifications => {\n notifications.forEach(notification => notification.pushAttributes({isRead: true}))\n });\n\n app.request({\n url: `${app.forum.attribute('apiUrl')}/notifications/read`,\n method: 'POST'\n });\n }\n}\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 = new 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.trans('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 ? m(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 } else {\r\n this.list.load();\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) {\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;\n\n/**\n * The `KeyboardNavigatable` class manages lists that can be navigated with the\n * keyboard, calling callbacks for each actions.\n *\n * This helper encapsulates the key binding logic, providing a simple fluent\n * API for use.\n */\nexport default class KeyboardNavigatable {\n /**\n * Callback to be executed for a specified input.\n *\n * @callback KeyboardNavigatable~keyCallback\n * @param {KeyboardEvent} event\n * @returns {boolean}\n */\n callbacks: { [key: number]: KeyboardEventCallback } = {};\n\n // By default, always handle keyboard navigation.\n whenCallback: KeyboardEventCallback = () => true;\n\n /**\n * Provide a callback to be executed when navigating upwards.\n *\n * This will be triggered by the Up key.\n */\n onUp(callback: KeyboardEventCallback): this {\n this.callbacks[38] = e => {\n e.preventDefault();\n callback(e);\n };\n\n return this;\n }\n\n /**\n * Provide a callback to be executed when navigating downwards.\n *\n * This will be triggered by the Down key.\n */\n onDown(callback: KeyboardEventCallback): this {\n this.callbacks[40] = e => {\n e.preventDefault();\n callback(e);\n };\n\n return this;\n }\n\n /**\n * Provide a callback to be executed when the current item is selected..\n *\n * This will be triggered by the Return and Tab keys..\n */\n onSelect(callback: KeyboardEventCallback): this {\n this.callbacks[9] = this.callbacks[13] = e => {\n e.preventDefault();\n callback(e);\n };\n\n return this;\n }\n\n /**\n * Provide a callback to be executed when the navigation is canceled.\n *\n * This will be triggered by the Escape key.\n */\n onCancel(callback: Function): this {\n this.callbacks[27] = e => {\n e.stopPropagation();\n e.preventDefault();\n callback(e);\n };\n\n return this;\n }\n\n /**\n * Provide a callback to be executed when previous input is removed.\n *\n * This will be triggered by the Backspace key.\n */\n onRemove(callback: Function): this {\n this.callbacks[8] = e => {\n if (e.target.selectionStart === 0 && e.target.selectionEnd === 0) {\n callback(e);\n e.preventDefault();\n }\n };\n\n return this;\n }\n\n /**\n * Provide a callback that determines whether keyboard input should be handled.\n */\n when(callback: KeyboardEventCallback): this {\n this.whenCallback = callback;\n\n return this;\n }\n\n /**\n * Set up the navigation key bindings on the given jQuery element.\n */\n bindTo($element: any) {\n // Handle navigation key events on the navigatable element.\n $element.on('keydown', this.navigate.bind(this));\n }\n\n /**\n * Interpret the given keyboard event as navigation commands.\n */\n navigate(event: KeyboardEvent) {\n // This callback determines whether keyboard should be handled or ignored.\n if (!this.whenCallback(event)) return;\n\n const keyCallback = this.callbacks[event.which];\n if (keyCallback) {\n keyCallback(event);\n }\n }\n}\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';\nimport LinkButton from '../../common/components/LinkButton';\nimport SearchSource from \"./SearchSource\";\nimport Discussion from \"../../common/models/Discussion\";\n\n/**\n * The `DiscussionsSearchSource` finds and displays discussion search results in\n * the search dropdown.\n */\nexport default class DiscussionsSearchSource extends SearchSource {\n protected results: { [key: string]: Discussion[] } = {};\n\n search(query: string) {\n query = query.toLowerCase();\n\n this.results[query] = [];\n\n const params = {\n filter: {q: query},\n page: {limit: 3},\n include: 'mostRelevantPost'\n };\n\n return app.store.find<Discussion>('discussions', params).then(results => this.results[query] = results);\n }\n\n view(query: string) {\n query = query.toLowerCase();\n\n const results = this.results[query] || [];\n\n return [\n <li className=\"Dropdown-header\">{app.translator.trans('core.forum.search.discussions_heading')}</li>,\n <li>\n {LinkButton.component({\n icon: 'fas fa-search',\n children: app.translator.trans('core.forum.search.all_discussions_button', {query}),\n href: app.route('index', {q: query})\n })}\n </li>,\n results.map(discussion => {\n const mostRelevantPost = discussion.mostRelevantPost();\n\n return (\n <li className=\"DiscussionSearchResult\" data-index={'discussions' + discussion.id()}>\n <m.route.Link href={app.route.discussion(discussion, mostRelevantPost && mostRelevantPost.number())}>\n <div className=\"DiscussionSearchResult-title\">{highlight(discussion.title(), query)}</div>\n {mostRelevantPost ? <div className=\"DiscussionSearchResult-excerpt\">{highlight(mostRelevantPost.contentPlain(), query, 100)}</div> : ''}\n </m.route.Link>\n </li>\n );\n })\n ];\n }\n}\n","import highlight from '../../common/helpers/highlight';\nimport avatar from '../../common/helpers/avatar';\nimport username from '../../common/helpers/username';\nimport SearchSource from './SearchSource';\nimport User from '../../common/models/User';\n\n/**\n * The `UsersSearchSource` finds and displays user search results in the search\n * dropdown.\n *\n * @implements SearchSource\n */\nexport default class UsersSearchSource extends SearchSource {\n protected results: { [key: string]: User[] } = {};\n\n search(query: string) {\n return app.store.find<User>('users', {\n filter: {q: query},\n page: {limit: 5}\n }).then(results => {\n this.results[query] = results;\n m.redraw();\n });\n }\n\n view(query: string) {\n query = query.toLowerCase();\n\n const results = (this.results[query] || [])\n .concat(app.store.all<User>('users').filter(user => [user.username(), user.displayName()].some(value => value.toLowerCase().substr(0, query.length) === query)))\n .filter((e, i, arr) => arr.lastIndexOf(e) === i)\n .sort((a, b) => a.displayName().localeCompare(b.displayName()));\n\n if (!results.length) return '';\n\n return [\n <li className=\"Dropdown-header\">{app.translator.trans('core.forum.search.users_heading')}</li>,\n results.map(user => {\n const name = username(user);\n\n if (!name.children) {\n name.children = [name.text];\n delete name.text;\n }\n\n name.children[0] = highlight(name.children[0], query);\n\n return (\n <li className=\"UserSearchResult\" data-index={'users' + user.id()}>\n <m.route.Link href={app.route.user(user)}>\n {avatar(user)}\n {name}\n </m.route.Link>\n </li>\n );\n })\n ];\n }\n}\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[] = null;\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: string|number = 0;\r\n\r\n navigator: 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 className={'Search ' + classNames({\r\n open: this.value() && this.hasFocus,\r\n focused: this.hasFocus,\r\n active: !!currentSearch,\r\n loading: !!this.loadingSources\r\n })}>\r\n <div className=\"Search-input\">\r\n <input 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 {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)}>{icon('fas fa-times-circle')}</button>\r\n : ''}\r\n </div>\r\n <ul className=\"Dropdown-menu Search-results\">\r\n {this.value() && this.hasFocus\r\n ? this.sources.map(source => source.view(this.value()))\r\n : ''}\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() {\r\n search.setIndex(\r\n search.selectableItems().index(this)\r\n );\r\n });\r\n\r\n const $input = this.$('input');\r\n\r\n this.navigator = new KeyboardNavigatable();\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() {\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) {\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() {\r\n $(this).one('mouseup', e => e.preventDefault()).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 * @return {String}\r\n */\r\n getCurrentSearch() {\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 * @return {jQuery}\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 * @return {Integer}\r\n */\r\n getCurrentNumericIndex() {\r\n return this.selectableItems().index(\r\n this.getItem(this.index)\r\n );\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 * @param {String} index\r\n * @return {DOMElement}\r\n */\r\n getItem(index) {\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 = $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.animate({scrollTop}, 100);\r\n }\r\n }\r\n }\r\n}\r\n","import Component from '../../common/Component';\r\nimport Button from '../../common/components/Button';\r\nimport LogInModal from './LogInModal';\r\n// import 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 (\r\n <ul className=\"Header-controls\">\r\n {listItems(this.items().toArray())}\r\n </ul>\r\n );\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 = [];\r\n\r\n for (const locale in app.data.locales) {\r\n locales.push(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 items.add('locale', SelectDropdown.component({\r\n children: locales,\r\n buttonClassName: 'Button Button--link'\r\n }), 20);\r\n }\r\n\r\n if (app.session.user) {\r\n items.add('notifications', NotificationsDropdown.component(), 10);\r\n items.add('session', SessionDropdown.component(), 0);\r\n } else {\r\n if (app.forum.attribute('allowSignUp')) {\r\n items.add('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(new SignUpModal())\r\n }), 10\r\n );\r\n }\r\n\r\n items.add('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(new LogInModal())\r\n }), 0\r\n );\r\n }\r\n\r\n return items;\r\n }\r\n}\r\n","import Component from '../../common/Component';\r\n\r\nexport default class IndexPage extends Component {\r\n oninit() {\r\n console.log('IndexPage#oninit');\r\n }\r\n\r\n view() {\r\n return (\r\n <div class=\"container\">\r\n <h1>hi</h1>\r\n </div>\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","/**\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 Alert from '../../common/components/Alert';\nimport Button from '../../common/components/Button';\nimport Separator from '../../common/components/Separator';\n// import EditUserModal from '../components/EditUserModal';\nimport UserPage from '../components/UserPage';\nimport ItemList from '../../common/utils/ItemList';\nimport User from \"../../common/models/User\";\n\n/**\n * The `UserControls` utility constructs a list of buttons for a user which\n * perform actions on it.\n */\nexport default {\n /**\n * Get a list of controls for a user.\n *\n * @param user\n * @param context The parent component under which the controls menu will\n * be displayed.\n */\n controls(user: User, context: any): ItemList {\n const items = new ItemList();\n\n ['user', 'moderation', 'destructive'].forEach(section => {\n const controls = this[section + 'Controls'](user, context).toArray();\n if (controls.length) {\n controls.forEach(item => items.add(item.itemName, item));\n items.add(section + 'Separator', Separator.component());\n }\n });\n\n return items;\n },\n\n /**\n * Get controls for a user pertaining to the current user (e.g. poke, follow).\n */\n userControls(): ItemList {\n return new ItemList();\n },\n\n /**\n * Get controls for a user pertaining to moderation (e.g. suspend, edit).\n */\n moderationControls(user: User): ItemList {\n const items = new ItemList();\n\n if (user.canEdit()) {\n items.add('edit', Button.component({\n icon: 'fas fa-pencil-alt',\n children: app.translator.trans('core.forum.user_controls.edit_button'),\n onclick: this.editAction.bind(this, user)\n }));\n }\n\n return items;\n },\n\n /**\n * Get controls for a user which are destructive (e.g. delete).\n */\n destructiveControls(user: User): ItemList {\n const items = new ItemList();\n\n if (user.id() !== '1' && user.canDelete()) {\n items.add('delete', Button.component({\n icon: 'fas fa-times',\n children: app.translator.trans('core.forum.user_controls.delete_button'),\n onclick: this.deleteAction.bind(this, user)\n }));\n }\n\n return items;\n },\n\n /**\n * Delete the user.\n */\n deleteAction(user: User) {\n if (!confirm(app.translator.trans('core.forum.user_controls.delete_confirmation'))) {\n return;\n }\n\n user.delete().then(() => {\n this.showDeletionAlert(user, 'success');\n if (app.current instanceof UserPage && app.current.user === user) {\n app.history.back();\n } else {\n window.location.reload();\n }\n }).catch(() => this.showDeletionAlert(user, 'error'));\n },\n\n /**\n * Show deletion alert of user.\n */\n showDeletionAlert(user: User, type: string) {\n const { username, email } = user.data.attributes;\n const message = `core.forum.user_controls.delete_${type}_message`;\n\n app.alerts.show(Alert.component({\n type,\n children: app.translator.trans(\n message, { username, email }\n )\n }));\n },\n\n /**\n * Edit the user.\n */\n editAction(user: User) {\n app.modal.show(new EditUserModal({user}));\n }\n};\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 className={'AvatarEditor Dropdown ' + this.props.className + (this.loading ? ' loading' : '') + (this.isDraggedOver ? ' dragover' : '')}>\r\n {avatar(user)}\r\n <a 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 {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\">\r\n {listItems(this.controlItems().toArray())}\r\n </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 * @return {ItemList}\r\n */\r\n controlItems() {\r\n const items = new ItemList();\r\n\r\n items.add('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('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 * @param {Event} e\r\n */\r\n enableDragover(e) {\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 * @param {Event} e\r\n */\r\n disableDragover(e) {\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) {\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 * @param {Event} e\r\n */\r\n quickUpload(e) {\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.appendTo('body').hide().click().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 * @param {File} file\r\n */\r\n upload(file) {\r\n if (this.loading) return;\r\n\r\n const user = this.props.user;\r\n const body = new FormData();\r\n data.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(\r\n this.success.bind(this),\r\n this.failure.bind(this)\r\n );\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(\r\n this.success.bind(this),\r\n this.failure.bind(this)\r\n );\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 * @param {Object} response\r\n * @protected\r\n */\r\n success(response) {\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 * @param {Object} response\r\n * @protected\r\n */\r\n failure(response) {\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 || '')}\r\n style={color ? {backgroundColor: color} : ''}>\r\n <div className=\"darkenBackground\">\r\n\r\n <div className=\"container\">\r\n {controls.length ? 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 <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 ? (\r\n <ul className=\"UserCard-badges badges\">\r\n {listItems(badges)}\r\n </ul>\r\n ) : ''}\r\n\r\n <ul className=\"UserCard-info\">\r\n {listItems(this.infoItems().toArray())}\r\n </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('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 Page from './Page';\nimport ItemList from '../../common/utils/ItemList';\nimport affixSidebar from '../utils/affixSidebar';\nimport UserCard from './UserCard';\nimport LoadingIndicator from '../../common/components/LoadingIndicator';\nimport SelectDropdown from '../../common/components/SelectDropdown';\nimport LinkButton from '../../common/components/LinkButton';\nimport Separator from '../../common/components/Separator';\nimport listItems from '../../common/helpers/listItems';\n\nimport User from '../../common/models/User';\n\n/**\n * The `UserPage` component shows a user's profile. It can be extended to show\n * content inside of the content area. See `ActivityPage` and `SettingsPage` for\n * examples.\n */\nexport default abstract class UserPage extends Page {\n /**\n * The user this page is for.\n */\n user: User;\n bodyClass: string = 'App--user';\n\n /**\n * The username of the currently loaded user\n */\n username: string;\n\n view() {\n return (\n <div className=\"UserPage\">\n {this.user ? [\n UserCard.component({\n user: this.user,\n className: 'Hero UserHero',\n editable: this.user.canEdit() || this.user === app.session.user,\n controlsButtonClassName: 'Button'\n }),\n <div className=\"container\">\n <div className=\"sideNavContainer\">\n <nav className=\"sideNav UserPage-nav\" config={affixSidebar}>\n <ul>{listItems(this.sidebarItems().toArray())}</ul>\n </nav>\n <div className=\"sideNavOffset UserPage-content\">\n {this.content()}\n </div>\n </div>\n </div>\n ] : [\n LoadingIndicator.component({lassName: 'LoadingIndicator--block'})\n ]}\n </div>\n );\n }\n\n /**\n * Get the content to display in the user page.\n */\n abstract content();\n\n /**\n * Initialize the component with a user, and trigger the loading of their\n * activity feed.\n */\n protected show(user: User) {\n this.user = user;\n\n app.setTitle(user.displayName());\n\n m.redraw();\n }\n\n /**\n * Given a username, load the user's profile from the store, or make a request\n * if we don't have it yet. Then initialize the profile page with that user.\n */\n loadUser(username: string) {\n const lowercaseUsername = username.toLowerCase();\n\n // Load the preloaded user object, if any, into the global app store\n // We don't use the output of the method because it returns raw JSON\n // instead of the parsed models\n app.preloadedApiDocument();\n\n if (lowercaseUsername == this.username) return;\n\n this.username = lowercaseUsername;\n\n app.store.all<User>('users').some(user => {\n if ((user.username().toLowerCase() === lowercaseUsername || user.id() === username) && user.joinTime()) {\n this.show(user);\n return true;\n }\n });\n\n if (!this.user) {\n app.store.find('users', username).then(this.show.bind(this));\n }\n }\n\n /**\n * Build an item list for the content of the sidebar.\n */\n sidebarItems() {\n const items = new ItemList();\n\n items.add('nav',\n SelectDropdown.component({\n children: this.navItems().toArray(),\n className: 'App-titleControl',\n buttonClassName: 'Button'\n })\n );\n\n return items;\n }\n\n /**\n * Build an item list for the navigation in the sidebar.\n */\n navItems() {\n const items = new ItemList();\n const user = this.user;\n\n items.add('posts',\n LinkButton.component({\n href: app.route('user.posts', {username: user.username()}),\n children: [app.translator.trans('core.forum.user.posts_link'), <span className=\"Button-badge\">{user.commentCount()}</span>],\n icon: 'far fa-comment'\n }),\n 100\n );\n\n items.add('discussions',\n LinkButton.component({\n href: app.route('user.discussions', {username: user.username()}),\n children: [app.translator.trans('core.forum.user.discussions_link'), <span className=\"Button-badge\">{user.discussionCount()}</span>],\n icon: 'fas fa-bars'\n }),\n 90\n );\n\n if (app.session.user === user) {\n items.add('separator', Separator.component(), -90);\n items.add('settings',\n LinkButton.component({\n href: app.route('settings'),\n children: app.translator.trans('core.forum.user.settings_link'),\n icon: 'fas fa-cog'\n }),\n -100\n );\n }\n\n return items;\n }\n}\n","import Component, {ComponentProps} from '../Component';\n\nexport interface PlaceholderProps extends ComponentProps {\n text: string\n}\n\n/**\n * The `Placeholder` component displays a muted text with some call to action,\n * usually used as an empty state.\n */\nexport default class Placeholder extends Component<PlaceholderProps> {\n view() {\n return (\n <div className=\"Placeholder\">\n <p>{this.props.text}</p>\n </div>\n );\n }\n}\n","import {Vnode} from \"mithril\";\n\n// import EditPostComposer from '../components/EditPostComposer';\nimport Button from '../../common/components/Button';\nimport Separator from '../../common/components/Separator';\nimport ItemList from '../../common/utils/ItemList';\nimport Post from \"../../common/models/Post\";\nimport PostComponent from \"../../forum/components/Post\";\n\n/**\n * The `PostControls` utility constructs a list of buttons for a post which\n * perform actions on it.\n */\nexport default {\n /**\n * Get a list of controls for a post.\n *\n * @param {Post} post\n * @param {*} context The parent component under which the controls menu will\n * be displayed.\n * @public\n */\n controls(post: Post, context) {\n const items = new ItemList();\n\n ['user', 'moderation', 'destructive'].forEach(section => {\n const controls = this[section + 'Controls'](post, context).toArray();\n\n if (controls.length) {\n controls.forEach(item => items.add(item.itemName, item));\n items.add(section + 'Separator', Separator.component());\n }\n });\n\n return items;\n },\n\n /**\n * Get controls for a post pertaining to the current user (e.g. report).\n *\n * @param {Post} post\n * @param {*} context The parent component under which the controls menu will\n * be displayed.\n * @protected\n */\n userControls(post: Post, context) {\n return new ItemList();\n },\n\n /**\n * Get controls for a post pertaining to moderation (e.g. edit).\n *\n * @param {Post} post\n * @param {*} context The parent component under which the controls menu will\n * be displayed.\n * @protected\n */\n moderationControls(post: Post, context) {\n const items = new ItemList();\n\n if (post.contentType() === 'comment' && post.canEdit()) {\n if (!post.isHidden()) {\n items.add('edit', Button.component({\n icon: 'fas fa-pencil-alt',\n onclick: this.editAction.bind(post)\n }, app.translator.trans('core.forum.post_controls.edit_button')));\n }\n }\n\n return items;\n },\n\n /**\n * Get controls for a post that are destructive (e.g. delete).\n *\n * @param {Post} post\n * @param {*} context The parent component under which the controls menu will\n * be displayed.\n * @protected\n */\n destructiveControls(post: Post, context) {\n const items = new ItemList();\n\n if (post.contentType() === 'comment' && !post.isHidden()) {\n if (post.canHide()) {\n items.add('hide', Button.component({\n icon: 'far fa-trash-alt',\n children: app.translator.trans('core.forum.post_controls.delete_button'),\n onclick: this.hideAction.bind(post)\n }));\n }\n } else {\n if (post.contentType() === 'comment' && post.canHide()) {\n items.add('restore', Button.component({\n icon: 'fas fa-reply',\n children: app.translator.trans('core.forum.post_controls.restore_button'),\n onclick: this.restoreAction.bind(post)\n }));\n }\n if (post.canDelete()) {\n items.add('delete', Button.component({\n icon: 'fas fa-times',\n children: app.translator.trans('core.forum.post_controls.delete_forever_button'),\n onclick: this.deleteAction.bind(post, context)\n }));\n }\n }\n\n return items;\n },\n\n /**\n * Open the composer to edit a post.\n */\n editAction(this: Post) {\n return new Promise<EditPostComposer>(resolve => {\n const component = new EditPostComposer({ post: this });\n\n app.composer.load(component);\n app.composer.show();\n\n resolve(component);\n });\n },\n\n /**\n * Hide a post.\n */\n hideAction(this: Post) {\n this.pushAttributes({ hiddenAt: new Date(), hiddenUser: app.session.user });\n\n return this.save({ isHidden: true }).then(() => m.redraw());\n },\n\n /**\n * Restore a post.\n */\n restoreAction(this: Post) {\n this.pushAttributes({ hiddenAt: null, hiddenUser: null });\n\n return this.save({ isHidden: false }).then(() => m.redraw());\n },\n\n /**\n * Delete a post.\n */\n deleteAction(this: Post, context: PostComponent) {\n if (context) context.loading = true;\n\n return this.delete()\n .then(() => {\n const discussion = this.discussion();\n\n discussion.removePost(this.id());\n\n // If this was the last post in the discussion, then we will assume that\n // the whole discussion was deleted too.\n if (!discussion.postIds().length) {\n // If there is a discussion list in the cache, remove this discussion.\n if (app.cache.discussionList) {\n app.cache.discussionList.removeDiscussion(discussion);\n }\n\n if (app.viewingDiscussion(discussion)) {\n app.history.back();\n }\n }\n })\n .catch(() => {})\n .then(() => {\n if (context) context.loading = false;\n m.redraw();\n });\n }\n};\n","export default class SubtreeRetainer {\n callbacks: Function[];\n data = {};\n\n constructor(...callbacks: Function[]) {\n this.callbacks = callbacks;\n }\n\n check(...callbacks: Function[]) {\n this.callbacks.concat(...callbacks);\n }\n\n /**\n * Return whether the component should redraw.\n */\n update(): boolean {\n let update = false;\n\n this.callbacks.forEach((callback, i) => {\n const result = callback();\n\n if (result !== this.data[i]) {\n this.data[i] = result;\n update = true;\n }\n });\n\n return update;\n }\n}\n","import Component, {ComponentProps} from '../../common/Component';\nimport Dropdown from '../../common/components/Dropdown';\nimport PostControls from '../utils/PostControls';\nimport listItems from '../../common/helpers/listItems';\nimport ItemList from '../../common/utils/ItemList';\nimport SubtreeRetainer from \"../../common/utils/SubtreeRetainer\";\nimport PostModel from '../../common/models/Post';\n\nexport interface PostProps extends ComponentProps {\n post: PostModel\n}\n\n/**\n * The `Post` component displays a single post. The basic post template just\n * includes a controls dropdown; subclasses must implement `content` and `attrs`\n * methods.\n *\n * @abstract\n */\nexport default class Post<T extends PostProps = PostProps> extends Component<PostProps> {\n loading = false;\n controlsOpen = false;\n\n subtree: SubtreeRetainer;\n\n oninit(vnode) {\n super.oninit(vnode);\n\n /**\n * Set up a subtree retainer so that the post will not be redrawn\n * unless new data comes in.\n */\n this.subtree = new SubtreeRetainer(\n () => this.props.post.freshness,\n () => {\n const user = this.props.post.user();\n return user?.freshness;\n },\n () => this.controlsOpen\n );\n }\n\n view() {\n const controls = PostControls.controls(this.props.post, this).toArray();\n const attrs = this.attrs();\n\n attrs.className = classNames(this.classes(attrs.className));\n\n return (\n <article {...attrs}>\n <div>\n {this.content()}\n <aside className=\"Post-actions\">\n <ul>\n {listItems(this.actionItems().toArray())}\n {controls.length ? <li>\n <Dropdown\n className=\"Post-controls\"\n buttonClassName=\"Button Button--icon Button--flat\"\n menuClassName=\"Dropdown-menu--right\"\n icon=\"fas fa-ellipsis-h\"\n onshow={() => this.$('.Post-actions').addClass('open')}\n onhide={() => this.$('.Post-actions').removeClass('open')}>\n {controls}\n </Dropdown>\n </li> : ''}\n </ul>\n </aside>\n <footer className=\"Post-footer\"><ul>{listItems(this.footerItems().toArray())}</ul></footer>\n </div>\n );\n </article>\n );\n }\n\n onbeforeupdate(vnode) {\n super.onbeforeupdate(vnode);\n\n return this.subtree.update();\n }\n\n oncreate(vnode) {\n super.oncreate(vnode);\n\n const $actions = this.$('.Post-actions');\n const $controls = this.$('.Post-controls');\n\n $actions.toggleClass('open', $controls.hasClass('open'));\n }\n\n /**\n * Get attributes for the post element.\n */\n attrs(): ComponentProps {\n return {};\n }\n\n /**\n * Get the post's content.\n */\n content() {\n return [];\n }\n\n classes(existing) {\n let classes = (existing || '').split(' ').concat(['Post']);\n\n if (this.loading) {\n classes.push('Post--loading');\n }\n\n if (this.props.post.user() === app.session.user) {\n classes.push('Post--by-actor');\n }\n\n return classes;\n }\n\n /**\n * Build an item list for the post's actions.\n */\n actionItems() {\n return new ItemList();\n }\n\n /**\n * Build an item list for the post's footer.\n */\n footerItems() {\n return new ItemList();\n }\n}\n","import Component from '../../common/Component';\nimport UserCard from './UserCard';\nimport avatar from '../../common/helpers/avatar';\nimport username from '../../common/helpers/username';\nimport userOnline from '../../common/helpers/userOnline';\nimport listItems from '../../common/helpers/listItems';\nimport {PostProps} from \"./Post\";\nimport LinkButton from \"../../common/components/LinkButton\";\n\n/**\n * The `PostUser` component shows the avatar and username of a post's author.\n */\nexport default class PostUser extends Component<PostProps> {\n /**\n * Whether or not the user hover card is visible.\n */\n cardVisible = false;\n\n view() {\n const post = this.props.post;\n const user = post.user();\n\n if (!user) {\n return (\n <div className=\"PostUser\">\n <h3>{avatar(user, {className: 'PostUser-avatar'})} {username(user)}</h3>\n </div>\n );\n }\n\n let card = '';\n\n if (!post.isHidden() && this.cardVisible) {\n card = UserCard.component({\n user,\n className: 'UserCard--popover',\n controlsButtonClassName: 'Button Button--icon Button--flat'\n });\n }\n\n return (\n <div className=\"PostUser\">\n <h3>\n <LinkButton href={app.route.user(user)}>\n {avatar(user, {className: 'PostUser-avatar'})}\n {userOnline(user)}\n {username(user)}\n </LinkButton>\n </h3>\n <ul className=\"PostUser-badges badges\">\n {listItems(user.badges().toArray())}\n </ul>\n {card}\n </div>\n );\n }\n\n oncreate(vnode) {\n super.oncreate(vnode);\n\n let timeout;\n\n this.$()\n .on('mouseover', 'h3 a, .UserCard', () => {\n clearTimeout(timeout);\n timeout = setTimeout(this.showCard.bind(this), 500);\n })\n .on('mouseout', 'h3 a, .UserCard', () => {\n clearTimeout(timeout);\n timeout = setTimeout(this.hideCard.bind(this), 250);\n });\n }\n\n /**\n * Show the user card.\n */\n showCard() {\n this.cardVisible = true;\n\n m.redraw();\n\n setTimeout(() => this.$('.UserCard').addClass('in'));\n }\n\n /**\n * Hide the user card.\n */\n hideCard() {\n this.$('.UserCard').removeClass('in')\n .one('transitionend webkitTransitionEnd oTransitionEnd', () => {\n this.cardVisible = false;\n m.redraw();\n });\n }\n}\n","import icon from './icon';\nimport User from '../models/User';\n\n/**\n * The `useronline` helper displays a green circle if the user is online\n *\n * @param {User} user\n * @return {Object}\n */\nexport default function userOnline(user: User) {\n if (user.lastSeenAt() && user.isOnline()) {\n return <span className=\"UserOnline\">{icon('fas fa-circle')}</span>;\n }\n}\n","import Post from './Post';\nimport PostUser from './PostUser';\n// import PostMeta from './PostMeta';\n// import PostEdited from './PostEdited';\n// import EditPostComposer from './EditPostComposer';\nimport ItemList from '../../common/utils/ItemList';\nimport listItems from '../../common/helpers/listItems';\nimport Button from '../../common/components/Button';\n\n/**\n * The `CommentPost` component displays a standard `comment`-typed post. This\n * includes a number of item lists (controls, header, and footer) surrounding\n * the post's HTML content.\n */\nexport default class CommentPost extends Post {\n /**\n * If the post has been hidden, then this flag determines whether or not its\n * content has been expanded.\n */\n revealContent: boolean = false;\n\n postUser: PostUser;\n\n oninit(vnode) {\n super.oninit(vnode);\n\n // Create an instance of the component that displays the post's author so\n // that we can force the post to rerender when the user card is shown.\n this.postUser = PostUser.component({post: this.props.post});\n\n this.subtree.check(\n () => this.postUser.cardVisible,\n () => this.isEditing()\n );\n }\n\n content() {\n // Note: we avoid using JSX for the <ul> below because it results in some\n // weirdness in Mithril.js 0.1.x (see flarum/core#975). This workaround can\n // be reverted when we upgrade to Mithril 1.0.\n return super.content().concat([\n <header className=\"Post-header\">{m('ul', listItems(this.headerItems().toArray()))}</header>,\n <div className=\"Post-body\">\n {this.isEditing()\n ? <div className=\"Post-preview\" config={this.configPreview.bind(this)}/>\n : m.trust(this.props.post.contentHtml())}\n </div>\n ]);\n }\n\n onupdate(vnode) {\n super.onupdate(vnode);\n\n const contentHtml = this.isEditing() ? '' : this.props.post.contentHtml();\n\n // TODO: idk what this is supposed to be\n\n // If the post content has changed since the last render, we'll run through\n // all of the <script> tags in the content and evaluate them. This is\n // necessary because TextFormatter outputs them for e.g. syntax highlighting.\n if (vnode.contentHtml !== contentHtml) {\n this.$('.Post-body script').each(function() {\n eval.call(window, $(this).text());\n });\n }\n\n vnode.contentHtml = contentHtml;\n }\n\n isEditing() {\n return false; // TODO\n // return app.composer?.component instanceof EditPostComposer &&\n // app.composer.component.props.post === this.props.post;\n }\n\n attrs() {\n const post = this.props.post;\n const attrs = super.attrs();\n\n attrs.className = (attrs.className || '') + ' ' + classNames({\n 'CommentPost': true,\n 'Post--hidden': post.isHidden(),\n 'Post--edited': post.isEdited(),\n 'revealContent': this.revealContent,\n 'editing': this.isEditing()\n });\n\n return attrs;\n }\n\n // TODO change so it works\n configPreview(element, isInitialized, context) {\n if (isInitialized) return;\n\n // Every 50ms, if the composer content has changed, then update the post's\n // body with a preview.\n let preview;\n const updatePreview = () => {\n const content = app.composer.component.content();\n\n if (preview === content) return;\n\n preview = content;\n\n s9e.TextFormatter.preview(preview || '', element);\n };\n updatePreview();\n\n const updateInterval = setInterval(updatePreview, 50);\n context.onunload = () => clearInterval(updateInterval);\n }\n\n /**\n * Toggle the visibility of a hidden post's content.\n */\n toggleContent() {\n this.revealContent = !this.revealContent;\n }\n\n /**\n * Build an item list for the post's header.\n *\n * @return {ItemList}\n */\n headerItems() {\n const items = new ItemList();\n const post = this.props.post;\n const props = {post};\n\n items.add('user', this.postUser, 100);\n // items.add('meta', PostMeta.component(props));\n\n if (post.isEdited() && !post.isHidden()) {\n items.add('edited', PostEdited.component(props));\n }\n\n // If the post is hidden, add a button that allows toggling the visibility\n // of the post's content.\n if (post.isHidden()) {\n items.add('toggle', (\n Button.component({\n className: 'Button Button--default Button--more',\n icon: 'fas fa-ellipsis-h',\n onclick: this.toggleContent.bind(this)\n })\n ));\n }\n\n return items;\n }\n}\n","import UserPage from './UserPage';\nimport LoadingIndicator from '../../common/components/LoadingIndicator';\nimport Button from '../../common/components/Button';\nimport Placeholder from '../../common/components/Placeholder';\nimport CommentPost from './CommentPost';\nimport Post from '../../common/models/Post';\n\n/**\n * The `PostsUserPage` component shows a user's activity feed inside of their\n * profile.\n */\nexport default class PostsUserPage extends UserPage {\n /**\n * Whether or not the activity feed is currently loading.\n */\n loading = true;\n\n /**\n * Whether or not there are any more activity items that can be loaded.\n */\n moreResults = false;\n\n /**\n * The Post models in the feed.\n */\n posts: Post[] = [];\n\n /**\n * The number of activity items to load per request.\n */\n loadLimit = 20;\n\n oninit(vnode) {\n super.oninit(vnode);\n\n this.loadUser(vnode.attrs.username);\n }\n\n onupdate(vnode) {\n super.onupdate(vnode);\n\n this.loadUser(vnode.attrs.username);\n }\n\n content() {\n if (this.posts.length === 0 && ! this.loading) {\n return (\n <div className=\"PostsUserPage\">\n <Placeholder text={app.translator.trans('core.forum.user.posts_empty_text')} />\n </div>\n );\n }\n\n let footer;\n\n if (this.loading) {\n footer = LoadingIndicator.component();\n } else if (this.moreResults) {\n footer = (\n <div className=\"PostsUserPage-loadMore\">\n {Button.component({\n children: app.translator.trans('core.forum.user.posts_load_more_button'),\n className: 'Button',\n onclick: this.loadMore.bind(this)\n })}\n </div>\n );\n }\n\n return (\n <div className=\"PostsUserPage\">\n <ul className=\"PostsUserPage-list\">\n {this.posts.map(post => (\n <li>\n <div className=\"PostsUserPage-discussion\">\n {app.translator.trans('core.forum.user.in_discussion_text', {discussion: <m.route.Link href={app.route.post(post)}>{post.discussion().title()}</m.route.Link>})}\n </div>\n {CommentPost.component({post})}\n </li>\n ))}\n </ul>\n <div className=\"PostsUserPage-loadMore\">\n {footer}\n </div>\n </div>\n );\n }\n\n /**\n * Initialize the component with a user, and trigger the loading of their\n * activity feed.\n */\n show(user) {\n super.show(user);\n\n this.refresh();\n }\n\n /**\n * Clear and reload the user's activity feed.\n */\n refresh() {\n this.loading = true;\n this.posts = [];\n\n m.redraw();\n\n this.loadResults().then(this.parseResults.bind(this));\n }\n\n /**\n * Load a new page of the user's activity feed.\n *\n * @param offset The position to start getting results from.\n */\n protected loadResults(offset?: number): Promise<Post[]> {\n return app.store.find<Post>('posts', {\n filter: {\n user: this.user.id(),\n type: 'comment'\n },\n page: {offset, limit: this.loadLimit},\n sort: '-createdAt'\n });\n }\n\n /**\n * Load the next page of results.\n */\n loadMore() {\n this.loading = true;\n this.loadResults(this.posts.length).then(this.parseResults.bind(this));\n }\n\n /**\n * Parse results and append them to the activity feed.\n */\n parseResults(results: Post[]): Post[] {\n this.loading = false;\n\n [].push.apply(this.posts, results);\n\n this.moreResults = results.length >= this.loadLimit;\n m.redraw();\n\n return results;\n }\n}\n","import Application from '../common/Application';\nimport History from './utils/History';\n\nimport HeaderPrimary from './components/HeaderPrimary';\nimport HeaderSecondary from './components/HeaderSecondary';\n\nimport Page from './components/Page';\nimport IndexPage from './components/IndexPage';\nimport PostsUserPage from './components/PostsUserPage';\nimport User from \"../common/models/User\";\nimport Post from \"../common/models/Post\";\nimport Discussion from \"../common/models/Discussion\";\n\nexport default class Forum extends Application {\n routes = {\n 'index': { path: '/', component: IndexPage },\n 'index.filter': { path: '/:filter', component: IndexPage },\n\n 'user': { path: '/u/:username', component: PostsUserPage },\n 'user.posts': { path: '/u/:username', component: PostsUserPage },\n 'user.discussions': { path: '/u/:username', component: PostsUserPage },\n 'settings': { path: '/u/:username', component: PostsUserPage },\n\n 'discussion': { path: '/d/:id', IndexPage },\n };\n\n /**\n * The app's history stack, which keeps track of which routes the user visits\n * so that they can easily navigate back to the previous route.\n */\n history: History = new History();\n\n previous: Page;\n current: Page;\n\n mount() {\n // Get the configured default route and update that route's path to be '/'.\n // Push the homepage as the first route, so that the user will always be\n // able to click on the 'back' button to go home, regardless of which page\n // they started on.\n const defaultRoute = this.forum.attribute('defaultRoute');\n let defaultAction = 'index';\n\n for (const i in this.routes) {\n if (this.routes[i].path === defaultRoute) defaultAction = i;\n }\n\n this.routes[defaultAction].path = '/';\n this.history.push(defaultAction, this.translator.transText('core.forum.header.back_to_index_tooltip'), '/');\n\n // m.mount(document.getElementById('app-navigation'), Navigation.component({className: 'App-backControl', drawer: true}));\n // m.mount(document.getElementById('header-navigation'), Navigation.component());\n m.mount(document.getElementById('header-primary'), new HeaderPrimary());\n m.mount(document.getElementById('header-secondary'), new HeaderSecondary());\n\n // this.pane = new Pane(document.getElementById('app'));\n // this.composer = m.mount(document.getElementById('composer'), Composer.component());\n\n m.route.prefix = '';\n super.mount(this.forum.attribute('basePath'));\n\n // alertEmailConfirmation(this);\n\n // Route the home link back home when clicked. We do not want it to register\n // if the user is opening it in a new tab, however.\n $('#home-link').click((e: MouseEvent) => {\n if (e.ctrlKey || e.metaKey || e.which === 2) return;\n e.preventDefault();\n app.history.home();\n\n // Reload the current user so that their unread notification count is refreshed.\n if (app.session.user) {\n app.store.find('users', app.session.user.id());\n m.redraw();\n }\n });\n }\n\n setupRoutes() {\n super.setupRoutes();\n\n this.route.discussion = (discussion: Discussion, near?: number): string => {\n const slug = discussion.slug();\n return this.route(near && near !== 1 ? 'discussion.near' : 'discussion', {\n id: discussion.id() + (slug.trim() ? '-' + slug : ''),\n near: near && near !== 1 ? near : undefined\n });\n };\n\n /**\n * Generate a URL to a post.\n */\n this.route.post = (post: Post): string => {\n return this.route.discussion(post.discussion(), post.number());\n };\n\n /**\n * Generate a URL to a user.\n */\n this.route.user = (user: User): string => {\n return this.route('user', {\n username: user.username()\n });\n };\n }\n}\n","import * as extend from './extend';\n\nimport Modal from './components/Modal';\n\nexport default {\n extend: extend,\n \n 'components/Modal': Modal\n};\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 Forum from './Forum';\r\n\r\nconst app = new Forum();\r\n\r\n// @ts-ignore\r\nwindow.app = app;\r\n\r\napp.bus.subscribe('app.plugins', () => {\r\n // @ts-ignore\r\n const extensions = flarum.extensions;\r\n\r\n Object.keys(extensions).forEach(name => {\r\n const extension = extensions[name];\r\n\r\n // if (typeof extension === 'function') extension();\r\n });\r\n});\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","/*\r\n * This file is part of Flarum.\r\n *\r\n * (c) Toby Zerner <toby.zerner@gmail.com>\r\n *\r\n * For the full copyright and license information, please view the LICENSE\r\n * file that was distributed with this source code.\r\n */\r\n\r\nexport * from './src/common';\r\nexport * from './src/forum';"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack://@flarum/core/webpack/bootstrap","webpack://@flarum/core/./node_modules/@babel/runtime/helpers/esm/extends.js","webpack://@flarum/core/./src/common/Component.ts","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/./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/lodash/isArray.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/utils/patchMithril.ts","webpack://@flarum/core/./src/common/index.ts","webpack://@flarum/core/../../src/utils/debounce.js","webpack://@flarum/core/../../src/utils/isBrowser.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/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/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/includeScroll.js","webpack://@flarum/core/../../src/utils/getFixedPositionOffsetParent.js","webpack://@flarum/core/../../src/utils/getBoundaries.js","webpack://@flarum/core/../../src/utils/getViewportOffsetRectRelativeToArtbitraryNode.js","webpack://@flarum/core/../../src/utils/isFixed.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/lodash/_baseGetTag.js","webpack://@flarum/core/./node_modules/lodash/_root.js","webpack://@flarum/core/./node_modules/lodash/isObjectLike.js","webpack://@flarum/core/./node_modules/lodash/_nativeCreate.js","webpack://@flarum/core/./node_modules/lodash/_assocIndexOf.js","webpack://@flarum/core/./node_modules/lodash/_getMapData.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/isObject.js","webpack://@flarum/core/./node_modules/lodash/isSymbol.js","webpack://@flarum/core/./node_modules/lodash/_getNative.js","webpack://@flarum/core/./node_modules/lodash/_freeGlobal.js","webpack://@flarum/core/(webpack)/buildin/module.js","webpack://@flarum/core/./node_modules/lodash/_isIndex.js","webpack://@flarum/core/./node_modules/lodash/isLength.js","webpack://@flarum/core/./node_modules/lodash/isArrayLike.js","webpack://@flarum/core/./node_modules/lodash/isFunction.js","webpack://@flarum/core/./node_modules/lodash/_castPath.js","webpack://@flarum/core/./node_modules/lodash/eq.js","webpack://@flarum/core/./node_modules/lodash/_toKey.js","webpack://@flarum/core/./node_modules/lodash/forEach.js","webpack://@flarum/core/./node_modules/lodash/get.js","webpack://@flarum/core/./node_modules/lodash/set.js","webpack://@flarum/core/./node_modules/lodash/_arrayEach.js","webpack://@flarum/core/./node_modules/lodash/_baseEach.js","webpack://@flarum/core/./node_modules/lodash/_baseForOwn.js","webpack://@flarum/core/./node_modules/lodash/_baseFor.js","webpack://@flarum/core/./node_modules/lodash/_createBaseFor.js","webpack://@flarum/core/./node_modules/lodash/keys.js","webpack://@flarum/core/./node_modules/lodash/_arrayLikeKeys.js","webpack://@flarum/core/./node_modules/lodash/_baseTimes.js","webpack://@flarum/core/./node_modules/lodash/isArguments.js","webpack://@flarum/core/./node_modules/lodash/_baseIsArguments.js","webpack://@flarum/core/./node_modules/lodash/_getRawTag.js","webpack://@flarum/core/./node_modules/lodash/_objectToString.js","webpack://@flarum/core/./node_modules/lodash/isBuffer.js","webpack://@flarum/core/./node_modules/lodash/stubFalse.js","webpack://@flarum/core/./node_modules/lodash/isTypedArray.js","webpack://@flarum/core/./node_modules/lodash/_baseIsTypedArray.js","webpack://@flarum/core/./node_modules/lodash/_baseUnary.js","webpack://@flarum/core/./node_modules/lodash/_nodeUtil.js","webpack://@flarum/core/./node_modules/lodash/_baseKeys.js","webpack://@flarum/core/./node_modules/lodash/_isPrototype.js","webpack://@flarum/core/./node_modules/lodash/_nativeKeys.js","webpack://@flarum/core/./node_modules/lodash/_overArg.js","webpack://@flarum/core/./node_modules/lodash/_createBaseEach.js","webpack://@flarum/core/./node_modules/lodash/_castFunction.js","webpack://@flarum/core/./node_modules/lodash/identity.js","webpack://@flarum/core/./node_modules/lodash/_baseGet.js","webpack://@flarum/core/./node_modules/lodash/_isKey.js","webpack://@flarum/core/./node_modules/lodash/_stringToPath.js","webpack://@flarum/core/./node_modules/lodash/_memoizeCapped.js","webpack://@flarum/core/./node_modules/lodash/memoize.js","webpack://@flarum/core/./node_modules/lodash/_MapCache.js","webpack://@flarum/core/./node_modules/lodash/_mapCacheClear.js","webpack://@flarum/core/./node_modules/lodash/_Hash.js","webpack://@flarum/core/./node_modules/lodash/_hashClear.js","webpack://@flarum/core/./node_modules/lodash/_baseIsNative.js","webpack://@flarum/core/./node_modules/lodash/_isMasked.js","webpack://@flarum/core/./node_modules/lodash/_coreJsData.js","webpack://@flarum/core/./node_modules/lodash/_toSource.js","webpack://@flarum/core/./node_modules/lodash/_getValue.js","webpack://@flarum/core/./node_modules/lodash/_hashDelete.js","webpack://@flarum/core/./node_modules/lodash/_hashGet.js","webpack://@flarum/core/./node_modules/lodash/_hashHas.js","webpack://@flarum/core/./node_modules/lodash/_hashSet.js","webpack://@flarum/core/./node_modules/lodash/_ListCache.js","webpack://@flarum/core/./node_modules/lodash/_listCacheClear.js","webpack://@flarum/core/./node_modules/lodash/_listCacheDelete.js","webpack://@flarum/core/./node_modules/lodash/_listCacheGet.js","webpack://@flarum/core/./node_modules/lodash/_listCacheHas.js","webpack://@flarum/core/./node_modules/lodash/_listCacheSet.js","webpack://@flarum/core/./node_modules/lodash/_Map.js","webpack://@flarum/core/./node_modules/lodash/_mapCacheDelete.js","webpack://@flarum/core/./node_modules/lodash/_isKeyable.js","webpack://@flarum/core/./node_modules/lodash/_mapCacheGet.js","webpack://@flarum/core/./node_modules/lodash/_mapCacheHas.js","webpack://@flarum/core/./node_modules/lodash/_mapCacheSet.js","webpack://@flarum/core/./node_modules/lodash/toString.js","webpack://@flarum/core/./node_modules/lodash/_baseToString.js","webpack://@flarum/core/./node_modules/lodash/_arrayMap.js","webpack://@flarum/core/./node_modules/lodash/_baseSet.js","webpack://@flarum/core/./node_modules/lodash/_assignValue.js","webpack://@flarum/core/./node_modules/lodash/_baseAssignValue.js","webpack://@flarum/core/./node_modules/lodash/_defineProperty.js","webpack://@flarum/core/./node_modules/@babel/runtime/helpers/esm/inheritsLoose.js","webpack://@flarum/core/./src/common/Bus.ts","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/Drawer.ts","webpack://@flarum/core/./src/common/utils/RequestError.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/utils/ItemList.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/./node_modules/micromodal/dist/micromodal.es.js","webpack://@flarum/core/./src/common/components/Alert.tsx","webpack://@flarum/core/./src/common/components/Modal.tsx","webpack://@flarum/core/./src/common/components/ModalManager.tsx","webpack://@flarum/core/./src/common/components/RequestErrorModal.tsx","webpack://@flarum/core/./src/common/Application.ts","webpack://@flarum/core/./src/common/utils/mapRoutes.ts","webpack://@flarum/core/./src/forum/utils/History.ts","webpack://@flarum/core/./src/forum/components/HeaderPrimary.tsx","webpack://@flarum/core/./src/forum/components/LogInButtons.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/common/components/LinkButton.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/components/IndexPage.tsx","webpack://@flarum/core/./src/forum/components/Page.tsx","webpack://@flarum/core/./src/forum/utils/affixSidebar.ts","webpack://@flarum/core/./src/common/utils/humanTime.ts","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/forum/components/UserPage.tsx","webpack://@flarum/core/./src/common/components/Placeholder.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/forum/components/PostUser.tsx","webpack://@flarum/core/./src/common/helpers/userOnline.tsx","webpack://@flarum/core/./src/forum/components/CommentPost.tsx","webpack://@flarum/core/./src/forum/components/PostsUserPage.tsx","webpack://@flarum/core/./src/forum/Forum.ts","webpack://@flarum/core/./src/common/compat.ts","webpack://@flarum/core/./src/forum/compat.ts","webpack://@flarum/core/./src/forum/index.ts","webpack://@flarum/core/./forum.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","_extends","assign","target","arguments","length","source","apply","this","Component","element","props","view","vnode","Error","oninit","setProps","attrs","oncreate","dom","onbeforeupdate","onupdate","onbeforeremove","onremove","$","selector","$element","find","component","children","componentProps","initProps","constructor","g","Function","e","window","Vnode","tag","text","domSize","undefined","state","events","instance","normalize","node","Array","isArray","normalizeChildren","String","input","isKeyed","TypeError","render","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","hyperscriptVnode","selectorParser","selectorCache","hasOwn","isEmpty","hasClass","className","class","newAttrs","execSelector","match","classes","exec","type","id","push","attrValue","join","compileSelector","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","args","destructure","keys","forEach","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","top","getBoundingClientRect","loop","timeCurrent","scrollTo","setAttribute","focus","done","options","scrollY","pageYOffset","document","querySelector","jumper","DEFAULT_OPTIONS","Tooltip","reference","title","allowHtml","tooltipGenerator","tooltipNode","Math","titleNode","functionToCheck","getType","titleText","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","animatedScrollTop","to","fx","speeds","_default","jump","extend","special","bindBeforeSpecialEvents","eventName","el","specialEvent","_init","originalHandler","$target","trigger","setup","mo","_m","dayjs","relativeTime","localizedFormat","comp","writable","concat","bidi","route","href","Link","withAttr","cb","getAttribute","prop","longerTimeoutBrowsers","timeoutDuration","isBrowser","navigator","called","scheduled","isFunction","getStyleComputedProperty","getParentNode","getScrollParent","overflow","overflowX","overflowY","isIE11","isIE10","isIE","version","getOffsetParent","noOffsetParent","offsetParent","nodeName","getRoot","findCommonOffsetParent","element1","element2","order","Node","end","range","commonAncestorContainer","element1root","getScroll","upperSide","html","getBordersSize","styles","axis","sideA","sideB","parseFloat","getSize","body","computedStyle","getWindowSizes","getComputedStyle","getClientRect","offsets","rect","scrollTop","scrollLeft","sizes","horizScrollbar","vertScrollbar","getOffsetRectRelativeToArbitraryNode","parent","fixedPosition","runIsIE","isHTML","childrenRect","parentRect","scrollParent","borderTopWidth","borderLeftWidth","marginTop","marginLeft","subtract","modifier","includeScroll","getFixedPositionOffsetParent","getBoundaries","boundaries","left","excludeScroll","relativeOffset","getViewportOffsetRectRelativeToArtbitraryNode","boundariesNode","isFixed","parentNode","isPaddingNumber","padding","computeAutoPlacement","rects","refRect","bottom","sortedAreas","getArea","a","filteredAreas","filter","computedPlacement","variation","getReferenceOffsets","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","getRawTag","objectToString","nullTag","undefinedTag","symToStringTag","freeGlobal","freeSelf","root","nativeCreate","getNative","eq","array","isKeyable","__data__","define","Zepto","classList","camelize","uniq","emptyArray","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","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","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","jsonType","htmlType","blankRE","originAnchor","triggerGlobal","settings","triggerAndReturn","ajaxBeforeSend","xhr","beforeSend","ajaxSuccess","deferred","success","resolveWith","ajaxComplete","ajaxError","rejectWith","status","complete","ajaxStop","appendQuery","parseArguments","dataType","location","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","ms","Q","weekdays","months","pl","date","D","locale","$L","$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","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","animate","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__","backdrop","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","merge","streams","scan","acc","origin","stream","combine","scanMerge","tuples","seed","tuple","changed","warnedHalt","dependentStreams","dependentFns","_changing","_state","_parents","_map","ignoreInitial","s1","s2","_unregisterChild","childIndex","mappers","endStream","mapper","baseGetTag","isObjectLike","symbolTag","baseIsNative","getValue","deprecate","paths","MAX_SAFE_INTEGER","reIsUint","isLength","asyncTag","funcTag","genTag","proxyTag","isKey","stringToPath","other","isSymbol","INFINITY","arrayEach","baseEach","castFunction","iteratee","baseGet","defaultValue","baseSet","baseForOwn","createBaseEach","baseFor","createBaseFor","fromRight","keysFunc","iterable","arrayLikeKeys","baseKeys","isArrayLike","baseTimes","isArguments","isBuffer","isIndex","isTypedArray","inherited","isArr","isArg","isBuff","isType","skipIndexes","baseIsArguments","objectProto","propertyIsEnumerable","argsTag","nativeObjectToString","isOwn","unmasked","stubFalse","freeExports","freeModule","Buffer","baseIsTypedArray","baseUnary","nodeUtil","nodeIsTypedArray","typedArrayTags","freeProcess","types","isPrototype","nativeKeys","Ctor","overArg","eachFunc","identity","castPath","toKey","reIsDeepProp","reIsPlainProp","memoizeCapped","rePropName","reEscapeChar","charCodeAt","number","quote","subString","memoize","MAX_MEMOIZE_SIZE","clear","MapCache","FUNC_ERROR_TEXT","resolver","memoized","Cache","mapCacheClear","mapCacheDelete","mapCacheGet","mapCacheHas","mapCacheSet","Hash","ListCache","Map","hashClear","hashDelete","hashGet","hashHas","hashSet","isMasked","toSource","reIsHostCtor","funcProto","funcToString","reIsNative","uid","coreJsData","maskSrcKey","IE_PROTO","HASH_UNDEFINED","listCacheClear","listCacheDelete","listCacheGet","listCacheHas","listCacheSet","assocIndexOf","getMapData","baseToString","arrayMap","symbolProto","symbolToString","assignValue","customizer","lastIndex","nested","newValue","objValue","baseAssignValue","_inheritsLoose","subClass","superClass","Bus","subscribers","subscribe","callable","dispatch","listener","extractText","vdom","displayName","app","translator","trans","Translator","translations","addTranslations","parameters","translation","transText","hydrated","part","Session","csrfToken","login","forum","logout","Store","models","pushPayload","included","pushObject","pushData","createRecord","exists","getById","getBy","model","records","override","newMethod","Drawer","$backdrop","isOpen","appendTo","RequestError","alert","Model","freshness","innerKey","getIdentifier","pushAttributes","save","relationships","oldData","copyData","meta","apiEndpoint","delete","hasOne","relationship","hasMany","transformDate","Forum","computed","dependentKeys","compute","computedValue","dependentValues","recompute","priority","ItemList","items","itemName","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","rgb","hsvToRgb","GroupBadge","group","backgroundColor","color","nameSingular","User","email","isEmailConfirmed","avatarUrl","preferences","groups","joinTime","lastSeenAt","unreadNotificationCount","newNotificationCount","discussionCount","canEdit","avatarColor","calculateAvatarColor","isOnline","image","Image","onload","colorThief","ColorThief","getColor","crossOrigin","savePreferences","newPreferences","getPlainContent","removeSelectors","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","FOCUSABLE_ELEMENTS","Modal","activeModal","validateModalPresence","validateArgs","Alert","controls","dismissible","ondismiss","dismissControl","MicroModal","targetModal","triggers","onShow","onClose","openTrigger","closeTrigger","disableScroll","disableFocus","awaitCloseAnimation","awaitOpenAnimation","debugMode","modal","registerTriggers","onClick","onKeydown","showModal","scrollBehaviour","addEventListeners","setFocusToFirstNode","closeModal","closeModalById","hasAttribute","maintainFocus","getFocusableNodes","focusableNodes","focusedItemIndex","warn","triggerMap","validateTriggerPresence","triggerAttr","generateTriggerMap","isDismissible","onsubmit","onready","select","onhide","loaded","errors","pointer","ModalManager","showing","hideTimeout","RequestErrorModal","Application","bus","forums","users","discussions","notifications","drawer","titleCount","requestError","basePath","routeName","mapRoutes","boot","resources","userId","plugins","setupRoutes","preloadedApiDocument","apiDocument","results","setTitle","updateTitle","setTitleCount","queryString","originalOptions","errorHandler","res","detail","isDebug","showDebug","History","stack","getCurrent","getPrevious","secondTop","canGoBack","back","home","backUrl","HeaderPrimary","LogInButtons","LogInModal","identification","remember","footer","fields","placeholder","forgotPassword","signUp","ForgotPasswordModal","reload","avatar","hasTitle","buttonClassName","menuClassName","caretIcon","getButton","getMenu","onshow","$menu","isRight","data-toggle","LinkButton","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","substring","truncate","SearchSource","DiscussionsSearchSource","limit","include","data-index","UsersSearchSource","lastIndexOf","localeCompare","Search","hasFocus","sources","loadingSources","searched","searchTimeout","currentSearch","getCurrentSearch","sourceItems","focused","onfocus","onblur","setIndex","getCurrentNumericIndex","selectableItems","$input","selectResult","current","searching","getItem","clearSearch","$item","scrollToItem","$dropdown","fixedIndex","dropdownScroll","dropdownTop","dropdownBottom","outerHeight","itemTop","itemBottom","HeaderSecondary","locales","cookie","SignUpModal","IndexPage","Page","bodyClass","previous","affixSidebar","$sidebar","$header","$affixElement","humanTime","time","section","userControls","moderationControls","editAction","destructiveControls","deleteAction","confirm","showDeletionAlert","UserPage","alerts","EditUserModal","AvatarEditor","isDraggedOver","quickUpload","ondragover","enableDragover","ondragenter","ondragleave","disableDragover","ondragend","ondrop","dropUpload","controlItems","openPicker","upload","dataTransfer","files","file","raw","failure","UserCard","UserControls","controlsButtonClassName","editable","infoItems","online","ago","sidebarItems","lassName","loadUser","lowercaseUsername","navItems","Placeholder","restoreAction","hideAction","EditPostComposer","composer","discussionList","removeDiscussion","viewingDiscussion","SubtreeRetainer","controlsOpen","subtree","PostControls","actionItems","footerItems","$actions","$controls","existing","PostUser","cardVisible","card","userOnline","showCard","hideCard","CommentPost","revealContent","postUser","isEditing","headerItems","configPreview","editing","isInitialized","preview","updatePreview","s9e","TextFormatter","updateInterval","onunload","toggleContent","PostEdited","PostsUserPage","loadLimit","loadResults","defaultAction","near","compat","extensions","flarum"],"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 = 144);\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}","import Mithril from 'mithril';\n\nexport type ComponentProps = {\n children?: Mithril.Children;\n\n className?: string;\n\n [key: string]: any;\n};\n\nexport default class Component<T extends ComponentProps = any> {\n element: HTMLElement;\n\n props = <T>{};\n\n view(vnode) {\n throw new Error('Component#view must be implemented by subclass');\n }\n\n oninit(vnode) {\n this.setProps(vnode.attrs);\n }\n\n oncreate(vnode) {\n this.setProps(vnode.attrs);\n this.element = vnode.dom;\n }\n\n onbeforeupdate(vnode) {\n this.setProps(vnode.attrs);\n }\n\n onupdate(vnode) {\n this.setProps(vnode.attrs);\n }\n\n onbeforeremove(vnode) {\n this.setProps(vnode.attrs);\n }\n\n onremove(vnode) {\n this.setProps(vnode.attrs);\n }\n\n /**\n * Returns a jQuery object for this component's element. If you pass in a\n * selector string, this method will return a jQuery object, using the current\n * element as its buffer.\n *\n * For example, calling `component.$('li')` will return a jQuery object\n * containing all of the `li` elements inside the DOM element of this\n * component.\n *\n * @param selector a jQuery-compatible selector string\n * @final\n */\n $(selector?: string): ZeptoCollection {\n const $element = $(this.element);\n\n return selector ? $element.find(selector) : $element;\n }\n\n static component(props: ComponentProps | any = {}, children?: Mithril.Children) {\n const componentProps: ComponentProps = Object.assign({}, props);\n\n if (children) componentProps.children = children;\n\n return m(this, componentProps);\n }\n\n static initProps(props: ComponentProps = {}) {}\n\n private setProps(props: T) {\n (this.constructor as typeof Component).initProps(props);\n\n this.props = props;\n }\n}\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","\"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","/**\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","// 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';\nimport Tooltip from 'tooltip.js';\n\n// add $.fn.tooltip\n$.fn.tooltip = function(option) {\n return this.each(function() {\n const $this = $(this);\n let data = $this.data('bs.tooltip');\n const options = (typeof option === 'object' && option) || {};\n\n if ($this.attr('title')) {\n options.title = $this.attr('title');\n $this.removeAttr('title');\n $this.attr('data-original-title', options.title);\n }\n\n if (option === 'destroy') option = 'dispose';\n\n if (!data && ['dispose', 'hide'].includes(option)) return;\n\n if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options)));\n if (typeof option === 'string' && data[option]) data[option]();\n });\n};\n\n// add $.fn.outerWidth and $.fn.outerHeight\n['width', 'height'].forEach(function(dimension) {\n const Dimension = dimension.replace(/./, function(m) {\n return m[0].toUpperCase();\n });\n\n $.fn[`outer${Dimension}`] = function(margin) {\n const elem = this;\n\n if (elem) {\n const sides = { width: ['left', 'right'], height: ['top', 'bottom'] };\n let size = elem[dimension]();\n\n sides[dimension].forEach(function(side) {\n if (margin) size += parseInt(elem.css('margin-' + side), 10);\n });\n\n return size;\n } else {\n return null;\n }\n };\n});\n\n// allow use of $(':input')\n// @ts-ignore\n$.expr[':']['input'] = function() {\n if ('disabled' in this || ['INPUT', 'SELECT', 'TEXTAREA', 'BUTTON'].includes(this.tagName)) return this;\n};\n\n// add $().hover() method\n$.fn.hover = function(hover, leave) {\n return this.on('mouseenter', hover).on('mouseleave', leave || hover);\n};\n\n// add animated scroll\n$.fn.animatedScrollTop = function(to, duration = $.fx.speeds._default, callback) {\n if (typeof to === 'number') to -= window.scrollY || window.pageYOffset;\n\n jump(to, {\n duration: $.fx.speeds[duration] || duration,\n callback,\n });\n\n return this;\n};\n\n// required for compatibility with jquery plugins\n// ex: bootstrap plugins\n$.fn.extend = $.extend.bind($);\n\n/**\n * Enable special events on Zepto\n * @license Original Copyright 2013 Enideo. Released under dual MIT and GPL licenses.\n */\n// @ts-ignore\n$.event.special = $.event.special || {};\n\nconst bindBeforeSpecialEvents = $.fn.bind;\n\n$.fn.bind = function(eventName, data, callback) {\n const el = this;\n\n if (!callback) {\n callback = data;\n data = null;\n }\n\n $.each(eventName.split(/\\s/), (key: string, value: any): boolean => {\n value = value.split(/\\./)[0];\n\n if (value in $.event.special) {\n let specialEvent = $.event.special[value];\n\n /// init enable special events on Zepto\n if (!specialEvent._init) {\n specialEvent._init = true;\n\n /// intercept and replace the special event handler to add functionality\n specialEvent.originalHandler = specialEvent.handler;\n specialEvent.handler = function() {\n /// make event argument writable, like on jQuery\n const args = Array.prototype.slice.call(arguments);\n\n args[0] = $.extend({}, args[0]);\n\n /// define the event handle, $.event.dispatch is only for newer versions of jQuery\n $.event.handle = function() {\n /// make context of trigger the event element\n const args = Array.prototype.slice.call(arguments);\n const event = args[0];\n const $target = $(event.target);\n\n $target.trigger.apply($target, arguments);\n };\n\n specialEvent.originalHandler.apply(this, args);\n };\n }\n\n /// setup special events on Zepto\n specialEvent.setup.apply(el, [data]);\n }\n\n return true;\n });\n\n return bindBeforeSpecialEvents.apply(this, [eventName, callback]);\n};\n","import m from 'mithril';\nimport prop from 'mithril/stream';\n\nimport Component from '../Component';\n\nexport default () => {\n const mo = window['m'];\n\n const _m = function(comp, ...args) {\n if (!arguments[1]) arguments[1] = {};\n\n if (comp.prototype && comp.prototype instanceof Component) {\n let children = args.slice(1);\n if (children.length === 1 && Array.isArray(children[0])) {\n children = children[0];\n }\n\n if (children) {\n Object.defineProperty(arguments[1], 'children', {\n writable: true,\n });\n\n arguments[1].children = (arguments[1].children || []).concat(children);\n }\n }\n\n const node = mo.apply(this, arguments);\n\n if (!node.attrs) node.attrs = {};\n\n if (node.attrs.bidi) {\n m.bidi(node, node.attrs.bidi);\n }\n\n if (node.attrs.route) {\n node.attrs.href = node.attrs.route;\n node.attrs.tag = m.route.Link;\n\n delete node.attrs.route;\n }\n\n return node;\n };\n\n Object.keys(mo).forEach(key => (_m[key] = mo[key]));\n\n _m.withAttr = (key: string, cb: Function) =>\n function() {\n cb(this.getAttribute(key) || this[key]);\n };\n\n _m.prop = prop;\n\n window['m'] = _m;\n};\n","import 'expose-loader?jQuery!zepto';\nimport 'expose-loader?moment!expose-loader?dayjs!dayjs';\nimport 'expose-loader?m!mithril';\nimport 'expose-loader?m.bidi!m.attrs.bidi';\nimport 'expose-loader?Mousetrap!mousetrap';\nimport 'expose-loader?classNames!classNames';\n\nimport 'zepto/src/selector';\nimport 'zepto/src/data';\nimport 'zepto/src/fx';\nimport 'zepto/src/fx_methods';\n\nimport './utils/patchZepto';\n\nimport 'hc-sticky';\nimport 'bootstrap/js/dropdown';\nimport 'bootstrap/js/transition';\n\nimport relativeTime from 'dayjs/plugin/relativeTime';\nimport localizedFormat from 'dayjs/plugin/localizedFormat';\n\ndayjs.extend(relativeTime);\ndayjs.extend(localizedFormat);\n\nimport patchMithril from './utils/patchMithril';\n\npatchMithril();\n\n// import * as Extend from './extend/index';\n\n// export { Extend };\n","import isBrowser from './isBrowser';\n\nconst longerTimeoutBrowsers = ['Edge', 'Trident', 'Firefox'];\nlet timeoutDuration = 0;\nfor (let i = 0; i < longerTimeoutBrowsers.length; i += 1) {\n if (isBrowser && navigator.userAgent.indexOf(longerTimeoutBrowsers[i]) >= 0) {\n timeoutDuration = 1;\n break;\n }\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","export default typeof window !== 'undefined' && typeof document !== 'undefined';\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","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","/*\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`], 10) +\n parseFloat(styles[`border${sideB}Width`], 10)\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.right - result.left;\n const height =\n sizes.height || element.clientHeight || result.bottom - result.top;\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, 10);\n const borderLeftWidth = parseFloat(styles.borderLeftWidth, 10);\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, 10);\n const marginLeft = parseFloat(styles.marginLeft, 10);\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 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","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 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, 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 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 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';\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, 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 explicity 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}`], 10);\n const popperBorderSide = parseFloat(css[`border${sideCapitalized}Width`], 10);\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=n.$locale().relativeTime,a=[{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\"}],f=a.length,s=0;s<f;s+=1){var l=a[s];l.d&&(d=o?e(r).diff(n,l.d,!0):n.diff(r,l.d,!0));var h=Math.round(Math.abs(d));if(h<=l.r||!l.r){1===h&&s>0&&(l=a[s-1]),i=u[l.l].replace(\"%d\",h);break}}return t?i:(d>0?u.future:u.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","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 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","/**\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 getNative = require('./_getNative');\n\n/* Built-in method references that are verified to be native. */\nvar nativeCreate = getNative(Object, 'create');\n\nmodule.exports = nativeCreate;\n","var eq = require('./eq');\n\n/**\n * Gets the index at which the `key` is found in `array` of key-value pairs.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} key The key to search for.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction assocIndexOf(array, key) {\n var length = array.length;\n while (length--) {\n if (eq(array[length][0], key)) {\n return length;\n }\n }\n return -1;\n}\n\nmodule.exports = assocIndexOf;\n","var isKeyable = require('./_isKeyable');\n\n/**\n * Gets the data for `map`.\n *\n * @private\n * @param {Object} map The map to query.\n * @param {string} key The reference key.\n * @returns {*} Returns the map data.\n */\nfunction getMapData(map, key) {\n var data = map.__data__;\n return isKeyable(key)\n ? data[typeof key == 'string' ? 'string' : 'hash']\n : data.map;\n}\n\nmodule.exports = getMapData;\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\",a=\"quarter\",o=\"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:o,w:s,d:i,h:r,m:e,s:n,ms:t,Q:a}[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||(l=r),r},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})};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\",o)},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,a){var h=this,f=!!D.u(a)||a,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 o: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,a){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[o]=c+\"FullYear\",h[r]=c+\"Hours\",h[e]=c+\"Minutes\",h[n]=c+\"Seconds\",h[t]=c+\"Milliseconds\",h)[f],$=f===i?this.$D+(a-this.$W):a;if(f===u||f===o){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,a){var h,f=this;t=Number(t);var c=D.p(a),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===o)return this.set(o,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.valueOf()+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,a=this.$M,o=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:a+1,MM:D.s(a+1,2,\"0\"),MMM:c(i.monthsShort,a,h,3),MMMM:h[a]||h(this,e),D:this.$D,DD:D.s(this.$D,2,\"0\"),d:String(this.$W),dd:c(i.weekdaysMin,this.$W,o,2),ddd:c(i.weekdaysShort,this.$W,o,3),dddd:o[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[o]=y/12,c[u]=y,c[a]=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();return e.$L=M(t,n,!0),e},d.clone=function(){return D.w(this.toDate(),this)},d.toDate=function(){return new Date(this.$d)},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.3\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 the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\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 object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return value != null && (type == 'object' || type == 'function');\n}\n\nmodule.exports = isObject;\n","var baseGetTag = require('./_baseGetTag'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar symbolTag = '[object Symbol]';\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or 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 a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n return typeof value == 'symbol' ||\n (isObjectLike(value) && baseGetTag(value) == symbolTag);\n}\n\nmodule.exports = isSymbol;\n","var baseIsNative = require('./_baseIsNative'),\n getValue = require('./_getValue');\n\n/**\n * Gets the native function at `key` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the method to get.\n * @returns {*} Returns the function if it's native, else `undefined`.\n */\nfunction getNative(object, key) {\n var value = getValue(object, key);\n return baseIsNative(value) ? value : undefined;\n}\n\nmodule.exports = getNative;\n","/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\nmodule.exports = freeGlobal;\n","module.exports = function(module) {\n\tif (!module.webpackPolyfill) {\n\t\tmodule.deprecate = function() {};\n\t\tmodule.paths = [];\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\tmodule.webpackPolyfill = 1;\n\t}\n\treturn module;\n};\n","/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/** Used to detect unsigned integer values. */\nvar reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n/**\n * Checks if `value` is a valid array-like index.\n *\n * @private\n * @param {*} value The value to check.\n * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n */\nfunction isIndex(value, length) {\n var type = typeof value;\n length = length == null ? MAX_SAFE_INTEGER : length;\n\n return !!length &&\n (type == 'number' ||\n (type != 'symbol' && reIsUint.test(value))) &&\n (value > -1 && value % 1 == 0 && value < length);\n}\n\nmodule.exports = isIndex;\n","/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This method is loosely based on\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\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 a valid length, else `false`.\n * @example\n *\n * _.isLength(3);\n * // => true\n *\n * _.isLength(Number.MIN_VALUE);\n * // => false\n *\n * _.isLength(Infinity);\n * // => false\n *\n * _.isLength('3');\n * // => false\n */\nfunction isLength(value) {\n return typeof value == 'number' &&\n value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n}\n\nmodule.exports = isLength;\n","var isFunction = require('./isFunction'),\n isLength = require('./isLength');\n\n/**\n * Checks if `value` is array-like. A value is considered array-like if it's\n * not a function and has a `value.length` that's an integer greater than or\n * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\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 array-like, else `false`.\n * @example\n *\n * _.isArrayLike([1, 2, 3]);\n * // => true\n *\n * _.isArrayLike(document.body.children);\n * // => true\n *\n * _.isArrayLike('abc');\n * // => true\n *\n * _.isArrayLike(_.noop);\n * // => false\n */\nfunction isArrayLike(value) {\n return value != null && isLength(value.length) && !isFunction(value);\n}\n\nmodule.exports = isArrayLike;\n","var baseGetTag = require('./_baseGetTag'),\n isObject = require('./isObject');\n\n/** `Object#toString` result references. */\nvar asyncTag = '[object AsyncFunction]',\n funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]',\n proxyTag = '[object Proxy]';\n\n/**\n * Checks if `value` is classified as a `Function` 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 a function, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n if (!isObject(value)) {\n return false;\n }\n // The use of `Object#toString` avoids issues with the `typeof` operator\n // in Safari 9 which returns 'object' for typed arrays and other constructors.\n var tag = baseGetTag(value);\n return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;\n}\n\nmodule.exports = isFunction;\n","var isArray = require('./isArray'),\n isKey = require('./_isKey'),\n stringToPath = require('./_stringToPath'),\n toString = require('./toString');\n\n/**\n * Casts `value` to a path array if it's not one.\n *\n * @private\n * @param {*} value The value to inspect.\n * @param {Object} [object] The object to query keys on.\n * @returns {Array} Returns the cast property path array.\n */\nfunction castPath(value, object) {\n if (isArray(value)) {\n return value;\n }\n return isKey(value, object) ? [value] : stringToPath(toString(value));\n}\n\nmodule.exports = castPath;\n","/**\n * Performs a\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * comparison between two values to determine if they are equivalent.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.eq(object, object);\n * // => true\n *\n * _.eq(object, other);\n * // => false\n *\n * _.eq('a', 'a');\n * // => true\n *\n * _.eq('a', Object('a'));\n * // => false\n *\n * _.eq(NaN, NaN);\n * // => true\n */\nfunction eq(value, other) {\n return value === other || (value !== value && other !== other);\n}\n\nmodule.exports = eq;\n","var isSymbol = require('./isSymbol');\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/**\n * Converts `value` to a string key if it's not a string or symbol.\n *\n * @private\n * @param {*} value The value to inspect.\n * @returns {string|symbol} Returns the key.\n */\nfunction toKey(value) {\n if (typeof value == 'string' || isSymbol(value)) {\n return value;\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\nmodule.exports = toKey;\n","var arrayEach = require('./_arrayEach'),\n baseEach = require('./_baseEach'),\n castFunction = require('./_castFunction'),\n isArray = require('./isArray');\n\n/**\n * Iterates over elements of `collection` and invokes `iteratee` for each element.\n * The iteratee is invoked with three arguments: (value, index|key, collection).\n * Iteratee functions may exit iteration early by explicitly returning `false`.\n *\n * **Note:** As with other \"Collections\" methods, objects with a \"length\"\n * property are iterated like arrays. To avoid this behavior use `_.forIn`\n * or `_.forOwn` for object iteration.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @alias each\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Array|Object} Returns `collection`.\n * @see _.forEachRight\n * @example\n *\n * _.forEach([1, 2], function(value) {\n * console.log(value);\n * });\n * // => Logs `1` then `2`.\n *\n * _.forEach({ 'a': 1, 'b': 2 }, function(value, key) {\n * console.log(key);\n * });\n * // => Logs 'a' then 'b' (iteration order is not guaranteed).\n */\nfunction forEach(collection, iteratee) {\n var func = isArray(collection) ? arrayEach : baseEach;\n return func(collection, castFunction(iteratee));\n}\n\nmodule.exports = forEach;\n","var baseGet = require('./_baseGet');\n\n/**\n * Gets the value at `path` of `object`. If the resolved value is\n * `undefined`, the `defaultValue` is returned in its place.\n *\n * @static\n * @memberOf _\n * @since 3.7.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @param {*} [defaultValue] The value returned for `undefined` resolved values.\n * @returns {*} Returns the resolved value.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n *\n * _.get(object, 'a[0].b.c');\n * // => 3\n *\n * _.get(object, ['a', '0', 'b', 'c']);\n * // => 3\n *\n * _.get(object, 'a.b.c', 'default');\n * // => 'default'\n */\nfunction get(object, path, defaultValue) {\n var result = object == null ? undefined : baseGet(object, path);\n return result === undefined ? defaultValue : result;\n}\n\nmodule.exports = get;\n","var baseSet = require('./_baseSet');\n\n/**\n * Sets the value at `path` of `object`. If a portion of `path` doesn't exist,\n * it's created. Arrays are created for missing index properties while objects\n * are created for all other missing properties. Use `_.setWith` to customize\n * `path` creation.\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 3.7.0\n * @category Object\n * @param {Object} object The object to modify.\n * @param {Array|string} path The path of the property to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns `object`.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n *\n * _.set(object, 'a[0].b.c', 4);\n * console.log(object.a[0].b.c);\n * // => 4\n *\n * _.set(object, ['x', '0', 'y', 'z'], 5);\n * console.log(object.x[0].y.z);\n * // => 5\n */\nfunction set(object, path, value) {\n return object == null ? object : baseSet(object, path, value);\n}\n\nmodule.exports = set;\n","/**\n * A specialized version of `_.forEach` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns `array`.\n */\nfunction arrayEach(array, iteratee) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n if (iteratee(array[index], index, array) === false) {\n break;\n }\n }\n return array;\n}\n\nmodule.exports = arrayEach;\n","var baseForOwn = require('./_baseForOwn'),\n createBaseEach = require('./_createBaseEach');\n\n/**\n * The base implementation of `_.forEach` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array|Object} Returns `collection`.\n */\nvar baseEach = createBaseEach(baseForOwn);\n\nmodule.exports = baseEach;\n","var baseFor = require('./_baseFor'),\n keys = require('./keys');\n\n/**\n * The base implementation of `_.forOwn` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Object} Returns `object`.\n */\nfunction baseForOwn(object, iteratee) {\n return object && baseFor(object, iteratee, keys);\n}\n\nmodule.exports = baseForOwn;\n","var createBaseFor = require('./_createBaseFor');\n\n/**\n * The base implementation of `baseForOwn` which iterates over `object`\n * properties returned by `keysFunc` and invokes `iteratee` for each property.\n * Iteratee functions may exit iteration early by explicitly returning `false`.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @returns {Object} Returns `object`.\n */\nvar baseFor = createBaseFor();\n\nmodule.exports = baseFor;\n","/**\n * Creates a base function for methods like `_.forIn` and `_.forOwn`.\n *\n * @private\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new base function.\n */\nfunction createBaseFor(fromRight) {\n return function(object, iteratee, keysFunc) {\n var index = -1,\n iterable = Object(object),\n props = keysFunc(object),\n length = props.length;\n\n while (length--) {\n var key = props[fromRight ? length : ++index];\n if (iteratee(iterable[key], key, iterable) === false) {\n break;\n }\n }\n return object;\n };\n}\n\nmodule.exports = createBaseFor;\n","var arrayLikeKeys = require('./_arrayLikeKeys'),\n baseKeys = require('./_baseKeys'),\n isArrayLike = require('./isArrayLike');\n\n/**\n * Creates an array of the own enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects. See the\n * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n * for more details.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keys(new Foo);\n * // => ['a', 'b'] (iteration order is not guaranteed)\n *\n * _.keys('hi');\n * // => ['0', '1']\n */\nfunction keys(object) {\n return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);\n}\n\nmodule.exports = keys;\n","var baseTimes = require('./_baseTimes'),\n isArguments = require('./isArguments'),\n isArray = require('./isArray'),\n isBuffer = require('./isBuffer'),\n isIndex = require('./_isIndex'),\n isTypedArray = require('./isTypedArray');\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 * Creates an array of the enumerable property names of the array-like `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @param {boolean} inherited Specify returning inherited property names.\n * @returns {Array} Returns the array of property names.\n */\nfunction arrayLikeKeys(value, inherited) {\n var isArr = isArray(value),\n isArg = !isArr && isArguments(value),\n isBuff = !isArr && !isArg && isBuffer(value),\n isType = !isArr && !isArg && !isBuff && isTypedArray(value),\n skipIndexes = isArr || isArg || isBuff || isType,\n result = skipIndexes ? baseTimes(value.length, String) : [],\n length = result.length;\n\n for (var key in value) {\n if ((inherited || hasOwnProperty.call(value, key)) &&\n !(skipIndexes && (\n // Safari 9 has enumerable `arguments.length` in strict mode.\n key == 'length' ||\n // Node.js 0.10 has enumerable non-index properties on buffers.\n (isBuff && (key == 'offset' || key == 'parent')) ||\n // PhantomJS 2 has enumerable non-index properties on typed arrays.\n (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||\n // Skip index properties.\n isIndex(key, length)\n ))) {\n result.push(key);\n }\n }\n return result;\n}\n\nmodule.exports = arrayLikeKeys;\n","/**\n * The base implementation of `_.times` without support for iteratee shorthands\n * or max array length checks.\n *\n * @private\n * @param {number} n The number of times to invoke `iteratee`.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the array of results.\n */\nfunction baseTimes(n, iteratee) {\n var index = -1,\n result = Array(n);\n\n while (++index < n) {\n result[index] = iteratee(index);\n }\n return result;\n}\n\nmodule.exports = baseTimes;\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\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","var root = require('./_root'),\n stubFalse = require('./stubFalse');\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Built-in value references. */\nvar Buffer = moduleExports ? root.Buffer : undefined;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined;\n\n/**\n * Checks if `value` is a buffer.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.\n * @example\n *\n * _.isBuffer(new Buffer(2));\n * // => true\n *\n * _.isBuffer(new Uint8Array(2));\n * // => false\n */\nvar isBuffer = nativeIsBuffer || stubFalse;\n\nmodule.exports = isBuffer;\n","/**\n * This method returns `false`.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {boolean} Returns `false`.\n * @example\n *\n * _.times(2, _.stubFalse);\n * // => [false, false]\n */\nfunction stubFalse() {\n return false;\n}\n\nmodule.exports = stubFalse;\n","var baseIsTypedArray = require('./_baseIsTypedArray'),\n baseUnary = require('./_baseUnary'),\n nodeUtil = require('./_nodeUtil');\n\n/* Node.js helper references. */\nvar nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;\n\n/**\n * Checks if `value` is classified as a typed array.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n * @example\n *\n * _.isTypedArray(new Uint8Array);\n * // => true\n *\n * _.isTypedArray([]);\n * // => false\n */\nvar isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;\n\nmodule.exports = isTypedArray;\n","var baseGetTag = require('./_baseGetTag'),\n isLength = require('./isLength'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n arrayTag = '[object Array]',\n boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n errorTag = '[object Error]',\n funcTag = '[object Function]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n objectTag = '[object Object]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n weakMapTag = '[object WeakMap]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]',\n float32Tag = '[object Float32Array]',\n float64Tag = '[object Float64Array]',\n int8Tag = '[object Int8Array]',\n int16Tag = '[object Int16Array]',\n int32Tag = '[object Int32Array]',\n uint8Tag = '[object Uint8Array]',\n uint8ClampedTag = '[object Uint8ClampedArray]',\n uint16Tag = '[object Uint16Array]',\n uint32Tag = '[object Uint32Array]';\n\n/** Used to identify `toStringTag` values of typed arrays. */\nvar typedArrayTags = {};\ntypedArrayTags[float32Tag] = typedArrayTags[float64Tag] =\ntypedArrayTags[int8Tag] = typedArrayTags[int16Tag] =\ntypedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =\ntypedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =\ntypedArrayTags[uint32Tag] = true;\ntypedArrayTags[argsTag] = typedArrayTags[arrayTag] =\ntypedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =\ntypedArrayTags[dataViewTag] = typedArrayTags[dateTag] =\ntypedArrayTags[errorTag] = typedArrayTags[funcTag] =\ntypedArrayTags[mapTag] = typedArrayTags[numberTag] =\ntypedArrayTags[objectTag] = typedArrayTags[regexpTag] =\ntypedArrayTags[setTag] = typedArrayTags[stringTag] =\ntypedArrayTags[weakMapTag] = false;\n\n/**\n * The base implementation of `_.isTypedArray` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n */\nfunction baseIsTypedArray(value) {\n return isObjectLike(value) &&\n isLength(value.length) && !!typedArrayTags[baseGetTag(value)];\n}\n\nmodule.exports = baseIsTypedArray;\n","/**\n * The base implementation of `_.unary` without support for storing metadata.\n *\n * @private\n * @param {Function} func The function to cap arguments for.\n * @returns {Function} Returns the new capped function.\n */\nfunction baseUnary(func) {\n return function(value) {\n return func(value);\n };\n}\n\nmodule.exports = baseUnary;\n","var freeGlobal = require('./_freeGlobal');\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Detect free variable `process` from Node.js. */\nvar freeProcess = moduleExports && freeGlobal.process;\n\n/** Used to access faster Node.js helpers. */\nvar nodeUtil = (function() {\n try {\n // Use `util.types` for Node.js 10+.\n var types = freeModule && freeModule.require && freeModule.require('util').types;\n\n if (types) {\n return types;\n }\n\n // Legacy `process.binding('util')` for Node.js < 10.\n return freeProcess && freeProcess.binding && freeProcess.binding('util');\n } catch (e) {}\n}());\n\nmodule.exports = nodeUtil;\n","var isPrototype = require('./_isPrototype'),\n nativeKeys = require('./_nativeKeys');\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 * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction baseKeys(object) {\n if (!isPrototype(object)) {\n return nativeKeys(object);\n }\n var result = [];\n for (var key in Object(object)) {\n if (hasOwnProperty.call(object, key) && key != 'constructor') {\n result.push(key);\n }\n }\n return result;\n}\n\nmodule.exports = baseKeys;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Checks if `value` is likely a prototype object.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\n */\nfunction isPrototype(value) {\n var Ctor = value && value.constructor,\n proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;\n\n return value === proto;\n}\n\nmodule.exports = isPrototype;\n","var overArg = require('./_overArg');\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeKeys = overArg(Object.keys, Object);\n\nmodule.exports = nativeKeys;\n","/**\n * Creates a unary function that invokes `func` with its argument transformed.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {Function} transform The argument transform.\n * @returns {Function} Returns the new function.\n */\nfunction overArg(func, transform) {\n return function(arg) {\n return func(transform(arg));\n };\n}\n\nmodule.exports = overArg;\n","var isArrayLike = require('./isArrayLike');\n\n/**\n * Creates a `baseEach` or `baseEachRight` function.\n *\n * @private\n * @param {Function} eachFunc The function to iterate over a collection.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new base function.\n */\nfunction createBaseEach(eachFunc, fromRight) {\n return function(collection, iteratee) {\n if (collection == null) {\n return collection;\n }\n if (!isArrayLike(collection)) {\n return eachFunc(collection, iteratee);\n }\n var length = collection.length,\n index = fromRight ? length : -1,\n iterable = Object(collection);\n\n while ((fromRight ? index-- : ++index < length)) {\n if (iteratee(iterable[index], index, iterable) === false) {\n break;\n }\n }\n return collection;\n };\n}\n\nmodule.exports = createBaseEach;\n","var identity = require('./identity');\n\n/**\n * Casts `value` to `identity` if it's not a function.\n *\n * @private\n * @param {*} value The value to inspect.\n * @returns {Function} Returns cast function.\n */\nfunction castFunction(value) {\n return typeof value == 'function' ? value : identity;\n}\n\nmodule.exports = castFunction;\n","/**\n * This method returns the first argument it receives.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Util\n * @param {*} value Any value.\n * @returns {*} Returns `value`.\n * @example\n *\n * var object = { 'a': 1 };\n *\n * console.log(_.identity(object) === object);\n * // => true\n */\nfunction identity(value) {\n return value;\n}\n\nmodule.exports = identity;\n","var castPath = require('./_castPath'),\n toKey = require('./_toKey');\n\n/**\n * The base implementation of `_.get` without support for default values.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @returns {*} Returns the resolved value.\n */\nfunction baseGet(object, path) {\n path = castPath(path, object);\n\n var index = 0,\n length = path.length;\n\n while (object != null && index < length) {\n object = object[toKey(path[index++])];\n }\n return (index && index == length) ? object : undefined;\n}\n\nmodule.exports = baseGet;\n","var isArray = require('./isArray'),\n isSymbol = require('./isSymbol');\n\n/** Used to match property names within property paths. */\nvar reIsDeepProp = /\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/,\n reIsPlainProp = /^\\w*$/;\n\n/**\n * Checks if `value` is a property name and not a property path.\n *\n * @private\n * @param {*} value The value to check.\n * @param {Object} [object] The object to query keys on.\n * @returns {boolean} Returns `true` if `value` is a property name, else `false`.\n */\nfunction isKey(value, object) {\n if (isArray(value)) {\n return false;\n }\n var type = typeof value;\n if (type == 'number' || type == 'symbol' || type == 'boolean' ||\n value == null || isSymbol(value)) {\n return true;\n }\n return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||\n (object != null && value in Object(object));\n}\n\nmodule.exports = isKey;\n","var memoizeCapped = require('./_memoizeCapped');\n\n/** Used to match property names within property paths. */\nvar rePropName = /[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))/g;\n\n/** Used to match backslashes in property paths. */\nvar reEscapeChar = /\\\\(\\\\)?/g;\n\n/**\n * Converts `string` to a property path array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the property path array.\n */\nvar stringToPath = memoizeCapped(function(string) {\n var result = [];\n if (string.charCodeAt(0) === 46 /* . */) {\n result.push('');\n }\n string.replace(rePropName, function(match, number, quote, subString) {\n result.push(quote ? subString.replace(reEscapeChar, '$1') : (number || match));\n });\n return result;\n});\n\nmodule.exports = stringToPath;\n","var memoize = require('./memoize');\n\n/** Used as the maximum memoize cache size. */\nvar MAX_MEMOIZE_SIZE = 500;\n\n/**\n * A specialized version of `_.memoize` which clears the memoized function's\n * cache when it exceeds `MAX_MEMOIZE_SIZE`.\n *\n * @private\n * @param {Function} func The function to have its output memoized.\n * @returns {Function} Returns the new memoized function.\n */\nfunction memoizeCapped(func) {\n var result = memoize(func, function(key) {\n if (cache.size === MAX_MEMOIZE_SIZE) {\n cache.clear();\n }\n return key;\n });\n\n var cache = result.cache;\n return result;\n}\n\nmodule.exports = memoizeCapped;\n","var MapCache = require('./_MapCache');\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/**\n * Creates a function that memoizes the result of `func`. If `resolver` is\n * provided, it determines the cache key for storing the result based on the\n * arguments provided to the memoized function. By default, the first argument\n * provided to the memoized function is used as the map cache key. The `func`\n * is invoked with the `this` binding of the memoized function.\n *\n * **Note:** The cache is exposed as the `cache` property on the memoized\n * function. Its creation may be customized by replacing the `_.memoize.Cache`\n * constructor with one whose instances implement the\n * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)\n * method interface of `clear`, `delete`, `get`, `has`, and `set`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to have its output memoized.\n * @param {Function} [resolver] The function to resolve the cache key.\n * @returns {Function} Returns the new memoized function.\n * @example\n *\n * var object = { 'a': 1, 'b': 2 };\n * var other = { 'c': 3, 'd': 4 };\n *\n * var values = _.memoize(_.values);\n * values(object);\n * // => [1, 2]\n *\n * values(other);\n * // => [3, 4]\n *\n * object.a = 2;\n * values(object);\n * // => [1, 2]\n *\n * // Modify the result cache.\n * values.cache.set(object, ['a', 'b']);\n * values(object);\n * // => ['a', 'b']\n *\n * // Replace `_.memoize.Cache`.\n * _.memoize.Cache = WeakMap;\n */\nfunction memoize(func, resolver) {\n if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n var memoized = function() {\n var args = arguments,\n key = resolver ? resolver.apply(this, args) : args[0],\n cache = memoized.cache;\n\n if (cache.has(key)) {\n return cache.get(key);\n }\n var result = func.apply(this, args);\n memoized.cache = cache.set(key, result) || cache;\n return result;\n };\n memoized.cache = new (memoize.Cache || MapCache);\n return memoized;\n}\n\n// Expose `MapCache`.\nmemoize.Cache = MapCache;\n\nmodule.exports = memoize;\n","var mapCacheClear = require('./_mapCacheClear'),\n mapCacheDelete = require('./_mapCacheDelete'),\n mapCacheGet = require('./_mapCacheGet'),\n mapCacheHas = require('./_mapCacheHas'),\n mapCacheSet = require('./_mapCacheSet');\n\n/**\n * Creates a map cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction MapCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `MapCache`.\nMapCache.prototype.clear = mapCacheClear;\nMapCache.prototype['delete'] = mapCacheDelete;\nMapCache.prototype.get = mapCacheGet;\nMapCache.prototype.has = mapCacheHas;\nMapCache.prototype.set = mapCacheSet;\n\nmodule.exports = MapCache;\n","var Hash = require('./_Hash'),\n ListCache = require('./_ListCache'),\n Map = require('./_Map');\n\n/**\n * Removes all key-value entries from the map.\n *\n * @private\n * @name clear\n * @memberOf MapCache\n */\nfunction mapCacheClear() {\n this.size = 0;\n this.__data__ = {\n 'hash': new Hash,\n 'map': new (Map || ListCache),\n 'string': new Hash\n };\n}\n\nmodule.exports = mapCacheClear;\n","var hashClear = require('./_hashClear'),\n hashDelete = require('./_hashDelete'),\n hashGet = require('./_hashGet'),\n hashHas = require('./_hashHas'),\n hashSet = require('./_hashSet');\n\n/**\n * Creates a hash object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Hash(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `Hash`.\nHash.prototype.clear = hashClear;\nHash.prototype['delete'] = hashDelete;\nHash.prototype.get = hashGet;\nHash.prototype.has = hashHas;\nHash.prototype.set = hashSet;\n\nmodule.exports = Hash;\n","var nativeCreate = require('./_nativeCreate');\n\n/**\n * Removes all key-value entries from the hash.\n *\n * @private\n * @name clear\n * @memberOf Hash\n */\nfunction hashClear() {\n this.__data__ = nativeCreate ? nativeCreate(null) : {};\n this.size = 0;\n}\n\nmodule.exports = hashClear;\n","var isFunction = require('./isFunction'),\n isMasked = require('./_isMasked'),\n isObject = require('./isObject'),\n toSource = require('./_toSource');\n\n/**\n * Used to match `RegExp`\n * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n */\nvar reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g;\n\n/** Used to detect host constructors (Safari). */\nvar reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n/** Used for built-in method references. */\nvar funcProto = Function.prototype,\n objectProto = Object.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Used to detect if a method is native. */\nvar reIsNative = RegExp('^' +\n funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\$&')\n .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n);\n\n/**\n * The base implementation of `_.isNative` without bad shim checks.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a native function,\n * else `false`.\n */\nfunction baseIsNative(value) {\n if (!isObject(value) || isMasked(value)) {\n return false;\n }\n var pattern = isFunction(value) ? reIsNative : reIsHostCtor;\n return pattern.test(toSource(value));\n}\n\nmodule.exports = baseIsNative;\n","var coreJsData = require('./_coreJsData');\n\n/** Used to detect methods masquerading as native. */\nvar maskSrcKey = (function() {\n var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n return uid ? ('Symbol(src)_1.' + uid) : '';\n}());\n\n/**\n * Checks if `func` has its source masked.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n */\nfunction isMasked(func) {\n return !!maskSrcKey && (maskSrcKey in func);\n}\n\nmodule.exports = isMasked;\n","var root = require('./_root');\n\n/** Used to detect overreaching core-js shims. */\nvar coreJsData = root['__core-js_shared__'];\n\nmodule.exports = coreJsData;\n","/** Used for built-in method references. */\nvar funcProto = Function.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/**\n * Converts `func` to its source code.\n *\n * @private\n * @param {Function} func The function to convert.\n * @returns {string} Returns the source code.\n */\nfunction toSource(func) {\n if (func != null) {\n try {\n return funcToString.call(func);\n } catch (e) {}\n try {\n return (func + '');\n } catch (e) {}\n }\n return '';\n}\n\nmodule.exports = toSource;\n","/**\n * Gets the value at `key` of `object`.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\nfunction getValue(object, key) {\n return object == null ? undefined : object[key];\n}\n\nmodule.exports = getValue;\n","/**\n * Removes `key` and its value from the hash.\n *\n * @private\n * @name delete\n * @memberOf Hash\n * @param {Object} hash The hash to modify.\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction hashDelete(key) {\n var result = this.has(key) && delete this.__data__[key];\n this.size -= result ? 1 : 0;\n return result;\n}\n\nmodule.exports = hashDelete;\n","var nativeCreate = require('./_nativeCreate');\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\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 * Gets the hash value for `key`.\n *\n * @private\n * @name get\n * @memberOf Hash\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction hashGet(key) {\n var data = this.__data__;\n if (nativeCreate) {\n var result = data[key];\n return result === HASH_UNDEFINED ? undefined : result;\n }\n return hasOwnProperty.call(data, key) ? data[key] : undefined;\n}\n\nmodule.exports = hashGet;\n","var nativeCreate = require('./_nativeCreate');\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 * Checks if a hash value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Hash\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction hashHas(key) {\n var data = this.__data__;\n return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);\n}\n\nmodule.exports = hashHas;\n","var nativeCreate = require('./_nativeCreate');\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/**\n * Sets the hash `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Hash\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the hash instance.\n */\nfunction hashSet(key, value) {\n var data = this.__data__;\n this.size += this.has(key) ? 0 : 1;\n data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;\n return this;\n}\n\nmodule.exports = hashSet;\n","var listCacheClear = require('./_listCacheClear'),\n listCacheDelete = require('./_listCacheDelete'),\n listCacheGet = require('./_listCacheGet'),\n listCacheHas = require('./_listCacheHas'),\n listCacheSet = require('./_listCacheSet');\n\n/**\n * Creates an list cache object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction ListCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `ListCache`.\nListCache.prototype.clear = listCacheClear;\nListCache.prototype['delete'] = listCacheDelete;\nListCache.prototype.get = listCacheGet;\nListCache.prototype.has = listCacheHas;\nListCache.prototype.set = listCacheSet;\n\nmodule.exports = ListCache;\n","/**\n * Removes all key-value entries from the list cache.\n *\n * @private\n * @name clear\n * @memberOf ListCache\n */\nfunction listCacheClear() {\n this.__data__ = [];\n this.size = 0;\n}\n\nmodule.exports = listCacheClear;\n","var assocIndexOf = require('./_assocIndexOf');\n\n/** Used for built-in method references. */\nvar arrayProto = Array.prototype;\n\n/** Built-in value references. */\nvar splice = arrayProto.splice;\n\n/**\n * Removes `key` and its value from the list cache.\n *\n * @private\n * @name delete\n * @memberOf ListCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction listCacheDelete(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n return false;\n }\n var lastIndex = data.length - 1;\n if (index == lastIndex) {\n data.pop();\n } else {\n splice.call(data, index, 1);\n }\n --this.size;\n return true;\n}\n\nmodule.exports = listCacheDelete;\n","var assocIndexOf = require('./_assocIndexOf');\n\n/**\n * Gets the list cache value for `key`.\n *\n * @private\n * @name get\n * @memberOf ListCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction listCacheGet(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n return index < 0 ? undefined : data[index][1];\n}\n\nmodule.exports = listCacheGet;\n","var assocIndexOf = require('./_assocIndexOf');\n\n/**\n * Checks if a list cache value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf ListCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction listCacheHas(key) {\n return assocIndexOf(this.__data__, key) > -1;\n}\n\nmodule.exports = listCacheHas;\n","var assocIndexOf = require('./_assocIndexOf');\n\n/**\n * Sets the list cache `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf ListCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the list cache instance.\n */\nfunction listCacheSet(key, value) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n ++this.size;\n data.push([key, value]);\n } else {\n data[index][1] = value;\n }\n return this;\n}\n\nmodule.exports = listCacheSet;\n","var getNative = require('./_getNative'),\n root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar Map = getNative(root, 'Map');\n\nmodule.exports = Map;\n","var getMapData = require('./_getMapData');\n\n/**\n * Removes `key` and its value from the map.\n *\n * @private\n * @name delete\n * @memberOf MapCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction mapCacheDelete(key) {\n var result = getMapData(this, key)['delete'](key);\n this.size -= result ? 1 : 0;\n return result;\n}\n\nmodule.exports = mapCacheDelete;\n","/**\n * Checks if `value` is suitable for use as unique object key.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\n */\nfunction isKeyable(value) {\n var type = typeof value;\n return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')\n ? (value !== '__proto__')\n : (value === null);\n}\n\nmodule.exports = isKeyable;\n","var getMapData = require('./_getMapData');\n\n/**\n * Gets the map value for `key`.\n *\n * @private\n * @name get\n * @memberOf MapCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction mapCacheGet(key) {\n return getMapData(this, key).get(key);\n}\n\nmodule.exports = mapCacheGet;\n","var getMapData = require('./_getMapData');\n\n/**\n * Checks if a map value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf MapCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction mapCacheHas(key) {\n return getMapData(this, key).has(key);\n}\n\nmodule.exports = mapCacheHas;\n","var getMapData = require('./_getMapData');\n\n/**\n * Sets the map `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf MapCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the map cache instance.\n */\nfunction mapCacheSet(key, value) {\n var data = getMapData(this, key),\n size = data.size;\n\n data.set(key, value);\n this.size += data.size == size ? 0 : 1;\n return this;\n}\n\nmodule.exports = mapCacheSet;\n","var baseToString = require('./_baseToString');\n\n/**\n * Converts `value` to a string. An empty string is returned for `null`\n * and `undefined` values. The sign of `-0` is preserved.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n * @example\n *\n * _.toString(null);\n * // => ''\n *\n * _.toString(-0);\n * // => '-0'\n *\n * _.toString([1, 2, 3]);\n * // => '1,2,3'\n */\nfunction toString(value) {\n return value == null ? '' : baseToString(value);\n}\n\nmodule.exports = toString;\n","var Symbol = require('./_Symbol'),\n arrayMap = require('./_arrayMap'),\n isArray = require('./isArray'),\n isSymbol = require('./isSymbol');\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n symbolToString = symbolProto ? symbolProto.toString : undefined;\n\n/**\n * The base implementation of `_.toString` which doesn't convert nullish\n * values to empty strings.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {string} Returns the string.\n */\nfunction baseToString(value) {\n // Exit early for strings to avoid a performance hit in some environments.\n if (typeof value == 'string') {\n return value;\n }\n if (isArray(value)) {\n // Recursively convert values (susceptible to call stack limits).\n return arrayMap(value, baseToString) + '';\n }\n if (isSymbol(value)) {\n return symbolToString ? symbolToString.call(value) : '';\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\nmodule.exports = baseToString;\n","/**\n * A specialized version of `_.map` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n */\nfunction arrayMap(array, iteratee) {\n var index = -1,\n length = array == null ? 0 : array.length,\n result = Array(length);\n\n while (++index < length) {\n result[index] = iteratee(array[index], index, array);\n }\n return result;\n}\n\nmodule.exports = arrayMap;\n","var assignValue = require('./_assignValue'),\n castPath = require('./_castPath'),\n isIndex = require('./_isIndex'),\n isObject = require('./isObject'),\n toKey = require('./_toKey');\n\n/**\n * The base implementation of `_.set`.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {Array|string} path The path of the property to set.\n * @param {*} value The value to set.\n * @param {Function} [customizer] The function to customize path creation.\n * @returns {Object} Returns `object`.\n */\nfunction baseSet(object, path, value, customizer) {\n if (!isObject(object)) {\n return object;\n }\n path = castPath(path, object);\n\n var index = -1,\n length = path.length,\n lastIndex = length - 1,\n nested = object;\n\n while (nested != null && ++index < length) {\n var key = toKey(path[index]),\n newValue = value;\n\n if (index != lastIndex) {\n var objValue = nested[key];\n newValue = customizer ? customizer(objValue, key, nested) : undefined;\n if (newValue === undefined) {\n newValue = isObject(objValue)\n ? objValue\n : (isIndex(path[index + 1]) ? [] : {});\n }\n }\n assignValue(nested, key, newValue);\n nested = nested[key];\n }\n return object;\n}\n\nmodule.exports = baseSet;\n","var baseAssignValue = require('./_baseAssignValue'),\n eq = require('./eq');\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 * Assigns `value` to `key` of `object` if the existing value is not equivalent\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction assignValue(object, key, value) {\n var objValue = object[key];\n if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||\n (value === undefined && !(key in object))) {\n baseAssignValue(object, key, value);\n }\n}\n\nmodule.exports = assignValue;\n","var defineProperty = require('./_defineProperty');\n\n/**\n * The base implementation of `assignValue` and `assignMergeValue` without\n * value checks.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction baseAssignValue(object, key, value) {\n if (key == '__proto__' && defineProperty) {\n defineProperty(object, key, {\n 'configurable': true,\n 'enumerable': true,\n 'value': value,\n 'writable': true\n });\n } else {\n object[key] = value;\n }\n}\n\nmodule.exports = baseAssignValue;\n","var getNative = require('./_getNative');\n\nvar defineProperty = (function() {\n try {\n var func = getNative(Object, 'defineProperty');\n func({}, '', {});\n return func;\n } catch (e) {}\n}());\n\nmodule.exports = defineProperty;\n","export default function _inheritsLoose(subClass, superClass) {\n subClass.prototype = Object.create(superClass.prototype);\n subClass.prototype.constructor = subClass;\n subClass.__proto__ = superClass;\n}","import forEach from 'lodash/forEach';\nimport get from 'lodash/get';\nimport set from 'lodash/set';\n\nexport default class Bus {\n subscribers = {};\n\n subscribe(event, callable) {\n set(this.subscribers, event + '[]', callable);\n }\n\n dispatch(event, args: any = null) {\n forEach(get(this.subscribers, event), function(listener) {\n listener(event, args);\n });\n }\n}\n","/**\n * The `extract` utility deletes a property from an object and returns its\n * value.\n */\nexport default function extract(object: object, property: string): any {\n const value = object[property];\n\n delete object[property];\n\n return value;\n}\n","/**\n * Extract the text nodes from a virtual element.\n *\n * @param {VirtualElement} vdom\n * @return {String}\n */\nexport default function extractText(vdom: any): string {\n if (vdom instanceof Array) {\n return vdom.map(element => extractText(element)).join('');\n } else if (typeof vdom === 'object' && vdom !== null) {\n return vdom.text || extractText(vdom.children);\n } else {\n return vdom;\n }\n}\n","/**\n * The `username` helper displays a user's username in a <span class=\"username\">\n * tag. If the user doesn't exist, the username will be displayed as [deleted].\n *\n * @param {User} user\n */\nexport default function username(user): any {\n const name = (user && user.displayName()) || app.translator.trans('core.lib.username.deleted_text');\n\n return <span className=\"username\">{name}</span>;\n}\n","import extract from './utils/extract';\nimport extractText from './utils/extractText';\nimport username from './helpers/username';\n\ntype Translations = { [key: string]: string };\n\nexport default class Translator {\n translations: Translations = {};\n locale = null;\n\n constructor() {\n /**\n * A map of translation keys to their translated values.\n *\n * @type {Object}\n * @public\n */\n this.translations = {};\n\n this.locale = null;\n }\n\n addTranslations(translations) {\n Object.assign(this.translations, translations);\n }\n\n trans(id: string, parameters = null) {\n const translation = this.translations[id];\n\n if (translation) {\n return this.apply(translation, parameters || {});\n }\n\n return id;\n }\n\n transText(id: string, parameters = null) {\n return extractText(this.trans(id, parameters));\n }\n\n apply(translation: string, input: any) {\n if ('user' in input) {\n const user = extract(input, 'user');\n if (!input.username) input.username = username(user);\n }\n\n const parts = translation.split(new RegExp('({[a-z0-9_]+}|</?[a-z0-9_]+>)', 'gi'));\n\n const hydrated: any[] = [];\n const open: any[][] = [hydrated];\n\n parts.forEach(part => {\n const match = part.match(new RegExp('{([a-z0-9_]+)}|<(/?)([a-z0-9_]+)>', 'i'));\n\n if (match) {\n if (match[1]) {\n open[0].push(input[match[1]]);\n } else if (match[3]) {\n if (match[2]) {\n open.shift();\n } else {\n let tag = input[match[3]] || { tag: match[3], children: [] };\n open[0].push(tag);\n open.unshift(tag.children || tag);\n }\n }\n } else {\n open[0].push({ tag: 'span', text: part });\n }\n });\n\n return hydrated.filter(part => part);\n }\n}\n","import User from './models/User';\n\n/**\n * The `Session` class defines the current user session. It stores a reference\n * to the current authenticated user, and provides methods to log in/out.\n */\nexport default class Session {\n /**\n * The current authenticated user.\n */\n user?: User;\n\n /**\n * The CSRF token.\n */\n csrfToken?: string;\n\n constructor(user, csrfToken) {\n this.user = user;\n\n this.csrfToken = csrfToken;\n }\n\n /**\n * Attempt to log in a user.\n */\n login(body: { identification: string; password: string; remember?: string }, options = {}) {\n return app.request(\n Object.assign(\n {\n method: 'POST',\n url: `${app.forum.attribute('baseUrl')}/login`,\n body,\n },\n options\n )\n );\n }\n\n /**\n * Log the user out.\n *\n * @public\n */\n logout() {\n window.location.href = `${app.forum.attribute('baseUrl')}/logout?token=${this.csrfToken}`;\n }\n}\n","import Model from './Model';\n\n/**\n * The `Store` class defines a local data store, and provides methods to\n * retrieve data from the API.\n */\nexport default class Store {\n /**\n * The local data store. A tree of resource types to IDs, such that\n * accessing data[type][id] will return the model for that type/ID.\n */\n data: { [key: string]: { [key: number]: Model } } = {};\n\n /**\n * The model registry. A map of resource types to the model class that\n * should be used to represent resources of that type.\n */\n models: {};\n\n constructor(models) {\n this.models = models;\n }\n\n /**\n * Push resources contained within an API payload into the store.\n *\n * @param payload\n * @return The model(s) representing the resource(s) contained\n * within the 'data' key of the payload.\n */\n pushPayload(payload: { included?: {}[]; data?: {} | {}[] }): Model | Model[] {\n if (payload.included) payload.included.map(this.pushObject.bind(this));\n\n const result: any = payload.data instanceof Array ? payload.data.map(this.pushObject.bind(this)) : this.pushObject(payload.data);\n\n // Attach the original payload to the model that we give back. This is\n // useful to consumers as it allows them to access meta information\n // associated with their request.\n result.payload = payload;\n\n return result;\n }\n\n /**\n * Create a model to represent a resource object (or update an existing one),\n * and push it into the store.\n *\n * @param {Object} data The resource object\n * @return The model, or null if no model class has been\n * registered for this resource type.\n */\n pushObject(data): Model {\n if (!this.models[data.type]) return null;\n\n const type = (this.data[data.type] = this.data[data.type] || {});\n\n if (type[data.id]) {\n type[data.id].pushData(data);\n } else {\n type[data.id] = this.createRecord(data.type, data);\n }\n\n type[data.id].exists = true;\n\n return type[data.id];\n }\n\n /**\n * Make a request to the API to find record(s) of a specific type.\n *\n * @param type The resource type.\n * @param [id] The ID(s) of the model(s) to retrieve.\n * Alternatively, if an object is passed, it will be handled as the\n * `query` parameter.\n * @param query\n * @param options\n */\n find<T extends Model = Model>(type: string, id?: number | number[] | any, query = {}, options = {}): Promise<T[]> {\n let params = query;\n let url = `${app.forum.attribute('apiUrl')}/${type}`;\n\n if (id instanceof Array) {\n url += `?filter[id]=${id.join(',')}`;\n } else if (typeof id === 'object') {\n params = id;\n } else if (id) {\n url += `/${id}`;\n }\n\n return app\n .request(\n Object.assign(\n {\n method: 'GET',\n url,\n params,\n },\n options\n )\n )\n .then(this.pushPayload.bind(this));\n }\n\n /**\n * Get a record from the store by ID.\n *\n * @param type The resource type.\n * @param id The resource ID.\n */\n getById<T extends Model = Model>(type: string, id: number): T {\n return this.data[type] && (this.data[type][id] as T);\n }\n\n /**\n * Get a record from the store by the value of a model attribute.\n *\n * @param type The resource type.\n * @param key The name of the method on the model.\n * @param value The value of the model attribute.\n */\n getBy<T extends Model = Model>(type: string, key: string, value: any): T {\n return this.all<T>(type).filter(model => model[key]() === value)[0];\n }\n\n /**\n * Get all loaded records of a specific type.\n */\n all<T extends Model = Model>(type: string): T[] {\n const records = this.data[type];\n\n return records ? Object.keys(records).map(id => records[id]) : [];\n }\n\n /**\n * Remove the given model from the store.\n */\n remove(model: Model) {\n delete this.data[model.data.type][model.id()];\n }\n\n /**\n * Create a new record of the given type.\n *\n * @param {String} type The resource type\n * @param {Object} [data] Any data to initialize the model with\n */\n createRecord<T extends Model = Model>(type: string, data: any = {}): T {\n data.type = data.type || type;\n\n return new this.models[type](data, this);\n }\n}\n","/**\n * Extend an object's method by running its output through a mutating callback\n * every time it is called.\n *\n * The callback accepts the method's return value and should perform any\n * mutations directly on this value. For this reason, this function will not be\n * effective on methods which return scalar values (numbers, strings, booleans).\n *\n * Care should be taken to extend the correct object – in most cases, a class'\n * prototype will be the desired target of extension, not the class itself.\n *\n * @example\n * extend(Discussion.prototype, 'badges', function(badges) {\n * // do something with `badges`\n * });\n *\n * @param {Object} object The object that owns the method\n * @param {String} method The name of the method to extend\n * @param {function} callback A callback which mutates the method's output\n */\nexport function extend(object, method, callback) {\n const original = object[method];\n\n object[method] = (...args) => {\n // @ts-ignore\n const value = original ? original.apply(object, args) : undefined;\n\n // @ts-ignore\n callback.apply(object, [value].concat(args));\n\n return value;\n };\n\n Object.assign(object[method], original);\n}\n\n/**\n * Override an object's method by replacing it with a new function, so that the\n * new function will be run every time the object's method is called.\n *\n * The replacement function accepts the original method as its first argument,\n * which is like a call to 'super'. Any arguments passed to the original method\n * are also passed to the replacement.\n *\n * Care should be taken to extend the correct object – in most cases, a class'\n * prototype will be the desired target of extension, not the class itself.\n *\n * @example\n * override(Discussion.prototype, 'badges', function(original) {\n * const badges = original();\n * // do something with badges\n * return badges;\n * });\n *\n * @param {Object} object The object that owns the method\n * @param {String} method The name of the method to override\n * @param {function} newMethod The method to replace it with\n */\nexport function override(object, method, newMethod) {\n const original = object[method];\n\n object[method] = function(...args) {\n // @ts-ignore\n return newMethod.apply(this, [original.bind(this)].concat(args));\n };\n\n Object.assign(object[method], original);\n}\n","/**\n * The `Drawer` class controls the page's drawer. The drawer is the area the\n * slides out from the left on mobile devices; it contains the header and the\n * footer.\n */\nexport default class Drawer {\n private $backdrop?: ZeptoCollection;\n\n constructor() {\n // Set up an event handler so that whenever the content area is tapped,\n // the drawer will close.\n $('#content').click(e => {\n if (this.isOpen()) {\n e.preventDefault();\n this.hide();\n }\n });\n }\n\n /**\n * Check whether or not the drawer is currently open.\n */\n isOpen(): boolean {\n return $('#app').hasClass('drawerOpen');\n }\n\n /**\n * Hide the drawer.\n */\n hide() {\n $('#app').removeClass('drawerOpen');\n\n if (this.$backdrop) this.$backdrop.remove();\n }\n\n /**\n * Show the drawer.\n *\n * @public\n */\n show() {\n $('#app').addClass('drawerOpen');\n\n this.$backdrop = $('<div/>')\n .addClass('drawer-backdrop fade')\n .appendTo('body')\n .click(() => this.hide());\n\n setTimeout(() => this.$backdrop.addClass('in'));\n }\n}\n","import Mithril from 'mithril';\n\nexport interface RequestErrorResponse extends JSON {\n errors?: {\n code: string;\n source?: {\n pointer: string;\n };\n }[];\n}\n\nexport default class RequestError {\n status: number;\n responseText: string;\n options: Mithril.RequestOptions;\n xhr: XMLHttpRequest;\n response?: RequestErrorResponse;\n alert?: Mithril.Vnode;\n\n constructor(status, responseText, options, xhr) {\n this.status = status;\n this.responseText = responseText;\n this.options = options;\n this.xhr = xhr;\n\n try {\n this.response = JSON.parse(responseText);\n } catch (e) {\n this.response = null;\n }\n\n this.alert = null;\n }\n}\n","/**\n * The `Model` class represents a local data resource. It provides methods to\n * persist changes via the API.\n *\n * @abstract\n */\nimport Store from './Store';\n\nexport default class Model {\n /**\n * The resource object from the API.\n */\n data: any;\n\n /**\n * The time at which the model's data was last updated. Watching the value\n * of this property is a fast way to retain/cache a subtree if data hasn't\n * changed.\n */\n freshness: Date;\n\n /**\n * Whether or not the resource exists on the server.\n */\n exists: boolean;\n\n /**\n * The data store that this resource should be persisted to.\n */\n protected store: Store;\n\n /**\n * @param {Object} data A resource object from the API.\n * @param {Store} store The data store that this model should be persisted to.\n */\n constructor(data = {}, store = null) {\n this.data = data;\n this.store = store;\n\n this.freshness = new Date();\n this.exists = false;\n }\n\n /**\n * Get the model's ID.\n * @final\n */\n id(): string | number {\n return this.data.id;\n }\n\n /**\n * Get one of the model's attributes.\n * @final\n */\n attribute(attribute: string): any {\n return this.data.attributes[attribute];\n }\n\n /**\n * Merge new data into this model locally.\n *\n * @param data A resource object to merge into this model\n * @public\n */\n pushData(data: {}) {\n // Since most of the top-level items in a resource object are objects\n // (e.g. relationships, attributes), we'll need to check and perform the\n // merge at the second level if that's the case.\n for (const key in data) {\n if (typeof data[key] === 'object') {\n this.data[key] = this.data[key] || {};\n\n // For every item in a second-level object, we want to check if we've\n // been handed a Model instance. If so, we will convert it to a\n // relationship data object.\n for (const innerKey in data[key]) {\n if (data[key][innerKey] instanceof Model) {\n data[key][innerKey] = { data: Model.getIdentifier(data[key][innerKey]) };\n }\n this.data[key][innerKey] = data[key][innerKey];\n }\n } else {\n this.data[key] = data[key];\n }\n }\n\n // Now that we've updated the data, we can say that the model is fresh.\n // This is an easy way to invalidate retained subtrees etc.\n this.freshness = new Date();\n }\n\n /**\n * Merge new attributes into this model locally.\n *\n * @param {Object} attributes The attributes to merge.\n */\n pushAttributes(attributes: any) {\n this.pushData({ attributes });\n }\n\n /**\n * Merge new attributes into this model, both locally and with persistence.\n *\n * @param attributes The attributes to save. If a 'relationships' key\n * exists, it will be extracted and relationships will also be saved.\n * @param [options]\n * @return {Promise}\n */\n save(attributes: any, options: any = {}): Promise<Model | Model[]> {\n const data = {\n type: this.data.type,\n id: this.data.id,\n attributes,\n relationships: undefined,\n };\n\n // If a 'relationships' key exists, extract it from the attributes hash and\n // set it on the top-level data object instead. We will be sending this data\n // object to the API for persistence.\n if (attributes.relationships) {\n data.relationships = {};\n\n for (const key in attributes.relationships) {\n const model = attributes.relationships[key];\n\n data.relationships[key] = {\n data: model instanceof Array ? model.map(Model.getIdentifier) : Model.getIdentifier(model),\n };\n }\n\n delete attributes.relationships;\n }\n\n // Before we update the model's data, we should make a copy of the model's\n // old data so that we can revert back to it if something goes awry during\n // persistence.\n const oldData = this.copyData();\n\n this.pushData(data);\n\n const request = { data };\n if (options.meta) request.meta = options.meta;\n\n return app\n .request(\n Object.assign(\n {\n method: this.exists ? 'PATCH' : 'POST',\n url: app.forum.attribute('apiUrl') + this.apiEndpoint(),\n body: request,\n },\n options\n )\n )\n .then(\n // If everything went well, we'll make sure the store knows that this\n // model exists now (if it didn't already), and we'll push the data that\n // the API returned into the store.\n payload => {\n this.store.data[payload.data.type] = this.store.data[payload.data.type] || {};\n this.store.data[payload.data.type][payload.data.id] = this;\n return this.store.pushPayload(payload);\n },\n\n // If something went wrong, though... good thing we backed up our model's\n // old data! We'll revert to that and let others handle the error.\n response => {\n this.pushData(oldData);\n m.redraw();\n throw response;\n }\n );\n }\n\n /**\n * Send a request to delete the resource.\n *\n * @param {Object} body Data to send along with the DELETE request.\n * @param {Object} [options]\n * @return {Promise}\n * @public\n */\n delete(body = {}, options = {}) {\n if (!this.exists) return Promise.resolve();\n\n return app\n .request(\n Object.assign(\n {\n method: 'DELETE',\n url: app.forum.attribute('apiUrl') + this.apiEndpoint(),\n body,\n },\n options\n )\n )\n .then(() => {\n this.exists = false;\n this.store.remove(this);\n });\n }\n\n /**\n * Construct a path to the API endpoint for this resource.\n *\n * @return {String}\n * @protected\n */\n apiEndpoint() {\n return '/' + this.data.type + (this.exists ? '/' + this.data.id : '');\n }\n\n copyData() {\n return JSON.parse(JSON.stringify(this.data));\n }\n\n /**\n * Generate a function which returns the value of the given attribute.\n *\n * @param {String} name\n * @param [transform] A function to transform the attribute value\n */\n static attribute(name: string, transform?: Function): () => any {\n return function() {\n const value = this.data.attributes && this.data.attributes[name];\n\n return transform ? transform(value) : value;\n };\n }\n\n /**\n * Generate a function which returns the value of the given has-one\n * relationship.\n *\n * @return false if no information about the\n * relationship exists; undefined if the relationship exists but the model\n * has not been loaded; or the model if it has been loaded.\n */\n static hasOne(name: string): () => Model | boolean {\n return function() {\n if (this.data.relationships) {\n const relationship = this.data.relationships[name];\n\n if (relationship) {\n return app.store.getById(relationship.data.type, relationship.data.id);\n }\n }\n\n return false;\n };\n }\n\n /**\n * Generate a function which returns the value of the given has-many\n * relationship.\n *\n * @return false if no information about the relationship\n * exists; an array if it does, containing models if they have been\n * loaded, and undefined for those that have not.\n */\n static hasMany(name: string): () => [] | boolean {\n return function() {\n if (this.data.relationships) {\n const relationship = this.data.relationships[name];\n\n if (relationship) {\n return relationship.data.map(data => app.store.getById(data.type, data.id));\n }\n }\n\n return false;\n };\n }\n\n /**\n * Transform the given value into a Date object.\n */\n static transformDate(value: string): Date {\n return value ? new Date(value) : null;\n }\n\n /**\n * Get a resource identifier object for the given model.\n */\n protected static getIdentifier(model: Model): { type: string; id: string } {\n return {\n type: model.data.type,\n id: model.data.id,\n };\n }\n}\n","import Model from '../Model';\n\nexport default class Forum extends Model {\n apiEndpoint() {\n return '/';\n }\n}\n","/**\n * The `computed` utility creates a function that will cache its output until\n * any of the dependent values are dirty.\n *\n * @param {...String} dependentKeys The keys of the dependent values.\n * @param {function} compute The function which computes the value using the\n * dependent values.\n */\nexport default function computed(dependentKeys: string | string[], compute: Function): () => any {\n const keys = Array.from(dependentKeys);\n\n const dependentValues = {};\n let computedValue;\n\n return function() {\n let recompute = false;\n\n // Read all of the dependent values. If any of them have changed since last\n // time, then we'll want to recompute our output.\n keys.forEach(key => {\n const value = typeof this[key] === 'function' ? this[key]() : this[key];\n\n if (dependentValues[key] !== value) {\n recompute = true;\n dependentValues[key] = value;\n }\n });\n\n if (recompute) {\n computedValue = compute.apply(\n this,\n keys.map(key => dependentValues[key])\n );\n }\n\n return computedValue;\n };\n}\n","class Item<T> {\n content: T;\n priority: number;\n key: number = 0;\n\n constructor(content: any, priority: number) {\n this.content = content;\n this.priority = priority;\n }\n}\n\nexport default class ItemList<T = any> {\n private items: { [key: string]: Item<T> } = {};\n\n /**\n * Check whether the list is empty.\n *\n * @returns {boolean}\n * @public\n */\n isEmpty(): boolean {\n for (const i in this.items) {\n if (this.items.hasOwnProperty(i)) {\n return false;\n }\n }\n\n return true;\n }\n\n /**\n * Check whether an item is present in the list.\n */\n has(key: any): boolean {\n return !!this.items[key];\n }\n\n /**\n * Get the content of an item.\n */\n get(key: any): T {\n return this.items[key]?.content;\n }\n\n /**\n * Add an item to the list.\n *\n * @param {String} key A unique key for the item.\n * @param {*} content The item's content.\n * @param {Integer} [priority] The priority of the item. Items with a higher\n * priority will be positioned before items with a lower priority.\n * @return {ItemList}\n * @public\n */\n add(key: any, content: T, priority = 0) {\n this.items[key] = new Item(content, priority);\n\n return this;\n }\n\n toArray(): T[] {\n const items: Item<T>[] = [];\n\n for (const i in this.items) {\n if (this.items.hasOwnProperty(i)) {\n if (this.items[i] !== null && this.items[i] instanceof Item) {\n this.items[i].content = Object(this.items[i].content);\n\n // @ts-ignore\n this.items[i].content.itemName = i;\n items.push(this.items[i]);\n this.items[i].key = items.length;\n }\n }\n }\n\n return items\n .sort((a, b) => {\n if (a.priority === b.priority) {\n return a.key - b.key;\n } else if (a.priority > b.priority) {\n return -1;\n }\n return 1;\n })\n .map(item => item.content);\n }\n}\n","/**\n * The `icon` helper displays an icon.\n *\n * @param {String} fontClass The full icon class, prefix and the icon’s name.\n * @param {Object} attrs Any other attributes to apply.\n */\nexport default function icon(fontClass: string, attrs: any = {}) {\n attrs.className = 'icon ' + fontClass + ' ' + (attrs.className || '');\n\n return <i {...attrs} />;\n}\n","import Component from '../Component';\nimport icon from '../helpers/icon';\nimport extract from '../utils/extract';\n\n/**\n * The `Badge` component represents a user/discussion badge, indicating some\n * status (e.g. a discussion is stickied, a user is an admin).\n *\n * A badge may have the following special props:\n *\n * - `type` The type of badge this is. This will be used to give the badge a\n * class name of `Badge--{type}`.\n * - `icon` The name of an icon to show inside the badge.\n * - `label`\n *\n * All other props will be assigned as attributes on the badge element.\n */\nexport default class Badge extends Component {\n view(vnode) {\n const attrs = vnode.attrs;\n const type = extract(attrs, 'type');\n const iconName = extract(attrs, 'icon');\n\n attrs.className = `Badge ${type ? `Badge--${type}` : ''} ${attrs.className || ''}`;\n attrs.title = extract(attrs, 'label') || '';\n\n return <span {...attrs}>{iconName ? icon(iconName, { className: 'Badge-icon' }) : m.trust(' ')}</span>;\n }\n\n oncreate(vnode) {\n super.oncreate(vnode);\n\n if (this.props.label) this.$().tooltip({ container: 'body' });\n }\n}\n","import Model from '../Model';\nimport computed from '../utils/computed';\nimport ItemList from '../utils/ItemList';\nimport Badge from '../components/Badge';\n\nimport User from './User';\nimport Post from './Post';\n\nexport default class Discussion extends Model {\n title = Model.attribute('title') as () => string;\n slug = Model.attribute('slug') as () => string;\n\n createdAt = Model.attribute('createdAt', Model.transformDate) as () => Date;\n user = Model.hasOne('user') as () => User;\n firstPost = Model.hasOne('firstPost') as () => Post;\n\n lastPostedAt = Model.attribute('lastPostedAt', Model.transformDate) as () => Date;\n lastPostedUser = Model.hasOne('lastPostedUser') as () => User;\n lastPost = Model.hasOne('lastPost') as () => Post;\n lastPostNumber = Model.attribute('lastPostNumber') as () => number;\n\n commentCount = Model.attribute('commentCount') as () => number;\n replyCount = computed('commentCount', commentCount => Math.max(0, commentCount - 1)) as () => string;\n posts = Model.hasMany('posts') as () => Post[];\n mostRelevantPost = Model.hasOne('mostRelevantPost') as () => Post;\n\n lastReadAt = Model.attribute('lastReadAt', Model.transformDate) as () => Date;\n lastReadPostNumber = Model.attribute('lastReadPostNumber') as () => number;\n isUnread = computed('unreadCount', unreadCount => !!unreadCount) as () => boolean;\n isRead = computed('unreadCount', unreadCount => app.session.user && !unreadCount) as () => boolean;\n\n hiddenAt = Model.attribute('hiddenAt', Model.transformDate) as () => Date;\n hiddenUser = Model.hasOne('hiddenUser') as () => User;\n isHidden = computed('hiddenAt', hiddenAt => !!hiddenAt) as () => boolean;\n\n canReply = Model.attribute('canReply') as () => boolean;\n canRename = Model.attribute('canRename') as () => boolean;\n canHide = Model.attribute('canHide') as () => boolean;\n canDelete = Model.attribute('canDelete') as () => boolean;\n\n /**\n * Remove a post from the discussion's posts relationship.\n *\n * @param id The ID of the post to remove.\n */\n removePost(id: number) {\n const relationships = this.data.relationships;\n const posts = relationships && relationships.posts;\n\n if (posts) {\n posts.data.some((data, i) => {\n if (id === data.id) {\n posts.data.splice(i, 1);\n return true;\n }\n });\n }\n }\n\n /**\n * Get the estimated number of unread posts in this discussion for the current\n * user.\n */\n unreadCount(): number {\n const user = app.session.user;\n\n if (user && user.markedAllAsReadAt() < this.lastPostedAt()) {\n return Math.max(0, this.lastPostNumber() - (this.lastReadPostNumber() || 0));\n }\n\n return 0;\n }\n\n /**\n * Get the Badge components that apply to this discussion.\n */\n badges(): ItemList {\n const items = new ItemList();\n\n if (this.isHidden()) {\n items.add('hidden', <Badge type=\"hidden\" icon=\"fas fa-trash\" label={app.translator.trans('core.lib.badge.hidden_tooltip')} />);\n }\n\n return items;\n }\n\n /**\n * Get a list of all of the post IDs in this discussion.\n */\n postIds(): number[] {\n const posts = this.data.relationships.posts;\n\n return posts ? posts.data.map(link => link.id) : [];\n }\n}\n","export function hsvToRgb(h: number, s: number, v: number) {\n let r;\n let g;\n let b;\n\n const i = Math.floor(h * 6);\n const f = h * 6 - i;\n const p = v * (1 - s);\n const q = v * (1 - f * s);\n const t = v * (1 - (1 - f) * s);\n\n switch (i % 6) {\n case 0:\n r = v;\n g = t;\n b = p;\n break;\n case 1:\n r = q;\n g = v;\n b = p;\n break;\n case 2:\n r = p;\n g = v;\n b = t;\n break;\n case 3:\n r = p;\n g = q;\n b = v;\n break;\n case 4:\n r = t;\n g = p;\n b = v;\n break;\n case 5:\n r = v;\n g = p;\n b = q;\n break;\n }\n\n return {\n r: Math.floor(r * 255),\n g: Math.floor(g * 255),\n b: Math.floor(b * 255),\n };\n}\n\n/**\n * Convert the given string to a unique color.\n */\nexport default function stringToColor(string: string): string {\n let num = 0;\n\n // Convert the username into a number based on the ASCII value of each\n // character.\n for (let i = 0; i < string.length; i++) {\n num += string.charCodeAt(i);\n }\n\n // Construct a color using the remainder of that number divided by 360, and\n // some predefined saturation and value values.\n const hue = num % 360;\n const rgb = hsvToRgb(hue / 360, 0.3, 0.9);\n\n return '' + rgb.r.toString(16) + rgb.g.toString(16) + rgb.b.toString(16);\n}\n","import Badge from './Badge';\n\nexport default class GroupBadge extends Badge {\n static initProps(props) {\n super.initProps(props);\n\n if (props.group) {\n props.icon = props.group.icon();\n props.style = { backgroundColor: props.group.color() };\n props.label = typeof props.label === 'undefined' ? props.group.nameSingular() : props.label;\n props.type = `group--${props.group.id()}`;\n\n delete props.group;\n }\n }\n}\n","import Model from '../Model';\nimport stringToColor from '../utils/stringToColor';\nimport ItemList from '../utils/ItemList';\nimport computed from '../utils/computed';\nimport GroupBadge from '../components/GroupBadge';\nimport Group from './Group';\n\nexport default class User extends Model {\n username = Model.attribute('username') as () => string;\n\n displayName = Model.attribute('displayName') as () => string;\n email = Model.attribute('email') as () => string;\n isEmailConfirmed = Model.attribute('isEmailConfirmed') as () => boolean;\n password = Model.attribute('password') as () => string;\n\n avatarUrl = Model.attribute('avatarUrl') as () => string;\n preferences = Model.attribute('preferences') as () => string;\n groups = Model.hasMany('groups') as () => Group[];\n\n joinTime = Model.attribute('joinTime', Model.transformDate) as () => Date;\n lastSeenAt = Model.attribute('lastSeenAt', Model.transformDate) as () => Date;\n markedAllAsReadAt = Model.attribute('markedAllAsReadAt', Model.transformDate) as () => Date;\n unreadNotificationCount = Model.attribute('unreadNotificationCount') as () => number;\n newNotificationCount = Model.attribute('newNotificationCount') as () => number;\n\n discussionCount = Model.attribute('discussionCount') as () => number;\n commentCount = Model.attribute('commentCount') as () => number;\n\n canEdit = Model.attribute('canEdit') as () => boolean;\n canDelete = Model.attribute('canDelete') as () => boolean;\n\n avatarColor = null;\n color = computed(['username', 'avatarUrl', 'avatarColor'], function(username, avatarUrl, avatarColor) {\n // If we've already calculated and cached the dominant color of the user's\n // avatar, then we can return that in RGB format. If we haven't, we'll want\n // to calculate it. Unless the user doesn't have an avatar, in which case\n // we generate a color from their username.\n if (avatarColor) {\n return 'rgb(' + avatarColor.join(', ') + ')';\n } else if (avatarUrl) {\n this.calculateAvatarColor();\n return '';\n }\n\n return '#' + stringToColor(username);\n }) as () => string;\n\n isOnline(): boolean {\n return (\n this.lastSeenAt() >\n dayjs()\n .subtract(5, 'minutes')\n .toDate()\n );\n }\n\n /**\n * Get the Badge components that apply to this user.\n */\n badges(): ItemList {\n const items = new ItemList();\n const groups = this.groups();\n\n if (groups) {\n groups.forEach(group => {\n items.add('group' + group.id(), GroupBadge.component({ group }));\n });\n }\n\n return items;\n }\n\n /**\n * Calculate the dominant color of the user's avatar. The dominant color will\n * be set to the `avatarColor` property once it has been calculated.\n *\n * @protected\n */\n calculateAvatarColor() {\n const image = new Image();\n const user = this;\n\n image.onload = function() {\n const colorThief = new ColorThief();\n user.avatarColor = colorThief.getColor(this);\n user.freshness = new Date();\n m.redraw();\n };\n image.crossOrigin = 'anonymous';\n image.src = this.avatarUrl();\n }\n\n /**\n * Update the user's preferences.\n */\n savePreferences(newPreferences: object): Promise<User> {\n const preferences = this.preferences();\n\n Object.assign(preferences, newPreferences);\n\n return <Promise<User>>this.save({ preferences });\n }\n}\n","/**\n * Truncate a string to the given length, appending ellipses if necessary.\n */\nexport function truncate(string: string, length: number, start = 0): string {\n return (start > 0 ? '...' : '') + string.substring(start, start + length) + (string.length > start + length ? '...' : '');\n}\n\n/**\n * Create a slug out of the given string. Non-alphanumeric characters are\n * converted to hyphens.\n */\nexport function slug(string: string): string {\n return string\n .toLowerCase()\n .replace(/[^a-z0-9]/gi, '-')\n .replace(/-+/g, '-')\n .replace(/-$|^-/g, '');\n}\n\n/**\n * Strip HTML tags and quotes out of the given string, replacing them with\n * meaningful punctuation.\n */\nexport function getPlainContent(string: string): string {\n const html = string.replace(/(<\\/p>|<br>)/g, '$1  ').replace(/<img\\b[^>]*>/gi, ' ');\n\n const dom = $('<div/>').html(html);\n\n dom.find(getPlainContent.removeSelectors.join(',')).remove();\n\n return dom\n .text()\n .replace(/\\s+/g, ' ')\n .trim();\n}\n\n/**\n * An array of DOM selectors to remove when getting plain content.\n *\n * @type {String[]}\n */\ngetPlainContent.removeSelectors = ['blockquote', 'script'];\n\n/**\n * Make a string's first character uppercase.\n */\nexport function ucfirst(string: string): string {\n return string.substr(0, 1).toUpperCase() + string.substr(1);\n}\n","import Model from '../Model';\nimport computed from '../utils/computed';\nimport { getPlainContent } from '../utils/string';\n\nimport Discussion from './Discussion';\nimport User from './User';\n\nexport default class Post extends Model {\n number = Model.attribute('number') as () => number;\n discussion = Model.hasOne('discussion') as () => Discussion;\n\n createdAt = Model.attribute('createdAt', Model.transformDate) as () => Date;\n user = Model.hasOne('user') as () => User;\n contentType = Model.attribute('contentType') as () => string;\n content = Model.attribute('content') as () => string;\n contentHtml = Model.attribute('contentHtml') as () => string;\n contentPlain = computed('contentHtml', getPlainContent) as () => string;\n\n editedAt = Model.attribute('editedAt', Model.transformDate) as () => Date;\n editedUser = Model.hasOne('editedUser') as () => User;\n isEdited = computed('editedAt', editedAt => !!editedAt) as () => boolean;\n\n hiddenAt = Model.attribute('hiddenAt', Model.transformDate) as () => Date;\n hiddenUser = Model.hasOne('hiddenUser') as () => User;\n isHidden = computed('hiddenAt', hiddenAt => !!hiddenAt) as () => boolean;\n\n canEdit = Model.attribute('canEdit') as () => boolean;\n canHide = Model.attribute('canHide') as () => boolean;\n canDelete = Model.attribute('canDelete') as () => boolean;\n}\n","import Model from '../Model';\n\nexport default class Group extends Model {\n static ADMINISTRATOR_ID = '1';\n static GUEST_ID = '2';\n static MEMBER_ID = '3';\n\n nameSingular = Model.attribute('nameSingular') as () => string;\n namePlural = Model.attribute('namePlural') as () => string;\n color = Model.attribute('color') as () => string;\n icon = Model.attribute('icon') as () => string;\n}\n","import Model from '../Model';\nimport User from './User';\n\nexport default class Notification extends Model {\n static ADMINISTRATOR_ID = '1';\n static GUEST_ID = '2';\n static MEMBER_ID = '3';\n\n contentType = Model.attribute('contentType') as () => string;\n content = Model.attribute('content') as () => string;\n createdAt = Model.attribute('createdAt', Model.transformDate) as () => Date;\n\n isRead = Model.attribute('isRead') as () => boolean;\n\n user = Model.hasOne('user') as () => User;\n fromUser = Model.hasOne('fromUser') as () => User;\n subject = Model.hasOne('subhect') as () => any;\n}\n","var __assign = (this && this.__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\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({}, 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';\nimport { Spinner, SpinnerOptions } from 'spin.js';\n\n/**\n * The `LoadingIndicator` component displays a loading spinner with spin.js. It\n * may have the following special props:\n *\n * - `size` The spin.js size preset to use. Defaults to 'small'.\n *\n * All other props will be assigned as attributes on the element.\n */\nexport default class LoadingIndicator extends Component {\n view(vnode) {\n const attrs = vnode.attrs;\n\n attrs.className = 'LoadingIndicator ' + (attrs.className || '');\n delete attrs.size;\n\n return <div {...attrs}>{m.trust(' ')}</div>;\n }\n\n oncreate(vnode) {\n super.oncreate(vnode);\n\n const options: SpinnerOptions = { zIndex: 'auto', color: this.$().css('color') };\n let sizeOptions: SpinnerOptions = {};\n\n switch (vnode.attrs.size) {\n case 'large':\n sizeOptions = { lines: 10, length: 8, width: 4, radius: 8 };\n break;\n\n case 'tiny':\n sizeOptions = { lines: 8, length: 2, width: 2, radius: 3 };\n break;\n\n default:\n sizeOptions = { lines: 8, length: 4, width: 3, radius: 5 };\n }\n\n new Spinner({ ...options, ...sizeOptions }).spin(this.element);\n }\n}\n","import Component, { ComponentProps } from '../Component';\nimport icon from '../helpers/icon';\nimport extract from '../utils/extract';\nimport extractText from '../utils/extractText';\nimport LoadingIndicator from './LoadingIndicator';\n\nexport interface ButtonProps extends ComponentProps {\n title?: string;\n type?: string;\n icon?: string;\n\n loading?: boolean;\n disabled?: boolean;\n onclick?: Function;\n}\n\n/**\n * The `Button` component defines an element which, when clicked, performs an\n * action. The button may have the following special props:\n *\n * - `icon` The name of the icon class. If specified, the button will be given a\n * 'has-icon' class name.\n * - `disabled` Whether or not the button is disabled. If truthy, the button\n * will be given a 'disabled' class name, and any `onclick` handler will be\n * removed.\n * - `loading` Whether or not the button should be in a disabled loading state.\n *\n * All other props will be assigned as attributes on the button element.\n *\n * Note that a Button has no default class names. This is because a Button can\n * be used to represent any generic clickable control, like a menu item.\n */\nexport default class Button<T extends ButtonProps = ButtonProps> extends Component<T> {\n view() {\n const { children, ...attrs } = this.props;\n\n attrs.className = attrs.className || '';\n attrs.type = attrs.type || 'button';\n\n // If a tooltip was provided for buttons without additional content, we also\n // use this tooltip as text for screen readers\n if (attrs.title && !this.props.children) {\n attrs['aria-label'] = attrs.title;\n }\n\n // If nothing else is provided, we use the textual button content as tooltip\n if (!attrs.title && this.props.children) {\n attrs.title = extractText(this.props.children);\n }\n\n const iconName = extract(attrs, 'icon');\n if (iconName) attrs.className += ' hasIcon';\n\n const loading = extract(attrs, 'loading');\n if (attrs.disabled || loading) {\n attrs.className += ' ' + classNames('disabled', loading && 'loading');\n delete attrs.onclick;\n }\n\n return <button {...attrs}>{this.getButtonContent(iconName, attrs.loading, children)}</button>;\n }\n\n /**\n * Get the template for the button's content.\n */\n protected getButtonContent(iconName?: string | boolean, loading?: boolean, children?: any): any[] {\n return [\n iconName && iconName !== true ? icon(iconName, { className: 'Button-icon' }) : '',\n children ? <span className=\"Button-label\">{children}</span> : '',\n loading ? LoadingIndicator.component({ size: 'tiny', className: 'LoadingIndicator--inline' }) : '',\n ];\n }\n}\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';\n\n/**\n * The `Separator` component defines a menu separator item.\n */\nexport default class Separator extends Component {\n static isListItem = true;\n\n view() {\n return <li className=\"Dropdown-separator\" />;\n }\n}\n","import Separator from '../components/Separator';\n\nexport function isSeparator(item) {\n return item?.tag === Separator;\n}\n\nexport function withoutUnnecessarySeparators(items) {\n const newItems = [];\n let prevItem;\n\n items.forEach((item, i) => {\n if (!isSeparator(item) || (prevItem && !isSeparator(prevItem) && i !== items.length - 1)) {\n prevItem = item;\n newItems.push(item);\n }\n });\n\n return newItems;\n}\n\n/**\n * The `listItems` helper wraps a collection of components in <li> tags,\n * stripping out any unnecessary `Separator` components.\n *\n * @param {*} items\n * @return {Array}\n */\nexport default function listItems(items) {\n if (!(items instanceof Array)) items = [items];\n\n return withoutUnnecessarySeparators(items).map(item => {\n const isListItem = item.tag?.isListItem;\n const active = item.tag?.isActive && item.tag.isActive(item.attrs);\n const className = item.attrs?.itemClassName || item.itemClassName;\n\n if (isListItem) {\n item.attrs = item.attrs || {};\n item.attrs.key = item.attrs.key || item.itemName;\n item.key = item.attrs.key;\n }\n\n const node = isListItem ? (\n item\n ) : (\n <li\n className={classNames(className, [item.itemName && `item-${item.itemName}`, active && 'active'])}\n key={item.attrs?.key || item.itemName}\n >\n {item}\n </li>\n );\n\n node.state = node.state || {};\n\n return node;\n });\n}\n","const MicroModal = (() => {\n\n const 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 class Modal {\n constructor({\n targetModal,\n triggers = [],\n onShow = () => {},\n onClose = () => {},\n openTrigger = 'data-micromodal-trigger',\n closeTrigger = 'data-micromodal-close',\n disableScroll = false,\n disableFocus = false,\n awaitCloseAnimation = false,\n awaitOpenAnimation = false,\n debugMode = false\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,\n disableScroll,\n openTrigger,\n closeTrigger,\n onShow,\n onClose,\n awaitCloseAnimation,\n awaitOpenAnimation,\n disableFocus // Register click events only if pre binding eventListeners\n\n };\n if (triggers.length > 0) this.registerTriggers(...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 registerTriggers(...triggers) {\n triggers.filter(Boolean).forEach(trigger => {\n trigger.addEventListener('click', event => this.showModal(event));\n });\n }\n\n showModal() {\n this.activeElement = document.activeElement;\n this.modal.setAttribute('aria-hidden', 'false');\n this.modal.classList.add('is-open');\n this.scrollBehaviour('disable');\n this.addEventListeners();\n\n if (this.config.awaitOpenAnimation) {\n const handler = () => {\n this.modal.removeEventListener('animationend', handler, false);\n this.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);\n }\n\n closeModal() {\n const modal = this.modal;\n this.modal.setAttribute('aria-hidden', 'true');\n this.removeEventListeners();\n this.scrollBehaviour('enable');\n\n if (this.activeElement) {\n this.activeElement.focus();\n }\n\n this.config.onClose(this.modal);\n\n if (this.config.awaitCloseAnimation) {\n this.modal.addEventListener('animationend', function handler() {\n modal.classList.remove('is-open');\n modal.removeEventListener('animationend', handler, false);\n }, false);\n } else {\n modal.classList.remove('is-open');\n }\n }\n\n closeModalById(targetModal) {\n this.modal = document.getElementById(targetModal);\n if (this.modal) this.closeModal();\n }\n\n scrollBehaviour(toggle) {\n if (!this.config.disableScroll) return;\n const body = document.querySelector('body');\n\n switch (toggle) {\n case 'enable':\n Object.assign(body.style, {\n overflow: '',\n height: ''\n });\n break;\n\n case 'disable':\n Object.assign(body.style, {\n overflow: 'hidden',\n height: '100vh'\n });\n break;\n\n default:\n }\n }\n\n addEventListeners() {\n this.modal.addEventListener('touchstart', this.onClick);\n this.modal.addEventListener('click', this.onClick);\n document.addEventListener('keydown', this.onKeydown);\n }\n\n removeEventListeners() {\n this.modal.removeEventListener('touchstart', this.onClick);\n this.modal.removeEventListener('click', this.onClick);\n document.removeEventListener('keydown', this.onKeydown);\n }\n\n onClick(event) {\n if (event.target.hasAttribute(this.config.closeTrigger)) {\n this.closeModal();\n event.preventDefault();\n }\n }\n\n onKeydown(event) {\n if (event.keyCode === 27) this.closeModal(event);\n if (event.keyCode === 9) this.maintainFocus(event);\n }\n\n getFocusableNodes() {\n const nodes = this.modal.querySelectorAll(FOCUSABLE_ELEMENTS);\n return Array(...nodes);\n }\n\n setFocusToFirstNode() {\n if (this.config.disableFocus) return;\n const focusableNodes = this.getFocusableNodes();\n if (focusableNodes.length) focusableNodes[0].focus();\n }\n\n maintainFocus(event) {\n const focusableNodes = this.getFocusableNodes(); // if disableFocus is true\n\n if (!this.modal.contains(document.activeElement)) {\n focusableNodes[0].focus();\n } else {\n const 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 && focusedItemIndex === focusableNodes.length - 1) {\n focusableNodes[0].focus();\n event.preventDefault();\n }\n }\n }\n\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 let 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 const generateTriggerMap = (triggers, triggerAttr) => {\n const triggerMap = [];\n triggers.forEach(trigger => {\n const 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 const validateModalPresence = id => {\n if (!document.getElementById(id)) {\n console.warn(`MicroModal: \\u2757Seems like you have missed %c'${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=\"${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 const 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 const validateArgs = (triggers, triggerMap) => {\n validateTriggerPresence(triggers);\n if (!triggerMap) return true;\n\n for (var id in triggerMap) validateModalPresence(id);\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 const init = config => {\n // Create an config object with default openTrigger\n const options = Object.assign({}, {\n openTrigger: 'data-micromodal-trigger'\n }, config); // Collects all the nodes with the trigger\n\n const triggers = [...document.querySelectorAll(`[${options.openTrigger}]`)]; // Makes a mappings of modals with their trigger nodes\n\n const 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 let value = triggerMap[key];\n options.targetModal = key;\n options.triggers = [...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 const show = (targetModal, config) => {\n const options = config || {};\n options.targetModal = targetModal; // Checks if modals and triggers exist in dom\n\n if (options.debugMode === true && validateModalPresence(targetModal) === false) return; // 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 const close = targetModal => {\n targetModal ? activeModal.closeModalById(targetModal) : activeModal.closeModal();\n };\n\n return {\n init,\n show,\n close\n };\n})();\n\nexport default MicroModal;\n","import Component, { ComponentProps } from '../Component';\nimport Button from './Button';\nimport listItems from '../helpers/listItems';\nimport extract from '../utils/extract';\nimport * as Mithril from 'mithril';\n\nexport interface AlertProps extends ComponentProps {\n controls?: Mithril.ChildArray;\n type?: string;\n dismissible?: boolean;\n\n ondismiss?: () => any;\n}\n\n/**\n * The `Alert` component represents an alert box, which contains a message,\n * some controls, and may be dismissible.\n *\n * The alert may have the following special props:\n *\n * - `type` The type of alert this is. Will be used to give the alert a class\n * name of `Alert--{type}`.\n * - `controls` An array of controls to show in the alert.\n * - `dismissible` Whether or not the alert can be dismissed.\n * - `ondismiss` A callback to run when the alert is dismissed.\n *\n * All other props will be assigned as attributes on the alert element.\n */\nexport default class Alert extends Component<AlertProps> {\n view() {\n const attrs: AlertProps = Object.assign({}, this.props);\n\n const type: string = extract(attrs, 'type');\n attrs.className = `Alert Alert--${type} ${attrs.className || ''}`;\n\n const children: Mithril.Children = extract(attrs, 'children');\n const controls: Mithril.ChildArray = extract(attrs, 'controls') || [];\n\n // If the alert is meant to be dismissible (which is the case by default),\n // then we will create a dismiss button to append as the final control in\n // the alert.\n const dismissible: boolean | undefined = extract(attrs, 'dismissible');\n const ondismiss: () => any = extract(attrs, 'ondismiss');\n const dismissControl = [];\n\n if (dismissible || dismissible === undefined) {\n dismissControl.push(<Button icon=\"fas fa-times\" className=\"Button Button--link Button--icon Alert-dismiss\" onclick={ondismiss} />);\n }\n\n return (\n <div {...attrs}>\n <span className=\"Alert-body\">{children}</span>\n <ul className=\"Alert-controls\">{listItems(controls.concat(dismissControl))}</ul>\n </div>\n );\n }\n}\n","import Mithril from 'mithril';\n\nimport Component, { ComponentProps } from '../Component';\nimport Button from './Button';\nimport RequestError from '../utils/RequestError';\n\n/**\n * The `Modal` component displays a modal dialog, wrapped in a form. Subclasses\n * should implement the `className`, `title`, and `content` methods.\n */\nexport default abstract class Modal<T extends ComponentProps = ComponentProps> extends Component<T> {\n /**\n * An alert component to show below the header.\n */\n alert: Mithril.Vnode;\n\n loading: boolean;\n\n view() {\n if (this.alert) {\n this.alert.attrs.dismissible = false;\n }\n\n return (\n <div className={`Modal modal-dialog ${this.className()}`}>\n <div className=\"Modal-content\">\n {this.isDismissible() ? (\n <div className=\"Modal-close App-backControl\">\n {Button.component({\n icon: 'fas fa-times',\n onclick: this.hide.bind(this),\n className: 'Button Button--icon Button--link',\n })}\n </div>\n ) : (\n ''\n )}\n\n <form onsubmit={this.onsubmit.bind(this)}>\n <div className=\"Modal-header\">\n <h3 className=\"App-titleControl App-titleControl--text\">{this.title()}</h3>\n </div>\n\n {this.alert && <div className=\"Modal-alert\">{this.alert}</div>}\n\n {this.content()}\n </form>\n </div>\n </div>\n );\n }\n\n oncreate(vnode) {\n super.oncreate(vnode);\n\n app.modal.component = this;\n }\n\n /**\n * Determine whether or not the modal should be dismissible via an 'x' button.\n */\n isDismissible(): boolean {\n return true;\n }\n\n /**\n * Get the class name to apply to the modal.\n */\n abstract className(): string;\n\n /**\n * Get the title of the modal dialog.\n */\n abstract title(): string;\n\n /**\n * Get the content of the modal.\n */\n abstract content();\n\n /**\n * Handle the modal form's submit event.\n */\n onsubmit(e: Event) {}\n\n /**\n * Focus on the first input when the modal is ready to be used.\n */\n onready() {\n this.$('form')\n .find('input, select, textarea')\n .first()\n .focus()\n .select();\n }\n\n onhide() {}\n\n /**\n * Hide the modal.\n */\n hide() {\n app.modal.close();\n }\n\n /**\n * Stop loading.\n */\n loaded() {\n this.loading = false;\n m.redraw();\n }\n\n /**\n * Show an alert describing an error returned from the API, and give focus to\n * the first relevant field.\n */\n onerror(error: RequestError) {\n this.alert = error.alert;\n\n m.redraw();\n\n if (error.status === 422 && error.response.errors) {\n this.$(`form [name=\"${error.response.errors[0].source.pointer.replace('/data/attributes/', '')}\"]`).select();\n } else {\n this.onready();\n }\n }\n}\n","import MicroModal from 'micromodal';\n\nimport Component from '../Component';\nimport Modal from './Modal';\nimport { Vnode } from 'mithril';\n\n/**\n * The `ModalManager` component manages a modal dialog. Only one modal dialog\n * can be shown at once; loading a new component into the ModalManager will\n * overwrite the previous one.\n */\nexport default class ModalManager extends Component {\n private node: Vnode;\n\n showing: boolean;\n hideTimeout: number;\n component?: Modal;\n\n oncreate(vnode) {\n super.oncreate(vnode);\n\n app.modal = this;\n }\n\n view() {\n return (\n <div className=\"ModalManager modal\" id=\"Modal\" onclick={this.onclick.bind(this)} key=\"modal\">\n {this.node}\n </div>\n );\n }\n\n /**\n * Show a modal dialog.\n */\n show(component) {\n if (!(component instanceof Modal) && !(component.tag?.prototype instanceof Modal)) {\n throw new Error('The ModalManager component can only show Modal components');\n }\n\n clearTimeout(this.hideTimeout);\n\n this.showing = true;\n this.node = component.tag ? component : m(component);\n\n // if (app.current) app.current.retain = true;\n\n m.redraw();\n\n if (!$('.modal-backdrop').length) {\n $('<div />')\n .addClass('modal-backdrop')\n .appendTo('body');\n }\n\n MicroModal.show('Modal', {\n awaitCloseAnimation: true,\n onClose: () => {\n $('.modal-backdrop').fadeOut(200, function() {\n this.remove();\n });\n\n this.showing = false;\n },\n });\n\n this.onready();\n }\n\n onclick(e) {\n if (e.target === this.element) {\n this.close();\n }\n }\n\n /**\n * Close the modal dialog.\n */\n close() {\n if (!this.showing) return;\n\n // Don't hide the modal immediately, because if the consumer happens to call\n // the `show` method straight after to show another modal dialog, it will\n // cause the new modal dialog to disappear. Instead we will wait for a tiny\n // bit to give the `show` method the opportunity to prevent this from going\n // ahead.\n this.hideTimeout = setTimeout(() => MicroModal.close('Modal'));\n }\n\n /**\n * Clear content from the modal area.\n *\n * @protected\n */\n clear() {\n if (this.component) {\n this.component.onhide();\n }\n\n this.component = null;\n\n // app.current.retain = false;\n\n m.redraw();\n }\n\n /**\n * When the modal dialog is ready to be used, tell it!\n *\n * @protected\n */\n onready() {\n if (this.component?.onready) {\n this.component.onready();\n }\n }\n}\n","import Modal from './Modal';\nimport { ComponentProps } from '../Component';\nimport RequestError from '../utils/RequestError';\n\nexport interface RequestErrorModalProps extends ComponentProps {\n error: RequestError;\n}\n\nexport default class RequestErrorModal<T extends RequestErrorModalProps = RequestErrorModalProps> extends Modal<T> {\n className(): string {\n return 'RequestErrorModal Modal--large';\n }\n\n title(): string {\n return this.props.error.xhr ? `${this.props.error.xhr.status} ${this.props.error.xhr.statusText}` : '';\n }\n\n content() {\n let responseText;\n\n try {\n responseText = JSON.stringify(JSON.parse(this.props.error.responseText), null, 2);\n } catch (e) {\n responseText = this.props.error.responseText;\n }\n\n return (\n <div className=\"Modal-body\">\n <pre>\n {this.props.error.options.method} {this.props.error.options.url}\n <br />\n <br />\n {responseText}\n </pre>\n </div>\n );\n }\n}\n","import Mithril from 'mithril';\n\nimport Bus from './Bus';\nimport Translator from './Translator';\nimport Session from './Session';\nimport Store from './Store';\nimport { extend } from './extend';\n\nimport extract from './utils/extract';\nimport mapRoutes from './utils/mapRoutes';\nimport Drawer from './utils/Drawer';\nimport RequestError from './utils/RequestError';\n\nimport Forum from './models/Forum';\nimport Discussion from './models/Discussion';\nimport User from './models/User';\nimport Post from './models/Post';\nimport Group from './models/Group';\nimport Notification from './models/Notification';\n\nimport Alert from './components/Alert';\nimport Button from './components/Button';\nimport ModalManager from './components/ModalManager';\nimport RequestErrorModal from './components/RequestErrorModal';\n\nexport type ApplicationData = {\n apiDocument: any;\n locale: string;\n locales: any;\n resources: any[];\n session: any;\n};\n\nexport default abstract class Application {\n /**\n * The forum model for this application.\n */\n forum: Forum;\n\n data: ApplicationData;\n\n translator = new Translator();\n bus = new Bus();\n\n /**\n * The app's session.\n */\n session: Session;\n\n /**\n * The app's data store.\n */\n store = new Store({\n forums: Forum,\n users: User,\n discussions: Discussion,\n posts: Post,\n groups: Group,\n notifications: Notification,\n });\n\n drawer = new Drawer();\n\n modal: ModalManager;\n\n /**\n * A local cache that can be used to store data at the application level, so\n * that is persists between different routes.\n */\n cache = {\n notifications: null,\n };\n\n routes = {};\n\n title = '';\n titleCount = 0;\n\n /**\n * An Alert that was shown as a result of an AJAX request error. If present,\n * it will be dismissed on the next successful request.\n */\n private requestError: Alert = null;\n\n mount(basePath = '') {\n m.mount(document.getElementById('modal'), new ModalManager());\n\n // this.alerts = m.mount(document.getElementById('alerts'), <AlertManager />);\n\n m.route(document.getElementById('content'), basePath + '/', mapRoutes(this.routes, basePath));\n }\n\n boot(payload: any) {\n this.data = payload;\n\n this.store.pushPayload({ data: this.data.resources });\n\n this.forum = this.store.getById('forums', 1);\n\n this.session = new Session(this.store.getById('users', this.data.session.userId), this.data.session.csrfToken);\n\n this.locale();\n this.plugins();\n this.setupRoutes();\n this.mount();\n\n this.bus.dispatch('app.booting');\n }\n\n locale() {\n this.translator.locale = this.data.locale;\n\n this.bus.dispatch('app.locale');\n }\n\n plugins() {\n this.bus.dispatch('app.plugins');\n }\n\n setupRoutes() {\n this.bus.dispatch('app.routes');\n }\n\n /**\n * Get the API response document that has been preloaded into the application.\n */\n preloadedApiDocument() {\n if (this.data.apiDocument) {\n const results = this.store.pushPayload(this.data.apiDocument);\n\n this.data.apiDocument = null;\n\n return results;\n }\n\n return null;\n }\n\n /**\n * Set the <title> of the page.\n */\n setTitle(title: string) {\n this.title = title;\n this.updateTitle();\n }\n\n /**\n * Set a number to display in the <title> of the page.\n */\n setTitleCount(count: number) {\n this.titleCount = count;\n this.updateTitle();\n }\n\n updateTitle() {\n document.title = (this.titleCount ? `(${this.titleCount}) ` : '') + (this.title ? this.title + ' - ' : '') + this.forum.attribute('title');\n }\n\n /**\n * Construct a URL to the route with the given name.\n */\n route(name: string, params: object = {}): string {\n const route = this.routes[name];\n\n if (!route) throw new Error(`Route '${name}' does not exist`);\n\n const url = route.path.replace(/:([^\\/]+)/g, (m, key) => extract(params, key));\n const queryString = m.buildQueryString(params);\n const prefix = m.route.prefix === '' ? this.forum.attribute('basePath') : '';\n\n return prefix + url + (queryString ? '?' + queryString : '');\n }\n\n /**\n * Make an AJAX request, handling any low-level errors that may occur.\n *\n * @see https://mithril.js.org/request.html\n */\n request(originalOptions: Mithril.RequestOptions | any): Promise<any> {\n const options: Mithril.RequestOptions = Object.assign({}, originalOptions);\n\n // Set some default options if they haven't been overridden. We want to\n // authenticate all requests with the session token. We also want all\n // requests to run asynchronously in the background, so that they don't\n // prevent redraws from occurring.\n options.background = options.background || true;\n\n extend(options, 'config', (result, xhr: XMLHttpRequest) => xhr.setRequestHeader('X-CSRF-Token', this.session.csrfToken));\n\n // If the method is something like PATCH or DELETE, which not all servers\n // and clients support, then we'll send it as a POST request with the\n // intended method specified in the X-HTTP-Method-Override header.\n if (options.method !== 'GET' && options.method !== 'POST') {\n const method = options.method;\n extend(options, 'config', (result, xhr: XMLHttpRequest) => xhr.setRequestHeader('X-HTTP-Method-Override', method));\n options.method = 'POST';\n }\n\n // When we deserialize JSON data, if for some reason the server has provided\n // a dud response, we don't want the application to crash. We'll show an\n // error message to the user instead.\n options.deserialize = options.deserialize || (responseText => responseText);\n\n options.errorHandler =\n options.errorHandler ||\n (error => {\n throw error;\n });\n\n // When extracting the data from the response, we can check the server\n // response code and show an error message to the user if something's gone\n // awry.\n const original = options.extract;\n options.extract = xhr => {\n let responseText;\n\n if (original) {\n responseText = original(xhr.responseText);\n } else {\n responseText = xhr.responseText || null;\n }\n\n const status = xhr.status;\n\n if (status < 200 || status > 299) {\n throw new RequestError(status, responseText, options, xhr);\n }\n\n if (xhr.getResponseHeader) {\n const csrfToken = xhr.getResponseHeader('X-CSRF-Token');\n if (csrfToken) app.session.csrfToken = csrfToken;\n }\n\n try {\n return JSON.parse(responseText);\n } catch (e) {\n throw new RequestError(500, responseText, options, xhr);\n }\n };\n\n // TODO: ALERT MANAGER\n // if (this.requestError) this.alerts.dismiss(this.requestError.alert);\n\n // Now make the request. If it's a failure, inspect the error that was\n // returned and show an alert containing its contents.\n // const deferred = m.deferred();\n\n // return new Promise((resolve, reject) => )\n\n return m.request(options).then(\n res => res,\n error => {\n this.requestError = error;\n\n let children;\n\n switch (error.status) {\n case 422:\n children = error.response.errors\n .map(error => [error.detail, m('br')])\n .reduce((a, b) => a.concat(b), [])\n .slice(0, -1);\n break;\n\n case 401:\n case 403:\n children = this.translator.trans('core.lib.error.permission_denied_message');\n break;\n\n case 404:\n case 410:\n children = this.translator.trans('core.lib.error.not_found_message');\n break;\n\n case 429:\n children = this.translator.trans('core.lib.error.rate_limit_exceeded_message');\n break;\n\n default:\n children = this.translator.trans('core.lib.error.generic_message');\n }\n\n const isDebug = app.forum.attribute('debug');\n\n error.alert = Alert.component({\n type: 'error',\n children,\n controls: isDebug && [\n Button.component({\n className: 'Button Button--link',\n onclick: this.showDebug.bind(this, error),\n children: 'DEBUG', // TODO make translatable\n }),\n ],\n });\n\n try {\n options.errorHandler(error);\n } catch (error) {\n console.error(error);\n // this.alerts.show(error.alert);\n }\n\n return Promise.reject(error);\n }\n );\n }\n\n private showDebug(error: RequestError) {\n // this.alerts.dismiss(this.requestError.alert);\n\n this.modal.show(RequestErrorModal.component({ error }));\n }\n}\n","import { RouteDefs } from 'mithril';\n\n/**\n * The `mapRoutes` utility converts a map of named application routes into a\n * format that can be understood by Mithril.\n *\n * @see https://lhorie.github.io/mithril/mithril.route.html#defining-routes\n */\nexport default function mapRoutes(routes: object, basePath: string = ''): RouteDefs {\n const map = {};\n\n for (const key in routes) {\n const route = routes[key];\n\n if (route.component) {\n if (!route.component.attrs) route.component.attrs = {};\n route.component.attrs.routeName = key;\n }\n\n map[basePath + route.path] = route.component;\n }\n\n return map;\n}\n","export interface StackItem {\n name: string;\n title: string;\n url?: string;\n}\n\n/**\n * The `History` class keeps track and manages a stack of routes that the user\n * has navigated to in their session.\n *\n * An item can be pushed to the top of the stack using the `push` method. An\n * item in the stack has a name and a URL. The name need not be unique; if it is\n * the same as the item before it, that will be overwritten with the new URL. In\n * this way, if a user visits a discussion, and then visits another discussion,\n * popping the history stack will still take them back to the discussion list\n * rather than the previous discussion.\n */\nexport default class History {\n /**\n * The stack of routes that have been navigated to.\n */\n protected stack: StackItem[] = [];\n\n /**\n * Get the item on the top of the stack.\n */\n getCurrent(): StackItem {\n return this.stack[this.stack.length - 1];\n }\n\n /**\n * Get the previous item on the stack.\n */\n getPrevious(): StackItem {\n return this.stack[this.stack.length - 2];\n }\n\n /**\n * Push an item to the top of the stack.\n *\n * @param {String} name The name of the route.\n * @param {String} title The title of the route.\n * @param {String} [url] The URL of the route. The current URL will be used if\n * not provided.\n */\n push(name: string, title: string, url: string = m.route.get()) {\n // If we're pushing an item with the same name as second-to-top item in the\n // stack, we will assume that the user has clicked the 'back' button in\n // their browser. In this case, we don't want to push a new item, so we will\n // pop off the top item, and then the second-to-top item will be overwritten\n // below.\n const secondTop = this.stack[this.stack.length - 2];\n if (secondTop && secondTop.name === name) {\n this.stack.pop();\n }\n\n // If we're pushing an item with the same name as the top item in the stack,\n // then we'll overwrite it with the new URL.\n const top = this.getCurrent();\n if (top && top.name === name) {\n Object.assign(top, { url, title });\n } else {\n this.stack.push({ name, url, title });\n }\n }\n\n /**\n * Check whether or not the history stack is able to be popped.\n */\n canGoBack(): boolean {\n return this.stack.length > 1;\n }\n\n /**\n * Go back to the previous route in the history stack.\n */\n back() {\n if (!this.canGoBack()) {\n return this.home();\n }\n\n this.stack.pop();\n\n m.route.set(this.getCurrent().url);\n }\n\n /**\n * Get the URL of the previous page.\n */\n backUrl(): string {\n const secondTop = this.stack[this.stack.length - 2];\n\n return secondTop.url;\n }\n\n /**\n * Go to the first route in the history stack.\n */\n home() {\n this.stack.splice(0);\n\n m.route.set('/');\n }\n}\n","import Component from '../../common/Component';\nimport ItemList from '../../common/utils/ItemList';\nimport listItems from '../../common/helpers/listItems';\n\n/**\n * The `HeaderPrimary` component displays primary header controls. On the\n * default skin, these are shown just to the right of the forum title.\n */\nexport default class HeaderPrimary extends Component {\n view() {\n return <ul className=\"Header-controls\">{listItems(this.items().toArray())}</ul>;\n }\n\n /**\n * Build an item list for the controls.\n */\n items(): ItemList {\n return new ItemList();\n }\n}\n","import Component from '../../common/Component';\nimport ItemList from '../../common/utils/ItemList';\n\n/**\n * The `LogInButtons` component displays a collection of social login buttons.\n */\nexport default class LogInButtons extends Component {\n view() {\n return <div className=\"LogInButtons\">{this.items().toArray()}</div>;\n }\n\n /**\n * Build a list of LogInButton components.\n */\n items(): ItemList {\n return new ItemList();\n }\n}\n","import Stream from 'mithril/stream';\n\nimport { ComponentProps } from '../../common/Component';\nimport Modal from '../../common/components/Modal';\nimport ItemList from '../../common/utils/ItemList';\nimport Button from '../../common/components/Button';\n\nimport LogInButtons from './LogInButtons';\n\nexport interface LogInModalProps extends ComponentProps {\n identification?: string;\n password?: string;\n remember?: boolean;\n}\n\n/**\n * The `LogInModal` component displays a modal dialog with a login form.\n */\nexport default class LogInModal extends Modal<LogInModalProps> {\n /**\n * The value of the identification input.\n */\n identification: Stream<string>;\n\n /**\n * The value of the password input.\n */\n password: Stream<string>;\n\n /**\n * The value of the remember me input.\n */\n remember: Stream<string>;\n\n oninit(vnode) {\n super.oninit(vnode);\n\n this.identification = m.prop(this.props.identification || '');\n\n this.password = m.prop(this.props.password || '');\n\n this.remember = m.prop(!!this.props.remember);\n }\n\n className(): string {\n return 'LogInModal Modal--small';\n }\n\n title(): string {\n return app.translator.transText('core.forum.log_in.title');\n }\n\n content() {\n return [<div className=\"Modal-body\">{this.body()}</div>, <div className=\"Modal-footer\">{this.footer()}</div>];\n }\n\n body() {\n return [<LogInButtons />, <div className=\"Form Form--centered\">{this.fields().toArray()}</div>];\n }\n\n fields() {\n const items = new ItemList();\n\n items.add(\n 'identification',\n <div className=\"Form-group\">\n <input\n className=\"FormControl\"\n name=\"identification\"\n type=\"text\"\n placeholder={app.translator.transText('core.forum.log_in.username_or_email_placeholder')}\n bidi={this.identification}\n disabled={this.loading}\n />\n </div>,\n 30\n );\n\n items.add(\n 'password',\n <div className=\"Form-group\">\n <input\n className=\"FormControl\"\n name=\"password\"\n type=\"password\"\n placeholder={app.translator.transText('core.forum.log_in.password_placeholder')}\n bidi={this.password}\n disabled={this.loading}\n />\n </div>,\n 20\n );\n\n items.add(\n 'remember',\n <div className=\"Form-group\">\n <div>\n <label className=\"checkbox\">\n <input type=\"checkbox\" bidi={this.remember} disabled={this.loading} />\n {app.translator.trans('core.forum.log_in.remember_me_label')}\n </label>\n </div>\n </div>,\n 10\n );\n\n items.add(\n 'submit',\n <div className=\"Form-group\">\n {Button.component({\n className: 'Button Button--primary Button--block',\n type: 'submit',\n loading: this.loading,\n children: app.translator.trans('core.forum.log_in.submit_button'),\n })}\n </div>,\n -10\n );\n\n return items;\n }\n\n footer() {\n return [\n <p className=\"LogInModal-forgotPassword\">\n <a onclick={this.forgotPassword.bind(this)}>{app.translator.trans('core.forum.log_in.forgot_password_link')}</a>\n </p>,\n\n app.forum.attribute('allowSignUp') && (\n <p className=\"LogInModal-signUp\">\n {app.translator.trans('core.forum.log_in.sign_up_text', { a: <a onclick={this.signUp.bind(this)} /> })}\n </p>\n ),\n ];\n }\n\n /**\n * Open the forgot password modal, prefilling it with an email if the user has\n * entered one.\n *\n * @public\n */\n forgotPassword() {\n const email = this.identification();\n const props = email.indexOf('@') !== -1 ? { email } : undefined;\n\n app.modal.show(new ForgotPasswordModal(props));\n }\n\n /**\n * Open the sign up modal, prefilling it with an email/username/password if\n * the user has entered one.\n *\n * @public\n */\n signUp() {\n const props = { password: this.password() };\n const identification = this.identification();\n props[identification.indexOf('@') !== -1 ? 'email' : 'username'] = identification;\n\n // app.modal.show(new SignUpModal(props));\n }\n\n oncreate(vnode) {\n super.oncreate(vnode);\n\n this.$(`[name=\"${this.identification() ? 'password' : 'identification'}\"]`).select();\n }\n\n onsubmit(e) {\n e.preventDefault();\n\n this.loading = true;\n\n const identification = this.identification();\n const password = this.password();\n const remember = this.remember();\n\n app.session\n .login({ identification, password, remember }, { errorHandler: this.onerror.bind(this) })\n .then(() => window.location.reload(), this.loaded.bind(this));\n }\n\n onerror(error) {\n if (error.status === 401) {\n error.alert.attrs.children = app.translator.trans('core.forum.log_in.invalid_login_message');\n }\n\n super.onerror(error);\n }\n}\n","/**\n * The `avatar` helper displays a user's avatar.\n *\n * @param {User} user\n * @param {Object} attrs Attributes to apply to the avatar element\n * @return {Object}\n */\nexport default function avatar(user, attrs: any = {}) {\n attrs.className = 'Avatar ' + (attrs.className || '');\n let content = '';\n\n // If the `title` attribute is set to null or false, we don't want to give the\n // avatar a title. On the other hand, if it hasn't been given at all, we can\n // safely default it to the user's username.\n const hasTitle = attrs.title === 'undefined' || attrs.title;\n if (!hasTitle) delete attrs.title;\n\n // If a user has been passed, then we will set up an avatar using their\n // uploaded image, or the first letter of their username if they haven't\n // uploaded one.\n if (user) {\n const username = user.displayName() || '?';\n const avatarUrl = user.avatarUrl();\n\n if (hasTitle) attrs.title = attrs.title || username;\n\n if (avatarUrl) {\n return <img {...attrs} src={avatarUrl} />;\n }\n\n content = username.charAt(0).toUpperCase();\n attrs.style = { background: user.color() };\n }\n\n return <span {...attrs}>{content}</span>;\n}\n","import Component, { ComponentProps } from '../Component';\nimport icon from '../helpers/icon';\nimport listItems from '../helpers/listItems';\n\nexport interface DropdownProps extends ComponentProps {\n buttonClassName?: string;\n menuClassName?: string;\n label?: string;\n icon?: string;\n caretIcon?: undefined | string;\n\n onhide?: Function;\n onshow?: Function;\n onclick?: Function;\n}\n\n/**\n * The `Dropdown` component displays a button which, when clicked, shows a\n * dropdown menu beneath it.\n *\n * ### Props\n *\n * - `buttonClassName` A class name to apply to the dropdown toggle button.\n * - `menuClassName` A class name to apply to the dropdown menu.\n * - `icon` The name of an icon to show in the dropdown toggle button.\n * - `caretIcon` The name of an icon to show on the right of the button.\n * - `label` The label of the dropdown toggle button. Defaults to 'Controls'.\n * - `onhide`\n * - `onshow`\n *\n * The children will be displayed as a list inside of the dropdown menu.\n */\nexport default class Dropdown<T extends DropdownProps = DropdownProps> extends Component<T> {\n showing: boolean;\n\n static initProps(props: DropdownProps) {\n props.className = props.className || '';\n props.buttonClassName = props.buttonClassName || '';\n props.menuClassName = props.menuClassName || '';\n props.label = props.label || '';\n props.caretIcon = typeof props.caretIcon !== 'undefined' ? props.caretIcon : 'fas fa-caret-down';\n }\n\n view() {\n const items = this.props.children ? listItems(this.props.children) : [];\n\n return (\n <div className={`ButtonGroup Dropdown dropdown ${this.props.className} itemCount${items.length}${this.showing ? ' open' : ''}`}>\n {this.getButton()}\n {this.getMenu(items)}\n </div>\n );\n }\n\n oncreate(vnode) {\n super.oncreate(vnode);\n\n this.$('> .Dropdown-toggle').dropdown();\n\n // When opening the dropdown menu, work out if the menu goes beyond the\n // bottom of the viewport. If it does, we will apply class to make it show\n // above the toggle button instead of below it.\n this.element.addEventListener('shown.bs.dropdown', () => {\n this.showing = true;\n\n if (this.props.onshow) {\n this.props.onshow();\n }\n\n m.redraw();\n\n const $menu = this.$('.Dropdown-menu');\n const isRight = $menu.hasClass('Dropdown-menu--right');\n\n $menu.removeClass('Dropdown-menu--top Dropdown-menu--right');\n\n $menu.toggleClass('Dropdown-menu--top', $menu.offset().top + $menu.height() > $(window).scrollTop() + $(window).height());\n\n if ($menu.offset().top < 0) {\n $menu.removeClass('Dropdown-menu--top');\n }\n\n $menu.toggleClass('Dropdown-menu--right', isRight || $menu.offset().left + $menu.width() > $(window).scrollLeft() + $(window).width());\n });\n\n this.element.addEventListener('hidden.bs.dropdown', () => {\n this.showing = false;\n\n if (this.props.onhide) {\n this.props.onhide();\n }\n\n m.redraw();\n });\n }\n\n /**\n * Get the template for the button.\n */\n protected getButton(): any {\n return (\n <button className={'Dropdown-toggle ' + this.props.buttonClassName} data-toggle=\"dropdown\" onclick={this.props.onclick}>\n {this.getButtonContent()}\n </button>\n );\n }\n\n /**\n * Get the template for the button's content.\n *\n * @return {*}\n */\n protected getButtonContent() {\n const attrs = this.props;\n\n return [\n attrs.icon ? icon(attrs.icon, { className: 'Button-icon' }) : '',\n <span className=\"Button-label\">{attrs.label}</span>,\n attrs.caretIcon ? icon(attrs.caretIcon, { className: 'Button-caret' }) : '',\n ];\n }\n\n protected getMenu(items) {\n return <ul className={'Dropdown-menu dropdown-menu ' + this.props.menuClassName}>{items}</ul>;\n }\n}\n","import Button, { ButtonProps } from './Button';\n\ninterface LinkButtonProps extends ButtonProps {\n active: boolean;\n oncreate: Function;\n href?: string;\n}\n\n/**\n * The `LinkButton` component defines a `Button` which links to a route.\n *\n * ### Props\n *\n * All of the props accepted by `Button`, plus:\n *\n * - `active` Whether or not the page that this button links to is currently\n * active.\n * - `href` The URL to link to. If the current URL `m.route()` matches this,\n * the `active` prop will automatically be set to true.\n */\nexport default class LinkButton extends Button<LinkButtonProps> {\n static initProps(props: LinkButtonProps) {\n props.active = this.isActive(props);\n }\n\n view() {\n const vdom = super.view();\n\n vdom.tag = m.route.Link;\n vdom.attrs.active = String(vdom.attrs.active);\n\n return vdom;\n }\n\n /**\n * Determine whether a component with the given props is 'active'.\n */\n static isActive(props: LinkButtonProps): boolean {\n return typeof props.active !== 'undefined' ? props.active : m.route.get() === props.href;\n }\n}\n","import avatar from '../../common/helpers/avatar';\nimport username from '../../common/helpers/username';\nimport Dropdown from '../../common/components/Dropdown';\nimport LinkButton from '../../common/components/LinkButton';\nimport Button from '../../common/components/Button';\nimport ItemList from '../../common/utils/ItemList';\nimport Separator from '../../common/components/Separator';\nimport Group from '../../common/models/Group';\n\n/**\n * The `SessionDropdown` component shows a button with the current user's\n * avatar/name, with a dropdown of session controls.\n */\nexport default class SessionDropdown extends Dropdown {\n static initProps(props) {\n super.initProps(props);\n\n props.className = 'SessionDropdown';\n props.buttonClassName = 'Button Button--user Button--flat';\n props.menuClassName = 'Dropdown-menu--right';\n }\n\n view() {\n this.props.children = this.items().toArray();\n\n return super.view();\n }\n\n getButtonContent() {\n const user = app.session.user;\n\n return [avatar(user), ' ', <span className=\"Button-label\">{username(user)}</span>];\n }\n\n /**\n * Build an item list for the contents of the dropdown menu.\n */\n items(): ItemList {\n const items = new ItemList();\n const user = app.session.user;\n\n items.add(\n 'profile',\n LinkButton.component({\n icon: 'fas fa-user',\n children: app.translator.trans('core.forum.header.profile_button'),\n href: app.route.user(user),\n }),\n 100\n );\n\n items.add(\n 'settings',\n LinkButton.component({\n icon: 'fas fa-cog',\n children: app.translator.trans('core.forum.header.settings_button'),\n href: app.route('settings'),\n }),\n 50\n );\n\n if (app.forum.attribute('adminUrl')) {\n items.add(\n 'administration',\n LinkButton.component({\n icon: 'fas fa-wrench',\n children: app.translator.trans('core.forum.header.admin_button'),\n href: app.forum.attribute('adminUrl'),\n target: '_blank',\n }),\n 0\n );\n }\n\n items.add('separator', Separator.component(), -90);\n\n items.add(\n 'logOut',\n Button.component({\n icon: 'fas fa-sign-out-alt',\n children: app.translator.trans('core.forum.header.log_out_button'),\n onclick: app.session.logout.bind(app.session),\n }),\n -100\n );\n\n return items;\n }\n}\n","import Dropdown, { DropdownProps } from './Dropdown';\nimport icon from '../helpers/icon';\n\nexport interface SelectDropdownProps extends DropdownProps {\n defaultLabel?: string;\n}\n\n/**\n * The `SelectDropdown` component is the same as a `Dropdown`, except the toggle\n * button's label is set as the label of the first child which has a truthy\n * `active` prop.\n *\n * ### Props\n *\n * - `caretIcon`\n * - `defaultLabel`\n */\nexport default class SelectDropdown extends Dropdown<SelectDropdownProps> {\n static initProps(props: SelectDropdownProps) {\n props.caretIcon = typeof props.caretIcon !== 'undefined' ? props.caretIcon : 'fas fa-sort';\n\n super.initProps(props);\n\n props.className += ' Dropdown--select';\n }\n\n getButtonContent() {\n const activeChild = this.props.children.filter(child => child.attrs.active)[0];\n let label = (activeChild && activeChild.attrs.children) || this.props.defaultLabel;\n\n if (label instanceof Array) label = label[0];\n\n return [<span className=\"Button-label\">{label}</span>, icon(this.props.caretIcon, { className: 'Button-caret' })];\n }\n}\n","import Component from '../../common/Component';\nimport listItems from '../../common/helpers/listItems';\nimport Button from '../../common/components/Button';\nimport LoadingIndicator from '../../common/components/LoadingIndicator';\nimport Notification from '../../common/models/Notification';\nimport Discussion from '../../common/models/Discussion';\n\n/**\n * The `NotificationList` component displays a list of the logged-in user's\n * notifications, grouped by discussion.\n */\nexport default class NotificationList extends Component {\n /**\n * Whether or not the notifications are loading.\n */\n loading: boolean = false;\n\n /**\n * Whether or not there are more results that can be loaded.\n */\n moreResults: boolean = false;\n\n private $scrollParent: ZeptoCollection;\n private scrollHandler: () => void;\n\n view() {\n const pages = app.cache.notifications || [];\n\n return (\n <div className=\"NotificationList\">\n <div className=\"NotificationList-header\">\n <div className=\"App-primaryControl\">\n {Button.component({\n className: 'Button Button--icon Button--link',\n icon: 'fas fa-check',\n title: app.translator.transText('core.forum.notifications.mark_all_as_read_tooltip'),\n onclick: this.markAllAsRead.bind(this),\n })}\n </div>\n\n <h4 className=\"App-titleControl App-titleControl--text\">{app.translator.trans('core.forum.notifications.title')}</h4>\n </div>\n\n <div className=\"NotificationList-content\">\n {pages.length\n ? pages.map(notifications => {\n const groups = [];\n const discussions = {};\n\n notifications.forEach(notification => {\n const subject = notification.subject();\n\n if (typeof subject === 'undefined') return;\n\n // Get the discussion that this notification is related to. If it's not\n // directly related to a discussion, it may be related to a post or\n // other entity which is related to a discussion.\n let discussion: any = false;\n if (subject instanceof Discussion) discussion = subject;\n else if (subject && subject.discussion) discussion = subject.discussion();\n\n // If the notification is not related to a discussion directly or\n // indirectly, then we will assign it to a neutral group.\n const key = discussion ? discussion.id() : 0;\n discussions[key] = discussions[key] || { discussion: discussion, notifications: [] };\n discussions[key].notifications.push(notification);\n\n if (groups.indexOf(discussions[key]) === -1) {\n groups.push(discussions[key]);\n }\n });\n\n return groups.map(group => {\n const badges = group.discussion && group.discussion.badges().toArray();\n\n return (\n <div className=\"NotificationGroup\">\n {group.discussion ? (\n <m.route.Link className=\"NotificationGroup-header\" href={app.route.discussion(group.discussion)}>\n {badges && badges.length ? (\n <ul className=\"NotificationGroup-badges badges\">{listItems(badges)}</ul>\n ) : (\n ''\n )}\n {group.discussion.title()}\n </m.route.Link>\n ) : (\n <div className=\"NotificationGroup-header\">{app.forum.attribute('title')}</div>\n )}\n\n <ul className=\"NotificationGroup-content\">\n {group.notifications.map(notification => {\n const NotificationComponent = app.notificationComponents[notification.contentType()];\n return NotificationComponent ? <li>{NotificationComponent.component({ notification })}</li> : '';\n })}\n </ul>\n </div>\n );\n });\n })\n : ''}\n {this.loading ? (\n <LoadingIndicator className=\"LoadingIndicator--block\" />\n ) : pages.length ? (\n ''\n ) : (\n <div className=\"NotificationList-empty\">{app.translator.trans('core.forum.notifications.empty_text')}</div>\n )}\n </div>\n </div>\n );\n }\n\n oncreate(vnode) {\n super.oncreate(vnode);\n\n const $notifications = this.$('.NotificationList-content');\n const $scrollParent = (this.$scrollParent = $notifications.css('overflow') === 'auto' ? $notifications : $(window));\n\n this.scrollHandler = () => {\n const scrollTop = $scrollParent.scrollTop();\n const viewportHeight = $scrollParent.height();\n const contentTop = $scrollParent === $notifications ? 0 : $notifications.offset().top;\n const contentHeight = $notifications[0].scrollHeight;\n\n if (this.moreResults && !this.loading && scrollTop + viewportHeight >= contentTop + contentHeight) {\n this.loadMore();\n }\n };\n\n $scrollParent.on('scroll', this.scrollHandler);\n }\n\n onremove(vnode) {\n super.onremove(vnode);\n\n this.$scrollParent.off('scroll', this.scrollHandler);\n }\n\n /**\n * Load notifications into the application's cache if they haven't already\n * been loaded.\n */\n load() {\n if (app.session.user.newNotificationCount()) {\n delete app.cache.notifications;\n }\n\n if (app.cache.notifications) {\n return;\n }\n\n app.session.user.pushAttributes({ newNotificationCount: 0 });\n\n this.loadMore();\n }\n\n /**\n * Load the next page of notification results.\n */\n loadMore() {\n this.loading = true;\n m.redraw();\n\n const params = app.cache.notifications ? { page: { offset: app.cache.notifications.length * 10 } } : null;\n\n return app.store\n .find<Notification>('notifications', params)\n .then(this.parseResults.bind(this))\n .catch(() => {})\n .then(() => {\n this.loading = false;\n m.redraw();\n });\n }\n\n /**\n * Parse results and append them to the notification list.\n */\n parseResults(results: Notification[]): Notification[] {\n app.cache.notifications = app.cache.notifications || [];\n\n if (results.length) app.cache.notifications.push(results);\n\n this.moreResults = !!results.payload.links.next;\n\n return results;\n }\n\n /**\n * Mark all of the notifications as read.\n */\n markAllAsRead() {\n if (!app.cache.notifications) return;\n\n app.session.user.pushAttributes({ unreadNotificationCount: 0 });\n\n app.cache.notifications.forEach(notifications => {\n notifications.forEach(notification => notification.pushAttributes({ isRead: true }));\n });\n\n app.request({\n url: `${app.forum.attribute('apiUrl')}/notifications/read`,\n method: 'POST',\n });\n }\n}\n","import Dropdown from '../../common/components/Dropdown';\nimport icon from '../../common/helpers/icon';\nimport NotificationList from './NotificationList';\n\nexport default class NotificationsDropdown extends Dropdown {\n list = new NotificationList();\n\n static initProps(props) {\n props.className = props.className || 'NotificationsDropdown';\n props.buttonClassName = props.buttonClassName || 'Button Button--flat';\n props.menuClassName = props.menuClassName || 'Dropdown-menu--right';\n props.label = props.label || app.translator.trans('core.forum.notifications.tooltip');\n props.icon = props.icon || 'fas fa-bell';\n\n super.initProps(props);\n }\n\n getButton() {\n const newNotifications = this.getNewCount();\n const vdom = super.getButton();\n\n vdom.attrs.title = this.props.label;\n\n vdom.attrs.className += newNotifications ? ' new' : '';\n vdom.attrs.onclick = this.onclick.bind(this);\n\n return vdom;\n }\n\n getButtonContent() {\n const unread = this.getUnreadCount();\n\n return [\n icon(this.props.icon, { className: 'Button-icon' }),\n unread ? <span className=\"NotificationsDropdown-unread\">{unread}</span> : '',\n <span className=\"Button-label\">{this.props.label}</span>,\n ];\n }\n\n getMenu() {\n return (\n <div className={'Dropdown-menu ' + this.props.menuClassName} onclick={this.menuClick.bind(this)}>\n {this.showing ? m(this.list) : ''}\n </div>\n );\n }\n\n onclick() {\n if (app.drawer.isOpen()) {\n this.goToRoute();\n } else {\n this.list.load();\n }\n }\n\n goToRoute() {\n m.route.set(app.route('notifications'));\n }\n\n getUnreadCount() {\n return app.session.user.unreadNotificationCount();\n }\n\n getNewCount() {\n return app.session.user.newNotificationCount();\n }\n\n menuClick(e) {\n // Don't close the notifications dropdown if the user is opening a link in a\n // new tab or window.\n if (e.shiftKey || e.metaKey || e.ctrlKey || e.which === 2) e.stopPropagation();\n }\n}\n","export type KeyboardEventCallback = (KeyboardEvent) => boolean | void;\n\n/**\n * The `KeyboardNavigatable` class manages lists that can be navigated with the\n * keyboard, calling callbacks for each actions.\n *\n * This helper encapsulates the key binding logic, providing a simple fluent\n * API for use.\n */\nexport default class KeyboardNavigatable {\n /**\n * Callback to be executed for a specified input.\n *\n * @callback KeyboardNavigatable~keyCallback\n * @param {KeyboardEvent} event\n * @returns {boolean}\n */\n callbacks: { [key: number]: KeyboardEventCallback } = {};\n\n // By default, always handle keyboard navigation.\n whenCallback: KeyboardEventCallback = () => true;\n\n /**\n * Provide a callback to be executed when navigating upwards.\n *\n * This will be triggered by the Up key.\n */\n onUp(callback: KeyboardEventCallback): this {\n this.callbacks[38] = e => {\n e.preventDefault();\n callback(e);\n };\n\n return this;\n }\n\n /**\n * Provide a callback to be executed when navigating downwards.\n *\n * This will be triggered by the Down key.\n */\n onDown(callback: KeyboardEventCallback): this {\n this.callbacks[40] = e => {\n e.preventDefault();\n callback(e);\n };\n\n return this;\n }\n\n /**\n * Provide a callback to be executed when the current item is selected..\n *\n * This will be triggered by the Return and Tab keys..\n */\n onSelect(callback: KeyboardEventCallback): this {\n this.callbacks[9] = this.callbacks[13] = e => {\n e.preventDefault();\n callback(e);\n };\n\n return this;\n }\n\n /**\n * Provide a callback to be executed when the navigation is canceled.\n *\n * This will be triggered by the Escape key.\n */\n onCancel(callback: Function): this {\n this.callbacks[27] = e => {\n e.stopPropagation();\n e.preventDefault();\n callback(e);\n };\n\n return this;\n }\n\n /**\n * Provide a callback to be executed when previous input is removed.\n *\n * This will be triggered by the Backspace key.\n */\n onRemove(callback: Function): this {\n this.callbacks[8] = e => {\n if (e.target.selectionStart === 0 && e.target.selectionEnd === 0) {\n callback(e);\n e.preventDefault();\n }\n };\n\n return this;\n }\n\n /**\n * Provide a callback that determines whether keyboard input should be handled.\n */\n when(callback: KeyboardEventCallback): this {\n this.whenCallback = callback;\n\n return this;\n }\n\n /**\n * Set up the navigation key bindings on the given jQuery element.\n */\n bindTo($element: any) {\n // Handle navigation key events on the navigatable element.\n $element.on('keydown', this.navigate.bind(this));\n }\n\n /**\n * Interpret the given keyboard event as navigation commands.\n */\n navigate(event: KeyboardEvent) {\n // This callback determines whether keyboard should be handled or ignored.\n if (!this.whenCallback(event)) return;\n\n const keyCallback = this.callbacks[event.which];\n if (keyCallback) {\n keyCallback(event);\n }\n }\n}\n","import { truncate } from '../utils/string';\n\n/**\n * The `highlight` helper searches for a word phrase in a string, and wraps\n * matches with the <mark> tag.\n *\n * @param {String} string The string to highlight.\n * @param {String|RegExp} phrase The word or words to highlight.\n * @param {Integer} [length] The number of characters to truncate the string to.\n * The string will be truncated surrounding the first match.\n */\nexport default function highlight(string: string, phrase: string | RegExp, length?: number): any {\n if (!phrase && !length) return string;\n\n // Convert the word phrase into a global regular expression (if it isn't\n // already) so we can search the string for matched.\n const regexp = phrase instanceof RegExp ? phrase : new RegExp(phrase, 'gi');\n\n let highlighted = string;\n let start = 0;\n\n // If a length was given, the truncate the string surrounding the first match.\n if (length) {\n if (phrase) start = Math.max(0, string.search(regexp) - length / 2);\n\n highlighted = truncate(highlighted, length, start);\n }\n\n // Convert the string into HTML entities, then highlight all matches with\n // <mark> tags. Then we will return the result as a trusted HTML string.\n highlighted = $('<div/>')\n .text(highlighted)\n .html();\n\n if (phrase) highlighted = highlighted.replace(regexp, '<mark>$&</mark>');\n\n return m.trust(highlighted);\n}\n","export default abstract class SearchSource {\n abstract view(vnode: string);\n\n abstract search(query: string);\n}\n","import highlight from '../../common/helpers/highlight';\nimport LinkButton from '../../common/components/LinkButton';\nimport SearchSource from './SearchSource';\nimport Discussion from '../../common/models/Discussion';\n\n/**\n * The `DiscussionsSearchSource` finds and displays discussion search results in\n * the search dropdown.\n */\nexport default class DiscussionsSearchSource extends SearchSource {\n protected results: { [key: string]: Discussion[] } = {};\n\n search(query: string) {\n query = query.toLowerCase();\n\n this.results[query] = [];\n\n const params = {\n filter: { q: query },\n page: { limit: 3 },\n include: 'mostRelevantPost',\n };\n\n return app.store.find<Discussion>('discussions', params).then(results => (this.results[query] = results));\n }\n\n view(query: string) {\n query = query.toLowerCase();\n\n const results = this.results[query] || [];\n\n return [\n <li className=\"Dropdown-header\">{app.translator.trans('core.forum.search.discussions_heading')}</li>,\n <li>\n {LinkButton.component({\n icon: 'fas fa-search',\n children: app.translator.trans('core.forum.search.all_discussions_button', { query }),\n href: app.route('index', { q: query }),\n })}\n </li>,\n results.map(discussion => {\n const mostRelevantPost = discussion.mostRelevantPost();\n\n return (\n <li className=\"DiscussionSearchResult\" data-index={'discussions' + discussion.id()}>\n <m.route.Link href={app.route.discussion(discussion, mostRelevantPost && mostRelevantPost.number())}>\n <div className=\"DiscussionSearchResult-title\">{highlight(discussion.title(), query)}</div>\n {mostRelevantPost ? (\n <div className=\"DiscussionSearchResult-excerpt\">{highlight(mostRelevantPost.contentPlain(), query, 100)}</div>\n ) : (\n ''\n )}\n </m.route.Link>\n </li>\n );\n }),\n ];\n }\n}\n","import highlight from '../../common/helpers/highlight';\nimport avatar from '../../common/helpers/avatar';\nimport username from '../../common/helpers/username';\nimport SearchSource from './SearchSource';\nimport User from '../../common/models/User';\n\n/**\n * The `UsersSearchSource` finds and displays user search results in the search\n * dropdown.\n *\n * @implements SearchSource\n */\nexport default class UsersSearchSource extends SearchSource {\n protected results: { [key: string]: User[] } = {};\n\n search(query: string) {\n return app.store\n .find<User>('users', {\n filter: { q: query },\n page: { limit: 5 },\n })\n .then(results => {\n this.results[query] = results;\n m.redraw();\n });\n }\n\n view(query: string) {\n query = query.toLowerCase();\n\n const results = (this.results[query] || [])\n .concat(\n app.store\n .all<User>('users')\n .filter(user => [user.username(), user.displayName()].some(value => value.toLowerCase().substr(0, query.length) === query))\n )\n .filter((e, i, arr) => arr.lastIndexOf(e) === i)\n .sort((a, b) => a.displayName().localeCompare(b.displayName()));\n\n if (!results.length) return '';\n\n return [\n <li className=\"Dropdown-header\">{app.translator.trans('core.forum.search.users_heading')}</li>,\n results.map(user => {\n const name = username(user);\n\n if (!name.children) {\n name.children = [name.text];\n delete name.text;\n }\n\n name.children[0] = highlight(name.children[0], query);\n\n return (\n <li className=\"UserSearchResult\" data-index={'users' + user.id()}>\n <m.route.Link href={app.route.user(user)}>\n {avatar(user)}\n {name}\n </m.route.Link>\n </li>\n );\n }),\n ];\n }\n}\n","import Component from '../../common/Component';\nimport LoadingIndicator from '../../common/components/LoadingIndicator';\nimport ItemList from '../../common/utils/ItemList';\nimport KeyboardNavigatable from '../utils/KeyboardNavigatable';\nimport icon from '../../common/helpers/icon';\nimport DiscussionsSearchSource from './DiscussionsSearchSource';\nimport UsersSearchSource from './UsersSearchSource';\nimport SearchSource from './SearchSource';\n\nimport Stream from 'mithril/stream';\n\n/**\n * The `Search` component displays a menu of as-you-type results from a variety\n * of sources.\n *\n * The search box will be 'activated' if the app's current controller implements\n * a `searching` method that returns a truthy value. If this is the case, an 'x'\n * button will be shown next to the search field, and clicking it will call the\n * `clearSearch` method on the controller.\n */\nexport default class Search extends Component {\n /**\n * The value of the search input.\n */\n value: Stream<string> = m.prop('');\n\n /**\n * Whether or not the search input has focus.\n */\n hasFocus: boolean = false;\n\n /**\n * An array of SearchSources.\n */\n sources: SearchSource[] = null;\n\n /**\n * The number of sources that are still loading results.\n */\n loadingSources = 0;\n\n /**\n * A list of queries that have been searched for.\n */\n searched: string[] = [];\n\n /**\n * The index of the currently-selected <li> in the results list. This can be\n * a unique string (to account for the fact that an item's position may jump\n * around as new results load), but otherwise it will be numeric (the\n * sequential position within the list).\n */\n index: string | number = 0;\n\n navigator: KeyboardNavigatable;\n\n searchTimeout: number;\n\n view() {\n const currentSearch = this.getCurrentSearch();\n\n // Initialize search input value in the view rather than the constructor so\n // that we have access to app.current.\n if (typeof this.value() === 'undefined') {\n this.value(currentSearch || '');\n }\n\n // Initialize search sources in the view rather than the constructor so\n // that we have access to app.forum.\n if (!this.sources) {\n this.sources = this.sourceItems().toArray();\n }\n\n // Hide the search view if no sources were loaded\n if (!this.sources.length) return <div />;\n\n return (\n <div\n className={\n 'Search ' +\n classNames({\n open: this.value() && this.hasFocus,\n focused: this.hasFocus,\n active: !!currentSearch,\n loading: !!this.loadingSources,\n })\n }\n >\n <div className=\"Search-input\">\n <input\n className=\"FormControl\"\n type=\"search\"\n placeholder={app.translator.transText('core.forum.header.search_placeholder')}\n value={this.value()}\n oninput={m.withAttr('value', this.value)}\n onfocus={() => (this.hasFocus = true)}\n onblur={() => (this.hasFocus = false)}\n />\n {this.loadingSources ? (\n LoadingIndicator.component({ size: 'tiny', className: 'Button Button--icon Button--link' })\n ) : currentSearch ? (\n <button className=\"Search-clear Button Button--icon Button--link\" onclick={this.clear.bind(this)}>\n {icon('fas fa-times-circle')}\n </button>\n ) : (\n ''\n )}\n </div>\n <ul className=\"Dropdown-menu Search-results\">\n {this.value() && this.hasFocus ? this.sources.map(source => source.view(this.value())) : ''}\n </ul>\n </div>\n );\n }\n\n oncreate(vnode) {\n super.oncreate(vnode);\n\n // Highlight the item that is currently selected.\n this.setIndex(this.getCurrentNumericIndex());\n\n const search = this;\n\n this.$('.Search-results')\n .on('mousedown', e => e.preventDefault())\n .on('click', () => this.$('input').blur())\n\n // Whenever the mouse is hovered over a search result, highlight it.\n .on('mouseenter', '> li:not(.Dropdown-header)', function() {\n search.setIndex(search.selectableItems().index(this));\n });\n\n const $input = this.$('input');\n\n this.navigator = new KeyboardNavigatable();\n\n this.navigator\n .onUp(() => this.setIndex(this.getCurrentNumericIndex() - 1, true))\n .onDown(() => this.setIndex(this.getCurrentNumericIndex() + 1, true))\n .onSelect(this.selectResult.bind(this))\n .onCancel(this.clear.bind(this))\n .bindTo($input);\n\n // Handle input key events on the search input, triggering results to load.\n $input\n .on('input focus', function() {\n const query = this.value.toLowerCase();\n\n if (!query) return;\n\n clearTimeout(search.searchTimeout);\n search.searchTimeout = setTimeout(() => {\n if (search.searched.indexOf(query) !== -1) return;\n\n if (query.length >= 3) {\n search.sources.map(source => {\n if (!source.search) return;\n\n search.loadingSources++;\n\n source.search(query).then(() => {\n search.loadingSources = Math.max(0, search.loadingSources - 1);\n m.redraw();\n });\n });\n }\n\n search.searched.push(query);\n m.redraw();\n }, 250);\n })\n\n .on('focus', function() {\n $(this)\n .one('mouseup', e => e.preventDefault())\n .select();\n });\n }\n\n /**\n * Get the active search in the app's current controller.\n *\n * @return {String}\n */\n getCurrentSearch() {\n return app.current && typeof app.current.searching === 'function' && app.current.searching();\n }\n\n /**\n * Navigate to the currently selected search result and close the list.\n */\n selectResult() {\n clearTimeout(this.searchTimeout);\n this.loadingSources = 0;\n\n if (this.value()) {\n m.route.set(\n this.getItem(this.index)\n .find('a')\n .attr('href')\n );\n } else {\n this.clear();\n }\n\n this.$('input').blur();\n }\n\n /**\n * Clear the search input and the current controller's active search.\n */\n clear() {\n this.value('');\n\n if (this.getCurrentSearch()) {\n app.current.clearSearch();\n } else {\n m.redraw();\n }\n }\n\n /**\n * Build an item list of SearchSources.\n *\n * @return {ItemList}\n */\n sourceItems() {\n const items = new ItemList();\n\n if (app.forum.attribute('canViewDiscussions')) items.add('discussions', new DiscussionsSearchSource());\n if (app.forum.attribute('canViewUserList')) items.add('users', new UsersSearchSource());\n\n return items;\n }\n\n /**\n * Get all of the search result items that are selectable.\n *\n * @return {jQuery}\n */\n selectableItems() {\n return this.$('.Search-results > li:not(.Dropdown-header)');\n }\n\n /**\n * Get the position of the currently selected search result item.\n *\n * @return {Integer}\n */\n getCurrentNumericIndex() {\n return this.selectableItems().index(this.getItem(this.index));\n }\n\n /**\n * Get the <li> in the search results with the given index (numeric or named).\n *\n * @param {String} index\n * @return {DOMElement}\n */\n getItem(index) {\n const $items = this.selectableItems();\n let $item = $items.filter(`[data-index=\"${index}\"]`);\n\n if (!$item.length) {\n $item = $items.eq(index);\n }\n\n return $item;\n }\n\n /**\n * Set the currently-selected search result item to the one with the given\n * index.\n *\n * @param index\n * @param scrollToItem Whether or not to scroll the dropdown so that\n * the item is in view.\n */\n setIndex(index: number, scrollToItem?: boolean) {\n const $items = this.selectableItems();\n const $dropdown = $items.parent();\n\n let fixedIndex = index;\n if (index < 0) {\n fixedIndex = $items.length - 1;\n } else if (index >= $items.length) {\n fixedIndex = 0;\n }\n\n const $item = $items\n .removeClass('active')\n .eq(fixedIndex)\n .addClass('active');\n\n this.index = $item.attr('data-index') || fixedIndex;\n\n if (scrollToItem) {\n const dropdownScroll = $dropdown.scrollTop();\n const dropdownTop = $dropdown.offset().top;\n const dropdownBottom = dropdownTop + $dropdown.outerHeight();\n const itemTop = $item.offset().top;\n const itemBottom = itemTop + $item.outerHeight();\n\n let scrollTop;\n if (itemTop < dropdownTop) {\n scrollTop = dropdownScroll - dropdownTop + itemTop - parseInt($dropdown.css('padding-top'), 10);\n } else if (itemBottom > dropdownBottom) {\n scrollTop = dropdownScroll - dropdownBottom + itemBottom + parseInt($dropdown.css('padding-bottom'), 10);\n }\n\n if (typeof scrollTop !== 'undefined') {\n $dropdown.animate({ scrollTop }, 100);\n }\n }\n }\n}\n","import Component from '../../common/Component';\nimport Button from '../../common/components/Button';\nimport LogInModal from './LogInModal';\n// import SignUpModal from './SignUpModal';\nimport SessionDropdown from './SessionDropdown';\nimport SelectDropdown from '../../common/components/SelectDropdown';\nimport NotificationsDropdown from './NotificationsDropdown';\nimport ItemList from '../../common/utils/ItemList';\nimport listItems from '../../common/helpers/listItems';\n\nimport Search from './Search';\n\n/**\n * The `HeaderSecondary` component displays secondary header controls, such as\n * the search box and the user menu. On the default skin, these are shown on the\n * right side of the header.\n */\nexport default class HeaderSecondary extends Component {\n view() {\n return <ul className=\"Header-controls\">{listItems(this.items().toArray())}</ul>;\n }\n\n /**\n * Build an item list for the controls.\n */\n items(): ItemList {\n const items = new ItemList();\n\n items.add('search', Search.component(), 30);\n\n if (app.forum.attribute('showLanguageSelector') && Object.keys(app.data.locales).length > 1) {\n const locales = [];\n\n for (const locale in app.data.locales) {\n locales.push(\n Button.component({\n active: app.data.locale === locale,\n children: app.data.locales[locale],\n icon: app.data.locale === locale ? 'fas fa-check' : true,\n onclick: () => {\n if (app.session.user) {\n app.session.user.savePreferences({ locale }).then(() => window.location.reload());\n } else {\n document.cookie = `locale=${locale}; path=/; expires=Tue, 19 Jan 2038 03:14:07 GMT`;\n window.location.reload();\n }\n },\n })\n );\n }\n\n items.add(\n 'locale',\n SelectDropdown.component({\n children: locales,\n buttonClassName: 'Button Button--link',\n }),\n 20\n );\n }\n\n if (app.session.user) {\n items.add('notifications', NotificationsDropdown.component(), 10);\n items.add('session', SessionDropdown.component(), 0);\n } else {\n if (app.forum.attribute('allowSignUp')) {\n items.add(\n 'signUp',\n Button.component({\n children: app.translator.trans('core.forum.header.sign_up_link'),\n className: 'Button Button--link',\n onclick: () => app.modal.show(new SignUpModal()),\n }),\n 10\n );\n }\n\n items.add(\n 'logIn',\n Button.component({\n children: app.translator.trans('core.forum.header.log_in_link'),\n className: 'Button Button--link',\n onclick: () => app.modal.show(new LogInModal()),\n }),\n 0\n );\n }\n\n return items;\n }\n}\n","import Component from '../../common/Component';\n\nexport default class IndexPage extends Component {\n oninit() {\n console.log('IndexPage#oninit');\n }\n\n view() {\n return (\n <div class=\"container\">\n <h1>hi</h1>\n </div>\n );\n }\n}\n","import Component from '../../common/Component';\n\n/**\n * The `Page` component\n */\nexport default abstract class Page extends Component {\n /**\n * A class name to apply to the body while the route is active.\n */\n bodyClass: string = '';\n\n oninit(vnode) {\n super.oninit(vnode);\n\n if (this.bodyClass) {\n $('#app').addClass(this.bodyClass);\n }\n }\n\n oncreate(vnode) {\n super.oncreate(vnode);\n\n app.previous = app.current;\n app.current = this;\n\n app.drawer.hide();\n app.modal.close();\n }\n\n onremove(vnode) {\n super.onremove(vnode);\n\n $('#app').removeClass(this.bodyClass);\n }\n}\n","/**\n * Setup the sidebar DOM element to be affixed to the top of the viewport\n * using hcSticky.\n */\nexport default function affixSidebar(vnode) {\n const element = vnode.dom;\n const $sidebar = $(element);\n const $header = $('#header');\n const $affixElement = $sidebar.find('> ul')[0];\n\n $(window).off('.affix');\n\n new hcSticky($affixElement, {\n stickTo: element,\n top: $header.outerHeight(true) + parseInt($sidebar.css('margin-top'), 10),\n });\n}\n","/**\n * The `humanTime` utility converts a date to a localized, human-readable time-\n * ago string.\n */\nexport default function humanTime(time: Date): string {\n let m = dayjs(time);\n const now = dayjs();\n\n // To prevent showing things like \"in a few seconds\" due to small offsets\n // between client and server time, we always reset future dates to the\n // current time. This will result in \"just now\" being shown instead.\n if (m.isAfter(now)) {\n m = now;\n }\n\n const day = 864e5;\n const diff = m.diff(dayjs());\n let ago = null;\n\n // If this date was more than a month ago, we'll show the name of the month\n // in the string. If it wasn't this year, we'll show the year as well.\n if (diff < -30 * day) {\n if (m.year() === dayjs().year()) {\n ago = m.format('D MMM');\n } else {\n ago = m.format(\"MMM 'YY\");\n }\n } else {\n ago = m.fromNow();\n }\n\n return ago;\n}\n","import Alert from '../../common/components/Alert';\nimport Button from '../../common/components/Button';\nimport Separator from '../../common/components/Separator';\n// import EditUserModal from '../components/EditUserModal';\nimport UserPage from '../components/UserPage';\nimport ItemList from '../../common/utils/ItemList';\nimport User from '../../common/models/User';\n\n/**\n * The `UserControls` utility constructs a list of buttons for a user which\n * perform actions on it.\n */\nexport default {\n /**\n * Get a list of controls for a user.\n *\n * @param user\n * @param context The parent component under which the controls menu will\n * be displayed.\n */\n controls(user: User, context: any): ItemList {\n const items = new ItemList();\n\n ['user', 'moderation', 'destructive'].forEach(section => {\n const controls = this[section + 'Controls'](user, context).toArray();\n if (controls.length) {\n controls.forEach(item => items.add(item.itemName, item));\n items.add(section + 'Separator', Separator.component());\n }\n });\n\n return items;\n },\n\n /**\n * Get controls for a user pertaining to the current user (e.g. poke, follow).\n */\n userControls(): ItemList {\n return new ItemList();\n },\n\n /**\n * Get controls for a user pertaining to moderation (e.g. suspend, edit).\n */\n moderationControls(user: User): ItemList {\n const items = new ItemList();\n\n if (user.canEdit()) {\n items.add(\n 'edit',\n Button.component({\n icon: 'fas fa-pencil-alt',\n children: app.translator.trans('core.forum.user_controls.edit_button'),\n onclick: this.editAction.bind(this, user),\n })\n );\n }\n\n return items;\n },\n\n /**\n * Get controls for a user which are destructive (e.g. delete).\n */\n destructiveControls(user: User): ItemList {\n const items = new ItemList();\n\n if (user.id() !== '1' && user.canDelete()) {\n items.add(\n 'delete',\n Button.component({\n icon: 'fas fa-times',\n children: app.translator.trans('core.forum.user_controls.delete_button'),\n onclick: this.deleteAction.bind(this, user),\n })\n );\n }\n\n return items;\n },\n\n /**\n * Delete the user.\n */\n deleteAction(user: User) {\n if (!confirm(app.translator.transText('core.forum.user_controls.delete_confirmation'))) {\n return;\n }\n\n user.delete()\n .then(() => {\n this.showDeletionAlert(user, 'success');\n if (app.current instanceof UserPage && app.current.user === user) {\n app.history.back();\n } else {\n window.location.reload();\n }\n })\n .catch(() => this.showDeletionAlert(user, 'error'));\n },\n\n /**\n * Show deletion alert of user.\n */\n showDeletionAlert(user: User, type: string) {\n const { username, email } = user.data.attributes;\n const message = `core.forum.user_controls.delete_${type}_message`;\n\n app.alerts.show(\n Alert.component({\n type,\n children: app.translator.trans(message, { username, email }),\n })\n );\n },\n\n /**\n * Edit the user.\n */\n editAction(user: User) {\n app.modal.show(new EditUserModal({ user }));\n },\n};\n","import Component, { ComponentProps } from '../../common/Component';\nimport avatar from '../../common/helpers/avatar';\nimport icon from '../../common/helpers/icon';\nimport listItems from '../../common/helpers/listItems';\nimport ItemList from '../../common/utils/ItemList';\nimport Button from '../../common/components/Button';\nimport LoadingIndicator from '../../common/components/LoadingIndicator';\nimport User from '../../common/models/User';\n\nexport interface AvatarEditorProps extends ComponentProps {\n user: User;\n}\n\n/**\n * The `AvatarEditor` component displays a user's avatar along with a dropdown\n * menu which allows the user to upload/remove the avatar.\n */\nexport default class AvatarEditor extends Component<AvatarEditorProps> {\n /**\n * Whether or not an avatar upload is in progress.\n */\n loading = false;\n\n /**\n * Whether or not an image has been dragged over the dropzone.\n */\n isDraggedOver = false;\n\n static initProps(props) {\n super.initProps(props);\n\n props.className = props.className || '';\n }\n\n view() {\n const user = this.props.user;\n\n return (\n <div\n className={\n 'AvatarEditor Dropdown ' + this.props.className + (this.loading ? ' loading' : '') + (this.isDraggedOver ? ' dragover' : '')\n }\n >\n {avatar(user)}\n <a\n className={user.avatarUrl() ? 'Dropdown-toggle' : 'Dropdown-toggle AvatarEditor--noAvatar'}\n title={app.translator.trans('core.forum.user.avatar_upload_tooltip')}\n data-toggle=\"dropdown\"\n onclick={this.quickUpload.bind(this)}\n ondragover={this.enableDragover.bind(this)}\n ondragenter={this.enableDragover.bind(this)}\n ondragleave={this.disableDragover.bind(this)}\n ondragend={this.disableDragover.bind(this)}\n ondrop={this.dropUpload.bind(this)}\n >\n {this.loading ? LoadingIndicator.component() : user.avatarUrl() ? icon('fas fa-pencil-alt') : icon('fas fa-plus-circle')}\n </a>\n <ul className=\"Dropdown-menu Menu\">{listItems(this.controlItems().toArray())}</ul>\n </div>\n );\n }\n\n /**\n * Get the items in the edit avatar dropdown menu.\n *\n * @return {ItemList}\n */\n controlItems() {\n const items = new ItemList();\n\n items.add(\n 'upload',\n Button.component({\n icon: 'fas fa-upload',\n children: app.translator.trans('core.forum.user.avatar_upload_button'),\n onclick: this.openPicker.bind(this),\n })\n );\n\n items.add(\n 'remove',\n Button.component({\n icon: 'fas fa-times',\n children: app.translator.trans('core.forum.user.avatar_remove_button'),\n onclick: this.remove.bind(this),\n })\n );\n\n return items;\n }\n\n /**\n * Enable dragover style\n *\n * @param {Event} e\n */\n enableDragover(e) {\n e.preventDefault();\n e.stopPropagation();\n this.isDraggedOver = true;\n }\n\n /**\n * Disable dragover style\n *\n * @param {Event} e\n */\n disableDragover(e) {\n e.preventDefault();\n e.stopPropagation();\n this.isDraggedOver = false;\n }\n\n /**\n * Upload avatar when file is dropped into dropzone.\n *\n * @param {Event} e\n */\n dropUpload(e) {\n e.preventDefault();\n e.stopPropagation();\n this.isDraggedOver = false;\n this.upload(e.dataTransfer.files[0]);\n }\n\n /**\n * If the user doesn't have an avatar, there's no point in showing the\n * controls dropdown, because only one option would be viable: uploading.\n * Thus, when the avatar editor's dropdown toggle button is clicked, we prompt\n * the user to upload an avatar immediately.\n *\n * @param {Event} e\n */\n quickUpload(e) {\n if (!this.props.user.avatarUrl()) {\n e.preventDefault();\n e.stopPropagation();\n this.openPicker();\n }\n }\n\n /**\n * Upload avatar using file picker\n */\n openPicker() {\n if (this.loading) return;\n\n // Create a hidden HTML input element and click on it so the user can select\n // an avatar file. Once they have, we will upload it via the API.\n const user = this.props.user;\n const $input = $('<input type=\"file\">');\n\n $input\n .appendTo('body')\n .hide()\n .click()\n .on('change', e => {\n this.upload($(e.target)[0].files[0]);\n });\n }\n\n /**\n * Upload avatar\n *\n * @param {File} file\n */\n upload(file) {\n if (this.loading) return;\n\n const user = this.props.user;\n const body = new FormData();\n data.append('avatar', file);\n\n this.loading = true;\n m.redraw();\n\n app.request({\n method: 'POST',\n url: `${app.forum.attribute('apiUrl')}/users/${user.id()}/avatar`,\n serialize: raw => raw,\n body,\n }).then(this.success.bind(this), this.failure.bind(this));\n }\n\n /**\n * Remove the user's avatar.\n */\n remove() {\n const user = this.props.user;\n\n this.loading = true;\n m.redraw();\n\n app.request({\n method: 'DELETE',\n url: `${app.forum.attribute('apiUrl')}/users/${user.id()}/avatar`,\n }).then(this.success.bind(this), this.failure.bind(this));\n }\n\n /**\n * After a successful upload/removal, push the updated user data into the\n * store, and force a recomputation of the user's avatar color.\n *\n * @param {Object} response\n * @protected\n */\n success(response) {\n app.store.pushPayload(response);\n delete this.props.user.avatarColor;\n\n this.loading = false;\n m.redraw();\n }\n\n /**\n * If avatar upload/removal fails, stop loading.\n *\n * @param {Object} response\n * @protected\n */\n failure(response) {\n this.loading = false;\n m.redraw();\n }\n}\n","import Component, { ComponentProps } from '../../common/Component';\nimport humanTime from '../../common/utils/humanTime';\nimport ItemList from '../../common/utils/ItemList';\nimport UserControls from '../utils/UserControls';\nimport avatar from '../../common/helpers/avatar';\nimport username from '../../common/helpers/username';\nimport icon from '../../common/helpers/icon';\nimport Dropdown from '../../common/components/Dropdown';\nimport AvatarEditor from './AvatarEditor';\nimport listItems from '../../common/helpers/listItems';\nimport User from '../../common/models/User';\n\nexport interface UserCardProps extends ComponentProps {\n user: User;\n editable: boolean;\n controlsButtonClassName: string;\n}\n\n/**\n * The `UserCard` component displays a user's profile card. This is used both on\n * the `UserPage` (in the hero) and in discussions, shown when hovering over a\n * post author.\n */\nexport default class UserCard extends Component<UserCardProps> {\n view() {\n const user = this.props.user;\n const controls = UserControls.controls(user, this).toArray();\n const color = user.color();\n const badges = user.badges().toArray();\n\n return (\n <div className={'UserCard ' + (this.props.className || '')} style={color ? { backgroundColor: color } : ''}>\n <div className=\"darkenBackground\">\n <div className=\"container\">\n {controls.length\n ? Dropdown.component({\n children: controls,\n className: 'UserCard-controls App-primaryControl',\n menuClassName: 'Dropdown-menu--right',\n buttonClassName: this.props.controlsButtonClassName,\n label: app.translator.trans('core.forum.user_controls.button'),\n icon: 'fas fa-ellipsis-v',\n })\n : ''}\n\n <div className=\"UserCard-profile\">\n <h2 className=\"UserCard-identity\">\n {this.props.editable ? (\n [AvatarEditor.component({ user, className: 'UserCard-avatar' }), username(user)]\n ) : (\n <m.route.Link href={app.route.user(user)}>\n <div className=\"UserCard-avatar\">{avatar(user)}</div>\n {username(user)}\n </m.route.Link>\n )}\n </h2>\n\n {badges.length ? <ul className=\"UserCard-badges badges\">{listItems(badges)}</ul> : ''}\n\n <ul className=\"UserCard-info\">{listItems(this.infoItems().toArray())}</ul>\n </div>\n </div>\n </div>\n </div>\n );\n }\n\n /**\n * Build an item list of tidbits of info to show on this user's profile.\n *\n * @return {ItemList}\n */\n infoItems() {\n const items = new ItemList();\n const user = this.props.user;\n const lastSeenAt = user.lastSeenAt();\n\n if (lastSeenAt) {\n const online = user.isOnline();\n\n items.add(\n 'lastSeen',\n <span className={'UserCard-lastSeen' + (online ? ' online' : '')}>\n {online\n ? [icon('fas fa-circle'), ' ', app.translator.trans('core.forum.user.online_text')]\n : [icon('far fa-clock'), ' ', humanTime(lastSeenAt)]}\n </span>\n );\n }\n\n items.add('joined', app.translator.trans('core.forum.user.joined_date_text', { ago: humanTime(user.joinTime()) }));\n\n return items;\n }\n}\n","import Page from './Page';\nimport ItemList from '../../common/utils/ItemList';\nimport affixSidebar from '../utils/affixSidebar';\nimport UserCard from './UserCard';\nimport LoadingIndicator from '../../common/components/LoadingIndicator';\nimport SelectDropdown from '../../common/components/SelectDropdown';\nimport LinkButton from '../../common/components/LinkButton';\nimport Separator from '../../common/components/Separator';\nimport listItems from '../../common/helpers/listItems';\n\nimport User from '../../common/models/User';\n\n/**\n * The `UserPage` component shows a user's profile. It can be extended to show\n * content inside of the content area. See `ActivityPage` and `SettingsPage` for\n * examples.\n */\nexport default abstract class UserPage extends Page {\n /**\n * The user this page is for.\n */\n user: User;\n bodyClass: string = 'App--user';\n\n /**\n * The username of the currently loaded user\n */\n username: string;\n\n view() {\n return (\n <div className=\"UserPage\">\n {this.user\n ? [\n UserCard.component({\n user: this.user,\n className: 'Hero UserHero',\n editable: this.user.canEdit() || this.user === app.session.user,\n controlsButtonClassName: 'Button',\n }),\n <div className=\"container\">\n <div className=\"sideNavContainer\">\n <nav className=\"sideNav UserPage-nav\" config={affixSidebar}>\n <ul>{listItems(this.sidebarItems().toArray())}</ul>\n </nav>\n <div className=\"sideNavOffset UserPage-content\">{this.content()}</div>\n </div>\n </div>,\n ]\n : [LoadingIndicator.component({ lassName: 'LoadingIndicator--block' })]}\n </div>\n );\n }\n\n /**\n * Get the content to display in the user page.\n */\n abstract content();\n\n /**\n * Initialize the component with a user, and trigger the loading of their\n * activity feed.\n */\n protected show(user: User) {\n this.user = user;\n\n app.setTitle(user.displayName());\n\n m.redraw();\n }\n\n /**\n * Given a username, load the user's profile from the store, or make a request\n * if we don't have it yet. Then initialize the profile page with that user.\n */\n loadUser(username: string) {\n const lowercaseUsername = username.toLowerCase();\n\n // Load the preloaded user object, if any, into the global app store\n // We don't use the output of the method because it returns raw JSON\n // instead of the parsed models\n app.preloadedApiDocument();\n\n if (lowercaseUsername == this.username) return;\n\n this.username = lowercaseUsername;\n\n app.store.all<User>('users').some(user => {\n if ((user.username().toLowerCase() === lowercaseUsername || user.id() === username) && user.joinTime()) {\n this.show(user);\n return true;\n }\n });\n\n if (!this.user) {\n app.store.find('users', username).then(this.show.bind(this));\n }\n }\n\n /**\n * Build an item list for the content of the sidebar.\n */\n sidebarItems() {\n const items = new ItemList();\n\n items.add(\n 'nav',\n SelectDropdown.component({\n children: this.navItems().toArray(),\n className: 'App-titleControl',\n buttonClassName: 'Button',\n })\n );\n\n return items;\n }\n\n /**\n * Build an item list for the navigation in the sidebar.\n */\n navItems() {\n const items = new ItemList();\n const user = this.user;\n\n items.add(\n 'posts',\n LinkButton.component({\n href: app.route('user.posts', { username: user.username() }),\n children: [app.translator.trans('core.forum.user.posts_link'), <span className=\"Button-badge\">{user.commentCount()}</span>],\n icon: 'far fa-comment',\n }),\n 100\n );\n\n items.add(\n 'discussions',\n LinkButton.component({\n href: app.route('user.discussions', { username: user.username() }),\n children: [app.translator.trans('core.forum.user.discussions_link'), <span className=\"Button-badge\">{user.discussionCount()}</span>],\n icon: 'fas fa-bars',\n }),\n 90\n );\n\n if (app.session.user === user) {\n items.add('separator', Separator.component(), -90);\n items.add(\n 'settings',\n LinkButton.component({\n href: app.route('settings'),\n children: app.translator.trans('core.forum.user.settings_link'),\n icon: 'fas fa-cog',\n }),\n -100\n );\n }\n\n return items;\n }\n}\n","import Component, { ComponentProps } from '../Component';\n\nexport interface PlaceholderProps extends ComponentProps {\n text: string;\n}\n\n/**\n * The `Placeholder` component displays a muted text with some call to action,\n * usually used as an empty state.\n */\nexport default class Placeholder extends Component<PlaceholderProps> {\n view() {\n return (\n <div className=\"Placeholder\">\n <p>{this.props.text}</p>\n </div>\n );\n }\n}\n","import { Vnode } from 'mithril';\n\n// import EditPostComposer from '../components/EditPostComposer';\nimport Button from '../../common/components/Button';\nimport Separator from '../../common/components/Separator';\nimport ItemList from '../../common/utils/ItemList';\nimport Post from '../../common/models/Post';\nimport PostComponent from '../../forum/components/Post';\n\n/**\n * The `PostControls` utility constructs a list of buttons for a post which\n * perform actions on it.\n */\nexport default {\n /**\n * Get a list of controls for a post.\n *\n * @param {Post} post\n * @param {*} context The parent component under which the controls menu will\n * be displayed.\n * @public\n */\n controls(post: Post, context) {\n const items = new ItemList();\n\n ['user', 'moderation', 'destructive'].forEach(section => {\n const controls = this[section + 'Controls'](post, context).toArray();\n\n if (controls.length) {\n controls.forEach(item => items.add(item.itemName, item));\n items.add(section + 'Separator', Separator.component());\n }\n });\n\n return items;\n },\n\n /**\n * Get controls for a post pertaining to the current user (e.g. report).\n *\n * @param {Post} post\n * @param {*} context The parent component under which the controls menu will\n * be displayed.\n * @protected\n */\n userControls(post: Post, context) {\n return new ItemList();\n },\n\n /**\n * Get controls for a post pertaining to moderation (e.g. edit).\n *\n * @param {Post} post\n * @param {*} context The parent component under which the controls menu will\n * be displayed.\n * @protected\n */\n moderationControls(post: Post, context) {\n const items = new ItemList();\n\n if (post.contentType() === 'comment' && post.canEdit()) {\n if (!post.isHidden()) {\n items.add(\n 'edit',\n Button.component(\n {\n icon: 'fas fa-pencil-alt',\n onclick: this.editAction.bind(post),\n },\n app.translator.trans('core.forum.post_controls.edit_button')\n )\n );\n }\n }\n\n return items;\n },\n\n /**\n * Get controls for a post that are destructive (e.g. delete).\n *\n * @param {Post} post\n * @param {*} context The parent component under which the controls menu will\n * be displayed.\n * @protected\n */\n destructiveControls(post: Post, context) {\n const items = new ItemList();\n\n if (post.contentType() === 'comment' && !post.isHidden()) {\n if (post.canHide()) {\n items.add(\n 'hide',\n Button.component({\n icon: 'far fa-trash-alt',\n children: app.translator.trans('core.forum.post_controls.delete_button'),\n onclick: this.hideAction.bind(post),\n })\n );\n }\n } else {\n if (post.contentType() === 'comment' && post.canHide()) {\n items.add(\n 'restore',\n Button.component({\n icon: 'fas fa-reply',\n children: app.translator.trans('core.forum.post_controls.restore_button'),\n onclick: this.restoreAction.bind(post),\n })\n );\n }\n if (post.canDelete()) {\n items.add(\n 'delete',\n Button.component({\n icon: 'fas fa-times',\n children: app.translator.trans('core.forum.post_controls.delete_forever_button'),\n onclick: this.deleteAction.bind(post, context),\n })\n );\n }\n }\n\n return items;\n },\n\n /**\n * Open the composer to edit a post.\n */\n editAction(this: Post) {\n return new Promise<EditPostComposer>(resolve => {\n const component = new EditPostComposer({ post: this });\n\n app.composer.load(component);\n app.composer.show();\n\n resolve(component);\n });\n },\n\n /**\n * Hide a post.\n */\n hideAction(this: Post) {\n this.pushAttributes({ hiddenAt: new Date(), hiddenUser: app.session.user });\n\n return this.save({ isHidden: true }).then(() => m.redraw());\n },\n\n /**\n * Restore a post.\n */\n restoreAction(this: Post) {\n this.pushAttributes({ hiddenAt: null, hiddenUser: null });\n\n return this.save({ isHidden: false }).then(() => m.redraw());\n },\n\n /**\n * Delete a post.\n */\n deleteAction(this: Post, context: PostComponent) {\n if (context) context.loading = true;\n\n return this.delete()\n .then(() => {\n const discussion = this.discussion();\n\n discussion.removePost(this.id());\n\n // If this was the last post in the discussion, then we will assume that\n // the whole discussion was deleted too.\n if (!discussion.postIds().length) {\n // If there is a discussion list in the cache, remove this discussion.\n if (app.cache.discussionList) {\n app.cache.discussionList.removeDiscussion(discussion);\n }\n\n if (app.viewingDiscussion(discussion)) {\n app.history.back();\n }\n }\n })\n .catch(() => {})\n .then(() => {\n if (context) context.loading = false;\n m.redraw();\n });\n },\n};\n","export default class SubtreeRetainer {\n callbacks: Function[];\n data = {};\n\n constructor(...callbacks: Function[]) {\n this.callbacks = callbacks;\n }\n\n check(...callbacks: Function[]) {\n this.callbacks.concat(...callbacks);\n }\n\n /**\n * Return whether the component should redraw.\n */\n update(): boolean {\n let update = false;\n\n this.callbacks.forEach((callback, i) => {\n const result = callback();\n\n if (result !== this.data[i]) {\n this.data[i] = result;\n update = true;\n }\n });\n\n return update;\n }\n}\n","import Component, { ComponentProps } from '../../common/Component';\nimport Dropdown from '../../common/components/Dropdown';\nimport PostControls from '../utils/PostControls';\nimport listItems from '../../common/helpers/listItems';\nimport ItemList from '../../common/utils/ItemList';\nimport SubtreeRetainer from '../../common/utils/SubtreeRetainer';\nimport PostModel from '../../common/models/Post';\n\nexport interface PostProps extends ComponentProps {\n post: PostModel;\n}\n\n/**\n * The `Post` component displays a single post. The basic post template just\n * includes a controls dropdown; subclasses must implement `content` and `attrs`\n * methods.\n *\n * @abstract\n */\nexport default class Post<T extends PostProps = PostProps> extends Component<PostProps> {\n loading = false;\n controlsOpen = false;\n\n subtree: SubtreeRetainer;\n\n oninit(vnode) {\n super.oninit(vnode);\n\n /**\n * Set up a subtree retainer so that the post will not be redrawn\n * unless new data comes in.\n */\n this.subtree = new SubtreeRetainer(\n () => this.props.post.freshness,\n () => {\n const user = this.props.post.user();\n return user?.freshness;\n },\n () => this.controlsOpen\n );\n }\n\n view() {\n const controls = PostControls.controls(this.props.post, this).toArray();\n const attrs = this.attrs();\n\n attrs.className = classNames(this.classes(attrs.className));\n\n return (\n <article {...attrs}>\n <div>\n {this.content()}\n <aside className=\"Post-actions\">\n <ul>\n {listItems(this.actionItems().toArray())}\n {controls.length ? (\n <li>\n <Dropdown\n className=\"Post-controls\"\n buttonClassName=\"Button Button--icon Button--flat\"\n menuClassName=\"Dropdown-menu--right\"\n icon=\"fas fa-ellipsis-h\"\n onshow={() => this.$('.Post-actions').addClass('open')}\n onhide={() => this.$('.Post-actions').removeClass('open')}\n >\n {controls}\n </Dropdown>\n </li>\n ) : (\n ''\n )}\n </ul>\n </aside>\n <footer className=\"Post-footer\">\n <ul>{listItems(this.footerItems().toArray())}</ul>\n </footer>\n </div>\n );\n </article>\n );\n }\n\n onbeforeupdate(vnode) {\n super.onbeforeupdate(vnode);\n\n return this.subtree.update();\n }\n\n oncreate(vnode) {\n super.oncreate(vnode);\n\n const $actions = this.$('.Post-actions');\n const $controls = this.$('.Post-controls');\n\n $actions.toggleClass('open', $controls.hasClass('open'));\n }\n\n /**\n * Get attributes for the post element.\n */\n attrs(): ComponentProps {\n return {};\n }\n\n /**\n * Get the post's content.\n */\n content() {\n return [];\n }\n\n classes(existing) {\n let classes = (existing || '').split(' ').concat(['Post']);\n\n if (this.loading) {\n classes.push('Post--loading');\n }\n\n if (this.props.post.user() === app.session.user) {\n classes.push('Post--by-actor');\n }\n\n return classes;\n }\n\n /**\n * Build an item list for the post's actions.\n */\n actionItems() {\n return new ItemList();\n }\n\n /**\n * Build an item list for the post's footer.\n */\n footerItems() {\n return new ItemList();\n }\n}\n","import Component from '../../common/Component';\nimport UserCard from './UserCard';\nimport avatar from '../../common/helpers/avatar';\nimport username from '../../common/helpers/username';\nimport userOnline from '../../common/helpers/userOnline';\nimport listItems from '../../common/helpers/listItems';\nimport { PostProps } from './Post';\nimport LinkButton from '../../common/components/LinkButton';\n\n/**\n * The `PostUser` component shows the avatar and username of a post's author.\n */\nexport default class PostUser extends Component<PostProps> {\n /**\n * Whether or not the user hover card is visible.\n */\n cardVisible = false;\n\n view() {\n const post = this.props.post;\n const user = post.user();\n\n if (!user) {\n return (\n <div className=\"PostUser\">\n <h3>\n {avatar(user, { className: 'PostUser-avatar' })} {username(user)}\n </h3>\n </div>\n );\n }\n\n let card = '';\n\n if (!post.isHidden() && this.cardVisible) {\n card = UserCard.component({\n user,\n className: 'UserCard--popover',\n controlsButtonClassName: 'Button Button--icon Button--flat',\n });\n }\n\n return (\n <div className=\"PostUser\">\n <h3>\n <LinkButton href={app.route.user(user)}>\n {avatar(user, { className: 'PostUser-avatar' })}\n {userOnline(user)}\n {username(user)}\n </LinkButton>\n </h3>\n <ul className=\"PostUser-badges badges\">{listItems(user.badges().toArray())}</ul>\n {card}\n </div>\n );\n }\n\n oncreate(vnode) {\n super.oncreate(vnode);\n\n let timeout;\n\n this.$()\n .on('mouseover', 'h3 a, .UserCard', () => {\n clearTimeout(timeout);\n timeout = setTimeout(this.showCard.bind(this), 500);\n })\n .on('mouseout', 'h3 a, .UserCard', () => {\n clearTimeout(timeout);\n timeout = setTimeout(this.hideCard.bind(this), 250);\n });\n }\n\n /**\n * Show the user card.\n */\n showCard() {\n this.cardVisible = true;\n\n m.redraw();\n\n setTimeout(() => this.$('.UserCard').addClass('in'));\n }\n\n /**\n * Hide the user card.\n */\n hideCard() {\n this.$('.UserCard')\n .removeClass('in')\n .one('transitionend webkitTransitionEnd oTransitionEnd', () => {\n this.cardVisible = false;\n m.redraw();\n });\n }\n}\n","import icon from './icon';\nimport User from '../models/User';\n\n/**\n * The `useronline` helper displays a green circle if the user is online\n *\n * @param {User} user\n * @return {Object}\n */\nexport default function userOnline(user: User) {\n if (user.lastSeenAt() && user.isOnline()) {\n return <span className=\"UserOnline\">{icon('fas fa-circle')}</span>;\n }\n}\n","import Post from './Post';\nimport PostUser from './PostUser';\n// import PostMeta from './PostMeta';\n// import PostEdited from './PostEdited';\n// import EditPostComposer from './EditPostComposer';\nimport ItemList from '../../common/utils/ItemList';\nimport listItems from '../../common/helpers/listItems';\nimport Button from '../../common/components/Button';\n\n/**\n * The `CommentPost` component displays a standard `comment`-typed post. This\n * includes a number of item lists (controls, header, and footer) surrounding\n * the post's HTML content.\n */\nexport default class CommentPost extends Post {\n /**\n * If the post has been hidden, then this flag determines whether or not its\n * content has been expanded.\n */\n revealContent: boolean = false;\n\n postUser: PostUser;\n\n oninit(vnode) {\n super.oninit(vnode);\n\n // Create an instance of the component that displays the post's author so\n // that we can force the post to rerender when the user card is shown.\n this.postUser = PostUser.component({ post: this.props.post });\n\n this.subtree.check(\n () => this.postUser.cardVisible,\n () => this.isEditing()\n );\n }\n\n content() {\n // Note: we avoid using JSX for the <ul> below because it results in some\n // weirdness in Mithril.js 0.1.x (see flarum/core#975). This workaround can\n // be reverted when we upgrade to Mithril 1.0.\n return super\n .content()\n .concat([\n <header className=\"Post-header\">{m('ul', listItems(this.headerItems().toArray()))}</header>,\n <div className=\"Post-body\">\n {this.isEditing() ? (\n <div className=\"Post-preview\" config={this.configPreview.bind(this)} />\n ) : (\n m.trust(this.props.post.contentHtml())\n )}\n </div>,\n ]);\n }\n\n onupdate(vnode) {\n super.onupdate(vnode);\n\n const contentHtml = this.isEditing() ? '' : this.props.post.contentHtml();\n\n // TODO: idk what this is supposed to be\n\n // If the post content has changed since the last render, we'll run through\n // all of the <script> tags in the content and evaluate them. This is\n // necessary because TextFormatter outputs them for e.g. syntax highlighting.\n if (vnode.contentHtml !== contentHtml) {\n this.$('.Post-body script').each(function() {\n eval.call(window, $(this).text());\n });\n }\n\n vnode.contentHtml = contentHtml;\n }\n\n isEditing() {\n return false; // TODO\n // return app.composer?.component instanceof EditPostComposer &&\n // app.composer.component.props.post === this.props.post;\n }\n\n attrs() {\n const post = this.props.post;\n const attrs = super.attrs();\n\n attrs.className =\n (attrs.className || '') +\n ' ' +\n classNames({\n CommentPost: true,\n 'Post--hidden': post.isHidden(),\n 'Post--edited': post.isEdited(),\n revealContent: this.revealContent,\n editing: this.isEditing(),\n });\n\n return attrs;\n }\n\n // TODO change so it works\n configPreview(element, isInitialized, context) {\n if (isInitialized) return;\n\n // Every 50ms, if the composer content has changed, then update the post's\n // body with a preview.\n let preview;\n const updatePreview = () => {\n const content = app.composer.component.content();\n\n if (preview === content) return;\n\n preview = content;\n\n s9e.TextFormatter.preview(preview || '', element);\n };\n updatePreview();\n\n const updateInterval = setInterval(updatePreview, 50);\n context.onunload = () => clearInterval(updateInterval);\n }\n\n /**\n * Toggle the visibility of a hidden post's content.\n */\n toggleContent() {\n this.revealContent = !this.revealContent;\n }\n\n /**\n * Build an item list for the post's header.\n *\n * @return {ItemList}\n */\n headerItems() {\n const items = new ItemList();\n const post = this.props.post;\n const props = { post };\n\n items.add('user', this.postUser, 100);\n // items.add('meta', PostMeta.component(props));\n\n if (post.isEdited() && !post.isHidden()) {\n items.add('edited', PostEdited.component(props));\n }\n\n // If the post is hidden, add a button that allows toggling the visibility\n // of the post's content.\n if (post.isHidden()) {\n items.add(\n 'toggle',\n Button.component({\n className: 'Button Button--default Button--more',\n icon: 'fas fa-ellipsis-h',\n onclick: this.toggleContent.bind(this),\n })\n );\n }\n\n return items;\n }\n}\n","import UserPage from './UserPage';\nimport LoadingIndicator from '../../common/components/LoadingIndicator';\nimport Button from '../../common/components/Button';\nimport Placeholder from '../../common/components/Placeholder';\nimport CommentPost from './CommentPost';\nimport Post from '../../common/models/Post';\n\n/**\n * The `PostsUserPage` component shows a user's activity feed inside of their\n * profile.\n */\nexport default class PostsUserPage extends UserPage {\n /**\n * Whether or not the activity feed is currently loading.\n */\n loading = true;\n\n /**\n * Whether or not there are any more activity items that can be loaded.\n */\n moreResults = false;\n\n /**\n * The Post models in the feed.\n */\n posts: Post[] = [];\n\n /**\n * The number of activity items to load per request.\n */\n loadLimit = 20;\n\n oninit(vnode) {\n super.oninit(vnode);\n\n this.loadUser(vnode.attrs.username);\n }\n\n onupdate(vnode) {\n super.onupdate(vnode);\n\n this.loadUser(vnode.attrs.username);\n }\n\n content() {\n if (this.posts.length === 0 && !this.loading) {\n return (\n <div className=\"PostsUserPage\">\n <Placeholder text={app.translator.trans('core.forum.user.posts_empty_text')} />\n </div>\n );\n }\n\n let footer;\n\n if (this.loading) {\n footer = LoadingIndicator.component();\n } else if (this.moreResults) {\n footer = (\n <div className=\"PostsUserPage-loadMore\">\n {Button.component({\n children: app.translator.trans('core.forum.user.posts_load_more_button'),\n className: 'Button',\n onclick: this.loadMore.bind(this),\n })}\n </div>\n );\n }\n\n return (\n <div className=\"PostsUserPage\">\n <ul className=\"PostsUserPage-list\">\n {this.posts.map(post => (\n <li>\n <div className=\"PostsUserPage-discussion\">\n {app.translator.trans('core.forum.user.in_discussion_text', {\n discussion: <m.route.Link href={app.route.post(post)}>{post.discussion().title()}</m.route.Link>,\n })}\n </div>\n {CommentPost.component({ post })}\n </li>\n ))}\n </ul>\n <div className=\"PostsUserPage-loadMore\">{footer}</div>\n </div>\n );\n }\n\n /**\n * Initialize the component with a user, and trigger the loading of their\n * activity feed.\n */\n show(user) {\n super.show(user);\n\n this.refresh();\n }\n\n /**\n * Clear and reload the user's activity feed.\n */\n refresh() {\n this.loading = true;\n this.posts = [];\n\n m.redraw();\n\n this.loadResults().then(this.parseResults.bind(this));\n }\n\n /**\n * Load a new page of the user's activity feed.\n *\n * @param offset The position to start getting results from.\n */\n protected loadResults(offset?: number): Promise<Post[]> {\n return app.store.find<Post>('posts', {\n filter: {\n user: this.user.id(),\n type: 'comment',\n },\n page: { offset, limit: this.loadLimit },\n sort: '-createdAt',\n });\n }\n\n /**\n * Load the next page of results.\n */\n loadMore() {\n this.loading = true;\n this.loadResults(this.posts.length).then(this.parseResults.bind(this));\n }\n\n /**\n * Parse results and append them to the activity feed.\n */\n parseResults(results: Post[]): Post[] {\n this.loading = false;\n\n [].push.apply(this.posts, results);\n\n this.moreResults = results.length >= this.loadLimit;\n m.redraw();\n\n return results;\n }\n}\n","import Application from '../common/Application';\nimport History from './utils/History';\n\nimport HeaderPrimary from './components/HeaderPrimary';\nimport HeaderSecondary from './components/HeaderSecondary';\n\nimport Page from './components/Page';\nimport IndexPage from './components/IndexPage';\nimport PostsUserPage from './components/PostsUserPage';\nimport User from '../common/models/User';\nimport Post from '../common/models/Post';\nimport Discussion from '../common/models/Discussion';\n\nexport default class Forum extends Application {\n routes = {\n index: { path: '/all', component: IndexPage },\n\n discussion: { path: '/d/:id', component: IndexPage },\n 'discussion.near': { path: '/d/:id/:near', component: IndexPage },\n\n user: { path: '/u/:username', component: PostsUserPage },\n 'user.posts': { path: '/u/:username', component: PostsUserPage },\n 'user.discussions': { path: '/u/:username/discussions', component: PostsUserPage },\n\n settings: { path: '/settings', component: PostsUserPage },\n\n 'index.filter': { path: '/:filter', component: IndexPage },\n };\n\n /**\n * The app's history stack, which keeps track of which routes the user visits\n * so that they can easily navigate back to the previous route.\n */\n history: History = new History();\n\n previous: Page;\n current: Page;\n\n mount() {\n // Get the configured default route and update that route's path to be '/'.\n // Push the homepage as the first route, so that the user will always be\n // able to click on the 'back' button to go home, regardless of which page\n // they started on.\n const defaultRoute = this.forum.attribute('defaultRoute');\n let defaultAction = 'index';\n\n for (const i in this.routes) {\n if (this.routes[i].path === defaultRoute) defaultAction = i;\n }\n\n this.routes[defaultAction].path = '/';\n this.history.push(defaultAction, this.translator.transText('core.forum.header.back_to_index_tooltip'), '/');\n\n // m.mount(document.getElementById('app-navigation'), Navigation.component({className: 'App-backControl', drawer: true}));\n // m.mount(document.getElementById('header-navigation'), Navigation.component());\n m.mount(document.getElementById('header-primary'), new HeaderPrimary());\n m.mount(document.getElementById('header-secondary'), new HeaderSecondary());\n\n // this.pane = new Pane(document.getElementById('app'));\n // this.composer = m.mount(document.getElementById('composer'), Composer.component());\n\n m.route.prefix = '';\n super.mount(this.forum.attribute('basePath'));\n\n // alertEmailConfirmation(this);\n\n // Route the home link back home when clicked. We do not want it to register\n // if the user is opening it in a new tab, however.\n $('#home-link').click((e: MouseEvent) => {\n if (e.ctrlKey || e.metaKey || e.which === 2) return;\n e.preventDefault();\n app.history.home();\n\n // Reload the current user so that their unread notification count is refreshed.\n if (app.session.user) {\n app.store.find('users', app.session.user.id());\n m.redraw();\n }\n });\n }\n\n setupRoutes() {\n super.setupRoutes();\n\n this.route.discussion = (discussion: Discussion, near?: number): string => {\n const slug = discussion.slug();\n return this.route(near && near !== 1 ? 'discussion.near' : 'discussion', {\n id: discussion.id() + (slug.trim() ? '-' + slug : ''),\n near: near && near !== 1 ? near : undefined,\n });\n };\n\n /**\n * Generate a URL to a post.\n */\n this.route.post = (post: Post): string => {\n return this.route.discussion(post.discussion(), post.number());\n };\n\n /**\n * Generate a URL to a user.\n */\n this.route.user = (user: User): string => {\n return this.route('user', {\n username: user.username(),\n });\n };\n }\n}\n","import * as extend from './extend';\n\nimport Modal from './components/Modal';\n\nexport default {\n extend: extend,\n\n 'components/Modal': Modal,\n};\n","import compat from '../common/compat';\n\nimport Forum from './Forum';\n\nimport IndexPage from './components/IndexPage';\n\nexport default Object.assign(compat, {\n 'components/IndexPage': IndexPage,\n Forum: Forum,\n}) as any;\n","import Forum from './Forum';\n\nconst app = new Forum();\n\n// @ts-ignore\nwindow.app = app;\n\napp.bus.subscribe('app.plugins', () => {\n // @ts-ignore\n const extensions = flarum.extensions;\n\n Object.keys(extensions).forEach(name => {\n const extension = extensions[name];\n\n // if (typeof extension === 'function') extension();\n });\n});\n\nexport { app };\n\n// Export compat API\nimport compat from './compat';\n\ncompat.app = app;\n\nexport { compat };\n","/*\n * This file is part of Flarum.\n *\n * (c) Toby Zerner <toby.zerner@gmail.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nexport * from './src/common';\nexport * from './src/forum';\n"],"sourceRoot":""} \ No newline at end of file diff --git a/js/forum.ts b/js/forum.ts index 90811e4b9..4fa6e4729 100644 --- a/js/forum.ts +++ b/js/forum.ts @@ -8,4 +8,4 @@ */ export * from './src/common'; -export * from './src/forum'; \ No newline at end of file +export * from './src/forum'; diff --git a/js/package.json b/js/package.json index 587a820c2..8328d5180 100644 --- a/js/package.json +++ b/js/package.json @@ -27,7 +27,7 @@ "scripts": { "dev": "webpack --mode development --watch", "build": "webpack --mode production", - "lint": "prettier --single-quote --trailing-comma es5 --print-width 150 --tab-width 4 --write \"src/**/*\"" + "lint": "prettier --single-quote --trailing-comma es5 --print-width 150 --tab-width 4 --write \"src/**/*\" \"*.{ts,js}\"" }, "devDependencies": { "@types/classnames": "^2.2.9", diff --git a/js/shims.d.ts b/js/shims.d.ts index 107f7980d..74c8ff14d 100644 --- a/js/shims.d.ts +++ b/js/shims.d.ts @@ -3,5 +3,5 @@ import 'flarum-webpack-config/shims'; import Forum from './src/forum/Forum'; declare global { - const app: Forum; + const app: Forum; } diff --git a/js/src/common/Application.ts b/js/src/common/Application.ts index 2ee00b658..4b281d2d6 100644 --- a/js/src/common/Application.ts +++ b/js/src/common/Application.ts @@ -4,7 +4,7 @@ import Bus from './Bus'; import Translator from './Translator'; import Session from './Session'; import Store from './Store'; -import {extend} from './extend'; +import { extend } from './extend'; import extract from './utils/extract'; import mapRoutes from './utils/mapRoutes'; @@ -56,7 +56,7 @@ export default abstract class Application { discussions: Discussion, posts: Post, groups: Group, - notifications: Notification + notifications: Notification, }); drawer = new Drawer(); @@ -97,10 +97,7 @@ export default abstract class Application { this.forum = this.store.getById('forums', 1); - this.session = new Session( - this.store.getById('users', this.data.session.userId), - this.data.session.csrfToken - ); + this.session = new Session(this.store.getById('users', this.data.session.userId), this.data.session.csrfToken); this.locale(); this.plugins(); @@ -128,15 +125,15 @@ export default abstract class Application { * Get the API response document that has been preloaded into the application. */ preloadedApiDocument() { - if (this.data.apiDocument) { - const results = this.store.pushPayload(this.data.apiDocument); + if (this.data.apiDocument) { + const results = this.store.pushPayload(this.data.apiDocument); - this.data.apiDocument = null; + this.data.apiDocument = null; - return results; - } + return results; + } - return null; + return null; } /** @@ -156,9 +153,7 @@ export default abstract class Application { } updateTitle() { - document.title = (this.titleCount ? `(${this.titleCount}) ` : '') + - (this.title ? this.title + ' - ' : '') + - this.forum.attribute('title'); + document.title = (this.titleCount ? `(${this.titleCount}) ` : '') + (this.title ? this.title + ' - ' : '') + this.forum.attribute('title'); } /** @@ -181,135 +176,139 @@ export default abstract class Application { * * @see https://mithril.js.org/request.html */ - request(originalOptions: Mithril.RequestOptions|any): Promise<any> { - const options: Mithril.RequestOptions = Object.assign({}, originalOptions); + request(originalOptions: Mithril.RequestOptions | any): Promise<any> { + const options: Mithril.RequestOptions = Object.assign({}, originalOptions); - // Set some default options if they haven't been overridden. We want to - // authenticate all requests with the session token. We also want all - // requests to run asynchronously in the background, so that they don't - // prevent redraws from occurring. - options.background = options.background || true; + // Set some default options if they haven't been overridden. We want to + // authenticate all requests with the session token. We also want all + // requests to run asynchronously in the background, so that they don't + // prevent redraws from occurring. + options.background = options.background || true; - extend(options, 'config', (result, xhr: XMLHttpRequest) => xhr.setRequestHeader('X-CSRF-Token', this.session.csrfToken)); + extend(options, 'config', (result, xhr: XMLHttpRequest) => xhr.setRequestHeader('X-CSRF-Token', this.session.csrfToken)); - // If the method is something like PATCH or DELETE, which not all servers - // and clients support, then we'll send it as a POST request with the - // intended method specified in the X-HTTP-Method-Override header. - if (options.method !== 'GET' && options.method !== 'POST') { - const method = options.method; - extend(options, 'config', (result, xhr: XMLHttpRequest) => xhr.setRequestHeader('X-HTTP-Method-Override', method)); - options.method = 'POST'; - } - - // When we deserialize JSON data, if for some reason the server has provided - // a dud response, we don't want the application to crash. We'll show an - // error message to the user instead. - options.deserialize = options.deserialize || (responseText => responseText); - - options.errorHandler = options.errorHandler || (error => { - throw error; - }); - - // When extracting the data from the response, we can check the server - // response code and show an error message to the user if something's gone - // awry. - const original = options.extract; - options.extract = xhr => { - let responseText; - - if (original) { - responseText = original(xhr.responseText); - } else { - responseText = xhr.responseText || null; + // If the method is something like PATCH or DELETE, which not all servers + // and clients support, then we'll send it as a POST request with the + // intended method specified in the X-HTTP-Method-Override header. + if (options.method !== 'GET' && options.method !== 'POST') { + const method = options.method; + extend(options, 'config', (result, xhr: XMLHttpRequest) => xhr.setRequestHeader('X-HTTP-Method-Override', method)); + options.method = 'POST'; } - const status = xhr.status; + // When we deserialize JSON data, if for some reason the server has provided + // a dud response, we don't want the application to crash. We'll show an + // error message to the user instead. + options.deserialize = options.deserialize || (responseText => responseText); - if (status < 200 || status > 299) { - throw new RequestError(status, responseText, options, xhr); - } + options.errorHandler = + options.errorHandler || + (error => { + throw error; + }); - if (xhr.getResponseHeader) { - const csrfToken = xhr.getResponseHeader('X-CSRF-Token'); - if (csrfToken) app.session.csrfToken = csrfToken; - } + // When extracting the data from the response, we can check the server + // response code and show an error message to the user if something's gone + // awry. + const original = options.extract; + options.extract = xhr => { + let responseText; - try { - return JSON.parse(responseText); - } catch (e) { - throw new RequestError(500, responseText, options, xhr); - } - }; + if (original) { + responseText = original(xhr.responseText); + } else { + responseText = xhr.responseText || null; + } - // TODO: ALERT MANAGER - // if (this.requestError) this.alerts.dismiss(this.requestError.alert); + const status = xhr.status; - // Now make the request. If it's a failure, inspect the error that was - // returned and show an alert containing its contents. - // const deferred = m.deferred(); + if (status < 200 || status > 299) { + throw new RequestError(status, responseText, options, xhr); + } - // return new Promise((resolve, reject) => ) + if (xhr.getResponseHeader) { + const csrfToken = xhr.getResponseHeader('X-CSRF-Token'); + if (csrfToken) app.session.csrfToken = csrfToken; + } - return m.request(options) - .then(res => res, error => { - this.requestError = error; + try { + return JSON.parse(responseText); + } catch (e) { + throw new RequestError(500, responseText, options, xhr); + } + }; - let children; + // TODO: ALERT MANAGER + // if (this.requestError) this.alerts.dismiss(this.requestError.alert); - switch (error.status) { - case 422: - children = error.response.errors - .map(error => [error.detail, m('br')]) - .reduce((a, b) => a.concat(b), []) - .slice(0, -1); - break; + // Now make the request. If it's a failure, inspect the error that was + // returned and show an alert containing its contents. + // const deferred = m.deferred(); - case 401: - case 403: - children = this.translator.trans('core.lib.error.permission_denied_message'); - break; + // return new Promise((resolve, reject) => ) - case 404: - case 410: - children = this.translator.trans('core.lib.error.not_found_message'); - break; + return m.request(options).then( + res => res, + error => { + this.requestError = error; - case 429: - children = this.translator.trans('core.lib.error.rate_limit_exceeded_message'); - break; + let children; - default: - children = this.translator.trans('core.lib.error.generic_message'); - } + switch (error.status) { + case 422: + children = error.response.errors + .map(error => [error.detail, m('br')]) + .reduce((a, b) => a.concat(b), []) + .slice(0, -1); + break; - const isDebug = app.forum.attribute('debug'); + case 401: + case 403: + children = this.translator.trans('core.lib.error.permission_denied_message'); + break; - error.alert = Alert.component({ - type: 'error', - children, - controls: isDebug && [ - Button.component({ - className: 'Button Button--link', - onclick: this.showDebug.bind(this, error), - children: 'DEBUG', // TODO make translatable - }) - ] - }); + case 404: + case 410: + children = this.translator.trans('core.lib.error.not_found_message'); + break; - try { - options.errorHandler(error); - } catch (error) { - console.error(error); - // this.alerts.show(error.alert); - } + case 429: + children = this.translator.trans('core.lib.error.rate_limit_exceeded_message'); + break; - return Promise.reject(error); - }); + default: + children = this.translator.trans('core.lib.error.generic_message'); + } + + const isDebug = app.forum.attribute('debug'); + + error.alert = Alert.component({ + type: 'error', + children, + controls: isDebug && [ + Button.component({ + className: 'Button Button--link', + onclick: this.showDebug.bind(this, error), + children: 'DEBUG', // TODO make translatable + }), + ], + }); + + try { + options.errorHandler(error); + } catch (error) { + console.error(error); + // this.alerts.show(error.alert); + } + + return Promise.reject(error); + } + ); } private showDebug(error: RequestError) { // this.alerts.dismiss(this.requestError.alert); - this.modal.show(RequestErrorModal.component({error})); + this.modal.show(RequestErrorModal.component({ error })); } } diff --git a/js/src/common/Bus.ts b/js/src/common/Bus.ts index f9c779903..c2de342a9 100644 --- a/js/src/common/Bus.ts +++ b/js/src/common/Bus.ts @@ -14,4 +14,4 @@ export default class Bus { listener(event, args); }); } -} \ No newline at end of file +} diff --git a/js/src/common/Component.ts b/js/src/common/Component.ts index cca988c88..ef4fb3490 100644 --- a/js/src/common/Component.ts +++ b/js/src/common/Component.ts @@ -1,17 +1,17 @@ import Mithril from 'mithril'; export type ComponentProps = { - children?: Mithril.Children, + children?: Mithril.Children; - className?: string; + className?: string; - [key: string]: any; -} + [key: string]: any; +}; export default class Component<T extends ComponentProps = any> { element: HTMLElement; - props = <T> {}; + props = <T>{}; view(vnode) { throw new Error('Component#view must be implemented by subclass'); @@ -60,7 +60,7 @@ export default class Component<T extends ComponentProps = any> { return selector ? $element.find(selector) : $element; } - static component(props: ComponentProps|any = {}, children?: Mithril.Children) { + static component(props: ComponentProps | any = {}, children?: Mithril.Children) { const componentProps: ComponentProps = Object.assign({}, props); if (children) componentProps.children = children; diff --git a/js/src/common/Model.ts b/js/src/common/Model.ts index 5634ee004..9001c0ac1 100644 --- a/js/src/common/Model.ts +++ b/js/src/common/Model.ts @@ -4,277 +4,289 @@ * * @abstract */ -import Store from "./Store"; +import Store from './Store'; export default class Model { - /** - * The resource object from the API. - */ - data: any; + /** + * The resource object from the API. + */ + data: any; - /** - * The time at which the model's data was last updated. Watching the value - * of this property is a fast way to retain/cache a subtree if data hasn't - * changed. - */ - freshness: Date; + /** + * The time at which the model's data was last updated. Watching the value + * of this property is a fast way to retain/cache a subtree if data hasn't + * changed. + */ + freshness: Date; - /** - * Whether or not the resource exists on the server. - */ - exists: boolean; + /** + * Whether or not the resource exists on the server. + */ + exists: boolean; - /** - * The data store that this resource should be persisted to. - */ - protected store: Store; + /** + * The data store that this resource should be persisted to. + */ + protected store: Store; - /** - * @param {Object} data A resource object from the API. - * @param {Store} store The data store that this model should be persisted to. - */ - constructor(data = {}, store = null) { - this.data = data; - this.store = store; + /** + * @param {Object} data A resource object from the API. + * @param {Store} store The data store that this model should be persisted to. + */ + constructor(data = {}, store = null) { + this.data = data; + this.store = store; - this.freshness = new Date(); - this.exists = false; - } - - /** - * Get the model's ID. - * @final - */ - id(): string|number { - return this.data.id; - } - - /** - * Get one of the model's attributes. - * @final - */ - attribute(attribute: string): any { - return this.data.attributes[attribute]; - } - - /** - * Merge new data into this model locally. - * - * @param data A resource object to merge into this model - * @public - */ - pushData(data: {}) { - // Since most of the top-level items in a resource object are objects - // (e.g. relationships, attributes), we'll need to check and perform the - // merge at the second level if that's the case. - for (const key in data) { - if (typeof data[key] === 'object') { - this.data[key] = this.data[key] || {}; - - // For every item in a second-level object, we want to check if we've - // been handed a Model instance. If so, we will convert it to a - // relationship data object. - for (const innerKey in data[key]) { - if (data[key][innerKey] instanceof Model) { - data[key][innerKey] = {data: Model.getIdentifier(data[key][innerKey])}; - } - this.data[key][innerKey] = data[key][innerKey]; - } - } else { - this.data[key] = data[key]; - } + this.freshness = new Date(); + this.exists = false; } - // Now that we've updated the data, we can say that the model is fresh. - // This is an easy way to invalidate retained subtrees etc. - this.freshness = new Date(); - } + /** + * Get the model's ID. + * @final + */ + id(): string | number { + return this.data.id; + } - /** - * Merge new attributes into this model locally. - * - * @param {Object} attributes The attributes to merge. - */ - pushAttributes(attributes: any) { - this.pushData({attributes}); - } + /** + * Get one of the model's attributes. + * @final + */ + attribute(attribute: string): any { + return this.data.attributes[attribute]; + } - /** - * Merge new attributes into this model, both locally and with persistence. - * - * @param attributes The attributes to save. If a 'relationships' key - * exists, it will be extracted and relationships will also be saved. - * @param [options] - * @return {Promise} - */ - save(attributes: any, options: any = {}): Promise<Model|Model[]> { - const data = { - type: this.data.type, - id: this.data.id, - attributes, - relationships: undefined - }; + /** + * Merge new data into this model locally. + * + * @param data A resource object to merge into this model + * @public + */ + pushData(data: {}) { + // Since most of the top-level items in a resource object are objects + // (e.g. relationships, attributes), we'll need to check and perform the + // merge at the second level if that's the case. + for (const key in data) { + if (typeof data[key] === 'object') { + this.data[key] = this.data[key] || {}; - // If a 'relationships' key exists, extract it from the attributes hash and - // set it on the top-level data object instead. We will be sending this data - // object to the API for persistence. - if (attributes.relationships) { - data.relationships = {}; + // For every item in a second-level object, we want to check if we've + // been handed a Model instance. If so, we will convert it to a + // relationship data object. + for (const innerKey in data[key]) { + if (data[key][innerKey] instanceof Model) { + data[key][innerKey] = { data: Model.getIdentifier(data[key][innerKey]) }; + } + this.data[key][innerKey] = data[key][innerKey]; + } + } else { + this.data[key] = data[key]; + } + } - for (const key in attributes.relationships) { - const model = attributes.relationships[key]; + // Now that we've updated the data, we can say that the model is fresh. + // This is an easy way to invalidate retained subtrees etc. + this.freshness = new Date(); + } - data.relationships[key] = { - data: model instanceof Array - ? model.map(Model.getIdentifier) - : Model.getIdentifier(model) + /** + * Merge new attributes into this model locally. + * + * @param {Object} attributes The attributes to merge. + */ + pushAttributes(attributes: any) { + this.pushData({ attributes }); + } + + /** + * Merge new attributes into this model, both locally and with persistence. + * + * @param attributes The attributes to save. If a 'relationships' key + * exists, it will be extracted and relationships will also be saved. + * @param [options] + * @return {Promise} + */ + save(attributes: any, options: any = {}): Promise<Model | Model[]> { + const data = { + type: this.data.type, + id: this.data.id, + attributes, + relationships: undefined, }; - } - delete attributes.relationships; + // If a 'relationships' key exists, extract it from the attributes hash and + // set it on the top-level data object instead. We will be sending this data + // object to the API for persistence. + if (attributes.relationships) { + data.relationships = {}; + + for (const key in attributes.relationships) { + const model = attributes.relationships[key]; + + data.relationships[key] = { + data: model instanceof Array ? model.map(Model.getIdentifier) : Model.getIdentifier(model), + }; + } + + delete attributes.relationships; + } + + // Before we update the model's data, we should make a copy of the model's + // old data so that we can revert back to it if something goes awry during + // persistence. + const oldData = this.copyData(); + + this.pushData(data); + + const request = { data }; + if (options.meta) request.meta = options.meta; + + return app + .request( + Object.assign( + { + method: this.exists ? 'PATCH' : 'POST', + url: app.forum.attribute('apiUrl') + this.apiEndpoint(), + body: request, + }, + options + ) + ) + .then( + // If everything went well, we'll make sure the store knows that this + // model exists now (if it didn't already), and we'll push the data that + // the API returned into the store. + payload => { + this.store.data[payload.data.type] = this.store.data[payload.data.type] || {}; + this.store.data[payload.data.type][payload.data.id] = this; + return this.store.pushPayload(payload); + }, + + // If something went wrong, though... good thing we backed up our model's + // old data! We'll revert to that and let others handle the error. + response => { + this.pushData(oldData); + m.redraw(); + throw response; + } + ); } - // Before we update the model's data, we should make a copy of the model's - // old data so that we can revert back to it if something goes awry during - // persistence. - const oldData = this.copyData(); + /** + * Send a request to delete the resource. + * + * @param {Object} body Data to send along with the DELETE request. + * @param {Object} [options] + * @return {Promise} + * @public + */ + delete(body = {}, options = {}) { + if (!this.exists) return Promise.resolve(); - this.pushData(data); + return app + .request( + Object.assign( + { + method: 'DELETE', + url: app.forum.attribute('apiUrl') + this.apiEndpoint(), + body, + }, + options + ) + ) + .then(() => { + this.exists = false; + this.store.remove(this); + }); + } - const request = {data}; - if (options.meta) request.meta = options.meta; + /** + * Construct a path to the API endpoint for this resource. + * + * @return {String} + * @protected + */ + apiEndpoint() { + return '/' + this.data.type + (this.exists ? '/' + this.data.id : ''); + } - return app.request(Object.assign({ - method: this.exists ? 'PATCH' : 'POST', - url: app.forum.attribute('apiUrl') + this.apiEndpoint(), - body: request - }, options)).then( - // If everything went well, we'll make sure the store knows that this - // model exists now (if it didn't already), and we'll push the data that - // the API returned into the store. - payload => { - this.store.data[payload.data.type] = this.store.data[payload.data.type] || {}; - this.store.data[payload.data.type][payload.data.id] = this; - return this.store.pushPayload(payload); - }, + copyData() { + return JSON.parse(JSON.stringify(this.data)); + } - // If something went wrong, though... good thing we backed up our model's - // old data! We'll revert to that and let others handle the error. - response => { - this.pushData(oldData); - m.redraw(); - throw response; - } - ); - } + /** + * Generate a function which returns the value of the given attribute. + * + * @param {String} name + * @param [transform] A function to transform the attribute value + */ + static attribute(name: string, transform?: Function): () => any { + return function() { + const value = this.data.attributes && this.data.attributes[name]; - /** - * Send a request to delete the resource. - * - * @param {Object} body Data to send along with the DELETE request. - * @param {Object} [options] - * @return {Promise} - * @public - */ - delete(body = {}, options = {}) { - if (!this.exists) return Promise.resolve(); + return transform ? transform(value) : value; + }; + } - return app.request(Object.assign({ - method: 'DELETE', - url: app.forum.attribute('apiUrl') + this.apiEndpoint(), - body - }, options)).then(() => { - this.exists = false; - this.store.remove(this); - }); - } + /** + * Generate a function which returns the value of the given has-one + * relationship. + * + * @return false if no information about the + * relationship exists; undefined if the relationship exists but the model + * has not been loaded; or the model if it has been loaded. + */ + static hasOne(name: string): () => Model | boolean { + return function() { + if (this.data.relationships) { + const relationship = this.data.relationships[name]; - /** - * Construct a path to the API endpoint for this resource. - * - * @return {String} - * @protected - */ - apiEndpoint() { - return '/' + this.data.type + (this.exists ? '/' + this.data.id : ''); - } + if (relationship) { + return app.store.getById(relationship.data.type, relationship.data.id); + } + } - copyData() { - return JSON.parse(JSON.stringify(this.data)); - } + return false; + }; + } - /** - * Generate a function which returns the value of the given attribute. - * - * @param {String} name - * @param [transform] A function to transform the attribute value - */ - static attribute(name: string, transform?: Function): () => any { - return function() { - const value = this.data.attributes && this.data.attributes[name]; + /** + * Generate a function which returns the value of the given has-many + * relationship. + * + * @return false if no information about the relationship + * exists; an array if it does, containing models if they have been + * loaded, and undefined for those that have not. + */ + static hasMany(name: string): () => [] | boolean { + return function() { + if (this.data.relationships) { + const relationship = this.data.relationships[name]; - return transform ? transform(value) : value; - }; - } + if (relationship) { + return relationship.data.map(data => app.store.getById(data.type, data.id)); + } + } - /** - * Generate a function which returns the value of the given has-one - * relationship. - * - * @return false if no information about the - * relationship exists; undefined if the relationship exists but the model - * has not been loaded; or the model if it has been loaded. - */ - static hasOne(name: string): () => Model|boolean { - return function() { - if (this.data.relationships) { - const relationship = this.data.relationships[name]; + return false; + }; + } - if (relationship) { - return app.store.getById(relationship.data.type, relationship.data.id); - } - } + /** + * Transform the given value into a Date object. + */ + static transformDate(value: string): Date { + return value ? new Date(value) : null; + } - return false; - }; - } - - /** - * Generate a function which returns the value of the given has-many - * relationship. - * - * @return false if no information about the relationship - * exists; an array if it does, containing models if they have been - * loaded, and undefined for those that have not. - */ - static hasMany(name: string): () => []|boolean { - return function() { - if (this.data.relationships) { - const relationship = this.data.relationships[name]; - - if (relationship) { - return relationship.data.map(data => app.store.getById(data.type, data.id)); - } - } - - return false; - }; - } - - /** - * Transform the given value into a Date object. - */ - static transformDate(value: string): Date { - return value ? new Date(value) : null; - } - - /** - * Get a resource identifier object for the given model. - */ - protected static getIdentifier(model: Model): { type: string, id: string } { - return { - type: model.data.type, - id: model.data.id - }; - } + /** + * Get a resource identifier object for the given model. + */ + protected static getIdentifier(model: Model): { type: string; id: string } { + return { + type: model.data.type, + id: model.data.id, + }; + } } diff --git a/js/src/common/Session.ts b/js/src/common/Session.ts index 748d7e740..04384699e 100644 --- a/js/src/common/Session.ts +++ b/js/src/common/Session.ts @@ -5,39 +5,44 @@ import User from './models/User'; * to the current authenticated user, and provides methods to log in/out. */ export default class Session { - /** - * The current authenticated user. - */ - user?: User; + /** + * The current authenticated user. + */ + user?: User; - /** - * The CSRF token. - */ - csrfToken?: string; + /** + * The CSRF token. + */ + csrfToken?: string; - constructor(user, csrfToken) { - this.user = user; + constructor(user, csrfToken) { + this.user = user; - this.csrfToken = csrfToken; - } + this.csrfToken = csrfToken; + } - /** - * Attempt to log in a user. - */ - login(body: { identification: string, password: string, remember?: string }, options = {}) { - return app.request(Object.assign({ - method: 'POST', - url: `${app.forum.attribute('baseUrl')}/login`, - body - }, options)); - } + /** + * Attempt to log in a user. + */ + login(body: { identification: string; password: string; remember?: string }, options = {}) { + return app.request( + Object.assign( + { + method: 'POST', + url: `${app.forum.attribute('baseUrl')}/login`, + body, + }, + options + ) + ); + } - /** - * Log the user out. - * - * @public - */ - logout() { - window.location.href = `${app.forum.attribute('baseUrl')}/logout?token=${this.csrfToken}`; - } + /** + * Log the user out. + * + * @public + */ + logout() { + window.location.href = `${app.forum.attribute('baseUrl')}/logout?token=${this.csrfToken}`; + } } diff --git a/js/src/common/Store.ts b/js/src/common/Store.ts index d834b2dde..891eff61a 100644 --- a/js/src/common/Store.ts +++ b/js/src/common/Store.ts @@ -5,143 +5,148 @@ import Model from './Model'; * retrieve data from the API. */ export default class Store { - /** - * The local data store. A tree of resource types to IDs, such that - * accessing data[type][id] will return the model for that type/ID. - */ - data: { [key: string]: { [key: number]: Model }} = {}; + /** + * The local data store. A tree of resource types to IDs, such that + * accessing data[type][id] will return the model for that type/ID. + */ + data: { [key: string]: { [key: number]: Model } } = {}; - /** - * The model registry. A map of resource types to the model class that - * should be used to represent resources of that type. - */ - models: {}; + /** + * The model registry. A map of resource types to the model class that + * should be used to represent resources of that type. + */ + models: {}; - constructor(models) { - this.models = models; - } - - /** - * Push resources contained within an API payload into the store. - * - * @param payload - * @return The model(s) representing the resource(s) contained - * within the 'data' key of the payload. - */ - pushPayload(payload: { included?: {}[], data?: {}|{}[] }): Model|Model[] { - if (payload.included) payload.included.map(this.pushObject.bind(this)); - - const result: any = payload.data instanceof Array - ? payload.data.map(this.pushObject.bind(this)) - : this.pushObject(payload.data); - - // Attach the original payload to the model that we give back. This is - // useful to consumers as it allows them to access meta information - // associated with their request. - result.payload = payload; - - return result; - } - - /** - * Create a model to represent a resource object (or update an existing one), - * and push it into the store. - * - * @param {Object} data The resource object - * @return The model, or null if no model class has been - * registered for this resource type. - */ - pushObject(data): Model { - if (!this.models[data.type]) return null; - - const type = this.data[data.type] = this.data[data.type] || {}; - - if (type[data.id]) { - type[data.id].pushData(data); - } else { - type[data.id] = this.createRecord(data.type, data); + constructor(models) { + this.models = models; } - type[data.id].exists = true; + /** + * Push resources contained within an API payload into the store. + * + * @param payload + * @return The model(s) representing the resource(s) contained + * within the 'data' key of the payload. + */ + pushPayload(payload: { included?: {}[]; data?: {} | {}[] }): Model | Model[] { + if (payload.included) payload.included.map(this.pushObject.bind(this)); - return type[data.id]; - } + const result: any = payload.data instanceof Array ? payload.data.map(this.pushObject.bind(this)) : this.pushObject(payload.data); - /** - * Make a request to the API to find record(s) of a specific type. - * - * @param type The resource type. - * @param [id] The ID(s) of the model(s) to retrieve. - * Alternatively, if an object is passed, it will be handled as the - * `query` parameter. - * @param query - * @param options - */ - find<T extends Model = Model>(type: string, id?: number|number[]|any, query = {}, options = {}): Promise<T[]> { - let params = query; - let url = `${app.forum.attribute('apiUrl')}/${type}`; + // Attach the original payload to the model that we give back. This is + // useful to consumers as it allows them to access meta information + // associated with their request. + result.payload = payload; - if (id instanceof Array) { - url += `?filter[id]=${id.join(',')}`; - } else if (typeof id === 'object') { - params = id; - } else if (id) { - url += `/${id}`; + return result; } - return app.request(Object.assign({ - method: 'GET', - url, - params - }, options)).then(this.pushPayload.bind(this)); - } + /** + * Create a model to represent a resource object (or update an existing one), + * and push it into the store. + * + * @param {Object} data The resource object + * @return The model, or null if no model class has been + * registered for this resource type. + */ + pushObject(data): Model { + if (!this.models[data.type]) return null; - /** - * Get a record from the store by ID. - * - * @param type The resource type. - * @param id The resource ID. - */ - getById<T extends Model = Model>(type: string, id: number): T { - return this.data[type] && this.data[type][id] as T; - } + const type = (this.data[data.type] = this.data[data.type] || {}); - /** - * Get a record from the store by the value of a model attribute. - * - * @param type The resource type. - * @param key The name of the method on the model. - * @param value The value of the model attribute. - */ - getBy<T extends Model = Model>(type: string, key: string, value: any): T { - return this.all<T>(type).filter(model => model[key]() === value)[0]; - } + if (type[data.id]) { + type[data.id].pushData(data); + } else { + type[data.id] = this.createRecord(data.type, data); + } - /** - * Get all loaded records of a specific type. - */ - all<T extends Model = Model>(type: string): T[] { - const records = this.data[type]; + type[data.id].exists = true; - return records ? Object.keys(records).map(id => records[id]) : []; - } + return type[data.id]; + } - /** - * Remove the given model from the store. - */ - remove(model: Model) { - delete this.data[model.data.type][model.id()]; - } + /** + * Make a request to the API to find record(s) of a specific type. + * + * @param type The resource type. + * @param [id] The ID(s) of the model(s) to retrieve. + * Alternatively, if an object is passed, it will be handled as the + * `query` parameter. + * @param query + * @param options + */ + find<T extends Model = Model>(type: string, id?: number | number[] | any, query = {}, options = {}): Promise<T[]> { + let params = query; + let url = `${app.forum.attribute('apiUrl')}/${type}`; - /** - * Create a new record of the given type. - * - * @param {String} type The resource type - * @param {Object} [data] Any data to initialize the model with - */ - createRecord<T extends Model = Model>(type: string, data: any = {}): T { - data.type = data.type || type; + if (id instanceof Array) { + url += `?filter[id]=${id.join(',')}`; + } else if (typeof id === 'object') { + params = id; + } else if (id) { + url += `/${id}`; + } - return new (this.models[type])(data, this); - } + return app + .request( + Object.assign( + { + method: 'GET', + url, + params, + }, + options + ) + ) + .then(this.pushPayload.bind(this)); + } + + /** + * Get a record from the store by ID. + * + * @param type The resource type. + * @param id The resource ID. + */ + getById<T extends Model = Model>(type: string, id: number): T { + return this.data[type] && (this.data[type][id] as T); + } + + /** + * Get a record from the store by the value of a model attribute. + * + * @param type The resource type. + * @param key The name of the method on the model. + * @param value The value of the model attribute. + */ + getBy<T extends Model = Model>(type: string, key: string, value: any): T { + return this.all<T>(type).filter(model => model[key]() === value)[0]; + } + + /** + * Get all loaded records of a specific type. + */ + all<T extends Model = Model>(type: string): T[] { + const records = this.data[type]; + + return records ? Object.keys(records).map(id => records[id]) : []; + } + + /** + * Remove the given model from the store. + */ + remove(model: Model) { + delete this.data[model.data.type][model.id()]; + } + + /** + * Create a new record of the given type. + * + * @param {String} type The resource type + * @param {Object} [data] Any data to initialize the model with + */ + createRecord<T extends Model = Model>(type: string, data: any = {}): T { + data.type = data.type || type; + + return new this.models[type](data, this); + } } diff --git a/js/src/common/Translator.ts b/js/src/common/Translator.ts index 0c7e4a2b0..b98f0219a 100644 --- a/js/src/common/Translator.ts +++ b/js/src/common/Translator.ts @@ -35,7 +35,7 @@ export default class Translator { } transText(id: string, parameters = null) { - return extractText(this.trans(id, parameters)); + return extractText(this.trans(id, parameters)); } apply(translation: string, input: any) { diff --git a/js/src/common/compat.ts b/js/src/common/compat.ts index b2249694e..d0da705b6 100644 --- a/js/src/common/compat.ts +++ b/js/src/common/compat.ts @@ -4,6 +4,6 @@ import Modal from './components/Modal'; export default { extend: extend, - - 'components/Modal': Modal + + 'components/Modal': Modal, }; diff --git a/js/src/common/components/Alert.tsx b/js/src/common/components/Alert.tsx index c86c2322f..659cd98f5 100644 --- a/js/src/common/components/Alert.tsx +++ b/js/src/common/components/Alert.tsx @@ -1,15 +1,15 @@ -import Component, {ComponentProps} from '../Component'; +import Component, { ComponentProps } from '../Component'; import Button from './Button'; import listItems from '../helpers/listItems'; import extract from '../utils/extract'; -import * as Mithril from "mithril"; +import * as Mithril from 'mithril'; export interface AlertProps extends ComponentProps { - controls?: Mithril.ChildArray, - type?: string, - dismissible?: boolean, + controls?: Mithril.ChildArray; + type?: string; + dismissible?: boolean; - ondismiss?: () => any, + ondismiss?: () => any; } /** @@ -27,40 +27,31 @@ export interface AlertProps extends ComponentProps { * All other props will be assigned as attributes on the alert element. */ export default class Alert extends Component<AlertProps> { - view() { - const attrs: AlertProps = Object.assign({}, this.props); + view() { + const attrs: AlertProps = Object.assign({}, this.props); - const type: string = extract(attrs, 'type'); - attrs.className = `Alert Alert--${type} ${attrs.className || ''}`; + const type: string = extract(attrs, 'type'); + attrs.className = `Alert Alert--${type} ${attrs.className || ''}`; - const children: Mithril.Children = extract(attrs, 'children'); - const controls: Mithril.ChildArray = extract(attrs, 'controls') || []; + const children: Mithril.Children = extract(attrs, 'children'); + const controls: Mithril.ChildArray = extract(attrs, 'controls') || []; - // If the alert is meant to be dismissible (which is the case by default), - // then we will create a dismiss button to append as the final control in - // the alert. - const dismissible: boolean|undefined = extract(attrs, 'dismissible'); - const ondismiss: () => any = extract(attrs, 'ondismiss'); - const dismissControl = []; + // If the alert is meant to be dismissible (which is the case by default), + // then we will create a dismiss button to append as the final control in + // the alert. + const dismissible: boolean | undefined = extract(attrs, 'dismissible'); + const ondismiss: () => any = extract(attrs, 'ondismiss'); + const dismissControl = []; - if (dismissible || dismissible === undefined) { - dismissControl.push( - <Button - icon="fas fa-times" - className="Button Button--link Button--icon Alert-dismiss" - onclick={ondismiss}/> - ); + if (dismissible || dismissible === undefined) { + dismissControl.push(<Button icon="fas fa-times" className="Button Button--link Button--icon Alert-dismiss" onclick={ondismiss} />); + } + + return ( + <div {...attrs}> + <span className="Alert-body">{children}</span> + <ul className="Alert-controls">{listItems(controls.concat(dismissControl))}</ul> + </div> + ); } - - return ( - <div {...attrs}> - <span className="Alert-body"> - {children} - </span> - <ul className="Alert-controls"> - {listItems(controls.concat(dismissControl))} - </ul> - </div> - ); - } } diff --git a/js/src/common/components/Badge.tsx b/js/src/common/components/Badge.tsx index a55915011..f14396be2 100644 --- a/js/src/common/components/Badge.tsx +++ b/js/src/common/components/Badge.tsx @@ -16,24 +16,20 @@ import extract from '../utils/extract'; * All other props will be assigned as attributes on the badge element. */ export default class Badge extends Component { - view(vnode) { - const attrs = vnode.attrs; - const type = extract(attrs, 'type'); - const iconName = extract(attrs, 'icon'); + view(vnode) { + const attrs = vnode.attrs; + const type = extract(attrs, 'type'); + const iconName = extract(attrs, 'icon'); - attrs.className = `Badge ${type ? `Badge--${type}` : ''} ${attrs.className || ''}`; - attrs.title = extract(attrs, 'label') || ''; + attrs.className = `Badge ${type ? `Badge--${type}` : ''} ${attrs.className || ''}`; + attrs.title = extract(attrs, 'label') || ''; - return ( - <span {...attrs}> - {iconName ? icon(iconName, {className: 'Badge-icon'}) : m.trust(' ')} - </span> - ); - } + return <span {...attrs}>{iconName ? icon(iconName, { className: 'Badge-icon' }) : m.trust(' ')}</span>; + } - oncreate(vnode) { - super.oncreate(vnode); + oncreate(vnode) { + super.oncreate(vnode); - if (this.props.label) this.$().tooltip({container: 'body'}); - } + if (this.props.label) this.$().tooltip({ container: 'body' }); + } } diff --git a/js/src/common/components/Button.tsx b/js/src/common/components/Button.tsx index 9d22297af..93138eb81 100644 --- a/js/src/common/components/Button.tsx +++ b/js/src/common/components/Button.tsx @@ -1,17 +1,17 @@ -import Component, {ComponentProps} from '../Component'; +import Component, { ComponentProps } from '../Component'; import icon from '../helpers/icon'; import extract from '../utils/extract'; import extractText from '../utils/extractText'; import LoadingIndicator from './LoadingIndicator'; export interface ButtonProps extends ComponentProps { - title?: string, - type?: string, - icon?: string, + title?: string; + type?: string; + icon?: string; - loading?: boolean, - disabled?: boolean, - onclick?: Function + loading?: boolean; + disabled?: boolean; + onclick?: Function; } /** @@ -31,43 +31,43 @@ export interface ButtonProps extends ComponentProps { * be used to represent any generic clickable control, like a menu item. */ export default class Button<T extends ButtonProps = ButtonProps> extends Component<T> { - view() { - const { children, ...attrs} = this.props; + view() { + const { children, ...attrs } = this.props; - attrs.className = attrs.className || ''; - attrs.type = attrs.type || 'button'; + attrs.className = attrs.className || ''; + attrs.type = attrs.type || 'button'; - // If a tooltip was provided for buttons without additional content, we also - // use this tooltip as text for screen readers - if (attrs.title && !this.props.children) { - attrs['aria-label'] = attrs.title; + // If a tooltip was provided for buttons without additional content, we also + // use this tooltip as text for screen readers + if (attrs.title && !this.props.children) { + attrs['aria-label'] = attrs.title; + } + + // If nothing else is provided, we use the textual button content as tooltip + if (!attrs.title && this.props.children) { + attrs.title = extractText(this.props.children); + } + + const iconName = extract(attrs, 'icon'); + if (iconName) attrs.className += ' hasIcon'; + + const loading = extract(attrs, 'loading'); + if (attrs.disabled || loading) { + attrs.className += ' ' + classNames('disabled', loading && 'loading'); + delete attrs.onclick; + } + + return <button {...attrs}>{this.getButtonContent(iconName, attrs.loading, children)}</button>; } - // If nothing else is provided, we use the textual button content as tooltip - if (!attrs.title && this.props.children) { - attrs.title = extractText(this.props.children); + /** + * Get the template for the button's content. + */ + protected getButtonContent(iconName?: string | boolean, loading?: boolean, children?: any): any[] { + return [ + iconName && iconName !== true ? icon(iconName, { className: 'Button-icon' }) : '', + children ? <span className="Button-label">{children}</span> : '', + loading ? LoadingIndicator.component({ size: 'tiny', className: 'LoadingIndicator--inline' }) : '', + ]; } - - const iconName = extract(attrs, 'icon'); - if (iconName) attrs.className += ' hasIcon'; - - const loading = extract(attrs, 'loading'); - if (attrs.disabled || loading) { - attrs.className += ' ' + classNames('disabled', loading && 'loading'); - delete attrs.onclick; - } - - return <button {...attrs}>{this.getButtonContent(iconName, attrs.loading, children)}</button>; - } - - /** - * Get the template for the button's content. - */ - protected getButtonContent(iconName?: string|boolean, loading?: boolean, children?: any) : any[] { - return [ - iconName && iconName !== true ? icon(iconName, {className: 'Button-icon'}) : '', - children ? <span className="Button-label">{children}</span> : '', - loading ? LoadingIndicator.component({size: 'tiny', className: 'LoadingIndicator--inline'}) : '' - ]; - } } diff --git a/js/src/common/components/Dropdown.tsx b/js/src/common/components/Dropdown.tsx index dddb3a7c3..b1a45fe7c 100644 --- a/js/src/common/components/Dropdown.tsx +++ b/js/src/common/components/Dropdown.tsx @@ -1,17 +1,17 @@ -import Component, {ComponentProps} from '../Component'; +import Component, { ComponentProps } from '../Component'; import icon from '../helpers/icon'; import listItems from '../helpers/listItems'; export interface DropdownProps extends ComponentProps { - buttonClassName?: string; - menuClassName?: string; - label?: string; - icon?: string; - caretIcon?: undefined|string; + buttonClassName?: string; + menuClassName?: string; + label?: string; + icon?: string; + caretIcon?: undefined | string; - onhide?: Function; - onshow?: Function; - onclick?: Function; + onhide?: Function; + onshow?: Function; + onclick?: Function; } /** @@ -31,109 +31,96 @@ export interface DropdownProps extends ComponentProps { * The children will be displayed as a list inside of the dropdown menu. */ export default class Dropdown<T extends DropdownProps = DropdownProps> extends Component<T> { - showing: boolean; + showing: boolean; - static initProps(props: DropdownProps) { - props.className = props.className || ''; - props.buttonClassName = props.buttonClassName || ''; - props.menuClassName = props.menuClassName || ''; - props.label = props.label || ''; - props.caretIcon = typeof props.caretIcon !== 'undefined' ? props.caretIcon : 'fas fa-caret-down'; - } + static initProps(props: DropdownProps) { + props.className = props.className || ''; + props.buttonClassName = props.buttonClassName || ''; + props.menuClassName = props.menuClassName || ''; + props.label = props.label || ''; + props.caretIcon = typeof props.caretIcon !== 'undefined' ? props.caretIcon : 'fas fa-caret-down'; + } - view() { - const items = this.props.children ? listItems(this.props.children) : []; + view() { + const items = this.props.children ? listItems(this.props.children) : []; - return ( - <div className={`ButtonGroup Dropdown dropdown ${this.props.className} itemCount${items.length}${this.showing ? ' open' : ''}`}> - {this.getButton()} - {this.getMenu(items)} - </div> - ); - } + return ( + <div className={`ButtonGroup Dropdown dropdown ${this.props.className} itemCount${items.length}${this.showing ? ' open' : ''}`}> + {this.getButton()} + {this.getMenu(items)} + </div> + ); + } - oncreate(vnode) { - super.oncreate(vnode); + oncreate(vnode) { + super.oncreate(vnode); - this.$('> .Dropdown-toggle').dropdown(); + this.$('> .Dropdown-toggle').dropdown(); - // When opening the dropdown menu, work out if the menu goes beyond the - // bottom of the viewport. If it does, we will apply class to make it show - // above the toggle button instead of below it. - this.element.addEventListener('shown.bs.dropdown', () => { - this.showing = true; + // When opening the dropdown menu, work out if the menu goes beyond the + // bottom of the viewport. If it does, we will apply class to make it show + // above the toggle button instead of below it. + this.element.addEventListener('shown.bs.dropdown', () => { + this.showing = true; - if (this.props.onshow) { - this.props.onshow(); - } + if (this.props.onshow) { + this.props.onshow(); + } - m.redraw(); + m.redraw(); - const $menu = this.$('.Dropdown-menu'); - const isRight = $menu.hasClass('Dropdown-menu--right'); + const $menu = this.$('.Dropdown-menu'); + const isRight = $menu.hasClass('Dropdown-menu--right'); - $menu.removeClass('Dropdown-menu--top Dropdown-menu--right'); + $menu.removeClass('Dropdown-menu--top Dropdown-menu--right'); - $menu.toggleClass( - 'Dropdown-menu--top', - $menu.offset().top + $menu.height() > $(window).scrollTop() + $(window).height() - ); + $menu.toggleClass('Dropdown-menu--top', $menu.offset().top + $menu.height() > $(window).scrollTop() + $(window).height()); - if ($menu.offset().top < 0) { - $menu.removeClass('Dropdown-menu--top'); - } + if ($menu.offset().top < 0) { + $menu.removeClass('Dropdown-menu--top'); + } - $menu.toggleClass( - 'Dropdown-menu--right', - isRight || $menu.offset().left + $menu.width() > $(window).scrollLeft() + $(window).width() - ); - }); + $menu.toggleClass('Dropdown-menu--right', isRight || $menu.offset().left + $menu.width() > $(window).scrollLeft() + $(window).width()); + }); - this.element.addEventListener('hidden.bs.dropdown', () => { - this.showing = false; + this.element.addEventListener('hidden.bs.dropdown', () => { + this.showing = false; - if (this.props.onhide) { - this.props.onhide(); - } + if (this.props.onhide) { + this.props.onhide(); + } - m.redraw(); - }); - } + m.redraw(); + }); + } - /** - * Get the template for the button. - */ - protected getButton(): any { - return ( - <button - className={'Dropdown-toggle ' + this.props.buttonClassName} - data-toggle="dropdown" - onclick={this.props.onclick}> - {this.getButtonContent()} - </button> - ); - } + /** + * Get the template for the button. + */ + protected getButton(): any { + return ( + <button className={'Dropdown-toggle ' + this.props.buttonClassName} data-toggle="dropdown" onclick={this.props.onclick}> + {this.getButtonContent()} + </button> + ); + } - /** - * Get the template for the button's content. - * - * @return {*} - */ - protected getButtonContent() { - const attrs = this.props; + /** + * Get the template for the button's content. + * + * @return {*} + */ + protected getButtonContent() { + const attrs = this.props; - return [ - attrs.icon ? icon(attrs.icon, {className: 'Button-icon'}) : '', - <span className="Button-label">{attrs.label}</span>, - attrs.caretIcon ? icon(attrs.caretIcon, {className: 'Button-caret'}) : '' - ]; - } + return [ + attrs.icon ? icon(attrs.icon, { className: 'Button-icon' }) : '', + <span className="Button-label">{attrs.label}</span>, + attrs.caretIcon ? icon(attrs.caretIcon, { className: 'Button-caret' }) : '', + ]; + } - protected getMenu(items) { - return ( - <ul className={'Dropdown-menu dropdown-menu ' + this.props.menuClassName}> - {items} - </ul> - ); - } + protected getMenu(items) { + return <ul className={'Dropdown-menu dropdown-menu ' + this.props.menuClassName}>{items}</ul>; + } } diff --git a/js/src/common/components/GroupBadge.ts b/js/src/common/components/GroupBadge.ts index ca8667361..06a955276 100644 --- a/js/src/common/components/GroupBadge.ts +++ b/js/src/common/components/GroupBadge.ts @@ -1,16 +1,16 @@ import Badge from './Badge'; export default class GroupBadge extends Badge { - static initProps(props) { - super.initProps(props); + static initProps(props) { + super.initProps(props); - if (props.group) { - props.icon = props.group.icon(); - props.style = {backgroundColor: props.group.color()}; - props.label = typeof props.label === 'undefined' ? props.group.nameSingular() : props.label; - props.type = `group--${props.group.id()}`; + if (props.group) { + props.icon = props.group.icon(); + props.style = { backgroundColor: props.group.color() }; + props.label = typeof props.label === 'undefined' ? props.group.nameSingular() : props.label; + props.type = `group--${props.group.id()}`; - delete props.group; + delete props.group; + } } - } } diff --git a/js/src/common/components/LinkButton.tsx b/js/src/common/components/LinkButton.tsx index 176c0c320..e4cdc02e8 100644 --- a/js/src/common/components/LinkButton.tsx +++ b/js/src/common/components/LinkButton.tsx @@ -1,9 +1,9 @@ -import Button, {ButtonProps} from './Button'; +import Button, { ButtonProps } from './Button'; interface LinkButtonProps extends ButtonProps { - active: boolean; - oncreate: Function; - href?: string; + active: boolean; + oncreate: Function; + href?: string; } /** @@ -19,25 +19,23 @@ interface LinkButtonProps extends ButtonProps { * the `active` prop will automatically be set to true. */ export default class LinkButton extends Button<LinkButtonProps> { - static initProps(props: LinkButtonProps) { - props.active = this.isActive(props); - } + static initProps(props: LinkButtonProps) { + props.active = this.isActive(props); + } - view() { - const vdom = super.view(); + view() { + const vdom = super.view(); - vdom.tag = m.route.Link; - vdom.attrs.active = String(vdom.attrs.active); + vdom.tag = m.route.Link; + vdom.attrs.active = String(vdom.attrs.active); - return vdom; - } + return vdom; + } - /** - * Determine whether a component with the given props is 'active'. - */ - static isActive(props: LinkButtonProps): boolean { - return typeof props.active !== 'undefined' - ? props.active - : m.route.get() === props.href; - } + /** + * Determine whether a component with the given props is 'active'. + */ + static isActive(props: LinkButtonProps): boolean { + return typeof props.active !== 'undefined' ? props.active : m.route.get() === props.href; + } } diff --git a/js/src/common/components/LoadingIndicator.tsx b/js/src/common/components/LoadingIndicator.tsx index 1b582ec2d..b7b4e4628 100644 --- a/js/src/common/components/LoadingIndicator.tsx +++ b/js/src/common/components/LoadingIndicator.tsx @@ -1,5 +1,5 @@ import Component from '../Component'; -import {Spinner, SpinnerOptions} from 'spin.js'; +import { Spinner, SpinnerOptions } from 'spin.js'; /** * The `LoadingIndicator` component displays a loading spinner with spin.js. It @@ -10,34 +10,34 @@ import {Spinner, SpinnerOptions} from 'spin.js'; * All other props will be assigned as attributes on the element. */ export default class LoadingIndicator extends Component { - view(vnode) { - const attrs = vnode.attrs; + view(vnode) { + const attrs = vnode.attrs; - attrs.className = 'LoadingIndicator ' + (attrs.className || ''); - delete attrs.size; + attrs.className = 'LoadingIndicator ' + (attrs.className || ''); + delete attrs.size; - return <div {...attrs}>{m.trust(' ')}</div>; - } - - oncreate(vnode) { - super.oncreate(vnode); - - const options: SpinnerOptions = { zIndex: 'auto', color: this.$().css('color') }; - let sizeOptions: SpinnerOptions = {}; - - switch (vnode.attrs.size) { - case 'large': - sizeOptions = { lines: 10, length: 8, width: 4, radius: 8 }; - break; - - case 'tiny': - sizeOptions = { lines: 8, length: 2, width: 2, radius: 3 }; - break; - - default: - sizeOptions = { lines: 8, length: 4, width: 3, radius: 5 }; + return <div {...attrs}>{m.trust(' ')}</div>; } - new Spinner({ ...options, ...sizeOptions }).spin(this.element); - } + oncreate(vnode) { + super.oncreate(vnode); + + const options: SpinnerOptions = { zIndex: 'auto', color: this.$().css('color') }; + let sizeOptions: SpinnerOptions = {}; + + switch (vnode.attrs.size) { + case 'large': + sizeOptions = { lines: 10, length: 8, width: 4, radius: 8 }; + break; + + case 'tiny': + sizeOptions = { lines: 8, length: 2, width: 2, radius: 3 }; + break; + + default: + sizeOptions = { lines: 8, length: 4, width: 3, radius: 5 }; + } + + new Spinner({ ...options, ...sizeOptions }).spin(this.element); + } } diff --git a/js/src/common/components/Modal.tsx b/js/src/common/components/Modal.tsx index 726ce8569..d2fbe0985 100644 --- a/js/src/common/components/Modal.tsx +++ b/js/src/common/components/Modal.tsx @@ -1,8 +1,8 @@ import Mithril from 'mithril'; -import Component, {ComponentProps} from '../Component'; +import Component, { ComponentProps } from '../Component'; import Button from './Button'; -import RequestError from "../utils/RequestError"; +import RequestError from '../utils/RequestError'; /** * The `Modal` component displays a modal dialog, wrapped in a form. Subclasses @@ -29,10 +29,12 @@ export default abstract class Modal<T extends ComponentProps = ComponentProps> e {Button.component({ icon: 'fas fa-times', onclick: this.hide.bind(this), - className: 'Button Button--icon Button--link' + className: 'Button Button--icon Button--link', })} </div> - ) : ''} + ) : ( + '' + )} <form onsubmit={this.onsubmit.bind(this)}> <div className="Modal-header"> @@ -85,7 +87,11 @@ export default abstract class Modal<T extends ComponentProps = ComponentProps> e * Focus on the first input when the modal is ready to be used. */ onready() { - this.$('form').find('input, select, textarea').first().focus().select(); + this.$('form') + .find('input, select, textarea') + .first() + .focus() + .select(); } onhide() {} diff --git a/js/src/common/components/ModalManager.tsx b/js/src/common/components/ModalManager.tsx index f3617498e..5e652cb8f 100644 --- a/js/src/common/components/ModalManager.tsx +++ b/js/src/common/components/ModalManager.tsx @@ -2,7 +2,7 @@ import MicroModal from 'micromodal'; import Component from '../Component'; import Modal from './Modal'; -import {Vnode} from "mithril"; +import { Vnode } from 'mithril'; /** * The `ModalManager` component manages a modal dialog. Only one modal dialog @@ -48,19 +48,20 @@ export default class ModalManager extends Component { m.redraw(); if (!$('.modal-backdrop').length) { - $('<div />').addClass('modal-backdrop') + $('<div />') + .addClass('modal-backdrop') .appendTo('body'); } MicroModal.show('Modal', { awaitCloseAnimation: true, onClose: () => { - $('.modal-backdrop').fadeOut(200, function () { + $('.modal-backdrop').fadeOut(200, function() { this.remove(); }); this.showing = false; - } + }, }); this.onready(); diff --git a/js/src/common/components/Placeholder.tsx b/js/src/common/components/Placeholder.tsx index aaf41d945..9c3efcfea 100644 --- a/js/src/common/components/Placeholder.tsx +++ b/js/src/common/components/Placeholder.tsx @@ -1,7 +1,7 @@ -import Component, {ComponentProps} from '../Component'; +import Component, { ComponentProps } from '../Component'; export interface PlaceholderProps extends ComponentProps { - text: string + text: string; } /** diff --git a/js/src/common/components/RequestErrorModal.tsx b/js/src/common/components/RequestErrorModal.tsx index a21bcc53e..c0624c31b 100644 --- a/js/src/common/components/RequestErrorModal.tsx +++ b/js/src/common/components/RequestErrorModal.tsx @@ -1,9 +1,9 @@ import Modal from './Modal'; -import {ComponentProps} from '../Component'; +import { ComponentProps } from '../Component'; import RequestError from '../utils/RequestError'; export interface RequestErrorModalProps extends ComponentProps { - error: RequestError, + error: RequestError; } export default class RequestErrorModal<T extends RequestErrorModalProps = RequestErrorModalProps> extends Modal<T> { @@ -12,9 +12,7 @@ export default class RequestErrorModal<T extends RequestErrorModalProps = Reques } title(): string { - return this.props.error.xhr - ? `${this.props.error.xhr.status} ${this.props.error.xhr.statusText}` - : ''; + return this.props.error.xhr ? `${this.props.error.xhr.status} ${this.props.error.xhr.statusText}` : ''; } content() { @@ -26,11 +24,15 @@ export default class RequestErrorModal<T extends RequestErrorModalProps = Reques responseText = this.props.error.responseText; } - return <div className="Modal-body"> - <pre> - {this.props.error.options.method} {this.props.error.options.url}<br/><br/> - {responseText} - </pre> - </div> + return ( + <div className="Modal-body"> + <pre> + {this.props.error.options.method} {this.props.error.options.url} + <br /> + <br /> + {responseText} + </pre> + </div> + ); } } diff --git a/js/src/common/components/SelectDropdown.tsx b/js/src/common/components/SelectDropdown.tsx index 3fa26cd41..e57e398ea 100644 --- a/js/src/common/components/SelectDropdown.tsx +++ b/js/src/common/components/SelectDropdown.tsx @@ -1,8 +1,8 @@ -import Dropdown, {DropdownProps} from './Dropdown'; +import Dropdown, { DropdownProps } from './Dropdown'; import icon from '../helpers/icon'; export interface SelectDropdownProps extends DropdownProps { - defaultLabel?: string; + defaultLabel?: string; } /** @@ -16,23 +16,20 @@ export interface SelectDropdownProps extends DropdownProps { * - `defaultLabel` */ export default class SelectDropdown extends Dropdown<SelectDropdownProps> { - static initProps(props: SelectDropdownProps) { - props.caretIcon = typeof props.caretIcon !== 'undefined' ? props.caretIcon : 'fas fa-sort'; + static initProps(props: SelectDropdownProps) { + props.caretIcon = typeof props.caretIcon !== 'undefined' ? props.caretIcon : 'fas fa-sort'; - super.initProps(props); + super.initProps(props); - props.className += ' Dropdown--select'; - } + props.className += ' Dropdown--select'; + } - getButtonContent() { - const activeChild = this.props.children.filter(child => child.attrs.active)[0]; - let label = activeChild && activeChild.attrs.children || this.props.defaultLabel; + getButtonContent() { + const activeChild = this.props.children.filter(child => child.attrs.active)[0]; + let label = (activeChild && activeChild.attrs.children) || this.props.defaultLabel; - if (label instanceof Array) label = label[0]; + if (label instanceof Array) label = label[0]; - return [ - <span className="Button-label">{label}</span>, - icon(this.props.caretIcon, {className: 'Button-caret'}) - ]; - } + return [<span className="Button-label">{label}</span>, icon(this.props.caretIcon, { className: 'Button-caret' })]; + } } diff --git a/js/src/common/components/Separator.tsx b/js/src/common/components/Separator.tsx index d97920f8a..cd9c3faa7 100644 --- a/js/src/common/components/Separator.tsx +++ b/js/src/common/components/Separator.tsx @@ -4,9 +4,9 @@ import Component from '../Component'; * The `Separator` component defines a menu separator item. */ export default class Separator extends Component { - static isListItem = true; + static isListItem = true; - view() { - return <li className="Dropdown-separator"/>; - } + view() { + return <li className="Dropdown-separator" />; + } } diff --git a/js/src/common/helpers/avatar.tsx b/js/src/common/helpers/avatar.tsx index f72d520ec..5c572a250 100644 --- a/js/src/common/helpers/avatar.tsx +++ b/js/src/common/helpers/avatar.tsx @@ -6,31 +6,31 @@ * @return {Object} */ export default function avatar(user, attrs: any = {}) { - attrs.className = 'Avatar ' + (attrs.className || ''); - let content = ''; + attrs.className = 'Avatar ' + (attrs.className || ''); + let content = ''; - // If the `title` attribute is set to null or false, we don't want to give the - // avatar a title. On the other hand, if it hasn't been given at all, we can - // safely default it to the user's username. - const hasTitle = attrs.title === 'undefined' || attrs.title; - if (!hasTitle) delete attrs.title; + // If the `title` attribute is set to null or false, we don't want to give the + // avatar a title. On the other hand, if it hasn't been given at all, we can + // safely default it to the user's username. + const hasTitle = attrs.title === 'undefined' || attrs.title; + if (!hasTitle) delete attrs.title; - // If a user has been passed, then we will set up an avatar using their - // uploaded image, or the first letter of their username if they haven't - // uploaded one. - if (user) { - const username = user.displayName() || '?'; - const avatarUrl = user.avatarUrl(); + // If a user has been passed, then we will set up an avatar using their + // uploaded image, or the first letter of their username if they haven't + // uploaded one. + if (user) { + const username = user.displayName() || '?'; + const avatarUrl = user.avatarUrl(); - if (hasTitle) attrs.title = attrs.title || username; + if (hasTitle) attrs.title = attrs.title || username; - if (avatarUrl) { - return <img {...attrs} src={avatarUrl}/>; + if (avatarUrl) { + return <img {...attrs} src={avatarUrl} />; + } + + content = username.charAt(0).toUpperCase(); + attrs.style = { background: user.color() }; } - content = username.charAt(0).toUpperCase(); - attrs.style = {background: user.color()}; - } - - return <span {...attrs}>{content}</span>; + return <span {...attrs}>{content}</span>; } diff --git a/js/src/common/helpers/highlight.ts b/js/src/common/helpers/highlight.ts index 1d91e35ee..6ac687700 100644 --- a/js/src/common/helpers/highlight.ts +++ b/js/src/common/helpers/highlight.ts @@ -9,28 +9,30 @@ import { truncate } from '../utils/string'; * @param {Integer} [length] The number of characters to truncate the string to. * The string will be truncated surrounding the first match. */ -export default function highlight(string: string, phrase: string|RegExp, length?: number): any { - if (!phrase && !length) return string; +export default function highlight(string: string, phrase: string | RegExp, length?: number): any { + if (!phrase && !length) return string; - // Convert the word phrase into a global regular expression (if it isn't - // already) so we can search the string for matched. - const regexp = phrase instanceof RegExp ? phrase : new RegExp(phrase, 'gi'); + // Convert the word phrase into a global regular expression (if it isn't + // already) so we can search the string for matched. + const regexp = phrase instanceof RegExp ? phrase : new RegExp(phrase, 'gi'); - let highlighted = string; - let start = 0; + let highlighted = string; + let start = 0; - // If a length was given, the truncate the string surrounding the first match. - if (length) { - if (phrase) start = Math.max(0, string.search(regexp) - length / 2); + // If a length was given, the truncate the string surrounding the first match. + if (length) { + if (phrase) start = Math.max(0, string.search(regexp) - length / 2); - highlighted = truncate(highlighted, length, start); - } + highlighted = truncate(highlighted, length, start); + } - // Convert the string into HTML entities, then highlight all matches with - // <mark> tags. Then we will return the result as a trusted HTML string. - highlighted = $('<div/>').text(highlighted).html(); + // Convert the string into HTML entities, then highlight all matches with + // <mark> tags. Then we will return the result as a trusted HTML string. + highlighted = $('<div/>') + .text(highlighted) + .html(); - if (phrase) highlighted = highlighted.replace(regexp, '<mark>$&</mark>'); + if (phrase) highlighted = highlighted.replace(regexp, '<mark>$&</mark>'); - return m.trust(highlighted); + return m.trust(highlighted); } diff --git a/js/src/common/helpers/icon.tsx b/js/src/common/helpers/icon.tsx index e11481156..c4723378e 100644 --- a/js/src/common/helpers/icon.tsx +++ b/js/src/common/helpers/icon.tsx @@ -5,7 +5,7 @@ * @param {Object} attrs Any other attributes to apply. */ export default function icon(fontClass: string, attrs: any = {}) { - attrs.className = 'icon ' + fontClass + ' ' + (attrs.className || ''); + attrs.className = 'icon ' + fontClass + ' ' + (attrs.className || ''); - return <i {...attrs}/>; + return <i {...attrs} />; } diff --git a/js/src/common/helpers/listItems.tsx b/js/src/common/helpers/listItems.tsx index 0d3c6e0f1..cd1ce2f31 100644 --- a/js/src/common/helpers/listItems.tsx +++ b/js/src/common/helpers/listItems.tsx @@ -1,21 +1,21 @@ import Separator from '../components/Separator'; export function isSeparator(item) { - return item?.tag === Separator; + return item?.tag === Separator; } export function withoutUnnecessarySeparators(items) { - const newItems = []; - let prevItem; + const newItems = []; + let prevItem; - items.forEach((item, i) => { - if (!isSeparator(item) || (prevItem && !isSeparator(prevItem) && i !== items.length - 1)) { - prevItem = item; - newItems.push(item); - } - }); + items.forEach((item, i) => { + if (!isSeparator(item) || (prevItem && !isSeparator(prevItem) && i !== items.length - 1)) { + prevItem = item; + newItems.push(item); + } + }); - return newItems; + return newItems; } /** @@ -26,32 +26,32 @@ export function withoutUnnecessarySeparators(items) { * @return {Array} */ export default function listItems(items) { - if (!(items instanceof Array)) items = [items]; + if (!(items instanceof Array)) items = [items]; - return withoutUnnecessarySeparators(items).map(item => { - const isListItem = item.tag?.isListItem; - const active = item.tag?.isActive && item.tag.isActive(item.attrs); - const className = item.attrs?.itemClassName || item.itemClassName; + return withoutUnnecessarySeparators(items).map(item => { + const isListItem = item.tag?.isListItem; + const active = item.tag?.isActive && item.tag.isActive(item.attrs); + const className = item.attrs?.itemClassName || item.itemClassName; - if (isListItem) { - item.attrs = item.attrs || {}; - item.attrs.key = item.attrs.key || item.itemName; - item.key = item.attrs.key; - } + if (isListItem) { + item.attrs = item.attrs || {}; + item.attrs.key = item.attrs.key || item.itemName; + item.key = item.attrs.key; + } - const node = isListItem - ? item - : <li className={classNames(className, [ - (item.itemName && `item-${item.itemName}`), - active && 'active', - ])} - key={item.attrs?.key || item.itemName}> - {item} - </li>; + const node = isListItem ? ( + item + ) : ( + <li + className={classNames(className, [item.itemName && `item-${item.itemName}`, active && 'active'])} + key={item.attrs?.key || item.itemName} + > + {item} + </li> + ); + node.state = node.state || {}; - node.state = node.state || {}; - - return node; - }); + return node; + }); } diff --git a/js/src/common/helpers/username.tsx b/js/src/common/helpers/username.tsx index 0230bc7c2..5585a6d9a 100644 --- a/js/src/common/helpers/username.tsx +++ b/js/src/common/helpers/username.tsx @@ -5,7 +5,7 @@ * @param {User} user */ export default function username(user): any { - const name = (user && user.displayName()) || app.translator.trans('core.lib.username.deleted_text'); + const name = (user && user.displayName()) || app.translator.trans('core.lib.username.deleted_text'); - return <span className="username">{name}</span>; + return <span className="username">{name}</span>; } diff --git a/js/src/common/models/Discussion.tsx b/js/src/common/models/Discussion.tsx index ac24ddfb6..248fe736c 100644 --- a/js/src/common/models/Discussion.tsx +++ b/js/src/common/models/Discussion.tsx @@ -7,89 +7,89 @@ import User from './User'; import Post from './Post'; export default class Discussion extends Model { - title = Model.attribute('title') as () => string; - slug = Model.attribute('slug') as () => string; + title = Model.attribute('title') as () => string; + slug = Model.attribute('slug') as () => string; - createdAt = Model.attribute('createdAt', Model.transformDate) as () => Date; - user = Model.hasOne('user') as () => User; - firstPost = Model.hasOne('firstPost') as () => Post; + createdAt = Model.attribute('createdAt', Model.transformDate) as () => Date; + user = Model.hasOne('user') as () => User; + firstPost = Model.hasOne('firstPost') as () => Post; - lastPostedAt = Model.attribute('lastPostedAt', Model.transformDate) as () => Date; - lastPostedUser = Model.hasOne('lastPostedUser') as () => User; - lastPost = Model.hasOne('lastPost') as () => Post; - lastPostNumber = Model.attribute('lastPostNumber') as () => number; + lastPostedAt = Model.attribute('lastPostedAt', Model.transformDate) as () => Date; + lastPostedUser = Model.hasOne('lastPostedUser') as () => User; + lastPost = Model.hasOne('lastPost') as () => Post; + lastPostNumber = Model.attribute('lastPostNumber') as () => number; - commentCount = Model.attribute('commentCount') as () => number; - replyCount = computed('commentCount', commentCount => Math.max(0, commentCount - 1)) as () => string; - posts = Model.hasMany('posts') as () => Post[]; - mostRelevantPost = Model.hasOne('mostRelevantPost') as () => Post; + commentCount = Model.attribute('commentCount') as () => number; + replyCount = computed('commentCount', commentCount => Math.max(0, commentCount - 1)) as () => string; + posts = Model.hasMany('posts') as () => Post[]; + mostRelevantPost = Model.hasOne('mostRelevantPost') as () => Post; - lastReadAt = Model.attribute('lastReadAt', Model.transformDate) as () => Date; - lastReadPostNumber = Model.attribute('lastReadPostNumber') as () => number; - isUnread = computed('unreadCount', unreadCount => !!unreadCount) as () => boolean; - isRead = computed('unreadCount', unreadCount => app.session.user && !unreadCount) as () => boolean; + lastReadAt = Model.attribute('lastReadAt', Model.transformDate) as () => Date; + lastReadPostNumber = Model.attribute('lastReadPostNumber') as () => number; + isUnread = computed('unreadCount', unreadCount => !!unreadCount) as () => boolean; + isRead = computed('unreadCount', unreadCount => app.session.user && !unreadCount) as () => boolean; - hiddenAt = Model.attribute('hiddenAt', Model.transformDate) as () => Date; - hiddenUser = Model.hasOne('hiddenUser') as () => User; - isHidden = computed('hiddenAt', hiddenAt => !!hiddenAt) as () => boolean; + hiddenAt = Model.attribute('hiddenAt', Model.transformDate) as () => Date; + hiddenUser = Model.hasOne('hiddenUser') as () => User; + isHidden = computed('hiddenAt', hiddenAt => !!hiddenAt) as () => boolean; - canReply = Model.attribute('canReply') as () => boolean; - canRename = Model.attribute('canRename') as () => boolean; - canHide = Model.attribute('canHide') as () => boolean; - canDelete = Model.attribute('canDelete') as () => boolean; + canReply = Model.attribute('canReply') as () => boolean; + canRename = Model.attribute('canRename') as () => boolean; + canHide = Model.attribute('canHide') as () => boolean; + canDelete = Model.attribute('canDelete') as () => boolean; - /** - * Remove a post from the discussion's posts relationship. - * - * @param id The ID of the post to remove. - */ - removePost(id: number) { - const relationships = this.data.relationships; - const posts = relationships && relationships.posts; + /** + * Remove a post from the discussion's posts relationship. + * + * @param id The ID of the post to remove. + */ + removePost(id: number) { + const relationships = this.data.relationships; + const posts = relationships && relationships.posts; - if (posts) { - posts.data.some((data, i) => { - if (id === data.id) { - posts.data.splice(i, 1); - return true; + if (posts) { + posts.data.some((data, i) => { + if (id === data.id) { + posts.data.splice(i, 1); + return true; + } + }); } - }); - } - } - - /** - * Get the estimated number of unread posts in this discussion for the current - * user. - */ - unreadCount(): number { - const user = app.session.user; - - if (user && user.markedAllAsReadAt() < this.lastPostedAt()) { - return Math.max(0, this.lastPostNumber() - (this.lastReadPostNumber() || 0)); } - return 0; - } + /** + * Get the estimated number of unread posts in this discussion for the current + * user. + */ + unreadCount(): number { + const user = app.session.user; - /** - * Get the Badge components that apply to this discussion. - */ - badges(): ItemList { - const items = new ItemList(); + if (user && user.markedAllAsReadAt() < this.lastPostedAt()) { + return Math.max(0, this.lastPostNumber() - (this.lastReadPostNumber() || 0)); + } - if (this.isHidden()) { - items.add('hidden', <Badge type="hidden" icon="fas fa-trash" label={app.translator.trans('core.lib.badge.hidden_tooltip')}/>); + return 0; } - return items; - } + /** + * Get the Badge components that apply to this discussion. + */ + badges(): ItemList { + const items = new ItemList(); - /** - * Get a list of all of the post IDs in this discussion. - */ - postIds(): number[] { - const posts = this.data.relationships.posts; + if (this.isHidden()) { + items.add('hidden', <Badge type="hidden" icon="fas fa-trash" label={app.translator.trans('core.lib.badge.hidden_tooltip')} />); + } - return posts ? posts.data.map(link => link.id) : []; - } + return items; + } + + /** + * Get a list of all of the post IDs in this discussion. + */ + postIds(): number[] { + const posts = this.data.relationships.posts; + + return posts ? posts.data.map(link => link.id) : []; + } } diff --git a/js/src/common/models/Forum.ts b/js/src/common/models/Forum.ts index adeec5c44..c970809c8 100644 --- a/js/src/common/models/Forum.ts +++ b/js/src/common/models/Forum.ts @@ -1,7 +1,7 @@ import Model from '../Model'; export default class Forum extends Model { - apiEndpoint() { - return '/'; - } + apiEndpoint() { + return '/'; + } } diff --git a/js/src/common/models/Group.ts b/js/src/common/models/Group.ts index 7d213e47c..612025415 100644 --- a/js/src/common/models/Group.ts +++ b/js/src/common/models/Group.ts @@ -1,12 +1,12 @@ import Model from '../Model'; export default class Group extends Model { - static ADMINISTRATOR_ID = '1'; - static GUEST_ID = '2'; - static MEMBER_ID = '3'; + static ADMINISTRATOR_ID = '1'; + static GUEST_ID = '2'; + static MEMBER_ID = '3'; - nameSingular = Model.attribute('nameSingular') as () => string; - namePlural = Model.attribute('namePlural') as () => string; - color = Model.attribute('color') as () => string; - icon = Model.attribute('icon') as () => string; + nameSingular = Model.attribute('nameSingular') as () => string; + namePlural = Model.attribute('namePlural') as () => string; + color = Model.attribute('color') as () => string; + icon = Model.attribute('icon') as () => string; } diff --git a/js/src/common/models/Notification.ts b/js/src/common/models/Notification.ts index 366db5d9b..53c359ad9 100644 --- a/js/src/common/models/Notification.ts +++ b/js/src/common/models/Notification.ts @@ -2,17 +2,17 @@ import Model from '../Model'; import User from './User'; export default class Notification extends Model { - static ADMINISTRATOR_ID = '1'; - static GUEST_ID = '2'; - static MEMBER_ID = '3'; + static ADMINISTRATOR_ID = '1'; + static GUEST_ID = '2'; + static MEMBER_ID = '3'; - contentType = Model.attribute('contentType') as () => string; - content = Model.attribute('content') as () => string; - createdAt = Model.attribute('createdAt', Model.transformDate) as () => Date; + contentType = Model.attribute('contentType') as () => string; + content = Model.attribute('content') as () => string; + createdAt = Model.attribute('createdAt', Model.transformDate) as () => Date; - isRead = Model.attribute('isRead') as () => boolean; + isRead = Model.attribute('isRead') as () => boolean; - user = Model.hasOne('user') as () => User; - fromUser = Model.hasOne('fromUser') as () => User; - subject = Model.hasOne('subhect') as () => any; + user = Model.hasOne('user') as () => User; + fromUser = Model.hasOne('fromUser') as () => User; + subject = Model.hasOne('subhect') as () => any; } diff --git a/js/src/common/models/Post.ts b/js/src/common/models/Post.ts index b7b5a00a2..01cf75118 100644 --- a/js/src/common/models/Post.ts +++ b/js/src/common/models/Post.ts @@ -3,28 +3,28 @@ import computed from '../utils/computed'; import { getPlainContent } from '../utils/string'; import Discussion from './Discussion'; -import User from "./User"; +import User from './User'; export default class Post extends Model { - number = Model.attribute('number') as () => number; - discussion = Model.hasOne('discussion') as () => Discussion; + number = Model.attribute('number') as () => number; + discussion = Model.hasOne('discussion') as () => Discussion; - createdAt= Model.attribute('createdAt', Model.transformDate) as () => Date; - user = Model.hasOne('user') as () => User; - contentType = Model.attribute('contentType') as () => string; - content = Model.attribute('content') as () => string; - contentHtml = Model.attribute('contentHtml') as () => string; - contentPlain = computed('contentHtml', getPlainContent) as () => string; + createdAt = Model.attribute('createdAt', Model.transformDate) as () => Date; + user = Model.hasOne('user') as () => User; + contentType = Model.attribute('contentType') as () => string; + content = Model.attribute('content') as () => string; + contentHtml = Model.attribute('contentHtml') as () => string; + contentPlain = computed('contentHtml', getPlainContent) as () => string; - editedAt = Model.attribute('editedAt', Model.transformDate) as () => Date; - editedUser = Model.hasOne('editedUser') as () => User; - isEdited = computed('editedAt', editedAt => !!editedAt) as () => boolean; + editedAt = Model.attribute('editedAt', Model.transformDate) as () => Date; + editedUser = Model.hasOne('editedUser') as () => User; + isEdited = computed('editedAt', editedAt => !!editedAt) as () => boolean; - hiddenAt = Model.attribute('hiddenAt', Model.transformDate) as () => Date; - hiddenUser = Model.hasOne('hiddenUser') as () => User; - isHidden = computed('hiddenAt', hiddenAt => !!hiddenAt) as () => boolean; + hiddenAt = Model.attribute('hiddenAt', Model.transformDate) as () => Date; + hiddenUser = Model.hasOne('hiddenUser') as () => User; + isHidden = computed('hiddenAt', hiddenAt => !!hiddenAt) as () => boolean; - canEdit = Model.attribute('canEdit') as () => boolean; - canHide = Model.attribute('canHide') as () => boolean; - canDelete = Model.attribute('canDelete') as () => boolean; + canEdit = Model.attribute('canEdit') as () => boolean; + canHide = Model.attribute('canHide') as () => boolean; + canDelete = Model.attribute('canDelete') as () => boolean; } diff --git a/js/src/common/models/User.ts b/js/src/common/models/User.ts index ec30ee6ae..88af6cfd1 100644 --- a/js/src/common/models/User.ts +++ b/js/src/common/models/User.ts @@ -6,93 +6,98 @@ import GroupBadge from '../components/GroupBadge'; import Group from './Group'; export default class User extends Model { - username = Model.attribute('username') as () => string; + username = Model.attribute('username') as () => string; - displayName = Model.attribute('displayName') as () => string; - email = Model.attribute('email') as () => string; - isEmailConfirmed = Model.attribute('isEmailConfirmed') as () => boolean; - password = Model.attribute('password') as () => string; + displayName = Model.attribute('displayName') as () => string; + email = Model.attribute('email') as () => string; + isEmailConfirmed = Model.attribute('isEmailConfirmed') as () => boolean; + password = Model.attribute('password') as () => string; - avatarUrl = Model.attribute('avatarUrl') as () => string; - preferences = Model.attribute('preferences') as () => string; - groups = Model.hasMany('groups') as () => Group[]; + avatarUrl = Model.attribute('avatarUrl') as () => string; + preferences = Model.attribute('preferences') as () => string; + groups = Model.hasMany('groups') as () => Group[]; - joinTime = Model.attribute('joinTime', Model.transformDate) as () => Date; - lastSeenAt = Model.attribute('lastSeenAt', Model.transformDate) as () => Date; - markedAllAsReadAt = Model.attribute('markedAllAsReadAt', Model.transformDate) as () => Date; - unreadNotificationCount = Model.attribute('unreadNotificationCount') as () => number; - newNotificationCount = Model.attribute('newNotificationCount') as () => number; + joinTime = Model.attribute('joinTime', Model.transformDate) as () => Date; + lastSeenAt = Model.attribute('lastSeenAt', Model.transformDate) as () => Date; + markedAllAsReadAt = Model.attribute('markedAllAsReadAt', Model.transformDate) as () => Date; + unreadNotificationCount = Model.attribute('unreadNotificationCount') as () => number; + newNotificationCount = Model.attribute('newNotificationCount') as () => number; - discussionCount = Model.attribute('discussionCount') as () => number; - commentCount = Model.attribute('commentCount') as () => number; + discussionCount = Model.attribute('discussionCount') as () => number; + commentCount = Model.attribute('commentCount') as () => number; - canEdit = Model.attribute('canEdit') as () => boolean; - canDelete = Model.attribute('canDelete') as () => boolean; + canEdit = Model.attribute('canEdit') as () => boolean; + canDelete = Model.attribute('canDelete') as () => boolean; - avatarColor = null; - color = computed(['username', 'avatarUrl', 'avatarColor'], function(username, avatarUrl, avatarColor) { - // If we've already calculated and cached the dominant color of the user's - // avatar, then we can return that in RGB format. If we haven't, we'll want - // to calculate it. Unless the user doesn't have an avatar, in which case - // we generate a color from their username. - if (avatarColor) { - return 'rgb(' + avatarColor.join(', ') + ')'; - } else if (avatarUrl) { - this.calculateAvatarColor(); - return ''; + avatarColor = null; + color = computed(['username', 'avatarUrl', 'avatarColor'], function(username, avatarUrl, avatarColor) { + // If we've already calculated and cached the dominant color of the user's + // avatar, then we can return that in RGB format. If we haven't, we'll want + // to calculate it. Unless the user doesn't have an avatar, in which case + // we generate a color from their username. + if (avatarColor) { + return 'rgb(' + avatarColor.join(', ') + ')'; + } else if (avatarUrl) { + this.calculateAvatarColor(); + return ''; + } + + return '#' + stringToColor(username); + }) as () => string; + + isOnline(): boolean { + return ( + this.lastSeenAt() > + dayjs() + .subtract(5, 'minutes') + .toDate() + ); } - return '#' + stringToColor(username); - }) as () => string; + /** + * Get the Badge components that apply to this user. + */ + badges(): ItemList { + const items = new ItemList(); + const groups = this.groups(); - isOnline(): boolean { - return this.lastSeenAt() > dayjs().subtract(5, 'minutes').toDate(); - } + if (groups) { + groups.forEach(group => { + items.add('group' + group.id(), GroupBadge.component({ group })); + }); + } - /** - * Get the Badge components that apply to this user. - */ - badges(): ItemList { - const items = new ItemList(); - const groups = this.groups(); - - if (groups) { - groups.forEach(group => { - items.add('group' + group.id(), GroupBadge.component({group})); - }); + return items; } - return items; - } + /** + * Calculate the dominant color of the user's avatar. The dominant color will + * be set to the `avatarColor` property once it has been calculated. + * + * @protected + */ + calculateAvatarColor() { + const image = new Image(); + const user = this; - /** - * Calculate the dominant color of the user's avatar. The dominant color will - * be set to the `avatarColor` property once it has been calculated. - * - * @protected - */ - calculateAvatarColor() { - const image = new Image(); - const user = this; + image.onload = function() { + const colorThief = new ColorThief(); + user.avatarColor = colorThief.getColor(this); + user.freshness = new Date(); + m.redraw(); + }; + image.crossOrigin = 'anonymous'; + image.src = this.avatarUrl(); + } - image.onload = function() { - const colorThief = new ColorThief(); - user.avatarColor = colorThief.getColor(this); - user.freshness = new Date(); - m.redraw(); - }; - image.crossOrigin = 'anonymous'; - image.src = this.avatarUrl(); - } + /** + * Update the user's preferences. + */ + savePreferences(newPreferences: object): Promise<User> { + const preferences = this.preferences(); - /** - * Update the user's preferences. - */ - savePreferences(newPreferences: object): Promise<User> { - const preferences = this.preferences(); + Object.assign(preferences, newPreferences); - Object.assign(preferences, newPreferences); - - return <Promise<User>> this.save({preferences}); - } + return <Promise<User>>this.save({ preferences }); + } } diff --git a/js/src/common/utils/Drawer.ts b/js/src/common/utils/Drawer.ts index dd903261d..215ea63a9 100644 --- a/js/src/common/utils/Drawer.ts +++ b/js/src/common/utils/Drawer.ts @@ -4,48 +4,48 @@ * footer. */ export default class Drawer { - private $backdrop?: ZeptoCollection; + private $backdrop?: ZeptoCollection; - constructor() { - // Set up an event handler so that whenever the content area is tapped, - // the drawer will close. - $('#content').click(e => { - if (this.isOpen()) { - e.preventDefault(); - this.hide(); - } - }); - } + constructor() { + // Set up an event handler so that whenever the content area is tapped, + // the drawer will close. + $('#content').click(e => { + if (this.isOpen()) { + e.preventDefault(); + this.hide(); + } + }); + } - /** - * Check whether or not the drawer is currently open. - */ - isOpen(): boolean { - return $('#app').hasClass('drawerOpen'); - } + /** + * Check whether or not the drawer is currently open. + */ + isOpen(): boolean { + return $('#app').hasClass('drawerOpen'); + } - /** - * Hide the drawer. - */ - hide() { - $('#app').removeClass('drawerOpen'); + /** + * Hide the drawer. + */ + hide() { + $('#app').removeClass('drawerOpen'); - if (this.$backdrop) this.$backdrop.remove(); - } + if (this.$backdrop) this.$backdrop.remove(); + } - /** - * Show the drawer. - * - * @public - */ - show() { - $('#app').addClass('drawerOpen'); + /** + * Show the drawer. + * + * @public + */ + show() { + $('#app').addClass('drawerOpen'); - this.$backdrop = $('<div/>') - .addClass('drawer-backdrop fade') - .appendTo('body') - .click(() => this.hide()); + this.$backdrop = $('<div/>') + .addClass('drawer-backdrop fade') + .appendTo('body') + .click(() => this.hide()); - setTimeout(() => this.$backdrop.addClass('in')); - } + setTimeout(() => this.$backdrop.addClass('in')); + } } diff --git a/js/src/common/utils/RequestError.ts b/js/src/common/utils/RequestError.ts index 41107236a..264ceeffe 100644 --- a/js/src/common/utils/RequestError.ts +++ b/js/src/common/utils/RequestError.ts @@ -1,4 +1,4 @@ -import Mithril from "mithril"; +import Mithril from 'mithril'; export interface RequestErrorResponse extends JSON { errors?: { @@ -18,17 +18,17 @@ export default class RequestError { alert?: Mithril.Vnode; constructor(status, responseText, options, xhr) { - this.status = status; - this.responseText = responseText; - this.options = options; - this.xhr = xhr; + this.status = status; + this.responseText = responseText; + this.options = options; + this.xhr = xhr; - try { - this.response = JSON.parse(responseText); - } catch (e) { - this.response = null; - } + try { + this.response = JSON.parse(responseText); + } catch (e) { + this.response = null; + } - this.alert = null; + this.alert = null; } } diff --git a/js/src/common/utils/computed.ts b/js/src/common/utils/computed.ts index 4ed7cf632..44e5e7e98 100644 --- a/js/src/common/utils/computed.ts +++ b/js/src/common/utils/computed.ts @@ -6,30 +6,33 @@ * @param {function} compute The function which computes the value using the * dependent values. */ -export default function computed(dependentKeys: string|string[], compute: Function): () => any { - const keys = Array.from(dependentKeys); +export default function computed(dependentKeys: string | string[], compute: Function): () => any { + const keys = Array.from(dependentKeys); - const dependentValues = {}; - let computedValue; + const dependentValues = {}; + let computedValue; - return function() { - let recompute = false; + return function() { + let recompute = false; - // Read all of the dependent values. If any of them have changed since last - // time, then we'll want to recompute our output. - keys.forEach(key => { - const value = typeof this[key] === 'function' ? this[key]() : this[key]; + // Read all of the dependent values. If any of them have changed since last + // time, then we'll want to recompute our output. + keys.forEach(key => { + const value = typeof this[key] === 'function' ? this[key]() : this[key]; - if (dependentValues[key] !== value) { - recompute = true; - dependentValues[key] = value; - } - }); + if (dependentValues[key] !== value) { + recompute = true; + dependentValues[key] = value; + } + }); - if (recompute) { - computedValue = compute.apply(this, keys.map(key => dependentValues[key])); - } + if (recompute) { + computedValue = compute.apply( + this, + keys.map(key => dependentValues[key]) + ); + } - return computedValue; - }; + return computedValue; + }; } diff --git a/js/src/common/utils/extractText.ts b/js/src/common/utils/extractText.ts index cb5423a85..010396f3a 100644 --- a/js/src/common/utils/extractText.ts +++ b/js/src/common/utils/extractText.ts @@ -5,11 +5,11 @@ * @return {String} */ export default function extractText(vdom: any): string { - if (vdom instanceof Array) { - return vdom.map(element => extractText(element)).join(''); - } else if (typeof vdom === 'object' && vdom !== null) { - return vdom.text || extractText(vdom.children); - } else { - return vdom; - } + if (vdom instanceof Array) { + return vdom.map(element => extractText(element)).join(''); + } else if (typeof vdom === 'object' && vdom !== null) { + return vdom.text || extractText(vdom.children); + } else { + return vdom; + } } diff --git a/js/src/common/utils/humanTime.ts b/js/src/common/utils/humanTime.ts index 746bc2cc5..ea95d3f06 100644 --- a/js/src/common/utils/humanTime.ts +++ b/js/src/common/utils/humanTime.ts @@ -3,31 +3,31 @@ * ago string. */ export default function humanTime(time: Date): string { - let m = dayjs(time); - const now = dayjs(); + let m = dayjs(time); + const now = dayjs(); - // To prevent showing things like "in a few seconds" due to small offsets - // between client and server time, we always reset future dates to the - // current time. This will result in "just now" being shown instead. - if (m.isAfter(now)) { - m = now; - } - - const day = 864e5; - const diff = m.diff(dayjs()); - let ago = null; - - // If this date was more than a month ago, we'll show the name of the month - // in the string. If it wasn't this year, we'll show the year as well. - if (diff < -30 * day) { - if (m.year() === dayjs().year()) { - ago = m.format('D MMM'); - } else { - ago = m.format('MMM \'YY'); + // To prevent showing things like "in a few seconds" due to small offsets + // between client and server time, we always reset future dates to the + // current time. This will result in "just now" being shown instead. + if (m.isAfter(now)) { + m = now; } - } else { - ago = m.fromNow(); - } - return ago; -}; + const day = 864e5; + const diff = m.diff(dayjs()); + let ago = null; + + // If this date was more than a month ago, we'll show the name of the month + // in the string. If it wasn't this year, we'll show the year as well. + if (diff < -30 * day) { + if (m.year() === dayjs().year()) { + ago = m.format('D MMM'); + } else { + ago = m.format("MMM 'YY"); + } + } else { + ago = m.fromNow(); + } + + return ago; +} diff --git a/js/src/common/utils/patchMithril.ts b/js/src/common/utils/patchMithril.ts index bf740f272..afce5c777 100644 --- a/js/src/common/utils/patchMithril.ts +++ b/js/src/common/utils/patchMithril.ts @@ -6,7 +6,7 @@ import Component from '../Component'; export default () => { const mo = window['m']; - const _m = function (comp, ...args) { + const _m = function(comp, ...args) { if (!arguments[1]) arguments[1] = {}; if (comp.prototype && comp.prototype instanceof Component) { @@ -42,13 +42,14 @@ export default () => { return node; }; - Object.keys(mo).forEach(key => _m[key] = mo[key]); + Object.keys(mo).forEach(key => (_m[key] = mo[key])); - _m.withAttr = (key: string, cb: Function) => function () { - cb(this.getAttribute(key) || this[key]); - }; + _m.withAttr = (key: string, cb: Function) => + function() { + cb(this.getAttribute(key) || this[key]); + }; _m.prop = prop; window['m'] = _m; -} +}; diff --git a/js/src/common/utils/patchZepto.ts b/js/src/common/utils/patchZepto.ts index 6e857fa71..72a304ae3 100644 --- a/js/src/common/utils/patchZepto.ts +++ b/js/src/common/utils/patchZepto.ts @@ -2,74 +2,72 @@ import jump from 'jump.js'; import Tooltip from 'tooltip.js'; // add $.fn.tooltip -$.fn.tooltip = function (option) { - return this.each(function () { - const $this = $(this); - let data = $this.data('bs.tooltip'); - const options = typeof option === 'object' && option || {}; +$.fn.tooltip = function(option) { + return this.each(function() { + const $this = $(this); + let data = $this.data('bs.tooltip'); + const options = (typeof option === 'object' && option) || {}; - if ($this.attr('title')) { - options.title = $this.attr('title'); - $this.removeAttr('title'); - $this.attr('data-original-title', options.title); - } + if ($this.attr('title')) { + options.title = $this.attr('title'); + $this.removeAttr('title'); + $this.attr('data-original-title', options.title); + } - if (option === 'destroy') option = 'dispose'; + if (option === 'destroy') option = 'dispose'; - if (!data && ['dispose', 'hide'].includes(option)) return; + if (!data && ['dispose', 'hide'].includes(option)) return; - if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options))); - if (typeof option === 'string' && data[option]) data[option](); - }); + if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options))); + if (typeof option === 'string' && data[option]) data[option](); + }); }; // add $.fn.outerWidth and $.fn.outerHeight ['width', 'height'].forEach(function(dimension) { - const Dimension = dimension.replace(/./, function (m) { - return m[0].toUpperCase() - }); + const Dimension = dimension.replace(/./, function(m) { + return m[0].toUpperCase(); + }); - $.fn[`outer${Dimension}`] = function(margin) { - const elem = this; + $.fn[`outer${Dimension}`] = function(margin) { + const elem = this; - if (elem) { - const sides = {'width': ['left', 'right'], 'height': ['top', 'bottom']}; - let size = elem[dimension](); + if (elem) { + const sides = { width: ['left', 'right'], height: ['top', 'bottom'] }; + let size = elem[dimension](); - sides[dimension].forEach(function(side) { - if (margin) size += parseInt(elem.css('margin-' + side), 10); - }); + sides[dimension].forEach(function(side) { + if (margin) size += parseInt(elem.css('margin-' + side), 10); + }); - return size; - } else { - return null; - } - }; + return size; + } else { + return null; + } + }; }); // allow use of $(':input') // @ts-ignore $.expr[':']['input'] = function() { - if (('disabled' in this) || ['INPUT', 'SELECT', 'TEXTAREA', 'BUTTON'].includes(this.tagName)) return this; + if ('disabled' in this || ['INPUT', 'SELECT', 'TEXTAREA', 'BUTTON'].includes(this.tagName)) return this; }; // add $().hover() method $.fn.hover = function(hover, leave) { - return this - .on('mouseenter', hover) - .on('mouseleave', leave || hover); + return this.on('mouseenter', hover).on('mouseleave', leave || hover); }; // add animated scroll -$.fn.animatedScrollTop = function (to, duration = $.fx.speeds._default, callback) { - if (typeof to === 'number') to -= (window.scrollY || window.pageYOffset); +$.fn.animatedScrollTop = function(to, duration = $.fx.speeds._default, callback) { + if (typeof to === 'number') to -= window.scrollY || window.pageYOffset; - jump(to, { - duration: $.fx.speeds[duration] || duration, - callback - }); + jump(to, { + duration: $.fx.speeds[duration] || duration, + callback, + }); - return this; + return this; }; // required for compatibility with jquery plugins @@ -86,53 +84,51 @@ $.event.special = $.event.special || {}; const bindBeforeSpecialEvents = $.fn.bind; $.fn.bind = function(eventName, data, callback) { - const el = this; + const el = this; - if (!callback){ - callback = data; - data = null; - } - - $.each(eventName.split(/\s/), (key: string, value: any) : boolean => { - value = value.split(/\./)[0]; - - if(value in $.event.special){ - let specialEvent = $.event.special[value]; - - /// init enable special events on Zepto - if(!specialEvent._init) { - specialEvent._init = true; - - /// intercept and replace the special event handler to add functionality - specialEvent.originalHandler = specialEvent.handler; - specialEvent.handler = function(){ - - /// make event argument writable, like on jQuery - const args = Array.prototype.slice.call(arguments); - - args[0] = $.extend({},args[0]); - - /// define the event handle, $.event.dispatch is only for newer versions of jQuery - $.event.handle = function(){ - - /// make context of trigger the event element - const args = Array.prototype.slice.call(arguments); - const event = args[0]; - const $target = $(event.target); - - $target.trigger.apply( $target, arguments ); - }; - - specialEvent.originalHandler.apply(this,args); - } - } - - /// setup special events on Zepto - specialEvent.setup.apply(el, [data]); + if (!callback) { + callback = data; + data = null; } - return true; - }); + $.each(eventName.split(/\s/), (key: string, value: any): boolean => { + value = value.split(/\./)[0]; - return bindBeforeSpecialEvents.apply(this, [eventName, callback]); + if (value in $.event.special) { + let specialEvent = $.event.special[value]; + + /// init enable special events on Zepto + if (!specialEvent._init) { + specialEvent._init = true; + + /// intercept and replace the special event handler to add functionality + specialEvent.originalHandler = specialEvent.handler; + specialEvent.handler = function() { + /// make event argument writable, like on jQuery + const args = Array.prototype.slice.call(arguments); + + args[0] = $.extend({}, args[0]); + + /// define the event handle, $.event.dispatch is only for newer versions of jQuery + $.event.handle = function() { + /// make context of trigger the event element + const args = Array.prototype.slice.call(arguments); + const event = args[0]; + const $target = $(event.target); + + $target.trigger.apply($target, arguments); + }; + + specialEvent.originalHandler.apply(this, args); + }; + } + + /// setup special events on Zepto + specialEvent.setup.apply(el, [data]); + } + + return true; + }); + + return bindBeforeSpecialEvents.apply(this, [eventName, callback]); }; diff --git a/js/src/common/utils/string.ts b/js/src/common/utils/string.ts index 4bd48d0fc..315d391e7 100644 --- a/js/src/common/utils/string.ts +++ b/js/src/common/utils/string.ts @@ -2,9 +2,7 @@ * Truncate a string to the given length, appending ellipses if necessary. */ export function truncate(string: string, length: number, start = 0): string { - return (start > 0 ? '...' : '') + - string.substring(start, start + length) + - (string.length > start + length ? '...' : ''); + return (start > 0 ? '...' : '') + string.substring(start, start + length) + (string.length > start + length ? '...' : ''); } /** @@ -12,10 +10,11 @@ export function truncate(string: string, length: number, start = 0): string { * converted to hyphens. */ export function slug(string: string): string { - return string.toLowerCase() - .replace(/[^a-z0-9]/gi, '-') - .replace(/-+/g, '-') - .replace(/-$|^-/g, ''); + return string + .toLowerCase() + .replace(/[^a-z0-9]/gi, '-') + .replace(/-+/g, '-') + .replace(/-$|^-/g, ''); } /** @@ -23,15 +22,16 @@ export function slug(string: string): string { * meaningful punctuation. */ export function getPlainContent(string: string): string { - const html = string - .replace(/(<\/p>|<br>)/g, '$1  ') - .replace(/<img\b[^>]*>/ig, ' '); + const html = string.replace(/(<\/p>|<br>)/g, '$1  ').replace(/<img\b[^>]*>/gi, ' '); - const dom = $('<div/>').html(html); + const dom = $('<div/>').html(html); - dom.find(getPlainContent.removeSelectors.join(',')).remove(); + dom.find(getPlainContent.removeSelectors.join(',')).remove(); - return dom.text().replace(/\s+/g, ' ').trim(); + return dom + .text() + .replace(/\s+/g, ' ') + .trim(); } /** @@ -45,5 +45,5 @@ getPlainContent.removeSelectors = ['blockquote', 'script']; * Make a string's first character uppercase. */ export function ucfirst(string: string): string { - return string.substr(0, 1).toUpperCase() + string.substr(1); + return string.substr(0, 1).toUpperCase() + string.substr(1); } diff --git a/js/src/common/utils/stringToColor.ts b/js/src/common/utils/stringToColor.ts index 2f9d36a56..db6b67977 100644 --- a/js/src/common/utils/stringToColor.ts +++ b/js/src/common/utils/stringToColor.ts @@ -1,46 +1,70 @@ export function hsvToRgb(h: number, s: number, v: number) { - let r; - let g; - let b; + let r; + let g; + let b; - const i = Math.floor(h * 6); - const f = h * 6 - i; - const p = v * (1 - s); - const q = v * (1 - f * s); - const t = v * (1 - (1 - f) * s); + const i = Math.floor(h * 6); + const f = h * 6 - i; + const p = v * (1 - s); + const q = v * (1 - f * s); + const t = v * (1 - (1 - f) * s); - switch (i % 6) { - case 0: r = v; g = t; b = p; break; - case 1: r = q; g = v; b = p; break; - case 2: r = p; g = v; b = t; break; - case 3: r = p; g = q; b = v; break; - case 4: r = t; g = p; b = v; break; - case 5: r = v; g = p; b = q; break; - } + switch (i % 6) { + case 0: + r = v; + g = t; + b = p; + break; + case 1: + r = q; + g = v; + b = p; + break; + case 2: + r = p; + g = v; + b = t; + break; + case 3: + r = p; + g = q; + b = v; + break; + case 4: + r = t; + g = p; + b = v; + break; + case 5: + r = v; + g = p; + b = q; + break; + } - return { - r: Math.floor(r * 255), - g: Math.floor(g * 255), - b: Math.floor(b * 255) - }; + return { + r: Math.floor(r * 255), + g: Math.floor(g * 255), + b: Math.floor(b * 255), + }; } /** * Convert the given string to a unique color. */ export default function stringToColor(string: string): string { - let num = 0; + let num = 0; - // Convert the username into a number based on the ASCII value of each - // character. - for (let i = 0; i < string.length; i++) { - num += string.charCodeAt(i); - } + // Convert the username into a number based on the ASCII value of each + // character. + for (let i = 0; i < string.length; i++) { + num += string.charCodeAt(i); + } - // Construct a color using the remainder of that number divided by 360, and - // some predefined saturation and value values. - const hue = num % 360; - const rgb = hsvToRgb(hue / 360, 0.3, 0.9); + // Construct a color using the remainder of that number divided by 360, and + // some predefined saturation and value values. + const hue = num % 360; + const rgb = hsvToRgb(hue / 360, 0.3, 0.9); - return '' + rgb.r.toString(16) + rgb.g.toString(16) + rgb.b.toString(16); + return '' + rgb.r.toString(16) + rgb.g.toString(16) + rgb.b.toString(16); } diff --git a/js/src/forum/Forum.ts b/js/src/forum/Forum.ts index 7bad2b5dc..8fcfa207d 100644 --- a/js/src/forum/Forum.ts +++ b/js/src/forum/Forum.ts @@ -7,22 +7,22 @@ import HeaderSecondary from './components/HeaderSecondary'; import Page from './components/Page'; import IndexPage from './components/IndexPage'; import PostsUserPage from './components/PostsUserPage'; -import User from "../common/models/User"; -import Post from "../common/models/Post"; -import Discussion from "../common/models/Discussion"; +import User from '../common/models/User'; +import Post from '../common/models/Post'; +import Discussion from '../common/models/Discussion'; export default class Forum extends Application { routes = { - 'index': { path: '/all', component: IndexPage }, + index: { path: '/all', component: IndexPage }, - 'discussion': { path: '/d/:id', component: IndexPage }, + discussion: { path: '/d/:id', component: IndexPage }, 'discussion.near': { path: '/d/:id/:near', component: IndexPage }, - 'user': { path: '/u/:username', component: PostsUserPage }, + user: { path: '/u/:username', component: PostsUserPage }, 'user.posts': { path: '/u/:username', component: PostsUserPage }, 'user.discussions': { path: '/u/:username/discussions', component: PostsUserPage }, - 'settings': { path: '/settings', component: PostsUserPage }, + settings: { path: '/settings', component: PostsUserPage }, 'index.filter': { path: '/:filter', component: IndexPage }, }; @@ -37,73 +37,73 @@ export default class Forum extends Application { current: Page; mount() { - // Get the configured default route and update that route's path to be '/'. - // Push the homepage as the first route, so that the user will always be - // able to click on the 'back' button to go home, regardless of which page - // they started on. - const defaultRoute = this.forum.attribute('defaultRoute'); - let defaultAction = 'index'; + // Get the configured default route and update that route's path to be '/'. + // Push the homepage as the first route, so that the user will always be + // able to click on the 'back' button to go home, regardless of which page + // they started on. + const defaultRoute = this.forum.attribute('defaultRoute'); + let defaultAction = 'index'; - for (const i in this.routes) { - if (this.routes[i].path === defaultRoute) defaultAction = i; - } - - this.routes[defaultAction].path = '/'; - this.history.push(defaultAction, this.translator.transText('core.forum.header.back_to_index_tooltip'), '/'); - - // m.mount(document.getElementById('app-navigation'), Navigation.component({className: 'App-backControl', drawer: true})); - // m.mount(document.getElementById('header-navigation'), Navigation.component()); - m.mount(document.getElementById('header-primary'), new HeaderPrimary()); - m.mount(document.getElementById('header-secondary'), new HeaderSecondary()); - - // this.pane = new Pane(document.getElementById('app')); - // this.composer = m.mount(document.getElementById('composer'), Composer.component()); - - m.route.prefix = ''; - super.mount(this.forum.attribute('basePath')); - - // alertEmailConfirmation(this); - - // Route the home link back home when clicked. We do not want it to register - // if the user is opening it in a new tab, however. - $('#home-link').click((e: MouseEvent) => { - if (e.ctrlKey || e.metaKey || e.which === 2) return; - e.preventDefault(); - app.history.home(); - - // Reload the current user so that their unread notification count is refreshed. - if (app.session.user) { - app.store.find('users', app.session.user.id()); - m.redraw(); + for (const i in this.routes) { + if (this.routes[i].path === defaultRoute) defaultAction = i; } - }); + + this.routes[defaultAction].path = '/'; + this.history.push(defaultAction, this.translator.transText('core.forum.header.back_to_index_tooltip'), '/'); + + // m.mount(document.getElementById('app-navigation'), Navigation.component({className: 'App-backControl', drawer: true})); + // m.mount(document.getElementById('header-navigation'), Navigation.component()); + m.mount(document.getElementById('header-primary'), new HeaderPrimary()); + m.mount(document.getElementById('header-secondary'), new HeaderSecondary()); + + // this.pane = new Pane(document.getElementById('app')); + // this.composer = m.mount(document.getElementById('composer'), Composer.component()); + + m.route.prefix = ''; + super.mount(this.forum.attribute('basePath')); + + // alertEmailConfirmation(this); + + // Route the home link back home when clicked. We do not want it to register + // if the user is opening it in a new tab, however. + $('#home-link').click((e: MouseEvent) => { + if (e.ctrlKey || e.metaKey || e.which === 2) return; + e.preventDefault(); + app.history.home(); + + // Reload the current user so that their unread notification count is refreshed. + if (app.session.user) { + app.store.find('users', app.session.user.id()); + m.redraw(); + } + }); } setupRoutes() { - super.setupRoutes(); + super.setupRoutes(); - this.route.discussion = (discussion: Discussion, near?: number): string => { - const slug = discussion.slug(); - return this.route(near && near !== 1 ? 'discussion.near' : 'discussion', { - id: discussion.id() + (slug.trim() ? '-' + slug : ''), - near: near && near !== 1 ? near : undefined - }); - }; + this.route.discussion = (discussion: Discussion, near?: number): string => { + const slug = discussion.slug(); + return this.route(near && near !== 1 ? 'discussion.near' : 'discussion', { + id: discussion.id() + (slug.trim() ? '-' + slug : ''), + near: near && near !== 1 ? near : undefined, + }); + }; - /** - * Generate a URL to a post. - */ - this.route.post = (post: Post): string => { - return this.route.discussion(post.discussion(), post.number()); - }; + /** + * Generate a URL to a post. + */ + this.route.post = (post: Post): string => { + return this.route.discussion(post.discussion(), post.number()); + }; - /** - * Generate a URL to a user. - */ - this.route.user = (user: User): string => { - return this.route('user', { - username: user.username() - }); - }; + /** + * Generate a URL to a user. + */ + this.route.user = (user: User): string => { + return this.route('user', { + username: user.username(), + }); + }; } } diff --git a/js/src/forum/components/AvatarEditor.tsx b/js/src/forum/components/AvatarEditor.tsx index f00898db9..a9a3f1ca4 100644 --- a/js/src/forum/components/AvatarEditor.tsx +++ b/js/src/forum/components/AvatarEditor.tsx @@ -1,4 +1,4 @@ -import Component, {ComponentProps} from '../../common/Component'; +import Component, { ComponentProps } from '../../common/Component'; import avatar from '../../common/helpers/avatar'; import icon from '../../common/helpers/icon'; import listItems from '../../common/helpers/listItems'; @@ -8,7 +8,7 @@ import LoadingIndicator from '../../common/components/LoadingIndicator'; import User from '../../common/models/User'; export interface AvatarEditorProps extends ComponentProps { - user: User; + user: User; } /** @@ -16,206 +16,210 @@ export interface AvatarEditorProps extends ComponentProps { * menu which allows the user to upload/remove the avatar. */ export default class AvatarEditor extends Component<AvatarEditorProps> { - /** - * Whether or not an avatar upload is in progress. - */ - loading = false; + /** + * Whether or not an avatar upload is in progress. + */ + loading = false; - /** - * Whether or not an image has been dragged over the dropzone. - */ - isDraggedOver = false; + /** + * Whether or not an image has been dragged over the dropzone. + */ + isDraggedOver = false; - static initProps(props) { - super.initProps(props); + static initProps(props) { + super.initProps(props); - props.className = props.className || ''; - } - - view() { - const user = this.props.user; - - return ( - <div className={'AvatarEditor Dropdown ' + this.props.className + (this.loading ? ' loading' : '') + (this.isDraggedOver ? ' dragover' : '')}> - {avatar(user)} - <a className={ user.avatarUrl() ? "Dropdown-toggle" : "Dropdown-toggle AvatarEditor--noAvatar" } - title={app.translator.trans('core.forum.user.avatar_upload_tooltip')} - data-toggle="dropdown" - onclick={this.quickUpload.bind(this)} - ondragover={this.enableDragover.bind(this)} - ondragenter={this.enableDragover.bind(this)} - ondragleave={this.disableDragover.bind(this)} - ondragend={this.disableDragover.bind(this)} - ondrop={this.dropUpload.bind(this)}> - {this.loading ? LoadingIndicator.component() : (user.avatarUrl() ? icon('fas fa-pencil-alt') : icon('fas fa-plus-circle'))} - </a> - <ul className="Dropdown-menu Menu"> - {listItems(this.controlItems().toArray())} - </ul> - </div> - ); - } - - /** - * Get the items in the edit avatar dropdown menu. - * - * @return {ItemList} - */ - controlItems() { - const items = new ItemList(); - - items.add('upload', - Button.component({ - icon: 'fas fa-upload', - children: app.translator.trans('core.forum.user.avatar_upload_button'), - onclick: this.openPicker.bind(this) - }) - ); - - items.add('remove', - Button.component({ - icon: 'fas fa-times', - children: app.translator.trans('core.forum.user.avatar_remove_button'), - onclick: this.remove.bind(this) - }) - ); - - return items; - } - - /** - * Enable dragover style - * - * @param {Event} e - */ - enableDragover(e) { - e.preventDefault(); - e.stopPropagation(); - this.isDraggedOver = true; - } - - /** - * Disable dragover style - * - * @param {Event} e - */ - disableDragover(e) { - e.preventDefault(); - e.stopPropagation(); - this.isDraggedOver = false; - } - - /** - * Upload avatar when file is dropped into dropzone. - * - * @param {Event} e - */ - dropUpload(e) { - e.preventDefault(); - e.stopPropagation(); - this.isDraggedOver = false; - this.upload(e.dataTransfer.files[0]); - } - - /** - * If the user doesn't have an avatar, there's no point in showing the - * controls dropdown, because only one option would be viable: uploading. - * Thus, when the avatar editor's dropdown toggle button is clicked, we prompt - * the user to upload an avatar immediately. - * - * @param {Event} e - */ - quickUpload(e) { - if (!this.props.user.avatarUrl()) { - e.preventDefault(); - e.stopPropagation(); - this.openPicker(); + props.className = props.className || ''; } - } - /** - * Upload avatar using file picker - */ - openPicker() { - if (this.loading) return; + view() { + const user = this.props.user; - // Create a hidden HTML input element and click on it so the user can select - // an avatar file. Once they have, we will upload it via the API. - const user = this.props.user; - const $input = $('<input type="file">'); + return ( + <div + className={ + 'AvatarEditor Dropdown ' + this.props.className + (this.loading ? ' loading' : '') + (this.isDraggedOver ? ' dragover' : '') + } + > + {avatar(user)} + <a + className={user.avatarUrl() ? 'Dropdown-toggle' : 'Dropdown-toggle AvatarEditor--noAvatar'} + title={app.translator.trans('core.forum.user.avatar_upload_tooltip')} + data-toggle="dropdown" + onclick={this.quickUpload.bind(this)} + ondragover={this.enableDragover.bind(this)} + ondragenter={this.enableDragover.bind(this)} + ondragleave={this.disableDragover.bind(this)} + ondragend={this.disableDragover.bind(this)} + ondrop={this.dropUpload.bind(this)} + > + {this.loading ? LoadingIndicator.component() : user.avatarUrl() ? icon('fas fa-pencil-alt') : icon('fas fa-plus-circle')} + </a> + <ul className="Dropdown-menu Menu">{listItems(this.controlItems().toArray())}</ul> + </div> + ); + } - $input.appendTo('body').hide().click().on('change', e => { - this.upload($(e.target)[0].files[0]); - }); - } + /** + * Get the items in the edit avatar dropdown menu. + * + * @return {ItemList} + */ + controlItems() { + const items = new ItemList(); - /** - * Upload avatar - * - * @param {File} file - */ - upload(file) { - if (this.loading) return; + items.add( + 'upload', + Button.component({ + icon: 'fas fa-upload', + children: app.translator.trans('core.forum.user.avatar_upload_button'), + onclick: this.openPicker.bind(this), + }) + ); - const user = this.props.user; - const body = new FormData(); - data.append('avatar', file); + items.add( + 'remove', + Button.component({ + icon: 'fas fa-times', + children: app.translator.trans('core.forum.user.avatar_remove_button'), + onclick: this.remove.bind(this), + }) + ); - this.loading = true; - m.redraw(); + return items; + } - app.request({ - method: 'POST', - url: `${app.forum.attribute('apiUrl')}/users/${user.id()}/avatar`, - serialize: raw => raw, - body - }).then( - this.success.bind(this), - this.failure.bind(this) - ); - } + /** + * Enable dragover style + * + * @param {Event} e + */ + enableDragover(e) { + e.preventDefault(); + e.stopPropagation(); + this.isDraggedOver = true; + } - /** - * Remove the user's avatar. - */ - remove() { - const user = this.props.user; + /** + * Disable dragover style + * + * @param {Event} e + */ + disableDragover(e) { + e.preventDefault(); + e.stopPropagation(); + this.isDraggedOver = false; + } - this.loading = true; - m.redraw(); + /** + * Upload avatar when file is dropped into dropzone. + * + * @param {Event} e + */ + dropUpload(e) { + e.preventDefault(); + e.stopPropagation(); + this.isDraggedOver = false; + this.upload(e.dataTransfer.files[0]); + } - app.request({ - method: 'DELETE', - url: `${app.forum.attribute('apiUrl')}/users/${user.id()}/avatar` - }).then( - this.success.bind(this), - this.failure.bind(this) - ); - } + /** + * If the user doesn't have an avatar, there's no point in showing the + * controls dropdown, because only one option would be viable: uploading. + * Thus, when the avatar editor's dropdown toggle button is clicked, we prompt + * the user to upload an avatar immediately. + * + * @param {Event} e + */ + quickUpload(e) { + if (!this.props.user.avatarUrl()) { + e.preventDefault(); + e.stopPropagation(); + this.openPicker(); + } + } - /** - * After a successful upload/removal, push the updated user data into the - * store, and force a recomputation of the user's avatar color. - * - * @param {Object} response - * @protected - */ - success(response) { - app.store.pushPayload(response); - delete this.props.user.avatarColor; + /** + * Upload avatar using file picker + */ + openPicker() { + if (this.loading) return; - this.loading = false; - m.redraw(); - } + // Create a hidden HTML input element and click on it so the user can select + // an avatar file. Once they have, we will upload it via the API. + const user = this.props.user; + const $input = $('<input type="file">'); - /** - * If avatar upload/removal fails, stop loading. - * - * @param {Object} response - * @protected - */ - failure(response) { - this.loading = false; - m.redraw(); - } + $input + .appendTo('body') + .hide() + .click() + .on('change', e => { + this.upload($(e.target)[0].files[0]); + }); + } + + /** + * Upload avatar + * + * @param {File} file + */ + upload(file) { + if (this.loading) return; + + const user = this.props.user; + const body = new FormData(); + data.append('avatar', file); + + this.loading = true; + m.redraw(); + + app.request({ + method: 'POST', + url: `${app.forum.attribute('apiUrl')}/users/${user.id()}/avatar`, + serialize: raw => raw, + body, + }).then(this.success.bind(this), this.failure.bind(this)); + } + + /** + * Remove the user's avatar. + */ + remove() { + const user = this.props.user; + + this.loading = true; + m.redraw(); + + app.request({ + method: 'DELETE', + url: `${app.forum.attribute('apiUrl')}/users/${user.id()}/avatar`, + }).then(this.success.bind(this), this.failure.bind(this)); + } + + /** + * After a successful upload/removal, push the updated user data into the + * store, and force a recomputation of the user's avatar color. + * + * @param {Object} response + * @protected + */ + success(response) { + app.store.pushPayload(response); + delete this.props.user.avatarColor; + + this.loading = false; + m.redraw(); + } + + /** + * If avatar upload/removal fails, stop loading. + * + * @param {Object} response + * @protected + */ + failure(response) { + this.loading = false; + m.redraw(); + } } diff --git a/js/src/forum/components/CommentPost.tsx b/js/src/forum/components/CommentPost.tsx index a3b19402f..3420ab440 100644 --- a/js/src/forum/components/CommentPost.tsx +++ b/js/src/forum/components/CommentPost.tsx @@ -26,7 +26,7 @@ export default class CommentPost extends Post { // Create an instance of the component that displays the post's author so // that we can force the post to rerender when the user card is shown. - this.postUser = PostUser.component({post: this.props.post}); + this.postUser = PostUser.component({ post: this.props.post }); this.subtree.check( () => this.postUser.cardVisible, @@ -38,14 +38,18 @@ export default class CommentPost extends Post { // Note: we avoid using JSX for the <ul> below because it results in some // weirdness in Mithril.js 0.1.x (see flarum/core#975). This workaround can // be reverted when we upgrade to Mithril 1.0. - return super.content().concat([ - <header className="Post-header">{m('ul', listItems(this.headerItems().toArray()))}</header>, - <div className="Post-body"> - {this.isEditing() - ? <div className="Post-preview" config={this.configPreview.bind(this)}/> - : m.trust(this.props.post.contentHtml())} - </div> - ]); + return super + .content() + .concat([ + <header className="Post-header">{m('ul', listItems(this.headerItems().toArray()))}</header>, + <div className="Post-body"> + {this.isEditing() ? ( + <div className="Post-preview" config={this.configPreview.bind(this)} /> + ) : ( + m.trust(this.props.post.contentHtml()) + )} + </div>, + ]); } onupdate(vnode) { @@ -77,13 +81,16 @@ export default class CommentPost extends Post { const post = this.props.post; const attrs = super.attrs(); - attrs.className = (attrs.className || '') + ' ' + classNames({ - 'CommentPost': true, - 'Post--hidden': post.isHidden(), - 'Post--edited': post.isEdited(), - 'revealContent': this.revealContent, - 'editing': this.isEditing() - }); + attrs.className = + (attrs.className || '') + + ' ' + + classNames({ + CommentPost: true, + 'Post--hidden': post.isHidden(), + 'Post--edited': post.isEdited(), + revealContent: this.revealContent, + editing: this.isEditing(), + }); return attrs; } @@ -125,7 +132,7 @@ export default class CommentPost extends Post { headerItems() { const items = new ItemList(); const post = this.props.post; - const props = {post}; + const props = { post }; items.add('user', this.postUser, 100); // items.add('meta', PostMeta.component(props)); @@ -137,13 +144,14 @@ export default class CommentPost extends Post { // If the post is hidden, add a button that allows toggling the visibility // of the post's content. if (post.isHidden()) { - items.add('toggle', ( + items.add( + 'toggle', Button.component({ className: 'Button Button--default Button--more', icon: 'fas fa-ellipsis-h', - onclick: this.toggleContent.bind(this) + onclick: this.toggleContent.bind(this), }) - )); + ); } return items; diff --git a/js/src/forum/components/DiscussionsSearchSource.tsx b/js/src/forum/components/DiscussionsSearchSource.tsx index 47a76a3bc..d54da0060 100644 --- a/js/src/forum/components/DiscussionsSearchSource.tsx +++ b/js/src/forum/components/DiscussionsSearchSource.tsx @@ -1,55 +1,59 @@ import highlight from '../../common/helpers/highlight'; import LinkButton from '../../common/components/LinkButton'; -import SearchSource from "./SearchSource"; -import Discussion from "../../common/models/Discussion"; +import SearchSource from './SearchSource'; +import Discussion from '../../common/models/Discussion'; /** * The `DiscussionsSearchSource` finds and displays discussion search results in * the search dropdown. */ export default class DiscussionsSearchSource extends SearchSource { - protected results: { [key: string]: Discussion[] } = {}; + protected results: { [key: string]: Discussion[] } = {}; - search(query: string) { - query = query.toLowerCase(); + search(query: string) { + query = query.toLowerCase(); - this.results[query] = []; + this.results[query] = []; - const params = { - filter: {q: query}, - page: {limit: 3}, - include: 'mostRelevantPost' - }; + const params = { + filter: { q: query }, + page: { limit: 3 }, + include: 'mostRelevantPost', + }; - return app.store.find<Discussion>('discussions', params).then(results => this.results[query] = results); - } + return app.store.find<Discussion>('discussions', params).then(results => (this.results[query] = results)); + } - view(query: string) { - query = query.toLowerCase(); + view(query: string) { + query = query.toLowerCase(); - const results = this.results[query] || []; + const results = this.results[query] || []; - return [ - <li className="Dropdown-header">{app.translator.trans('core.forum.search.discussions_heading')}</li>, - <li> - {LinkButton.component({ - icon: 'fas fa-search', - children: app.translator.trans('core.forum.search.all_discussions_button', {query}), - href: app.route('index', {q: query}) - })} - </li>, - results.map(discussion => { - const mostRelevantPost = discussion.mostRelevantPost(); + return [ + <li className="Dropdown-header">{app.translator.trans('core.forum.search.discussions_heading')}</li>, + <li> + {LinkButton.component({ + icon: 'fas fa-search', + children: app.translator.trans('core.forum.search.all_discussions_button', { query }), + href: app.route('index', { q: query }), + })} + </li>, + results.map(discussion => { + const mostRelevantPost = discussion.mostRelevantPost(); - return ( - <li className="DiscussionSearchResult" data-index={'discussions' + discussion.id()}> - <m.route.Link href={app.route.discussion(discussion, mostRelevantPost && mostRelevantPost.number())}> - <div className="DiscussionSearchResult-title">{highlight(discussion.title(), query)}</div> - {mostRelevantPost ? <div className="DiscussionSearchResult-excerpt">{highlight(mostRelevantPost.contentPlain(), query, 100)}</div> : ''} - </m.route.Link> - </li> - ); - }) - ]; - } + return ( + <li className="DiscussionSearchResult" data-index={'discussions' + discussion.id()}> + <m.route.Link href={app.route.discussion(discussion, mostRelevantPost && mostRelevantPost.number())}> + <div className="DiscussionSearchResult-title">{highlight(discussion.title(), query)}</div> + {mostRelevantPost ? ( + <div className="DiscussionSearchResult-excerpt">{highlight(mostRelevantPost.contentPlain(), query, 100)}</div> + ) : ( + '' + )} + </m.route.Link> + </li> + ); + }), + ]; + } } diff --git a/js/src/forum/components/HeaderPrimary.tsx b/js/src/forum/components/HeaderPrimary.tsx index 891bb34a3..e45ca620e 100644 --- a/js/src/forum/components/HeaderPrimary.tsx +++ b/js/src/forum/components/HeaderPrimary.tsx @@ -7,18 +7,14 @@ import listItems from '../../common/helpers/listItems'; * default skin, these are shown just to the right of the forum title. */ export default class HeaderPrimary extends Component { - view() { - return ( - <ul className="Header-controls"> - {listItems(this.items().toArray())} - </ul> - ); - } + view() { + return <ul className="Header-controls">{listItems(this.items().toArray())}</ul>; + } - /** - * Build an item list for the controls. - */ - items(): ItemList { - return new ItemList(); - } + /** + * Build an item list for the controls. + */ + items(): ItemList { + return new ItemList(); + } } diff --git a/js/src/forum/components/HeaderSecondary.tsx b/js/src/forum/components/HeaderSecondary.tsx index 2764d725c..08d896ab4 100644 --- a/js/src/forum/components/HeaderSecondary.tsx +++ b/js/src/forum/components/HeaderSecondary.tsx @@ -16,70 +16,76 @@ import Search from './Search'; * right side of the header. */ export default class HeaderSecondary extends Component { - view() { - return ( - <ul className="Header-controls"> - {listItems(this.items().toArray())} - </ul> - ); - } + view() { + return <ul className="Header-controls">{listItems(this.items().toArray())}</ul>; + } - /** - * Build an item list for the controls. - */ - items(): ItemList { - const items = new ItemList(); + /** + * Build an item list for the controls. + */ + items(): ItemList { + const items = new ItemList(); - items.add('search', Search.component(), 30); + items.add('search', Search.component(), 30); - if (app.forum.attribute("showLanguageSelector") && Object.keys(app.data.locales).length > 1) { - const locales = []; + if (app.forum.attribute('showLanguageSelector') && Object.keys(app.data.locales).length > 1) { + const locales = []; - for (const locale in app.data.locales) { - locales.push(Button.component({ - active: app.data.locale === locale, - children: app.data.locales[locale], - icon: app.data.locale === locale ? 'fas fa-check' : true, - onclick: () => { - if (app.session.user) { - app.session.user.savePreferences({locale}).then(() => window.location.reload()); - } else { - document.cookie = `locale=${locale}; path=/; expires=Tue, 19 Jan 2038 03:14:07 GMT`; - window.location.reload(); + for (const locale in app.data.locales) { + locales.push( + Button.component({ + active: app.data.locale === locale, + children: app.data.locales[locale], + icon: app.data.locale === locale ? 'fas fa-check' : true, + onclick: () => { + if (app.session.user) { + app.session.user.savePreferences({ locale }).then(() => window.location.reload()); + } else { + document.cookie = `locale=${locale}; path=/; expires=Tue, 19 Jan 2038 03:14:07 GMT`; + window.location.reload(); + } + }, + }) + ); } - } - })); - } - items.add('locale', SelectDropdown.component({ - children: locales, - buttonClassName: 'Button Button--link' - }), 20); + items.add( + 'locale', + SelectDropdown.component({ + children: locales, + buttonClassName: 'Button Button--link', + }), + 20 + ); + } + + if (app.session.user) { + items.add('notifications', NotificationsDropdown.component(), 10); + items.add('session', SessionDropdown.component(), 0); + } else { + if (app.forum.attribute('allowSignUp')) { + items.add( + 'signUp', + Button.component({ + children: app.translator.trans('core.forum.header.sign_up_link'), + className: 'Button Button--link', + onclick: () => app.modal.show(new SignUpModal()), + }), + 10 + ); + } + + items.add( + 'logIn', + Button.component({ + children: app.translator.trans('core.forum.header.log_in_link'), + className: 'Button Button--link', + onclick: () => app.modal.show(new LogInModal()), + }), + 0 + ); + } + + return items; } - - if (app.session.user) { - items.add('notifications', NotificationsDropdown.component(), 10); - items.add('session', SessionDropdown.component(), 0); - } else { - if (app.forum.attribute('allowSignUp')) { - items.add('signUp', - Button.component({ - children: app.translator.trans('core.forum.header.sign_up_link'), - className: 'Button Button--link', - onclick: () => app.modal.show(new SignUpModal()) - }), 10 - ); - } - - items.add('logIn', - Button.component({ - children: app.translator.trans('core.forum.header.log_in_link'), - className: 'Button Button--link', - onclick: () => app.modal.show(new LogInModal()) - }), 0 - ); - } - - return items; - } } diff --git a/js/src/forum/components/LogInButtons.tsx b/js/src/forum/components/LogInButtons.tsx index fe13cc787..f292edd98 100644 --- a/js/src/forum/components/LogInButtons.tsx +++ b/js/src/forum/components/LogInButtons.tsx @@ -6,9 +6,7 @@ import ItemList from '../../common/utils/ItemList'; */ export default class LogInButtons extends Component { view() { - return <div className="LogInButtons"> - {this.items().toArray()} - </div> + return <div className="LogInButtons">{this.items().toArray()}</div>; } /** diff --git a/js/src/forum/components/LogInModal.tsx b/js/src/forum/components/LogInModal.tsx index c44fe844e..85b95988d 100644 --- a/js/src/forum/components/LogInModal.tsx +++ b/js/src/forum/components/LogInModal.tsx @@ -1,9 +1,9 @@ import Stream from 'mithril/stream'; -import {ComponentProps} from '../../common/Component'; +import { ComponentProps } from '../../common/Component'; import Modal from '../../common/components/Modal'; -import ItemList from "../../common/utils/ItemList"; -import Button from "../../common/components/Button"; +import ItemList from '../../common/utils/ItemList'; +import Button from '../../common/components/Button'; import LogInButtons from './LogInButtons'; @@ -51,58 +51,71 @@ export default class LogInModal extends Modal<LogInModalProps> { } content() { - return [ - <div className="Modal-body"> - {this.body()} - </div>, - <div className="Modal-footer"> - {this.footer()} - </div> - ]; + return [<div className="Modal-body">{this.body()}</div>, <div className="Modal-footer">{this.footer()}</div>]; } body() { - return [ - <LogInButtons/>, - - <div className="Form Form--centered"> - {this.fields().toArray()} - </div> - ]; + return [<LogInButtons />, <div className="Form Form--centered">{this.fields().toArray()}</div>]; } fields() { const items = new ItemList(); - items.add('identification', <div className="Form-group"> - <input className="FormControl" name="identification" type="text" placeholder={app.translator.transText('core.forum.log_in.username_or_email_placeholder')} - bidi={this.identification} - disabled={this.loading} /> - </div>, 30); + items.add( + 'identification', + <div className="Form-group"> + <input + className="FormControl" + name="identification" + type="text" + placeholder={app.translator.transText('core.forum.log_in.username_or_email_placeholder')} + bidi={this.identification} + disabled={this.loading} + /> + </div>, + 30 + ); - items.add('password', <div className="Form-group"> - <input className="FormControl" name="password" type="password" placeholder={app.translator.transText('core.forum.log_in.password_placeholder')} - bidi={this.password} - disabled={this.loading} /> - </div>, 20); + items.add( + 'password', + <div className="Form-group"> + <input + className="FormControl" + name="password" + type="password" + placeholder={app.translator.transText('core.forum.log_in.password_placeholder')} + bidi={this.password} + disabled={this.loading} + /> + </div>, + 20 + ); - items.add('remember', <div className="Form-group"> - <div> - <label className="checkbox"> - <input type="checkbox" bidi={this.remember} disabled={this.loading} /> - {app.translator.trans('core.forum.log_in.remember_me_label')} - </label> - </div> - </div>, 10); + items.add( + 'remember', + <div className="Form-group"> + <div> + <label className="checkbox"> + <input type="checkbox" bidi={this.remember} disabled={this.loading} /> + {app.translator.trans('core.forum.log_in.remember_me_label')} + </label> + </div> + </div>, + 10 + ); - items.add('submit', <div className="Form-group"> - {Button.component({ - className: 'Button Button--primary Button--block', - type: 'submit', - loading: this.loading, - children: app.translator.trans('core.forum.log_in.submit_button') - })} - </div>, -10); + items.add( + 'submit', + <div className="Form-group"> + {Button.component({ + className: 'Button Button--primary Button--block', + type: 'submit', + loading: this.loading, + children: app.translator.trans('core.forum.log_in.submit_button'), + })} + </div>, + -10 + ); return items; } @@ -115,9 +128,9 @@ export default class LogInModal extends Modal<LogInModalProps> { app.forum.attribute('allowSignUp') && ( <p className="LogInModal-signUp"> - {app.translator.trans('core.forum.log_in.sign_up_text', {a: <a onclick={this.signUp.bind(this)}/> })} + {app.translator.trans('core.forum.log_in.sign_up_text', { a: <a onclick={this.signUp.bind(this)} /> })} </p> - ) + ), ]; } @@ -129,7 +142,7 @@ export default class LogInModal extends Modal<LogInModalProps> { */ forgotPassword() { const email = this.identification(); - const props = email.indexOf('@') !== -1 ? {email} : undefined; + const props = email.indexOf('@') !== -1 ? { email } : undefined; app.modal.show(new ForgotPasswordModal(props)); } @@ -141,7 +154,7 @@ export default class LogInModal extends Modal<LogInModalProps> { * @public */ signUp() { - const props = {password: this.password()}; + const props = { password: this.password() }; const identification = this.identification(); props[identification.indexOf('@') !== -1 ? 'email' : 'username'] = identification; @@ -163,11 +176,9 @@ export default class LogInModal extends Modal<LogInModalProps> { const password = this.password(); const remember = this.remember(); - app.session.login({identification, password, remember}, {errorHandler: this.onerror.bind(this)}) - .then( - () => window.location.reload(), - this.loaded.bind(this) - ); + app.session + .login({ identification, password, remember }, { errorHandler: this.onerror.bind(this) }) + .then(() => window.location.reload(), this.loaded.bind(this)); } onerror(error) { diff --git a/js/src/forum/components/NotificationList.tsx b/js/src/forum/components/NotificationList.tsx index bdaea43c5..47da0a5e8 100644 --- a/js/src/forum/components/NotificationList.tsx +++ b/js/src/forum/components/NotificationList.tsx @@ -10,191 +10,198 @@ import Discussion from '../../common/models/Discussion'; * notifications, grouped by discussion. */ export default class NotificationList extends Component { - /** - * Whether or not the notifications are loading. - */ - loading: boolean = false; + /** + * Whether or not the notifications are loading. + */ + loading: boolean = false; - /** - * Whether or not there are more results that can be loaded. - */ - moreResults: boolean = false; + /** + * Whether or not there are more results that can be loaded. + */ + moreResults: boolean = false; - private $scrollParent: ZeptoCollection; - private scrollHandler: () => void; + private $scrollParent: ZeptoCollection; + private scrollHandler: () => void; - view() { - const pages = app.cache.notifications || []; + view() { + const pages = app.cache.notifications || []; - return ( - <div className="NotificationList"> - <div className="NotificationList-header"> - <div className="App-primaryControl"> - {Button.component({ - className: 'Button Button--icon Button--link', - icon: 'fas fa-check', - title: app.translator.transText('core.forum.notifications.mark_all_as_read_tooltip'), - onclick: this.markAllAsRead.bind(this) - })} - </div> + return ( + <div className="NotificationList"> + <div className="NotificationList-header"> + <div className="App-primaryControl"> + {Button.component({ + className: 'Button Button--icon Button--link', + icon: 'fas fa-check', + title: app.translator.transText('core.forum.notifications.mark_all_as_read_tooltip'), + onclick: this.markAllAsRead.bind(this), + })} + </div> - <h4 className="App-titleControl App-titleControl--text">{app.translator.trans('core.forum.notifications.title')}</h4> - </div> - - <div className="NotificationList-content"> - {pages.length ? pages.map(notifications => { - const groups = []; - const discussions = {}; - - notifications.forEach(notification => { - const subject = notification.subject(); - - if (typeof subject === 'undefined') return; - - // Get the discussion that this notification is related to. If it's not - // directly related to a discussion, it may be related to a post or - // other entity which is related to a discussion. - let discussion: any = false; - if (subject instanceof Discussion) discussion = subject; - else if (subject && subject.discussion) discussion = subject.discussion(); - - // If the notification is not related to a discussion directly or - // indirectly, then we will assign it to a neutral group. - const key = discussion ? discussion.id() : 0; - discussions[key] = discussions[key] || {discussion: discussion, notifications: []}; - discussions[key].notifications.push(notification); - - if (groups.indexOf(discussions[key]) === -1) { - groups.push(discussions[key]); - } - }); - - return groups.map(group => { - const badges = group.discussion && group.discussion.badges().toArray(); - - return ( - <div className="NotificationGroup"> - {group.discussion - ? ( - <m.route.Link className="NotificationGroup-header" - href={app.route.discussion(group.discussion)}> - {badges && badges.length ? <ul className="NotificationGroup-badges badges">{listItems(badges)}</ul> : ''} - {group.discussion.title()} - </m.route.Link> - ) : ( - <div className="NotificationGroup-header"> - {app.forum.attribute('title')} - </div> - )} - - <ul className="NotificationGroup-content"> - {group.notifications.map(notification => { - const NotificationComponent = app.notificationComponents[notification.contentType()]; - return NotificationComponent ? <li>{NotificationComponent.component({notification})}</li> : ''; - })} - </ul> + <h4 className="App-titleControl App-titleControl--text">{app.translator.trans('core.forum.notifications.title')}</h4> </div> - ); - }); - }) : ''} - {this.loading - ? <LoadingIndicator className="LoadingIndicator--block" /> - : (pages.length ? '' : <div className="NotificationList-empty">{app.translator.trans('core.forum.notifications.empty_text')}</div>)} - </div> - </div> - ); - } - oncreate(vnode) { - super.oncreate(vnode); + <div className="NotificationList-content"> + {pages.length + ? pages.map(notifications => { + const groups = []; + const discussions = {}; - const $notifications = this.$('.NotificationList-content'); - const $scrollParent = this.$scrollParent = $notifications.css('overflow') === 'auto' ? $notifications : $(window); + notifications.forEach(notification => { + const subject = notification.subject(); - this.scrollHandler = () => { - const scrollTop = $scrollParent.scrollTop(); - const viewportHeight = $scrollParent.height(); - const contentTop = $scrollParent === $notifications ? 0 : $notifications.offset().top; - const contentHeight = $notifications[0].scrollHeight; + if (typeof subject === 'undefined') return; + + // Get the discussion that this notification is related to. If it's not + // directly related to a discussion, it may be related to a post or + // other entity which is related to a discussion. + let discussion: any = false; + if (subject instanceof Discussion) discussion = subject; + else if (subject && subject.discussion) discussion = subject.discussion(); + + // If the notification is not related to a discussion directly or + // indirectly, then we will assign it to a neutral group. + const key = discussion ? discussion.id() : 0; + discussions[key] = discussions[key] || { discussion: discussion, notifications: [] }; + discussions[key].notifications.push(notification); + + if (groups.indexOf(discussions[key]) === -1) { + groups.push(discussions[key]); + } + }); + + return groups.map(group => { + const badges = group.discussion && group.discussion.badges().toArray(); + + return ( + <div className="NotificationGroup"> + {group.discussion ? ( + <m.route.Link className="NotificationGroup-header" href={app.route.discussion(group.discussion)}> + {badges && badges.length ? ( + <ul className="NotificationGroup-badges badges">{listItems(badges)}</ul> + ) : ( + '' + )} + {group.discussion.title()} + </m.route.Link> + ) : ( + <div className="NotificationGroup-header">{app.forum.attribute('title')}</div> + )} + + <ul className="NotificationGroup-content"> + {group.notifications.map(notification => { + const NotificationComponent = app.notificationComponents[notification.contentType()]; + return NotificationComponent ? <li>{NotificationComponent.component({ notification })}</li> : ''; + })} + </ul> + </div> + ); + }); + }) + : ''} + {this.loading ? ( + <LoadingIndicator className="LoadingIndicator--block" /> + ) : pages.length ? ( + '' + ) : ( + <div className="NotificationList-empty">{app.translator.trans('core.forum.notifications.empty_text')}</div> + )} + </div> + </div> + ); + } + + oncreate(vnode) { + super.oncreate(vnode); + + const $notifications = this.$('.NotificationList-content'); + const $scrollParent = (this.$scrollParent = $notifications.css('overflow') === 'auto' ? $notifications : $(window)); + + this.scrollHandler = () => { + const scrollTop = $scrollParent.scrollTop(); + const viewportHeight = $scrollParent.height(); + const contentTop = $scrollParent === $notifications ? 0 : $notifications.offset().top; + const contentHeight = $notifications[0].scrollHeight; + + if (this.moreResults && !this.loading && scrollTop + viewportHeight >= contentTop + contentHeight) { + this.loadMore(); + } + }; + + $scrollParent.on('scroll', this.scrollHandler); + } + + onremove(vnode) { + super.onremove(vnode); + + this.$scrollParent.off('scroll', this.scrollHandler); + } + + /** + * Load notifications into the application's cache if they haven't already + * been loaded. + */ + load() { + if (app.session.user.newNotificationCount()) { + delete app.cache.notifications; + } + + if (app.cache.notifications) { + return; + } + + app.session.user.pushAttributes({ newNotificationCount: 0 }); - if (this.moreResults && !this.loading && scrollTop + viewportHeight >= contentTop + contentHeight) { this.loadMore(); - } - }; - - $scrollParent.on('scroll', this.scrollHandler); - } - - onremove(vnode) { - super.onremove(vnode); - - this.$scrollParent.off('scroll', this.scrollHandler); - } - - /** - * Load notifications into the application's cache if they haven't already - * been loaded. - */ - load() { - if (app.session.user.newNotificationCount()) { - delete app.cache.notifications; } - if (app.cache.notifications) { - return; - } - - app.session.user.pushAttributes({newNotificationCount: 0}); - - this.loadMore(); - } - - /** - * Load the next page of notification results. - */ - loadMore() { - this.loading = true; - m.redraw(); - - const params = app.cache.notifications ? {page: {offset: app.cache.notifications.length * 10}} : null; - - return app.store.find<Notification>('notifications', params) - .then(this.parseResults.bind(this)) - .catch(() => {}) - .then(() => { - this.loading = false; + /** + * Load the next page of notification results. + */ + loadMore() { + this.loading = true; m.redraw(); - }); - } - /** - * Parse results and append them to the notification list. - */ - parseResults(results: Notification[]): Notification[] { - app.cache.notifications = app.cache.notifications || []; + const params = app.cache.notifications ? { page: { offset: app.cache.notifications.length * 10 } } : null; - if (results.length) app.cache.notifications.push(results); + return app.store + .find<Notification>('notifications', params) + .then(this.parseResults.bind(this)) + .catch(() => {}) + .then(() => { + this.loading = false; + m.redraw(); + }); + } - this.moreResults = !!results.payload.links.next; + /** + * Parse results and append them to the notification list. + */ + parseResults(results: Notification[]): Notification[] { + app.cache.notifications = app.cache.notifications || []; - return results; - } + if (results.length) app.cache.notifications.push(results); - /** - * Mark all of the notifications as read. - */ - markAllAsRead() { - if (!app.cache.notifications) return; + this.moreResults = !!results.payload.links.next; - app.session.user.pushAttributes({unreadNotificationCount: 0}); + return results; + } - app.cache.notifications.forEach(notifications => { - notifications.forEach(notification => notification.pushAttributes({isRead: true})) - }); + /** + * Mark all of the notifications as read. + */ + markAllAsRead() { + if (!app.cache.notifications) return; - app.request({ - url: `${app.forum.attribute('apiUrl')}/notifications/read`, - method: 'POST' - }); - } + app.session.user.pushAttributes({ unreadNotificationCount: 0 }); + + app.cache.notifications.forEach(notifications => { + notifications.forEach(notification => notification.pushAttributes({ isRead: true })); + }); + + app.request({ + url: `${app.forum.attribute('apiUrl')}/notifications/read`, + method: 'POST', + }); + } } diff --git a/js/src/forum/components/NotificationsDropdown.tsx b/js/src/forum/components/NotificationsDropdown.tsx index c4e515ec1..3a6b474bb 100644 --- a/js/src/forum/components/NotificationsDropdown.tsx +++ b/js/src/forum/components/NotificationsDropdown.tsx @@ -3,71 +3,71 @@ import icon from '../../common/helpers/icon'; import NotificationList from './NotificationList'; export default class NotificationsDropdown extends Dropdown { - list = new NotificationList(); + list = new NotificationList(); - static initProps(props) { - props.className = props.className || 'NotificationsDropdown'; - props.buttonClassName = props.buttonClassName || 'Button Button--flat'; - props.menuClassName = props.menuClassName || 'Dropdown-menu--right'; - props.label = props.label || app.translator.trans('core.forum.notifications.tooltip'); - props.icon = props.icon || 'fas fa-bell'; + static initProps(props) { + props.className = props.className || 'NotificationsDropdown'; + props.buttonClassName = props.buttonClassName || 'Button Button--flat'; + props.menuClassName = props.menuClassName || 'Dropdown-menu--right'; + props.label = props.label || app.translator.trans('core.forum.notifications.tooltip'); + props.icon = props.icon || 'fas fa-bell'; - super.initProps(props); - } - - getButton() { - const newNotifications = this.getNewCount(); - const vdom = super.getButton(); - - vdom.attrs.title = this.props.label; - - vdom.attrs.className += (newNotifications ? ' new' : ''); - vdom.attrs.onclick = this.onclick.bind(this); - - return vdom; - } - - getButtonContent() { - const unread = this.getUnreadCount(); - - return [ - icon(this.props.icon, {className: 'Button-icon'}), - unread ? <span className="NotificationsDropdown-unread">{unread}</span> : '', - <span className="Button-label">{this.props.label}</span> - ]; - } - - getMenu() { - return ( - <div className={'Dropdown-menu ' + this.props.menuClassName} onclick={this.menuClick.bind(this)}> - {this.showing ? m(this.list) : ''} - </div> - ); - } - - onclick() { - if (app.drawer.isOpen()) { - this.goToRoute(); - } else { - this.list.load(); + super.initProps(props); } - } - goToRoute() { - m.route.set(app.route('notifications')); - } + getButton() { + const newNotifications = this.getNewCount(); + const vdom = super.getButton(); - getUnreadCount() { - return app.session.user.unreadNotificationCount(); - } + vdom.attrs.title = this.props.label; - getNewCount() { - return app.session.user.newNotificationCount(); - } + vdom.attrs.className += newNotifications ? ' new' : ''; + vdom.attrs.onclick = this.onclick.bind(this); - menuClick(e) { - // Don't close the notifications dropdown if the user is opening a link in a - // new tab or window. - if (e.shiftKey || e.metaKey || e.ctrlKey || e.which === 2) e.stopPropagation(); - } + return vdom; + } + + getButtonContent() { + const unread = this.getUnreadCount(); + + return [ + icon(this.props.icon, { className: 'Button-icon' }), + unread ? <span className="NotificationsDropdown-unread">{unread}</span> : '', + <span className="Button-label">{this.props.label}</span>, + ]; + } + + getMenu() { + return ( + <div className={'Dropdown-menu ' + this.props.menuClassName} onclick={this.menuClick.bind(this)}> + {this.showing ? m(this.list) : ''} + </div> + ); + } + + onclick() { + if (app.drawer.isOpen()) { + this.goToRoute(); + } else { + this.list.load(); + } + } + + goToRoute() { + m.route.set(app.route('notifications')); + } + + getUnreadCount() { + return app.session.user.unreadNotificationCount(); + } + + getNewCount() { + return app.session.user.newNotificationCount(); + } + + menuClick(e) { + // Don't close the notifications dropdown if the user is opening a link in a + // new tab or window. + if (e.shiftKey || e.metaKey || e.ctrlKey || e.which === 2) e.stopPropagation(); + } } diff --git a/js/src/forum/components/Page.tsx b/js/src/forum/components/Page.tsx index 0ea54d260..5e93c10fa 100644 --- a/js/src/forum/components/Page.tsx +++ b/js/src/forum/components/Page.tsx @@ -4,32 +4,32 @@ import Component from '../../common/Component'; * The `Page` component */ export default abstract class Page extends Component { - /** - * A class name to apply to the body while the route is active. - */ - bodyClass: string = ''; + /** + * A class name to apply to the body while the route is active. + */ + bodyClass: string = ''; - oninit(vnode) { - super.oninit(vnode); + oninit(vnode) { + super.oninit(vnode); - if (this.bodyClass) { - $('#app').addClass(this.bodyClass); + if (this.bodyClass) { + $('#app').addClass(this.bodyClass); + } } - } - oncreate(vnode) { - super.oncreate(vnode); + oncreate(vnode) { + super.oncreate(vnode); - app.previous = app.current; - app.current = this; + app.previous = app.current; + app.current = this; - app.drawer.hide(); - app.modal.close(); - } + app.drawer.hide(); + app.modal.close(); + } - onremove(vnode) { - super.onremove(vnode); + onremove(vnode) { + super.onremove(vnode); - $('#app').removeClass(this.bodyClass); - } + $('#app').removeClass(this.bodyClass); + } } diff --git a/js/src/forum/components/Post.tsx b/js/src/forum/components/Post.tsx index 8b45cff1a..5bbcf5e81 100644 --- a/js/src/forum/components/Post.tsx +++ b/js/src/forum/components/Post.tsx @@ -1,13 +1,13 @@ -import Component, {ComponentProps} from '../../common/Component'; +import Component, { ComponentProps } from '../../common/Component'; import Dropdown from '../../common/components/Dropdown'; import PostControls from '../utils/PostControls'; import listItems from '../../common/helpers/listItems'; import ItemList from '../../common/utils/ItemList'; -import SubtreeRetainer from "../../common/utils/SubtreeRetainer"; +import SubtreeRetainer from '../../common/utils/SubtreeRetainer'; import PostModel from '../../common/models/Post'; export interface PostProps extends ComponentProps { - post: PostModel + post: PostModel; } /** @@ -53,20 +53,27 @@ export default class Post<T extends PostProps = PostProps> extends Component<Pos <aside className="Post-actions"> <ul> {listItems(this.actionItems().toArray())} - {controls.length ? <li> - <Dropdown - className="Post-controls" - buttonClassName="Button Button--icon Button--flat" - menuClassName="Dropdown-menu--right" - icon="fas fa-ellipsis-h" - onshow={() => this.$('.Post-actions').addClass('open')} - onhide={() => this.$('.Post-actions').removeClass('open')}> - {controls} - </Dropdown> - </li> : ''} + {controls.length ? ( + <li> + <Dropdown + className="Post-controls" + buttonClassName="Button Button--icon Button--flat" + menuClassName="Dropdown-menu--right" + icon="fas fa-ellipsis-h" + onshow={() => this.$('.Post-actions').addClass('open')} + onhide={() => this.$('.Post-actions').removeClass('open')} + > + {controls} + </Dropdown> + </li> + ) : ( + '' + )} </ul> </aside> - <footer className="Post-footer"><ul>{listItems(this.footerItems().toArray())}</ul></footer> + <footer className="Post-footer"> + <ul>{listItems(this.footerItems().toArray())}</ul> + </footer> </div> ); </article> diff --git a/js/src/forum/components/PostUser.tsx b/js/src/forum/components/PostUser.tsx index 2e9bf7132..39a75234e 100644 --- a/js/src/forum/components/PostUser.tsx +++ b/js/src/forum/components/PostUser.tsx @@ -4,8 +4,8 @@ import avatar from '../../common/helpers/avatar'; import username from '../../common/helpers/username'; import userOnline from '../../common/helpers/userOnline'; import listItems from '../../common/helpers/listItems'; -import {PostProps} from "./Post"; -import LinkButton from "../../common/components/LinkButton"; +import { PostProps } from './Post'; +import LinkButton from '../../common/components/LinkButton'; /** * The `PostUser` component shows the avatar and username of a post's author. @@ -23,7 +23,9 @@ export default class PostUser extends Component<PostProps> { if (!user) { return ( <div className="PostUser"> - <h3>{avatar(user, {className: 'PostUser-avatar'})} {username(user)}</h3> + <h3> + {avatar(user, { className: 'PostUser-avatar' })} {username(user)} + </h3> </div> ); } @@ -34,7 +36,7 @@ export default class PostUser extends Component<PostProps> { card = UserCard.component({ user, className: 'UserCard--popover', - controlsButtonClassName: 'Button Button--icon Button--flat' + controlsButtonClassName: 'Button Button--icon Button--flat', }); } @@ -42,14 +44,12 @@ export default class PostUser extends Component<PostProps> { <div className="PostUser"> <h3> <LinkButton href={app.route.user(user)}> - {avatar(user, {className: 'PostUser-avatar'})} + {avatar(user, { className: 'PostUser-avatar' })} {userOnline(user)} {username(user)} </LinkButton> </h3> - <ul className="PostUser-badges badges"> - {listItems(user.badges().toArray())} - </ul> + <ul className="PostUser-badges badges">{listItems(user.badges().toArray())}</ul> {card} </div> ); @@ -86,7 +86,8 @@ export default class PostUser extends Component<PostProps> { * Hide the user card. */ hideCard() { - this.$('.UserCard').removeClass('in') + this.$('.UserCard') + .removeClass('in') .one('transitionend webkitTransitionEnd oTransitionEnd', () => { this.cardVisible = false; m.redraw(); diff --git a/js/src/forum/components/PostsUserPage.tsx b/js/src/forum/components/PostsUserPage.tsx index 47f4188fc..51df6dcd6 100644 --- a/js/src/forum/components/PostsUserPage.tsx +++ b/js/src/forum/components/PostsUserPage.tsx @@ -10,139 +10,139 @@ import Post from '../../common/models/Post'; * profile. */ export default class PostsUserPage extends UserPage { - /** - * Whether or not the activity feed is currently loading. - */ - loading = true; + /** + * Whether or not the activity feed is currently loading. + */ + loading = true; - /** - * Whether or not there are any more activity items that can be loaded. - */ - moreResults = false; + /** + * Whether or not there are any more activity items that can be loaded. + */ + moreResults = false; - /** - * The Post models in the feed. - */ - posts: Post[] = []; + /** + * The Post models in the feed. + */ + posts: Post[] = []; - /** - * The number of activity items to load per request. - */ - loadLimit = 20; + /** + * The number of activity items to load per request. + */ + loadLimit = 20; - oninit(vnode) { - super.oninit(vnode); + oninit(vnode) { + super.oninit(vnode); - this.loadUser(vnode.attrs.username); - } - - onupdate(vnode) { - super.onupdate(vnode); - - this.loadUser(vnode.attrs.username); - } - - content() { - if (this.posts.length === 0 && ! this.loading) { - return ( - <div className="PostsUserPage"> - <Placeholder text={app.translator.trans('core.forum.user.posts_empty_text')} /> - </div> - ); + this.loadUser(vnode.attrs.username); } - let footer; + onupdate(vnode) { + super.onupdate(vnode); - if (this.loading) { - footer = LoadingIndicator.component(); - } else if (this.moreResults) { - footer = ( - <div className="PostsUserPage-loadMore"> - {Button.component({ - children: app.translator.trans('core.forum.user.posts_load_more_button'), - className: 'Button', - onclick: this.loadMore.bind(this) - })} - </div> - ); + this.loadUser(vnode.attrs.username); } - return ( - <div className="PostsUserPage"> - <ul className="PostsUserPage-list"> - {this.posts.map(post => ( - <li> - <div className="PostsUserPage-discussion"> - {app.translator.trans('core.forum.user.in_discussion_text', {discussion: <m.route.Link href={app.route.post(post)}>{post.discussion().title()}</m.route.Link>})} - </div> - {CommentPost.component({post})} - </li> - ))} - </ul> - <div className="PostsUserPage-loadMore"> - {footer} - </div> - </div> - ); - } + content() { + if (this.posts.length === 0 && !this.loading) { + return ( + <div className="PostsUserPage"> + <Placeholder text={app.translator.trans('core.forum.user.posts_empty_text')} /> + </div> + ); + } - /** - * Initialize the component with a user, and trigger the loading of their - * activity feed. - */ - show(user) { - super.show(user); + let footer; - this.refresh(); - } + if (this.loading) { + footer = LoadingIndicator.component(); + } else if (this.moreResults) { + footer = ( + <div className="PostsUserPage-loadMore"> + {Button.component({ + children: app.translator.trans('core.forum.user.posts_load_more_button'), + className: 'Button', + onclick: this.loadMore.bind(this), + })} + </div> + ); + } - /** - * Clear and reload the user's activity feed. - */ - refresh() { - this.loading = true; - this.posts = []; + return ( + <div className="PostsUserPage"> + <ul className="PostsUserPage-list"> + {this.posts.map(post => ( + <li> + <div className="PostsUserPage-discussion"> + {app.translator.trans('core.forum.user.in_discussion_text', { + discussion: <m.route.Link href={app.route.post(post)}>{post.discussion().title()}</m.route.Link>, + })} + </div> + {CommentPost.component({ post })} + </li> + ))} + </ul> + <div className="PostsUserPage-loadMore">{footer}</div> + </div> + ); + } - m.redraw(); + /** + * Initialize the component with a user, and trigger the loading of their + * activity feed. + */ + show(user) { + super.show(user); - this.loadResults().then(this.parseResults.bind(this)); - } + this.refresh(); + } - /** - * Load a new page of the user's activity feed. - * - * @param offset The position to start getting results from. - */ - protected loadResults(offset?: number): Promise<Post[]> { - return app.store.find<Post>('posts', { - filter: { - user: this.user.id(), - type: 'comment' - }, - page: {offset, limit: this.loadLimit}, - sort: '-createdAt' - }); - } + /** + * Clear and reload the user's activity feed. + */ + refresh() { + this.loading = true; + this.posts = []; - /** - * Load the next page of results. - */ - loadMore() { - this.loading = true; - this.loadResults(this.posts.length).then(this.parseResults.bind(this)); - } + m.redraw(); - /** - * Parse results and append them to the activity feed. - */ - parseResults(results: Post[]): Post[] { - this.loading = false; + this.loadResults().then(this.parseResults.bind(this)); + } - [].push.apply(this.posts, results); + /** + * Load a new page of the user's activity feed. + * + * @param offset The position to start getting results from. + */ + protected loadResults(offset?: number): Promise<Post[]> { + return app.store.find<Post>('posts', { + filter: { + user: this.user.id(), + type: 'comment', + }, + page: { offset, limit: this.loadLimit }, + sort: '-createdAt', + }); + } - this.moreResults = results.length >= this.loadLimit; - m.redraw(); + /** + * Load the next page of results. + */ + loadMore() { + this.loading = true; + this.loadResults(this.posts.length).then(this.parseResults.bind(this)); + } - return results; - } + /** + * Parse results and append them to the activity feed. + */ + parseResults(results: Post[]): Post[] { + this.loading = false; + + [].push.apply(this.posts, results); + + this.moreResults = results.length >= this.loadLimit; + m.redraw(); + + return results; + } } diff --git a/js/src/forum/components/Search.tsx b/js/src/forum/components/Search.tsx index 0f702f947..cfafc57e9 100644 --- a/js/src/forum/components/Search.tsx +++ b/js/src/forum/components/Search.tsx @@ -19,284 +19,298 @@ import Stream from 'mithril/stream'; * `clearSearch` method on the controller. */ export default class Search extends Component { - /** - * The value of the search input. - */ - value: Stream<string> = m.prop(''); + /** + * The value of the search input. + */ + value: Stream<string> = m.prop(''); - /** - * Whether or not the search input has focus. - */ - hasFocus: boolean = false; + /** + * Whether or not the search input has focus. + */ + hasFocus: boolean = false; - /** - * An array of SearchSources. - */ - sources: SearchSource[] = null; + /** + * An array of SearchSources. + */ + sources: SearchSource[] = null; - /** - * The number of sources that are still loading results. - */ - loadingSources = 0; + /** + * The number of sources that are still loading results. + */ + loadingSources = 0; - /** - * A list of queries that have been searched for. - */ - searched: string[] = []; + /** + * A list of queries that have been searched for. + */ + searched: string[] = []; - /** - * The index of the currently-selected <li> in the results list. This can be - * a unique string (to account for the fact that an item's position may jump - * around as new results load), but otherwise it will be numeric (the - * sequential position within the list). - */ - index: string|number = 0; + /** + * The index of the currently-selected <li> in the results list. This can be + * a unique string (to account for the fact that an item's position may jump + * around as new results load), but otherwise it will be numeric (the + * sequential position within the list). + */ + index: string | number = 0; - navigator: KeyboardNavigatable; + navigator: KeyboardNavigatable; - searchTimeout: number; + searchTimeout: number; - view() { - const currentSearch = this.getCurrentSearch(); + view() { + const currentSearch = this.getCurrentSearch(); - // Initialize search input value in the view rather than the constructor so - // that we have access to app.current. - if (typeof this.value() === 'undefined') { - this.value(currentSearch || ''); - } + // Initialize search input value in the view rather than the constructor so + // that we have access to app.current. + if (typeof this.value() === 'undefined') { + this.value(currentSearch || ''); + } - // Initialize search sources in the view rather than the constructor so - // that we have access to app.forum. - if (!this.sources) { - this.sources = this.sourceItems().toArray(); - } + // Initialize search sources in the view rather than the constructor so + // that we have access to app.forum. + if (!this.sources) { + this.sources = this.sourceItems().toArray(); + } - // Hide the search view if no sources were loaded - if (!this.sources.length) return <div/>; + // Hide the search view if no sources were loaded + if (!this.sources.length) return <div />; - return ( - <div className={'Search ' + classNames({ - open: this.value() && this.hasFocus, - focused: this.hasFocus, - active: !!currentSearch, - loading: !!this.loadingSources - })}> - <div className="Search-input"> - <input className="FormControl" - type="search" - placeholder={app.translator.transText('core.forum.header.search_placeholder')} - value={this.value()} - oninput={m.withAttr('value', this.value)} - onfocus={() => this.hasFocus = true} - onblur={() => this.hasFocus = false}/> - {this.loadingSources - ? LoadingIndicator.component({size: 'tiny', className: 'Button Button--icon Button--link'}) - : currentSearch - ? <button className="Search-clear Button Button--icon Button--link" onclick={this.clear.bind(this)}>{icon('fas fa-times-circle')}</button> - : ''} - </div> - <ul className="Dropdown-menu Search-results"> - {this.value() && this.hasFocus - ? this.sources.map(source => source.view(this.value())) - : ''} - </ul> - </div> - ); - } - - oncreate(vnode) { - super.oncreate(vnode); - - // Highlight the item that is currently selected. - this.setIndex(this.getCurrentNumericIndex()); - - const search = this; - - this.$('.Search-results') - .on('mousedown', e => e.preventDefault()) - .on('click', () => this.$('input').blur()) - - // Whenever the mouse is hovered over a search result, highlight it. - .on('mouseenter', '> li:not(.Dropdown-header)', function() { - search.setIndex( - search.selectableItems().index(this) + return ( + <div + className={ + 'Search ' + + classNames({ + open: this.value() && this.hasFocus, + focused: this.hasFocus, + active: !!currentSearch, + loading: !!this.loadingSources, + }) + } + > + <div className="Search-input"> + <input + className="FormControl" + type="search" + placeholder={app.translator.transText('core.forum.header.search_placeholder')} + value={this.value()} + oninput={m.withAttr('value', this.value)} + onfocus={() => (this.hasFocus = true)} + onblur={() => (this.hasFocus = false)} + /> + {this.loadingSources ? ( + LoadingIndicator.component({ size: 'tiny', className: 'Button Button--icon Button--link' }) + ) : currentSearch ? ( + <button className="Search-clear Button Button--icon Button--link" onclick={this.clear.bind(this)}> + {icon('fas fa-times-circle')} + </button> + ) : ( + '' + )} + </div> + <ul className="Dropdown-menu Search-results"> + {this.value() && this.hasFocus ? this.sources.map(source => source.view(this.value())) : ''} + </ul> + </div> ); - }); + } - const $input = this.$('input'); + oncreate(vnode) { + super.oncreate(vnode); - this.navigator = new KeyboardNavigatable(); + // Highlight the item that is currently selected. + this.setIndex(this.getCurrentNumericIndex()); - this.navigator - .onUp(() => this.setIndex(this.getCurrentNumericIndex() - 1, true)) - .onDown(() => this.setIndex(this.getCurrentNumericIndex() + 1, true)) - .onSelect(this.selectResult.bind(this)) - .onCancel(this.clear.bind(this)) - .bindTo($input); + const search = this; - // Handle input key events on the search input, triggering results to load. - $input - .on('input focus', function() { - const query = this.value.toLowerCase(); + this.$('.Search-results') + .on('mousedown', e => e.preventDefault()) + .on('click', () => this.$('input').blur()) - if (!query) return; - - clearTimeout(search.searchTimeout); - search.searchTimeout = setTimeout(() => { - if (search.searched.indexOf(query) !== -1) return; - - if (query.length >= 3) { - search.sources.map(source => { - if (!source.search) return; - - search.loadingSources++; - - source.search(query).then(() => { - search.loadingSources = Math.max(0, search.loadingSources - 1); - m.redraw(); - }); + // Whenever the mouse is hovered over a search result, highlight it. + .on('mouseenter', '> li:not(.Dropdown-header)', function() { + search.setIndex(search.selectableItems().index(this)); }); - } - search.searched.push(query); - m.redraw(); - }, 250); - }) + const $input = this.$('input'); - .on('focus', function() { - $(this).one('mouseup', e => e.preventDefault()).select(); - }); - } + this.navigator = new KeyboardNavigatable(); - /** - * Get the active search in the app's current controller. - * - * @return {String} - */ - getCurrentSearch() { - return app.current && typeof app.current.searching === 'function' && app.current.searching(); - } + this.navigator + .onUp(() => this.setIndex(this.getCurrentNumericIndex() - 1, true)) + .onDown(() => this.setIndex(this.getCurrentNumericIndex() + 1, true)) + .onSelect(this.selectResult.bind(this)) + .onCancel(this.clear.bind(this)) + .bindTo($input); - /** - * Navigate to the currently selected search result and close the list. - */ - selectResult() { - clearTimeout(this.searchTimeout); - this.loadingSources = 0; + // Handle input key events on the search input, triggering results to load. + $input + .on('input focus', function() { + const query = this.value.toLowerCase(); - if (this.value()) { - m.route.set(this.getItem(this.index).find('a').attr('href')); - } else { - this.clear(); + if (!query) return; + + clearTimeout(search.searchTimeout); + search.searchTimeout = setTimeout(() => { + if (search.searched.indexOf(query) !== -1) return; + + if (query.length >= 3) { + search.sources.map(source => { + if (!source.search) return; + + search.loadingSources++; + + source.search(query).then(() => { + search.loadingSources = Math.max(0, search.loadingSources - 1); + m.redraw(); + }); + }); + } + + search.searched.push(query); + m.redraw(); + }, 250); + }) + + .on('focus', function() { + $(this) + .one('mouseup', e => e.preventDefault()) + .select(); + }); } - this.$('input').blur(); - } - - /** - * Clear the search input and the current controller's active search. - */ - clear() { - this.value(''); - - if (this.getCurrentSearch()) { - app.current.clearSearch(); - } else { - m.redraw(); - } - } - - /** - * Build an item list of SearchSources. - * - * @return {ItemList} - */ - sourceItems() { - const items = new ItemList(); - - if (app.forum.attribute('canViewDiscussions')) items.add('discussions', new DiscussionsSearchSource()); - if (app.forum.attribute('canViewUserList')) items.add('users', new UsersSearchSource()); - - return items; - } - - /** - * Get all of the search result items that are selectable. - * - * @return {jQuery} - */ - selectableItems() { - return this.$('.Search-results > li:not(.Dropdown-header)'); - } - - /** - * Get the position of the currently selected search result item. - * - * @return {Integer} - */ - getCurrentNumericIndex() { - return this.selectableItems().index( - this.getItem(this.index) - ); - } - - /** - * Get the <li> in the search results with the given index (numeric or named). - * - * @param {String} index - * @return {DOMElement} - */ - getItem(index) { - const $items = this.selectableItems(); - let $item = $items.filter(`[data-index="${index}"]`); - - if (!$item.length) { - $item = $items.eq(index); + /** + * Get the active search in the app's current controller. + * + * @return {String} + */ + getCurrentSearch() { + return app.current && typeof app.current.searching === 'function' && app.current.searching(); } - return $item; - } + /** + * Navigate to the currently selected search result and close the list. + */ + selectResult() { + clearTimeout(this.searchTimeout); + this.loadingSources = 0; - /** - * Set the currently-selected search result item to the one with the given - * index. - * - * @param index - * @param scrollToItem Whether or not to scroll the dropdown so that - * the item is in view. - */ - setIndex(index: number, scrollToItem?: boolean) { - const $items = this.selectableItems(); - const $dropdown = $items.parent(); + if (this.value()) { + m.route.set( + this.getItem(this.index) + .find('a') + .attr('href') + ); + } else { + this.clear(); + } - let fixedIndex = index; - if (index < 0) { - fixedIndex = $items.length - 1; - } else if (index >= $items.length) { - fixedIndex = 0; + this.$('input').blur(); } - const $item = $items.removeClass('active').eq(fixedIndex).addClass('active'); + /** + * Clear the search input and the current controller's active search. + */ + clear() { + this.value(''); - this.index = $item.attr('data-index') || fixedIndex; - - if (scrollToItem) { - const dropdownScroll = $dropdown.scrollTop(); - const dropdownTop = $dropdown.offset().top; - const dropdownBottom = dropdownTop + $dropdown.outerHeight(); - const itemTop = $item.offset().top; - const itemBottom = itemTop + $item.outerHeight(); - - let scrollTop; - if (itemTop < dropdownTop) { - scrollTop = dropdownScroll - dropdownTop + itemTop - parseInt($dropdown.css('padding-top'), 10); - } else if (itemBottom > dropdownBottom) { - scrollTop = dropdownScroll - dropdownBottom + itemBottom + parseInt($dropdown.css('padding-bottom'), 10); - } - - if (typeof scrollTop !== 'undefined') { - $dropdown.animate({scrollTop}, 100); - } + if (this.getCurrentSearch()) { + app.current.clearSearch(); + } else { + m.redraw(); + } + } + + /** + * Build an item list of SearchSources. + * + * @return {ItemList} + */ + sourceItems() { + const items = new ItemList(); + + if (app.forum.attribute('canViewDiscussions')) items.add('discussions', new DiscussionsSearchSource()); + if (app.forum.attribute('canViewUserList')) items.add('users', new UsersSearchSource()); + + return items; + } + + /** + * Get all of the search result items that are selectable. + * + * @return {jQuery} + */ + selectableItems() { + return this.$('.Search-results > li:not(.Dropdown-header)'); + } + + /** + * Get the position of the currently selected search result item. + * + * @return {Integer} + */ + getCurrentNumericIndex() { + return this.selectableItems().index(this.getItem(this.index)); + } + + /** + * Get the <li> in the search results with the given index (numeric or named). + * + * @param {String} index + * @return {DOMElement} + */ + getItem(index) { + const $items = this.selectableItems(); + let $item = $items.filter(`[data-index="${index}"]`); + + if (!$item.length) { + $item = $items.eq(index); + } + + return $item; + } + + /** + * Set the currently-selected search result item to the one with the given + * index. + * + * @param index + * @param scrollToItem Whether or not to scroll the dropdown so that + * the item is in view. + */ + setIndex(index: number, scrollToItem?: boolean) { + const $items = this.selectableItems(); + const $dropdown = $items.parent(); + + let fixedIndex = index; + if (index < 0) { + fixedIndex = $items.length - 1; + } else if (index >= $items.length) { + fixedIndex = 0; + } + + const $item = $items + .removeClass('active') + .eq(fixedIndex) + .addClass('active'); + + this.index = $item.attr('data-index') || fixedIndex; + + if (scrollToItem) { + const dropdownScroll = $dropdown.scrollTop(); + const dropdownTop = $dropdown.offset().top; + const dropdownBottom = dropdownTop + $dropdown.outerHeight(); + const itemTop = $item.offset().top; + const itemBottom = itemTop + $item.outerHeight(); + + let scrollTop; + if (itemTop < dropdownTop) { + scrollTop = dropdownScroll - dropdownTop + itemTop - parseInt($dropdown.css('padding-top'), 10); + } else if (itemBottom > dropdownBottom) { + scrollTop = dropdownScroll - dropdownBottom + itemBottom + parseInt($dropdown.css('padding-bottom'), 10); + } + + if (typeof scrollTop !== 'undefined') { + $dropdown.animate({ scrollTop }, 100); + } + } } - } } diff --git a/js/src/forum/components/SearchSource.ts b/js/src/forum/components/SearchSource.ts index 4fabe6ff7..55548dfa9 100644 --- a/js/src/forum/components/SearchSource.ts +++ b/js/src/forum/components/SearchSource.ts @@ -1,5 +1,5 @@ export default abstract class SearchSource { - abstract view(vnode: string); + abstract view(vnode: string); - abstract search(query: string); + abstract search(query: string); } diff --git a/js/src/forum/components/SessionDropdown.tsx b/js/src/forum/components/SessionDropdown.tsx index 4717be683..bd3766571 100644 --- a/js/src/forum/components/SessionDropdown.tsx +++ b/js/src/forum/components/SessionDropdown.tsx @@ -12,77 +12,78 @@ import Group from '../../common/models/Group'; * avatar/name, with a dropdown of session controls. */ export default class SessionDropdown extends Dropdown { - static initProps(props) { - super.initProps(props); + static initProps(props) { + super.initProps(props); - props.className = 'SessionDropdown'; - props.buttonClassName = 'Button Button--user Button--flat'; - props.menuClassName = 'Dropdown-menu--right'; - } - - view() { - this.props.children = this.items().toArray(); - - return super.view(); - } - - getButtonContent() { - const user = app.session.user; - - return [ - avatar(user), ' ', - <span className="Button-label">{username(user)}</span> - ]; - } - - /** - * Build an item list for the contents of the dropdown menu. - */ - items(): ItemList { - const items = new ItemList(); - const user = app.session.user; - - items.add('profile', - LinkButton.component({ - icon: 'fas fa-user', - children: app.translator.trans('core.forum.header.profile_button'), - href: app.route.user(user) - }), - 100 - ); - - items.add('settings', - LinkButton.component({ - icon: 'fas fa-cog', - children: app.translator.trans('core.forum.header.settings_button'), - href: app.route('settings') - }), - 50 - ); - - if (app.forum.attribute('adminUrl')) { - items.add('administration', - LinkButton.component({ - icon: 'fas fa-wrench', - children: app.translator.trans('core.forum.header.admin_button'), - href: app.forum.attribute('adminUrl'), - target: '_blank', - }), - 0 - ); + props.className = 'SessionDropdown'; + props.buttonClassName = 'Button Button--user Button--flat'; + props.menuClassName = 'Dropdown-menu--right'; } - items.add('separator', Separator.component(), -90); + view() { + this.props.children = this.items().toArray(); - items.add('logOut', - Button.component({ - icon: 'fas fa-sign-out-alt', - children: app.translator.trans('core.forum.header.log_out_button'), - onclick: app.session.logout.bind(app.session) - }), - -100 - ); + return super.view(); + } - return items; - } + getButtonContent() { + const user = app.session.user; + + return [avatar(user), ' ', <span className="Button-label">{username(user)}</span>]; + } + + /** + * Build an item list for the contents of the dropdown menu. + */ + items(): ItemList { + const items = new ItemList(); + const user = app.session.user; + + items.add( + 'profile', + LinkButton.component({ + icon: 'fas fa-user', + children: app.translator.trans('core.forum.header.profile_button'), + href: app.route.user(user), + }), + 100 + ); + + items.add( + 'settings', + LinkButton.component({ + icon: 'fas fa-cog', + children: app.translator.trans('core.forum.header.settings_button'), + href: app.route('settings'), + }), + 50 + ); + + if (app.forum.attribute('adminUrl')) { + items.add( + 'administration', + LinkButton.component({ + icon: 'fas fa-wrench', + children: app.translator.trans('core.forum.header.admin_button'), + href: app.forum.attribute('adminUrl'), + target: '_blank', + }), + 0 + ); + } + + items.add('separator', Separator.component(), -90); + + items.add( + 'logOut', + Button.component({ + icon: 'fas fa-sign-out-alt', + children: app.translator.trans('core.forum.header.log_out_button'), + onclick: app.session.logout.bind(app.session), + }), + -100 + ); + + return items; + } } diff --git a/js/src/forum/components/UserCard.tsx b/js/src/forum/components/UserCard.tsx index 1648471b7..8e262546b 100644 --- a/js/src/forum/components/UserCard.tsx +++ b/js/src/forum/components/UserCard.tsx @@ -1,4 +1,4 @@ -import Component, {ComponentProps} from '../../common/Component'; +import Component, { ComponentProps } from '../../common/Component'; import humanTime from '../../common/utils/humanTime'; import ItemList from '../../common/utils/ItemList'; import UserControls from '../utils/UserControls'; @@ -8,12 +8,12 @@ import icon from '../../common/helpers/icon'; import Dropdown from '../../common/components/Dropdown'; import AvatarEditor from './AvatarEditor'; import listItems from '../../common/helpers/listItems'; -import User from "../../common/models/User"; +import User from '../../common/models/User'; export interface UserCardProps extends ComponentProps { - user: User; - editable: boolean; - controlsButtonClassName: string; + user: User; + editable: boolean; + controlsButtonClassName: string; } /** @@ -22,79 +22,74 @@ export interface UserCardProps extends ComponentProps { * post author. */ export default class UserCard extends Component<UserCardProps> { - view() { - const user = this.props.user; - const controls = UserControls.controls(user, this).toArray(); - const color = user.color(); - const badges = user.badges().toArray(); + view() { + const user = this.props.user; + const controls = UserControls.controls(user, this).toArray(); + const color = user.color(); + const badges = user.badges().toArray(); - return ( - <div className={'UserCard ' + (this.props.className || '')} - style={color ? {backgroundColor: color} : ''}> - <div className="darkenBackground"> + return ( + <div className={'UserCard ' + (this.props.className || '')} style={color ? { backgroundColor: color } : ''}> + <div className="darkenBackground"> + <div className="container"> + {controls.length + ? Dropdown.component({ + children: controls, + className: 'UserCard-controls App-primaryControl', + menuClassName: 'Dropdown-menu--right', + buttonClassName: this.props.controlsButtonClassName, + label: app.translator.trans('core.forum.user_controls.button'), + icon: 'fas fa-ellipsis-v', + }) + : ''} - <div className="container"> - {controls.length ? Dropdown.component({ - children: controls, - className: 'UserCard-controls App-primaryControl', - menuClassName: 'Dropdown-menu--right', - buttonClassName: this.props.controlsButtonClassName, - label: app.translator.trans('core.forum.user_controls.button'), - icon: 'fas fa-ellipsis-v' - }) : ''} + <div className="UserCard-profile"> + <h2 className="UserCard-identity"> + {this.props.editable ? ( + [AvatarEditor.component({ user, className: 'UserCard-avatar' }), username(user)] + ) : ( + <m.route.Link href={app.route.user(user)}> + <div className="UserCard-avatar">{avatar(user)}</div> + {username(user)} + </m.route.Link> + )} + </h2> - <div className="UserCard-profile"> - <h2 className="UserCard-identity"> - {this.props.editable - ? [AvatarEditor.component({user, className: 'UserCard-avatar'}), username(user)] - : ( - <m.route.Link href={app.route.user(user)}> - <div className="UserCard-avatar">{avatar(user)}</div> - {username(user)} - </m.route.Link> - )} - </h2> + {badges.length ? <ul className="UserCard-badges badges">{listItems(badges)}</ul> : ''} - {badges.length ? ( - <ul className="UserCard-badges badges"> - {listItems(badges)} - </ul> - ) : ''} - - <ul className="UserCard-info"> - {listItems(this.infoItems().toArray())} - </ul> + <ul className="UserCard-info">{listItems(this.infoItems().toArray())}</ul> + </div> + </div> + </div> </div> - </div> - </div> - </div> - ); - } - - /** - * Build an item list of tidbits of info to show on this user's profile. - * - * @return {ItemList} - */ - infoItems() { - const items = new ItemList(); - const user = this.props.user; - const lastSeenAt = user.lastSeenAt(); - - if (lastSeenAt) { - const online = user.isOnline(); - - items.add('lastSeen', ( - <span className={'UserCard-lastSeen' + (online ? ' online' : '')}> - {online - ? [icon('fas fa-circle'), ' ', app.translator.trans('core.forum.user.online_text')] - : [icon('far fa-clock'), ' ', humanTime(lastSeenAt)]} - </span> - )); + ); } - items.add('joined', app.translator.trans('core.forum.user.joined_date_text', {ago: humanTime(user.joinTime())})); + /** + * Build an item list of tidbits of info to show on this user's profile. + * + * @return {ItemList} + */ + infoItems() { + const items = new ItemList(); + const user = this.props.user; + const lastSeenAt = user.lastSeenAt(); - return items; - } + if (lastSeenAt) { + const online = user.isOnline(); + + items.add( + 'lastSeen', + <span className={'UserCard-lastSeen' + (online ? ' online' : '')}> + {online + ? [icon('fas fa-circle'), ' ', app.translator.trans('core.forum.user.online_text')] + : [icon('far fa-clock'), ' ', humanTime(lastSeenAt)]} + </span> + ); + } + + items.add('joined', app.translator.trans('core.forum.user.joined_date_text', { ago: humanTime(user.joinTime()) })); + + return items; + } } diff --git a/js/src/forum/components/UserPage.tsx b/js/src/forum/components/UserPage.tsx index 82fc4790c..6a2e5294e 100644 --- a/js/src/forum/components/UserPage.tsx +++ b/js/src/forum/components/UserPage.tsx @@ -16,143 +16,145 @@ import User from '../../common/models/User'; * examples. */ export default abstract class UserPage extends Page { - /** - * The user this page is for. - */ - user: User; - bodyClass: string = 'App--user'; + /** + * The user this page is for. + */ + user: User; + bodyClass: string = 'App--user'; - /** - * The username of the currently loaded user - */ - username: string; + /** + * The username of the currently loaded user + */ + username: string; - view() { - return ( - <div className="UserPage"> - {this.user ? [ - UserCard.component({ - user: this.user, - className: 'Hero UserHero', - editable: this.user.canEdit() || this.user === app.session.user, - controlsButtonClassName: 'Button' - }), - <div className="container"> - <div className="sideNavContainer"> - <nav className="sideNav UserPage-nav" config={affixSidebar}> - <ul>{listItems(this.sidebarItems().toArray())}</ul> - </nav> - <div className="sideNavOffset UserPage-content"> - {this.content()} - </div> + view() { + return ( + <div className="UserPage"> + {this.user + ? [ + UserCard.component({ + user: this.user, + className: 'Hero UserHero', + editable: this.user.canEdit() || this.user === app.session.user, + controlsButtonClassName: 'Button', + }), + <div className="container"> + <div className="sideNavContainer"> + <nav className="sideNav UserPage-nav" config={affixSidebar}> + <ul>{listItems(this.sidebarItems().toArray())}</ul> + </nav> + <div className="sideNavOffset UserPage-content">{this.content()}</div> + </div> + </div>, + ] + : [LoadingIndicator.component({ lassName: 'LoadingIndicator--block' })]} </div> - </div> - ] : [ - LoadingIndicator.component({lassName: 'LoadingIndicator--block'}) - ]} - </div> - ); - } - - /** - * Get the content to display in the user page. - */ - abstract content(); - - /** - * Initialize the component with a user, and trigger the loading of their - * activity feed. - */ - protected show(user: User) { - this.user = user; - - app.setTitle(user.displayName()); - - m.redraw(); - } - - /** - * Given a username, load the user's profile from the store, or make a request - * if we don't have it yet. Then initialize the profile page with that user. - */ - loadUser(username: string) { - const lowercaseUsername = username.toLowerCase(); - - // Load the preloaded user object, if any, into the global app store - // We don't use the output of the method because it returns raw JSON - // instead of the parsed models - app.preloadedApiDocument(); - - if (lowercaseUsername == this.username) return; - - this.username = lowercaseUsername; - - app.store.all<User>('users').some(user => { - if ((user.username().toLowerCase() === lowercaseUsername || user.id() === username) && user.joinTime()) { - this.show(user); - return true; - } - }); - - if (!this.user) { - app.store.find('users', username).then(this.show.bind(this)); - } - } - - /** - * Build an item list for the content of the sidebar. - */ - sidebarItems() { - const items = new ItemList(); - - items.add('nav', - SelectDropdown.component({ - children: this.navItems().toArray(), - className: 'App-titleControl', - buttonClassName: 'Button' - }) - ); - - return items; - } - - /** - * Build an item list for the navigation in the sidebar. - */ - navItems() { - const items = new ItemList(); - const user = this.user; - - items.add('posts', - LinkButton.component({ - href: app.route('user.posts', {username: user.username()}), - children: [app.translator.trans('core.forum.user.posts_link'), <span className="Button-badge">{user.commentCount()}</span>], - icon: 'far fa-comment' - }), - 100 - ); - - items.add('discussions', - LinkButton.component({ - href: app.route('user.discussions', {username: user.username()}), - children: [app.translator.trans('core.forum.user.discussions_link'), <span className="Button-badge">{user.discussionCount()}</span>], - icon: 'fas fa-bars' - }), - 90 - ); - - if (app.session.user === user) { - items.add('separator', Separator.component(), -90); - items.add('settings', - LinkButton.component({ - href: app.route('settings'), - children: app.translator.trans('core.forum.user.settings_link'), - icon: 'fas fa-cog' - }), - -100 - ); + ); } - return items; - } + /** + * Get the content to display in the user page. + */ + abstract content(); + + /** + * Initialize the component with a user, and trigger the loading of their + * activity feed. + */ + protected show(user: User) { + this.user = user; + + app.setTitle(user.displayName()); + + m.redraw(); + } + + /** + * Given a username, load the user's profile from the store, or make a request + * if we don't have it yet. Then initialize the profile page with that user. + */ + loadUser(username: string) { + const lowercaseUsername = username.toLowerCase(); + + // Load the preloaded user object, if any, into the global app store + // We don't use the output of the method because it returns raw JSON + // instead of the parsed models + app.preloadedApiDocument(); + + if (lowercaseUsername == this.username) return; + + this.username = lowercaseUsername; + + app.store.all<User>('users').some(user => { + if ((user.username().toLowerCase() === lowercaseUsername || user.id() === username) && user.joinTime()) { + this.show(user); + return true; + } + }); + + if (!this.user) { + app.store.find('users', username).then(this.show.bind(this)); + } + } + + /** + * Build an item list for the content of the sidebar. + */ + sidebarItems() { + const items = new ItemList(); + + items.add( + 'nav', + SelectDropdown.component({ + children: this.navItems().toArray(), + className: 'App-titleControl', + buttonClassName: 'Button', + }) + ); + + return items; + } + + /** + * Build an item list for the navigation in the sidebar. + */ + navItems() { + const items = new ItemList(); + const user = this.user; + + items.add( + 'posts', + LinkButton.component({ + href: app.route('user.posts', { username: user.username() }), + children: [app.translator.trans('core.forum.user.posts_link'), <span className="Button-badge">{user.commentCount()}</span>], + icon: 'far fa-comment', + }), + 100 + ); + + items.add( + 'discussions', + LinkButton.component({ + href: app.route('user.discussions', { username: user.username() }), + children: [app.translator.trans('core.forum.user.discussions_link'), <span className="Button-badge">{user.discussionCount()}</span>], + icon: 'fas fa-bars', + }), + 90 + ); + + if (app.session.user === user) { + items.add('separator', Separator.component(), -90); + items.add( + 'settings', + LinkButton.component({ + href: app.route('settings'), + children: app.translator.trans('core.forum.user.settings_link'), + icon: 'fas fa-cog', + }), + -100 + ); + } + + return items; + } } diff --git a/js/src/forum/components/UsersSearchSource.tsx b/js/src/forum/components/UsersSearchSource.tsx index 62f05302b..d4e42751a 100644 --- a/js/src/forum/components/UsersSearchSource.tsx +++ b/js/src/forum/components/UsersSearchSource.tsx @@ -11,49 +11,55 @@ import User from '../../common/models/User'; * @implements SearchSource */ export default class UsersSearchSource extends SearchSource { - protected results: { [key: string]: User[] } = {}; + protected results: { [key: string]: User[] } = {}; - search(query: string) { - return app.store.find<User>('users', { - filter: {q: query}, - page: {limit: 5} - }).then(results => { - this.results[query] = results; - m.redraw(); - }); - } + search(query: string) { + return app.store + .find<User>('users', { + filter: { q: query }, + page: { limit: 5 }, + }) + .then(results => { + this.results[query] = results; + m.redraw(); + }); + } - view(query: string) { - query = query.toLowerCase(); + view(query: string) { + query = query.toLowerCase(); - const results = (this.results[query] || []) - .concat(app.store.all<User>('users').filter(user => [user.username(), user.displayName()].some(value => value.toLowerCase().substr(0, query.length) === query))) - .filter((e, i, arr) => arr.lastIndexOf(e) === i) - .sort((a, b) => a.displayName().localeCompare(b.displayName())); + const results = (this.results[query] || []) + .concat( + app.store + .all<User>('users') + .filter(user => [user.username(), user.displayName()].some(value => value.toLowerCase().substr(0, query.length) === query)) + ) + .filter((e, i, arr) => arr.lastIndexOf(e) === i) + .sort((a, b) => a.displayName().localeCompare(b.displayName())); - if (!results.length) return ''; + if (!results.length) return ''; - return [ - <li className="Dropdown-header">{app.translator.trans('core.forum.search.users_heading')}</li>, - results.map(user => { - const name = username(user); + return [ + <li className="Dropdown-header">{app.translator.trans('core.forum.search.users_heading')}</li>, + results.map(user => { + const name = username(user); - if (!name.children) { - name.children = [name.text]; - delete name.text; - } + if (!name.children) { + name.children = [name.text]; + delete name.text; + } - name.children[0] = highlight(name.children[0], query); + name.children[0] = highlight(name.children[0], query); - return ( - <li className="UserSearchResult" data-index={'users' + user.id()}> - <m.route.Link href={app.route.user(user)}> - {avatar(user)} - {name} - </m.route.Link> - </li> - ); - }) - ]; - } + return ( + <li className="UserSearchResult" data-index={'users' + user.id()}> + <m.route.Link href={app.route.user(user)}> + {avatar(user)} + {name} + </m.route.Link> + </li> + ); + }), + ]; + } } diff --git a/js/src/forum/utils/History.ts b/js/src/forum/utils/History.ts index 62f7ac734..da910ce47 100644 --- a/js/src/forum/utils/History.ts +++ b/js/src/forum/utils/History.ts @@ -1,7 +1,7 @@ export interface StackItem { - name: string; - title: string; - url?: string; + name: string; + title: string; + url?: string; } /** @@ -16,89 +16,89 @@ export interface StackItem { * rather than the previous discussion. */ export default class History { - /** - * The stack of routes that have been navigated to. - */ - protected stack: StackItem[] = []; + /** + * The stack of routes that have been navigated to. + */ + protected stack: StackItem[] = []; - /** - * Get the item on the top of the stack. - */ - getCurrent(): StackItem { - return this.stack[this.stack.length - 1]; - } - - /** - * Get the previous item on the stack. - */ - getPrevious(): StackItem { - return this.stack[this.stack.length - 2]; - } - - /** - * Push an item to the top of the stack. - * - * @param {String} name The name of the route. - * @param {String} title The title of the route. - * @param {String} [url] The URL of the route. The current URL will be used if - * not provided. - */ - push(name: string, title: string, url: string = m.route.get()) { - // If we're pushing an item with the same name as second-to-top item in the - // stack, we will assume that the user has clicked the 'back' button in - // their browser. In this case, we don't want to push a new item, so we will - // pop off the top item, and then the second-to-top item will be overwritten - // below. - const secondTop = this.stack[this.stack.length - 2]; - if (secondTop && secondTop.name === name) { - this.stack.pop(); + /** + * Get the item on the top of the stack. + */ + getCurrent(): StackItem { + return this.stack[this.stack.length - 1]; } - // If we're pushing an item with the same name as the top item in the stack, - // then we'll overwrite it with the new URL. - const top = this.getCurrent(); - if (top && top.name === name) { - Object.assign(top, {url, title}); - } else { - this.stack.push({name, url, title}); - } - } - - /** - * Check whether or not the history stack is able to be popped. - */ - canGoBack(): boolean { - return this.stack.length > 1; - } - - /** - * Go back to the previous route in the history stack. - */ - back() { - if (! this.canGoBack()) { - return this.home(); + /** + * Get the previous item on the stack. + */ + getPrevious(): StackItem { + return this.stack[this.stack.length - 2]; } - this.stack.pop(); + /** + * Push an item to the top of the stack. + * + * @param {String} name The name of the route. + * @param {String} title The title of the route. + * @param {String} [url] The URL of the route. The current URL will be used if + * not provided. + */ + push(name: string, title: string, url: string = m.route.get()) { + // If we're pushing an item with the same name as second-to-top item in the + // stack, we will assume that the user has clicked the 'back' button in + // their browser. In this case, we don't want to push a new item, so we will + // pop off the top item, and then the second-to-top item will be overwritten + // below. + const secondTop = this.stack[this.stack.length - 2]; + if (secondTop && secondTop.name === name) { + this.stack.pop(); + } - m.route.set(this.getCurrent().url); - } + // If we're pushing an item with the same name as the top item in the stack, + // then we'll overwrite it with the new URL. + const top = this.getCurrent(); + if (top && top.name === name) { + Object.assign(top, { url, title }); + } else { + this.stack.push({ name, url, title }); + } + } - /** - * Get the URL of the previous page. - */ - backUrl(): string { - const secondTop = this.stack[this.stack.length - 2]; + /** + * Check whether or not the history stack is able to be popped. + */ + canGoBack(): boolean { + return this.stack.length > 1; + } - return secondTop.url; - } + /** + * Go back to the previous route in the history stack. + */ + back() { + if (!this.canGoBack()) { + return this.home(); + } - /** - * Go to the first route in the history stack. - */ - home() { - this.stack.splice(0); + this.stack.pop(); - m.route.set('/'); - } + m.route.set(this.getCurrent().url); + } + + /** + * Get the URL of the previous page. + */ + backUrl(): string { + const secondTop = this.stack[this.stack.length - 2]; + + return secondTop.url; + } + + /** + * Go to the first route in the history stack. + */ + home() { + this.stack.splice(0); + + m.route.set('/'); + } } diff --git a/js/src/forum/utils/KeyboardNavigatable.ts b/js/src/forum/utils/KeyboardNavigatable.ts index 1047c7ab2..5f7f395e8 100644 --- a/js/src/forum/utils/KeyboardNavigatable.ts +++ b/js/src/forum/utils/KeyboardNavigatable.ts @@ -1,4 +1,4 @@ -export type KeyboardEventCallback = (KeyboardEvent) => boolean|void; +export type KeyboardEventCallback = (KeyboardEvent) => boolean | void; /** * The `KeyboardNavigatable` class manages lists that can be navigated with the @@ -8,118 +8,118 @@ export type KeyboardEventCallback = (KeyboardEvent) => boolean|void; * API for use. */ export default class KeyboardNavigatable { - /** - * Callback to be executed for a specified input. - * - * @callback KeyboardNavigatable~keyCallback - * @param {KeyboardEvent} event - * @returns {boolean} - */ - callbacks: { [key: number]: KeyboardEventCallback } = {}; + /** + * Callback to be executed for a specified input. + * + * @callback KeyboardNavigatable~keyCallback + * @param {KeyboardEvent} event + * @returns {boolean} + */ + callbacks: { [key: number]: KeyboardEventCallback } = {}; - // By default, always handle keyboard navigation. - whenCallback: KeyboardEventCallback = () => true; + // By default, always handle keyboard navigation. + whenCallback: KeyboardEventCallback = () => true; - /** - * Provide a callback to be executed when navigating upwards. - * - * This will be triggered by the Up key. - */ - onUp(callback: KeyboardEventCallback): this { - this.callbacks[38] = e => { - e.preventDefault(); - callback(e); - }; + /** + * Provide a callback to be executed when navigating upwards. + * + * This will be triggered by the Up key. + */ + onUp(callback: KeyboardEventCallback): this { + this.callbacks[38] = e => { + e.preventDefault(); + callback(e); + }; - return this; - } - - /** - * Provide a callback to be executed when navigating downwards. - * - * This will be triggered by the Down key. - */ - onDown(callback: KeyboardEventCallback): this { - this.callbacks[40] = e => { - e.preventDefault(); - callback(e); - }; - - return this; - } - - /** - * Provide a callback to be executed when the current item is selected.. - * - * This will be triggered by the Return and Tab keys.. - */ - onSelect(callback: KeyboardEventCallback): this { - this.callbacks[9] = this.callbacks[13] = e => { - e.preventDefault(); - callback(e); - }; - - return this; - } - - /** - * Provide a callback to be executed when the navigation is canceled. - * - * This will be triggered by the Escape key. - */ - onCancel(callback: Function): this { - this.callbacks[27] = e => { - e.stopPropagation(); - e.preventDefault(); - callback(e); - }; - - return this; - } - - /** - * Provide a callback to be executed when previous input is removed. - * - * This will be triggered by the Backspace key. - */ - onRemove(callback: Function): this { - this.callbacks[8] = e => { - if (e.target.selectionStart === 0 && e.target.selectionEnd === 0) { - callback(e); - e.preventDefault(); - } - }; - - return this; - } - - /** - * Provide a callback that determines whether keyboard input should be handled. - */ - when(callback: KeyboardEventCallback): this { - this.whenCallback = callback; - - return this; - } - - /** - * Set up the navigation key bindings on the given jQuery element. - */ - bindTo($element: any) { - // Handle navigation key events on the navigatable element. - $element.on('keydown', this.navigate.bind(this)); - } - - /** - * Interpret the given keyboard event as navigation commands. - */ - navigate(event: KeyboardEvent) { - // This callback determines whether keyboard should be handled or ignored. - if (!this.whenCallback(event)) return; - - const keyCallback = this.callbacks[event.which]; - if (keyCallback) { - keyCallback(event); + return this; + } + + /** + * Provide a callback to be executed when navigating downwards. + * + * This will be triggered by the Down key. + */ + onDown(callback: KeyboardEventCallback): this { + this.callbacks[40] = e => { + e.preventDefault(); + callback(e); + }; + + return this; + } + + /** + * Provide a callback to be executed when the current item is selected.. + * + * This will be triggered by the Return and Tab keys.. + */ + onSelect(callback: KeyboardEventCallback): this { + this.callbacks[9] = this.callbacks[13] = e => { + e.preventDefault(); + callback(e); + }; + + return this; + } + + /** + * Provide a callback to be executed when the navigation is canceled. + * + * This will be triggered by the Escape key. + */ + onCancel(callback: Function): this { + this.callbacks[27] = e => { + e.stopPropagation(); + e.preventDefault(); + callback(e); + }; + + return this; + } + + /** + * Provide a callback to be executed when previous input is removed. + * + * This will be triggered by the Backspace key. + */ + onRemove(callback: Function): this { + this.callbacks[8] = e => { + if (e.target.selectionStart === 0 && e.target.selectionEnd === 0) { + callback(e); + e.preventDefault(); + } + }; + + return this; + } + + /** + * Provide a callback that determines whether keyboard input should be handled. + */ + when(callback: KeyboardEventCallback): this { + this.whenCallback = callback; + + return this; + } + + /** + * Set up the navigation key bindings on the given jQuery element. + */ + bindTo($element: any) { + // Handle navigation key events on the navigatable element. + $element.on('keydown', this.navigate.bind(this)); + } + + /** + * Interpret the given keyboard event as navigation commands. + */ + navigate(event: KeyboardEvent) { + // This callback determines whether keyboard should be handled or ignored. + if (!this.whenCallback(event)) return; + + const keyCallback = this.callbacks[event.which]; + if (keyCallback) { + keyCallback(event); + } } - } } diff --git a/js/src/forum/utils/PostControls.tsx b/js/src/forum/utils/PostControls.tsx index 3d12b121a..763137679 100644 --- a/js/src/forum/utils/PostControls.tsx +++ b/js/src/forum/utils/PostControls.tsx @@ -1,11 +1,11 @@ -import {Vnode} from "mithril"; +import { Vnode } from 'mithril'; // import EditPostComposer from '../components/EditPostComposer'; import Button from '../../common/components/Button'; import Separator from '../../common/components/Separator'; import ItemList from '../../common/utils/ItemList'; -import Post from "../../common/models/Post"; -import PostComponent from "../../forum/components/Post"; +import Post from '../../common/models/Post'; +import PostComponent from '../../forum/components/Post'; /** * The `PostControls` utility constructs a list of buttons for a post which @@ -60,10 +60,16 @@ export default { if (post.contentType() === 'comment' && post.canEdit()) { if (!post.isHidden()) { - items.add('edit', Button.component({ - icon: 'fas fa-pencil-alt', - onclick: this.editAction.bind(post) - }, app.translator.trans('core.forum.post_controls.edit_button'))); + items.add( + 'edit', + Button.component( + { + icon: 'fas fa-pencil-alt', + onclick: this.editAction.bind(post), + }, + app.translator.trans('core.forum.post_controls.edit_button') + ) + ); } } @@ -83,26 +89,35 @@ export default { if (post.contentType() === 'comment' && !post.isHidden()) { if (post.canHide()) { - items.add('hide', Button.component({ - icon: 'far fa-trash-alt', - children: app.translator.trans('core.forum.post_controls.delete_button'), - onclick: this.hideAction.bind(post) - })); + items.add( + 'hide', + Button.component({ + icon: 'far fa-trash-alt', + children: app.translator.trans('core.forum.post_controls.delete_button'), + onclick: this.hideAction.bind(post), + }) + ); } } else { if (post.contentType() === 'comment' && post.canHide()) { - items.add('restore', Button.component({ - icon: 'fas fa-reply', - children: app.translator.trans('core.forum.post_controls.restore_button'), - onclick: this.restoreAction.bind(post) - })); + items.add( + 'restore', + Button.component({ + icon: 'fas fa-reply', + children: app.translator.trans('core.forum.post_controls.restore_button'), + onclick: this.restoreAction.bind(post), + }) + ); } if (post.canDelete()) { - items.add('delete', Button.component({ - icon: 'fas fa-times', - children: app.translator.trans('core.forum.post_controls.delete_forever_button'), - onclick: this.deleteAction.bind(post, context) - })); + items.add( + 'delete', + Button.component({ + icon: 'fas fa-times', + children: app.translator.trans('core.forum.post_controls.delete_forever_button'), + onclick: this.deleteAction.bind(post, context), + }) + ); } } @@ -171,5 +186,5 @@ export default { if (context) context.loading = false; m.redraw(); }); - } + }, }; diff --git a/js/src/forum/utils/UserControls.ts b/js/src/forum/utils/UserControls.ts index 33ec48f90..6333d134f 100644 --- a/js/src/forum/utils/UserControls.ts +++ b/js/src/forum/utils/UserControls.ts @@ -4,112 +4,120 @@ import Separator from '../../common/components/Separator'; // import EditUserModal from '../components/EditUserModal'; import UserPage from '../components/UserPage'; import ItemList from '../../common/utils/ItemList'; -import User from "../../common/models/User"; +import User from '../../common/models/User'; /** * The `UserControls` utility constructs a list of buttons for a user which * perform actions on it. */ export default { - /** - * Get a list of controls for a user. - * - * @param user - * @param context The parent component under which the controls menu will - * be displayed. - */ - controls(user: User, context: any): ItemList { - const items = new ItemList(); + /** + * Get a list of controls for a user. + * + * @param user + * @param context The parent component under which the controls menu will + * be displayed. + */ + controls(user: User, context: any): ItemList { + const items = new ItemList(); - ['user', 'moderation', 'destructive'].forEach(section => { - const controls = this[section + 'Controls'](user, context).toArray(); - if (controls.length) { - controls.forEach(item => items.add(item.itemName, item)); - items.add(section + 'Separator', Separator.component()); - } - }); + ['user', 'moderation', 'destructive'].forEach(section => { + const controls = this[section + 'Controls'](user, context).toArray(); + if (controls.length) { + controls.forEach(item => items.add(item.itemName, item)); + items.add(section + 'Separator', Separator.component()); + } + }); - return items; - }, + return items; + }, - /** - * Get controls for a user pertaining to the current user (e.g. poke, follow). - */ - userControls(): ItemList { - return new ItemList(); - }, + /** + * Get controls for a user pertaining to the current user (e.g. poke, follow). + */ + userControls(): ItemList { + return new ItemList(); + }, - /** - * Get controls for a user pertaining to moderation (e.g. suspend, edit). - */ - moderationControls(user: User): ItemList { - const items = new ItemList(); + /** + * Get controls for a user pertaining to moderation (e.g. suspend, edit). + */ + moderationControls(user: User): ItemList { + const items = new ItemList(); - if (user.canEdit()) { - items.add('edit', Button.component({ - icon: 'fas fa-pencil-alt', - children: app.translator.trans('core.forum.user_controls.edit_button'), - onclick: this.editAction.bind(this, user) - })); - } + if (user.canEdit()) { + items.add( + 'edit', + Button.component({ + icon: 'fas fa-pencil-alt', + children: app.translator.trans('core.forum.user_controls.edit_button'), + onclick: this.editAction.bind(this, user), + }) + ); + } - return items; - }, + return items; + }, - /** - * Get controls for a user which are destructive (e.g. delete). - */ - destructiveControls(user: User): ItemList { - const items = new ItemList(); + /** + * Get controls for a user which are destructive (e.g. delete). + */ + destructiveControls(user: User): ItemList { + const items = new ItemList(); - if (user.id() !== '1' && user.canDelete()) { - items.add('delete', Button.component({ - icon: 'fas fa-times', - children: app.translator.trans('core.forum.user_controls.delete_button'), - onclick: this.deleteAction.bind(this, user) - })); - } + if (user.id() !== '1' && user.canDelete()) { + items.add( + 'delete', + Button.component({ + icon: 'fas fa-times', + children: app.translator.trans('core.forum.user_controls.delete_button'), + onclick: this.deleteAction.bind(this, user), + }) + ); + } - return items; - }, + return items; + }, - /** - * Delete the user. - */ - deleteAction(user: User) { - if (!confirm(app.translator.transText('core.forum.user_controls.delete_confirmation'))) { - return; - } + /** + * Delete the user. + */ + deleteAction(user: User) { + if (!confirm(app.translator.transText('core.forum.user_controls.delete_confirmation'))) { + return; + } - user.delete().then(() => { - this.showDeletionAlert(user, 'success'); - if (app.current instanceof UserPage && app.current.user === user) { - app.history.back(); - } else { - window.location.reload(); - } - }).catch(() => this.showDeletionAlert(user, 'error')); - }, + user.delete() + .then(() => { + this.showDeletionAlert(user, 'success'); + if (app.current instanceof UserPage && app.current.user === user) { + app.history.back(); + } else { + window.location.reload(); + } + }) + .catch(() => this.showDeletionAlert(user, 'error')); + }, - /** - * Show deletion alert of user. - */ - showDeletionAlert(user: User, type: string) { - const { username, email } = user.data.attributes; - const message = `core.forum.user_controls.delete_${type}_message`; + /** + * Show deletion alert of user. + */ + showDeletionAlert(user: User, type: string) { + const { username, email } = user.data.attributes; + const message = `core.forum.user_controls.delete_${type}_message`; - app.alerts.show(Alert.component({ - type, - children: app.translator.trans( - message, { username, email } - ) - })); - }, + app.alerts.show( + Alert.component({ + type, + children: app.translator.trans(message, { username, email }), + }) + ); + }, - /** - * Edit the user. - */ - editAction(user: User) { - app.modal.show(new EditUserModal({user})); - } + /** + * Edit the user. + */ + editAction(user: User) { + app.modal.show(new EditUserModal({ user })); + }, }; diff --git a/js/src/forum/utils/affixSidebar.ts b/js/src/forum/utils/affixSidebar.ts index 14a2d3e85..c46fa3d5a 100644 --- a/js/src/forum/utils/affixSidebar.ts +++ b/js/src/forum/utils/affixSidebar.ts @@ -3,15 +3,15 @@ * using hcSticky. */ export default function affixSidebar(vnode) { - const element = vnode.dom; - const $sidebar = $(element); - const $header = $('#header'); - const $affixElement = $sidebar.find('> ul')[0]; + const element = vnode.dom; + const $sidebar = $(element); + const $header = $('#header'); + const $affixElement = $sidebar.find('> ul')[0]; - $(window).off('.affix'); + $(window).off('.affix'); - new hcSticky($affixElement, { - stickTo: element, - top: $header.outerHeight(true) + parseInt($sidebar.css('margin-top'), 10), - }); + new hcSticky($affixElement, { + stickTo: element, + top: $header.outerHeight(true) + parseInt($sidebar.css('margin-top'), 10), + }); } diff --git a/js/webpack.config.js b/js/webpack.config.js index 0493c08e4..a791b639c 100755 --- a/js/webpack.config.js +++ b/js/webpack.config.js @@ -3,10 +3,22 @@ const webpack = require('webpack'); const merge = require('webpack-merge'); module.exports = merge(config(), { - output: { - library: 'flarum.core' - }, - plugins: [ - new webpack.IgnorePlugin(/^\.\/locale$/, /moment$/) - ] + output: { + library: 'flarum.core', + }, + + // use zepto instead of jquery + module: { + rules: [ + { + test: require.resolve('zepto'), + use: 'imports-loader?this=>window', + }, + ], + }, + resolve: { + alias: { + jquery: 'zepto', + }, + }, });