does.\n\t contentKey = 'textContent' in document.documentElement ? 'textContent' : 'innerText';\n\t }\n\t return contentKey;\n\t}\n\t\n\tmodule.exports = getTextContentAccessor;\n\n/***/ },\n/* 321 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/**\n\t * Copyright 2013-present, Facebook, Inc.\n\t * All rights reserved.\n\t *\n\t * This source code is licensed under the BSD-style license found in the\n\t * LICENSE file in the root directory of this source tree. An additional grant\n\t * of patent rights can be found in the PATENTS file in the same directory.\n\t *\n\t * @providesModule instantiateReactComponent\n\t */\n\t\n\t'use strict';\n\t\n\tvar _prodInvariant = __webpack_require__(5),\n\t _assign = __webpack_require__(11);\n\t\n\tvar ReactCompositeComponent = __webpack_require__(810);\n\tvar ReactEmptyComponent = __webpack_require__(305);\n\tvar ReactHostComponent = __webpack_require__(307);\n\tvar ReactInstrumentation = __webpack_require__(31);\n\t\n\tvar invariant = __webpack_require__(3);\n\tvar warning = __webpack_require__(6);\n\t\n\t// To avoid a cyclic dependency, we create the final class in this module\n\tvar ReactCompositeComponentWrapper = function (element) {\n\t this.construct(element);\n\t};\n\t_assign(ReactCompositeComponentWrapper.prototype, ReactCompositeComponent.Mixin, {\n\t _instantiateReactComponent: instantiateReactComponent\n\t});\n\t\n\tfunction getDeclarationErrorAddendum(owner) {\n\t if (owner) {\n\t var name = owner.getName();\n\t if (name) {\n\t return ' Check the render method of `' + name + '`.';\n\t }\n\t }\n\t return '';\n\t}\n\t\n\tfunction getDisplayName(instance) {\n\t var element = instance._currentElement;\n\t if (element == null) {\n\t return '#empty';\n\t } else if (typeof element === 'string' || typeof element === 'number') {\n\t return '#text';\n\t } else if (typeof element.type === 'string') {\n\t return element.type;\n\t } else if (instance.getName) {\n\t return instance.getName() || 'Unknown';\n\t } else {\n\t return element.type.displayName || element.type.name || 'Unknown';\n\t }\n\t}\n\t\n\t/**\n\t * Check if the type reference is a known internal type. I.e. not a user\n\t * provided composite type.\n\t *\n\t * @param {function} type\n\t * @return {boolean} Returns true if this is a valid internal type.\n\t */\n\tfunction isInternalComponentType(type) {\n\t return typeof type === 'function' && typeof type.prototype !== 'undefined' && typeof type.prototype.mountComponent === 'function' && typeof type.prototype.receiveComponent === 'function';\n\t}\n\t\n\tvar nextDebugID = 1;\n\t\n\t/**\n\t * Given a ReactNode, create an instance that will actually be mounted.\n\t *\n\t * @param {ReactNode} node\n\t * @param {boolean} shouldHaveDebugID\n\t * @return {object} A new instance of the element's constructor.\n\t * @protected\n\t */\n\tfunction instantiateReactComponent(node, shouldHaveDebugID) {\n\t var instance;\n\t\n\t if (node === null || node === false) {\n\t instance = ReactEmptyComponent.create(instantiateReactComponent);\n\t } else if (typeof node === 'object') {\n\t var element = node;\n\t !(element && (typeof element.type === 'function' || typeof element.type === 'string')) ? false ? invariant(false, 'Element type is invalid: expected a string (for built-in components) or a class/function (for composite components) but got: %s.%s', element.type == null ? element.type : typeof element.type, getDeclarationErrorAddendum(element._owner)) : _prodInvariant('130', element.type == null ? element.type : typeof element.type, getDeclarationErrorAddendum(element._owner)) : void 0;\n\t\n\t // Special case string values\n\t if (typeof element.type === 'string') {\n\t instance = ReactHostComponent.createInternalComponent(element);\n\t } else if (isInternalComponentType(element.type)) {\n\t // This is temporarily available for custom components that are not string\n\t // representations. I.e. ART. Once those are updated to use the string\n\t // representation, we can drop this code path.\n\t instance = new element.type(element);\n\t\n\t // We renamed this. Allow the old name for compat. :(\n\t if (!instance.getHostNode) {\n\t instance.getHostNode = instance.getNativeNode;\n\t }\n\t } else {\n\t instance = new ReactCompositeComponentWrapper(element);\n\t }\n\t } else if (typeof node === 'string' || typeof node === 'number') {\n\t instance = ReactHostComponent.createInstanceForText(node);\n\t } else {\n\t true ? false ? invariant(false, 'Encountered invalid React node of type %s', typeof node) : _prodInvariant('131', typeof node) : void 0;\n\t }\n\t\n\t if (false) {\n\t process.env.NODE_ENV !== 'production' ? warning(typeof instance.mountComponent === 'function' && typeof instance.receiveComponent === 'function' && typeof instance.getHostNode === 'function' && typeof instance.unmountComponent === 'function', 'Only React Components can be mounted.') : void 0;\n\t }\n\t\n\t // These two fields are used by the DOM and ART diffing algorithms\n\t // respectively. Instead of using expandos on components, we should be\n\t // storing the state needed by the diffing algorithms elsewhere.\n\t instance._mountIndex = 0;\n\t instance._mountImage = null;\n\t\n\t if (false) {\n\t if (shouldHaveDebugID) {\n\t var debugID = nextDebugID++;\n\t instance._debugID = debugID;\n\t var displayName = getDisplayName(instance);\n\t ReactInstrumentation.debugTool.onSetDisplayName(debugID, displayName);\n\t var owner = node && node._owner;\n\t if (owner) {\n\t ReactInstrumentation.debugTool.onSetOwner(debugID, owner._debugID);\n\t }\n\t } else {\n\t instance._debugID = 0;\n\t }\n\t }\n\t\n\t // Internal instances should fully constructed at this point, so they should\n\t // not get any new fields added to them at this point.\n\t if (false) {\n\t if (Object.preventExtensions) {\n\t Object.preventExtensions(instance);\n\t }\n\t }\n\t\n\t return instance;\n\t}\n\t\n\tmodule.exports = instantiateReactComponent;\n\n/***/ },\n/* 322 */\n/***/ function(module, exports) {\n\n\t/**\n\t * Copyright 2013-present, Facebook, Inc.\n\t * All rights reserved.\n\t *\n\t * This source code is licensed under the BSD-style license found in the\n\t * LICENSE file in the root directory of this source tree. An additional grant\n\t * of patent rights can be found in the PATENTS file in the same directory.\n\t *\n\t * @providesModule isTextInputElement\n\t * \n\t */\n\t\n\t'use strict';\n\t\n\t/**\n\t * @see http://www.whatwg.org/specs/web-apps/current-work/multipage/the-input-element.html#input-type-attr-summary\n\t */\n\t\n\tvar supportedInputTypes = {\n\t 'color': true,\n\t 'date': true,\n\t 'datetime': true,\n\t 'datetime-local': true,\n\t 'email': true,\n\t 'month': true,\n\t 'number': true,\n\t 'password': true,\n\t 'range': true,\n\t 'search': true,\n\t 'tel': true,\n\t 'text': true,\n\t 'time': true,\n\t 'url': true,\n\t 'week': true\n\t};\n\t\n\tfunction isTextInputElement(elem) {\n\t var nodeName = elem && elem.nodeName && elem.nodeName.toLowerCase();\n\t\n\t if (nodeName === 'input') {\n\t return !!supportedInputTypes[elem.type];\n\t }\n\t\n\t if (nodeName === 'textarea') {\n\t return true;\n\t }\n\t\n\t return false;\n\t}\n\t\n\tmodule.exports = isTextInputElement;\n\n/***/ },\n/* 323 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/**\n\t * Copyright 2013-present, Facebook, Inc.\n\t * All rights reserved.\n\t *\n\t * This source code is licensed under the BSD-style license found in the\n\t * LICENSE file in the root directory of this source tree. An additional grant\n\t * of patent rights can be found in the PATENTS file in the same directory.\n\t *\n\t * @providesModule setTextContent\n\t */\n\t\n\t'use strict';\n\t\n\tvar ExecutionEnvironment = __webpack_require__(25);\n\tvar escapeTextContentForBrowser = __webpack_require__(139);\n\tvar setInnerHTML = __webpack_require__(140);\n\t\n\t/**\n\t * Set the textContent property of a node, ensuring that whitespace is preserved\n\t * even in IE8. innerText is a poor substitute for textContent and, among many\n\t * issues, inserts
instead of the literal newline chars. innerHTML behaves\n\t * as it should.\n\t *\n\t * @param {DOMElement} node\n\t * @param {string} text\n\t * @internal\n\t */\n\tvar setTextContent = function (node, text) {\n\t if (text) {\n\t var firstChild = node.firstChild;\n\t\n\t if (firstChild && firstChild === node.lastChild && firstChild.nodeType === 3) {\n\t firstChild.nodeValue = text;\n\t return;\n\t }\n\t }\n\t node.textContent = text;\n\t};\n\t\n\tif (ExecutionEnvironment.canUseDOM) {\n\t if (!('textContent' in document.documentElement)) {\n\t setTextContent = function (node, text) {\n\t setInnerHTML(node, escapeTextContentForBrowser(text));\n\t };\n\t }\n\t}\n\t\n\tmodule.exports = setTextContent;\n\n/***/ },\n/* 324 */\n/***/ function(module, exports) {\n\n\t\"use strict\";\n\t\n\texports.__esModule = true;\n\texports[\"default\"] = compose;\n\t/**\n\t * Composes single-argument functions from right to left. The rightmost\n\t * function can take multiple arguments as it provides the signature for\n\t * the resulting composite function.\n\t *\n\t * @param {...Function} funcs The functions to compose.\n\t * @returns {Function} A function obtained by composing the argument functions\n\t * from right to left. For example, compose(f, g, h) is identical to doing\n\t * (...args) => f(g(h(...args))).\n\t */\n\t\n\tfunction compose() {\n\t for (var _len = arguments.length, funcs = Array(_len), _key = 0; _key < _len; _key++) {\n\t funcs[_key] = arguments[_key];\n\t }\n\t\n\t if (funcs.length === 0) {\n\t return function (arg) {\n\t return arg;\n\t };\n\t } else {\n\t var _ret = function () {\n\t var last = funcs[funcs.length - 1];\n\t var rest = funcs.slice(0, -1);\n\t return {\n\t v: function v() {\n\t return rest.reduceRight(function (composed, f) {\n\t return f(composed);\n\t }, last.apply(undefined, arguments));\n\t }\n\t };\n\t }();\n\t\n\t if (typeof _ret === \"object\") return _ret.v;\n\t }\n\t}\n\n/***/ },\n/* 325 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\texports.__esModule = true;\n\texports.ActionTypes = undefined;\n\texports[\"default\"] = createStore;\n\t\n\tvar _isPlainObject = __webpack_require__(181);\n\t\n\tvar _isPlainObject2 = _interopRequireDefault(_isPlainObject);\n\t\n\tvar _symbolObservable = __webpack_require__(871);\n\t\n\tvar _symbolObservable2 = _interopRequireDefault(_symbolObservable);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\t\n\t/**\n\t * These are private action types reserved by Redux.\n\t * For any unknown actions, you must return the current state.\n\t * If the current state is undefined, you must return the initial state.\n\t * Do not reference these action types directly in your code.\n\t */\n\tvar ActionTypes = exports.ActionTypes = {\n\t INIT: '@@redux/INIT'\n\t};\n\t\n\t/**\n\t * Creates a Redux store that holds the state tree.\n\t * The only way to change the data in the store is to call `dispatch()` on it.\n\t *\n\t * There should only be a single store in your app. To specify how different\n\t * parts of the state tree respond to actions, you may combine several reducers\n\t * into a single reducer function by using `combineReducers`.\n\t *\n\t * @param {Function} reducer A function that returns the next state tree, given\n\t * the current state tree and the action to handle.\n\t *\n\t * @param {any} [initialState] The initial state. You may optionally specify it\n\t * to hydrate the state from the server in universal apps, or to restore a\n\t * previously serialized user session.\n\t * If you use `combineReducers` to produce the root reducer function, this must be\n\t * an object with the same shape as `combineReducers` keys.\n\t *\n\t * @param {Function} enhancer The store enhancer. You may optionally specify it\n\t * to enhance the store with third-party capabilities such as middleware,\n\t * time travel, persistence, etc. The only store enhancer that ships with Redux\n\t * is `applyMiddleware()`.\n\t *\n\t * @returns {Store} A Redux store that lets you read the state, dispatch actions\n\t * and subscribe to changes.\n\t */\n\tfunction createStore(reducer, initialState, enhancer) {\n\t var _ref2;\n\t\n\t if (typeof initialState === 'function' && typeof enhancer === 'undefined') {\n\t enhancer = initialState;\n\t initialState = undefined;\n\t }\n\t\n\t if (typeof enhancer !== 'undefined') {\n\t if (typeof enhancer !== 'function') {\n\t throw new Error('Expected the enhancer to be a function.');\n\t }\n\t\n\t return enhancer(createStore)(reducer, initialState);\n\t }\n\t\n\t if (typeof reducer !== 'function') {\n\t throw new Error('Expected the reducer to be a function.');\n\t }\n\t\n\t var currentReducer = reducer;\n\t var currentState = initialState;\n\t var currentListeners = [];\n\t var nextListeners = currentListeners;\n\t var isDispatching = false;\n\t\n\t function ensureCanMutateNextListeners() {\n\t if (nextListeners === currentListeners) {\n\t nextListeners = currentListeners.slice();\n\t }\n\t }\n\t\n\t /**\n\t * Reads the state tree managed by the store.\n\t *\n\t * @returns {any} The current state tree of your application.\n\t */\n\t function getState() {\n\t return currentState;\n\t }\n\t\n\t /**\n\t * Adds a change listener. It will be called any time an action is dispatched,\n\t * and some part of the state tree may potentially have changed. You may then\n\t * call `getState()` to read the current state tree inside the callback.\n\t *\n\t * You may call `dispatch()` from a change listener, with the following\n\t * caveats:\n\t *\n\t * 1. The subscriptions are snapshotted just before every `dispatch()` call.\n\t * If you subscribe or unsubscribe while the listeners are being invoked, this\n\t * will not have any effect on the `dispatch()` that is currently in progress.\n\t * However, the next `dispatch()` call, whether nested or not, will use a more\n\t * recent snapshot of the subscription list.\n\t *\n\t * 2. The listener should not expect to see all state changes, as the state\n\t * might have been updated multiple times during a nested `dispatch()` before\n\t * the listener is called. It is, however, guaranteed that all subscribers\n\t * registered before the `dispatch()` started will be called with the latest\n\t * state by the time it exits.\n\t *\n\t * @param {Function} listener A callback to be invoked on every dispatch.\n\t * @returns {Function} A function to remove this change listener.\n\t */\n\t function subscribe(listener) {\n\t if (typeof listener !== 'function') {\n\t throw new Error('Expected listener to be a function.');\n\t }\n\t\n\t var isSubscribed = true;\n\t\n\t ensureCanMutateNextListeners();\n\t nextListeners.push(listener);\n\t\n\t return function unsubscribe() {\n\t if (!isSubscribed) {\n\t return;\n\t }\n\t\n\t isSubscribed = false;\n\t\n\t ensureCanMutateNextListeners();\n\t var index = nextListeners.indexOf(listener);\n\t nextListeners.splice(index, 1);\n\t };\n\t }\n\t\n\t /**\n\t * Dispatches an action. It is the only way to trigger a state change.\n\t *\n\t * The `reducer` function, used to create the store, will be called with the\n\t * current state tree and the given `action`. Its return value will\n\t * be considered the **next** state of the tree, and the change listeners\n\t * will be notified.\n\t *\n\t * The base implementation only supports plain object actions. If you want to\n\t * dispatch a Promise, an Observable, a thunk, or something else, you need to\n\t * wrap your store creating function into the corresponding middleware. For\n\t * example, see the documentation for the `redux-thunk` package. Even the\n\t * middleware will eventually dispatch plain object actions using this method.\n\t *\n\t * @param {Object} action A plain object representing “what changed”. It is\n\t * a good idea to keep actions serializable so you can record and replay user\n\t * sessions, or use the time travelling `redux-devtools`. An action must have\n\t * a `type` property which may not be `undefined`. It is a good idea to use\n\t * string constants for action types.\n\t *\n\t * @returns {Object} For convenience, the same action object you dispatched.\n\t *\n\t * Note that, if you use a custom middleware, it may wrap `dispatch()` to\n\t * return something else (for example, a Promise you can await).\n\t */\n\t function dispatch(action) {\n\t if (!(0, _isPlainObject2[\"default\"])(action)) {\n\t throw new Error('Actions must be plain objects. ' + 'Use custom middleware for async actions.');\n\t }\n\t\n\t if (typeof action.type === 'undefined') {\n\t throw new Error('Actions may not have an undefined \"type\" property. ' + 'Have you misspelled a constant?');\n\t }\n\t\n\t if (isDispatching) {\n\t throw new Error('Reducers may not dispatch actions.');\n\t }\n\t\n\t try {\n\t isDispatching = true;\n\t currentState = currentReducer(currentState, action);\n\t } finally {\n\t isDispatching = false;\n\t }\n\t\n\t var listeners = currentListeners = nextListeners;\n\t for (var i = 0; i < listeners.length; i++) {\n\t listeners[i]();\n\t }\n\t\n\t return action;\n\t }\n\t\n\t /**\n\t * Replaces the reducer currently used by the store to calculate the state.\n\t *\n\t * You might need this if your app implements code splitting and you want to\n\t * load some of the reducers dynamically. You might also need this if you\n\t * implement a hot reloading mechanism for Redux.\n\t *\n\t * @param {Function} nextReducer The reducer for the store to use instead.\n\t * @returns {void}\n\t */\n\t function replaceReducer(nextReducer) {\n\t if (typeof nextReducer !== 'function') {\n\t throw new Error('Expected the nextReducer to be a function.');\n\t }\n\t\n\t currentReducer = nextReducer;\n\t dispatch({ type: ActionTypes.INIT });\n\t }\n\t\n\t /**\n\t * Interoperability point for observable/reactive libraries.\n\t * @returns {observable} A minimal observable of state changes.\n\t * For more information, see the observable proposal:\n\t * https://github.com/zenparsing/es-observable\n\t */\n\t function observable() {\n\t var _ref;\n\t\n\t var outerSubscribe = subscribe;\n\t return _ref = {\n\t /**\n\t * The minimal observable subscription method.\n\t * @param {Object} observer Any object that can be used as an observer.\n\t * The observer object should have a `next` method.\n\t * @returns {subscription} An object with an `unsubscribe` method that can\n\t * be used to unsubscribe the observable from the store, and prevent further\n\t * emission of values from the observable.\n\t */\n\t\n\t subscribe: function subscribe(observer) {\n\t if (typeof observer !== 'object') {\n\t throw new TypeError('Expected the observer to be an object.');\n\t }\n\t\n\t function observeState() {\n\t if (observer.next) {\n\t observer.next(getState());\n\t }\n\t }\n\t\n\t observeState();\n\t var unsubscribe = outerSubscribe(observeState);\n\t return { unsubscribe: unsubscribe };\n\t }\n\t }, _ref[_symbolObservable2[\"default\"]] = function () {\n\t return this;\n\t }, _ref;\n\t }\n\t\n\t // When a store is created, an \"INIT\" action is dispatched so that every\n\t // reducer returns their initial state. This effectively populates\n\t // the initial state tree.\n\t dispatch({ type: ActionTypes.INIT });\n\t\n\t return _ref2 = {\n\t dispatch: dispatch,\n\t subscribe: subscribe,\n\t getState: getState,\n\t replaceReducer: replaceReducer\n\t }, _ref2[_symbolObservable2[\"default\"]] = observable, _ref2;\n\t}\n\n/***/ },\n/* 326 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\texports.__esModule = true;\n\texports[\"default\"] = warning;\n\t/**\n\t * Prints a warning in the console if it exists.\n\t *\n\t * @param {String} message The warning message.\n\t * @returns {void}\n\t */\n\tfunction warning(message) {\n\t /* eslint-disable no-console */\n\t if (typeof console !== 'undefined' && typeof console.error === 'function') {\n\t console.error(message);\n\t }\n\t /* eslint-enable no-console */\n\t try {\n\t // This error was thrown as a convenience so that if you enable\n\t // \"break on all exceptions\" in your console,\n\t // it would pause the execution at this line.\n\t throw new Error(message);\n\t /* eslint-disable no-empty */\n\t } catch (e) {}\n\t /* eslint-enable no-empty */\n\t}\n\n/***/ },\n/* 327 */,\n/* 328 */,\n/* 329 */,\n/* 330 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\"use strict\";\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.DEFAULT_LIMIT = undefined;\n\t\n\texports.default = function (action, requestType, successType, failureType) {\n\t /** Get the name of the item associated with action */\n\t var itemName = action.rstrip(\"s\");\n\t\n\t /**\n\t * Normalizr helper to normalize API response.\n\t *\n\t * @param jsonData The JS object returned by the API.\n\t * @return A normalized object.\n\t */\n\t var _normalizeAPIResponse = function _normalizeAPIResponse(jsonData) {\n\t return (0, _normalizr.normalize)(jsonData, {\n\t artist: (0, _normalizr.arrayOf)(_api2.artist),\n\t album: (0, _normalizr.arrayOf)(_api2.album),\n\t song: (0, _normalizr.arrayOf)(_api2.song)\n\t }, {\n\t // Use custom assignEntity function to delete useless fields\n\t assignEntity: function assignEntity(output, key, value) {\n\t if (key == \"sessionExpire\") {\n\t delete output.sessionExpire;\n\t } else {\n\t output[key] = value;\n\t }\n\t }\n\t });\n\t };\n\t\n\t /**\n\t * Callback on successful fetch of paginated items\n\t *\n\t * @param jsonData JS object returned from the API.\n\t * @param pageNumber Number of the page that was fetched.\n\t */\n\t var fetchPaginatedItemsSuccess = function fetchPaginatedItemsSuccess(jsonData, pageNumber, limit) {\n\t var totalCount = jsonData.totalCount;\n\t jsonData = _normalizeAPIResponse(jsonData);\n\t\n\t // Compute the total number of pages\n\t var nPages = Math.ceil(totalCount / limit);\n\t\n\t // Return success actions\n\t return [\n\t // Action for the global entities store\n\t (0, _entities.pushEntities)(jsonData.entities, [itemName]),\n\t // Action for the paginated store\n\t {\n\t type: successType,\n\t payload: {\n\t type: itemName,\n\t result: jsonData.result[itemName],\n\t nPages: nPages,\n\t currentPage: pageNumber\n\t }\n\t }];\n\t };\n\t\n\t /**\n\t * Callback on successful fetch of single item\n\t *\n\t * @param jsonData JS object returned from the API.\n\t * @param pageNumber Number of the page that was fetched.\n\t */\n\t var fetchItemSuccess = function fetchItemSuccess(jsonData) {\n\t jsonData = _normalizeAPIResponse(jsonData);\n\t\n\t return (0, _entities.pushEntities)(jsonData.entities, [itemName]);\n\t };\n\t\n\t /** Callback on request */\n\t var fetchItemsRequest = function fetchItemsRequest() {\n\t // Return a request type action\n\t return {\n\t type: requestType,\n\t payload: {}\n\t };\n\t };\n\t\n\t /**\n\t * Callback on failed fetch\n\t *\n\t * @param error An error object, either a string or an i18nError\n\t * object.\n\t */\n\t var fetchItemsFailure = function fetchItemsFailure(error) {\n\t // Return a failure type action\n\t return {\n\t type: failureType,\n\t payload: {\n\t error: error\n\t }\n\t };\n\t };\n\t\n\t /**\n\t * Method to trigger a fetch of items.\n\t *\n\t * @param endpoint Ampache server base URL.\n\t * @param username Username to use for API request.\n\t * @param filter An eventual filter to apply (mapped to API filter\n\t * param)\n\t * @param pageNumber Number of the page to fetch items from.\n\t * @param limit Max number of items to fetch.\n\t * @param include [Optional] A list of includes to return as well\n\t * (mapped to API include param)\n\t *\n\t * @return A CALL_API action to fetch the specified items.\n\t */\n\t var fetchItems = function fetchItems(endpoint, username, passphrase, filter, pageNumber, limit) {\n\t var include = arguments.length <= 6 || arguments[6] === undefined ? [] : arguments[6];\n\t\n\t // Compute offset in number of items from the page number\n\t var offset = (pageNumber - 1) * DEFAULT_LIMIT;\n\t // Set extra params for pagination\n\t var extraParams = {\n\t offset: offset,\n\t limit: limit\n\t };\n\t\n\t // Handle filter\n\t if (filter) {\n\t extraParams.filter = filter;\n\t }\n\t\n\t // Handle includes\n\t if (include && include.length > 0) {\n\t extraParams.include = include;\n\t }\n\t\n\t // Return a CALL_API action\n\t return {\n\t type: _api.CALL_API,\n\t payload: {\n\t endpoint: endpoint,\n\t dispatch: [fetchItemsRequest, null, fetchItemsFailure],\n\t action: action,\n\t auth: passphrase,\n\t username: username,\n\t extraParams: extraParams\n\t }\n\t };\n\t };\n\t\n\t /**\n\t * High level method to load paginated items from the API wihtout dealing about credentials.\n\t *\n\t * @param pageNumber [Optional] Number of the page to fetch items from.\n\t * @param filter [Optional] An eventual filter to apply (mapped to\n\t * API filter param)\n\t * @param include [Optional] A list of includes to return as well\n\t * (mapped to API include param)\n\t *\n\t * Dispatches the CALL_API action to fetch these items.\n\t */\n\t var loadPaginatedItems = function loadPaginatedItems() {\n\t var _ref = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];\n\t\n\t var _ref$pageNumber = _ref.pageNumber;\n\t var pageNumber = _ref$pageNumber === undefined ? 1 : _ref$pageNumber;\n\t var _ref$limit = _ref.limit;\n\t var limit = _ref$limit === undefined ? DEFAULT_LIMIT : _ref$limit;\n\t var _ref$filter = _ref.filter;\n\t var filter = _ref$filter === undefined ? null : _ref$filter;\n\t var _ref$include = _ref.include;\n\t var include = _ref$include === undefined ? [] : _ref$include;\n\t\n\t return function (dispatch, getState) {\n\t // Get credentials from the state\n\t var _getState = getState();\n\t\n\t var auth = _getState.auth;\n\t // Get the fetch action to dispatch\n\t\n\t var fetchAction = fetchItems(auth.endpoint, auth.username, auth.token.token, filter, pageNumber, limit, include);\n\t // Set success callback\n\t fetchAction.payload.dispatch[1] = function (jsonData) {\n\t return function (dispatch) {\n\t // Dispatch all the necessary actions\n\t var actions = fetchPaginatedItemsSuccess(jsonData, pageNumber, limit);\n\t actions.map(function (action) {\n\t return dispatch(action);\n\t });\n\t };\n\t };\n\t // Dispatch action\n\t dispatch(fetchAction);\n\t };\n\t };\n\t\n\t /**\n\t * High level method to load a single item from the API wihtout dealing about credentials.\n\t *\n\t * @param filter The filter to apply (mapped to API filter param)\n\t * @param include [Optional] A list of includes to return as well\n\t * (mapped to API include param)\n\t *\n\t * Dispatches the CALL_API action to fetch this item.\n\t */\n\t var loadItem = function loadItem() {\n\t var _ref2 = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];\n\t\n\t var _ref2$filter = _ref2.filter;\n\t var filter = _ref2$filter === undefined ? null : _ref2$filter;\n\t var _ref2$include = _ref2.include;\n\t var include = _ref2$include === undefined ? [] : _ref2$include;\n\t\n\t return function (dispatch, getState) {\n\t // Get credentials from the state\n\t var _getState2 = getState();\n\t\n\t var auth = _getState2.auth;\n\t // Get the action to dispatch\n\t\n\t var fetchAction = fetchItems(auth.endpoint, auth.username, auth.token.token, filter, 1, DEFAULT_LIMIT, include);\n\t // Set success callback\n\t fetchAction.payload.dispatch[1] = function (jsonData) {\n\t return function (dispatch) {\n\t dispatch(fetchItemSuccess(jsonData));\n\t };\n\t };\n\t // Dispatch action\n\t dispatch(fetchAction);\n\t };\n\t };\n\t\n\t // Remap the above methods to methods including item name\n\t var returned = {};\n\t var camelizedAction = _humps2.default.pascalize(action);\n\t returned[\"loadPaginated\" + camelizedAction] = loadPaginatedItems;\n\t returned[\"load\" + camelizedAction.rstrip(\"s\")] = loadItem;\n\t return returned;\n\t};\n\t\n\tvar _normalizr = __webpack_require__(283);\n\t\n\tvar _humps = __webpack_require__(255);\n\t\n\tvar _humps2 = _interopRequireDefault(_humps);\n\t\n\tvar _api = __webpack_require__(141);\n\t\n\tvar _entities = __webpack_require__(103);\n\t\n\tvar _api2 = __webpack_require__(362);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\t// Constants\n\tvar DEFAULT_LIMIT = exports.DEFAULT_LIMIT = 32; /** Default max number of elements to retrieve. */\n\t\n\t/**\n\t * This function wraps around an API action to generate actions trigger\n\t * functions to load items etc.\n\t *\n\t * @param action API action.\n\t * @param requestType Action type to trigger on request.\n\t * @param successType Action type to trigger on success.\n\t * @param failureType Action type to trigger on failure.\n\t */\n\t\n\t\n\t// Models\n\t\n\t\n\t// Other actions\n\t/**\n\t * This file implements actions to fetch and load data from the API.\n\t */\n\t\n\t// NPM imports\n\n/***/ },\n/* 331 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\"use strict\";\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.CLEAR_PAGINATED_RESULTS = undefined;\n\texports.clearPaginatedResults = clearPaginatedResults;\n\t\n\tvar _entities = __webpack_require__(103);\n\t\n\t/** Define an action to invalidate results in paginated store. */\n\tvar CLEAR_PAGINATED_RESULTS = exports.CLEAR_PAGINATED_RESULTS = \"CLEAR_PAGINATED_RESULTS\"; /**\n\t * These actions are actions acting directly on the paginated views store.\n\t */\n\t\n\t// Other actions\n\tfunction clearPaginatedResults() {\n\t return function (dispatch, getState) {\n\t // Decrement reference counter\n\t var paginatedStore = getState().paginated;\n\t var entities = {};\n\t entities[paginatedStore.get(\"type\")] = paginatedStore.get(\"result\").toJS();\n\t dispatch((0, _entities.decrementRefCount)(entities));\n\t\n\t // Clear results in store\n\t dispatch({\n\t type: CLEAR_PAGINATED_RESULTS\n\t });\n\t };\n\t}\n\n/***/ },\n/* 332 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\"use strict\";\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.goToPage = goToPage;\n\t\n\tvar _reactRouterRedux = __webpack_require__(97);\n\t\n\t/** Define an action to go to a specific page. */\n\tfunction goToPage(pageLocation) {\n\t return function (dispatch) {\n\t // Just push the new page location in react-router.\n\t dispatch((0, _reactRouterRedux.push)(pageLocation));\n\t };\n\t} /**\n\t * This file defines pagination related actions.\n\t */\n\t\n\t// NPM imports\n\n/***/ },\n/* 333 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\"use strict\";\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _hacks = __webpack_require__(604);\n\t\n\tObject.keys(_hacks).forEach(function (key) {\n\t if (key === \"default\" || key === \"__esModule\") return;\n\t Object.defineProperty(exports, key, {\n\t enumerable: true,\n\t get: function get() {\n\t return _hacks[key];\n\t }\n\t });\n\t});\n\t\n\tvar _common = __webpack_require__(603);\n\t\n\tObject.keys(_common).forEach(function (key) {\n\t if (key === \"default\" || key === \"__esModule\") return;\n\t Object.defineProperty(exports, key, {\n\t enumerable: true,\n\t get: function get() {\n\t return _common[key];\n\t }\n\t });\n\t});\n\n/***/ },\n/* 334 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\"use strict\";\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _jquery = __webpack_require__(335);\n\t\n\tObject.keys(_jquery).forEach(function (key) {\n\t if (key === \"default\" || key === \"__esModule\") return;\n\t Object.defineProperty(exports, key, {\n\t enumerable: true,\n\t get: function get() {\n\t return _jquery[key];\n\t }\n\t });\n\t});\n\t\n\tvar _string = __webpack_require__(336);\n\t\n\tObject.keys(_string).forEach(function (key) {\n\t if (key === \"default\" || key === \"__esModule\") return;\n\t Object.defineProperty(exports, key, {\n\t enumerable: true,\n\t get: function get() {\n\t return _string[key];\n\t }\n\t });\n\t});\n\n/***/ },\n/* 335 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/* WEBPACK VAR INJECTION */(function($) {\"use strict\";\n\t\n\t/**\n\t * jQuery prototype extensions.\n\t */\n\t\n\t/**\n\t * Shake animation.\n\t *\n\t * @param intShakes Number of times to shake.\n\t * @param intDistance Distance to move the object.\n\t * @param intDuration Duration of the animation.\n\t *\n\t * @return The element it was applied one, for chaining.\n\t */\n\t$.fn.shake = function (intShakes, intDistance, intDuration) {\n\t this.each(function () {\n\t $(this).css(\"position\", \"relative\");\n\t for (var x = 1; x <= intShakes; x++) {\n\t $(this).animate({ left: intDistance * -1 }, intDuration / intShakes / 4).animate({ left: intDistance }, intDuration / intShakes / 2).animate({ left: 0 }, intDuration / intShakes / 4);\n\t }\n\t });\n\t return this;\n\t};\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(16)))\n\n/***/ },\n/* 336 */\n/***/ function(module, exports) {\n\n\t\"use strict\";\n\t\n\t/**\n\t * String prototype extension.\n\t */\n\t\n\t/**\n\t * Capitalize a string.\n\t *\n\t * @return Capitalized string.\n\t */\n\tString.prototype.capitalize = function () {\n\t return this.charAt(0).toUpperCase() + this.slice(1);\n\t};\n\t\n\t/**\n\t * Strip characters at the end of a string.\n\t *\n\t * @param chars A regex-like element to strip from the end.\n\t * @return Stripped string.\n\t */\n\tString.prototype.rstrip = function (chars) {\n\t var regex = new RegExp(chars + \"$\");\n\t return this.replace(regex, \"\");\n\t};\n\n/***/ },\n/* 337 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/* WEBPACK VAR INJECTION */(function($) {\"use strict\";\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.AlbumRow = exports.AlbumTracksTable = exports.AlbumTrackRow = undefined;\n\t\n\tvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\t\n\tvar _react = __webpack_require__(2);\n\t\n\tvar _react2 = _interopRequireDefault(_react);\n\t\n\tvar _reactCssModules = __webpack_require__(46);\n\t\n\tvar _reactCssModules2 = _interopRequireDefault(_reactCssModules);\n\t\n\tvar _reactIntl = __webpack_require__(18);\n\t\n\tvar _reactFontawesome = __webpack_require__(78);\n\t\n\tvar _reactFontawesome2 = _interopRequireDefault(_reactFontawesome);\n\t\n\tvar _immutable = __webpack_require__(15);\n\t\n\tvar _immutable2 = _interopRequireDefault(_immutable);\n\t\n\tvar _utils = __webpack_require__(12);\n\t\n\tvar _common = __webpack_require__(50);\n\t\n\tvar _common2 = _interopRequireDefault(_common);\n\t\n\tvar _Album = __webpack_require__(605);\n\t\n\tvar _Album2 = _interopRequireDefault(_Album);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\t\n\tfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\t\n\tfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // NPM import\n\t\n\t\n\t// Local imports\n\t\n\t\n\t// Translations\n\t\n\t\n\t// Styles\n\t\n\t\n\t// Set translations\n\tvar albumMessages = (0, _reactIntl.defineMessages)((0, _utils.messagesMap)(Array.concat([], _common2.default)));\n\t\n\t/**\n\t * Track row in an album tracks table.\n\t */\n\t\n\tvar AlbumTrackRowCSSIntl = function (_Component) {\n\t _inherits(AlbumTrackRowCSSIntl, _Component);\n\t\n\t function AlbumTrackRowCSSIntl(props) {\n\t _classCallCheck(this, AlbumTrackRowCSSIntl);\n\t\n\t // Bind this\n\t var _this = _possibleConstructorReturn(this, Object.getPrototypeOf(AlbumTrackRowCSSIntl).call(this, props));\n\t\n\t _this.onPlayClick = _this.onPlayClick.bind(_this);\n\t _this.onPlayNextClick = _this.onPlayNextClick.bind(_this);\n\t return _this;\n\t }\n\t\n\t /**\n\t * Handle click on play button.\n\t */\n\t\n\t\n\t _createClass(AlbumTrackRowCSSIntl, [{\n\t key: \"onPlayClick\",\n\t value: function onPlayClick() {\n\t $(this.refs.play).blur();\n\t this.props.playAction(this.props.track.get(\"id\"));\n\t }\n\t\n\t /**\n\t * Handle click on play next button.\n\t */\n\t\n\t }, {\n\t key: \"onPlayNextClick\",\n\t value: function onPlayNextClick() {\n\t $(this.refs.playNext).blur();\n\t this.props.playNextAction(this.props.track.get(\"id\"));\n\t }\n\t }, {\n\t key: \"render\",\n\t value: function render() {\n\t var formatMessage = this.props.intl.formatMessage;\n\t\n\t var length = (0, _utils.formatLength)(this.props.track.get(\"time\"));\n\t return _react2.default.createElement(\n\t \"tr\",\n\t null,\n\t _react2.default.createElement(\n\t \"td\",\n\t null,\n\t _react2.default.createElement(\n\t \"button\",\n\t { styleName: \"play\", title: formatMessage(albumMessages[\"app.common.play\"]), onClick: this.onPlayClick },\n\t _react2.default.createElement(\n\t \"span\",\n\t { className: \"sr-only\" },\n\t _react2.default.createElement(_reactIntl.FormattedMessage, albumMessages[\"app.common.play\"])\n\t ),\n\t _react2.default.createElement(_reactFontawesome2.default, { name: \"play-circle-o\", \"aria-hidden\": \"true\" })\n\t ),\n\t \" \",\n\t _react2.default.createElement(\n\t \"button\",\n\t { styleName: \"playNext\", title: formatMessage(albumMessages[\"app.common.playNext\"]), onClick: this.onPlayNextClick, ref: \"playNext\" },\n\t _react2.default.createElement(\n\t \"span\",\n\t { className: \"sr-only\" },\n\t _react2.default.createElement(_reactIntl.FormattedMessage, albumMessages[\"app.common.playNext\"])\n\t ),\n\t _react2.default.createElement(_reactFontawesome2.default, { name: \"plus-circle\", \"aria-hidden\": \"true\" })\n\t )\n\t ),\n\t _react2.default.createElement(\n\t \"td\",\n\t null,\n\t this.props.track.get(\"track\")\n\t ),\n\t _react2.default.createElement(\n\t \"td\",\n\t null,\n\t this.props.track.get(\"name\")\n\t ),\n\t _react2.default.createElement(\n\t \"td\",\n\t null,\n\t length\n\t )\n\t );\n\t }\n\t }]);\n\t\n\t return AlbumTrackRowCSSIntl;\n\t}(_react.Component);\n\t\n\tAlbumTrackRowCSSIntl.propTypes = {\n\t playAction: _react.PropTypes.func.isRequired,\n\t playNextAction: _react.PropTypes.func.isRequired,\n\t track: _react.PropTypes.instanceOf(_immutable2.default.Map).isRequired,\n\t intl: _reactIntl.intlShape.isRequired\n\t};\n\tvar AlbumTrackRow = exports.AlbumTrackRow = (0, _reactIntl.injectIntl)((0, _reactCssModules2.default)(AlbumTrackRowCSSIntl, _Album2.default));\n\t\n\t/**\n\t * Tracks table of an album.\n\t */\n\t\n\tvar AlbumTracksTableCSS = function (_Component2) {\n\t _inherits(AlbumTracksTableCSS, _Component2);\n\t\n\t function AlbumTracksTableCSS() {\n\t _classCallCheck(this, AlbumTracksTableCSS);\n\t\n\t return _possibleConstructorReturn(this, Object.getPrototypeOf(AlbumTracksTableCSS).apply(this, arguments));\n\t }\n\t\n\t _createClass(AlbumTracksTableCSS, [{\n\t key: \"render\",\n\t value: function render() {\n\t var rows = [];\n\t // Build rows for each track\n\t var _props = this.props;\n\t var playAction = _props.playAction;\n\t var playNextAction = _props.playNextAction;\n\t\n\t this.props.tracks.forEach(function (item) {\n\t rows.push(_react2.default.createElement(AlbumTrackRow, { playAction: playAction, playNextAction: playNextAction, track: item, key: item.get(\"id\") }));\n\t });\n\t return _react2.default.createElement(\n\t \"table\",\n\t { className: \"table table-hover\", styleName: \"songs\" },\n\t _react2.default.createElement(\n\t \"tbody\",\n\t null,\n\t rows\n\t )\n\t );\n\t }\n\t }]);\n\t\n\t return AlbumTracksTableCSS;\n\t}(_react.Component);\n\t\n\tAlbumTracksTableCSS.propTypes = {\n\t playAction: _react.PropTypes.func.isRequired,\n\t playNextAction: _react.PropTypes.func.isRequired,\n\t tracks: _react.PropTypes.instanceOf(_immutable2.default.List).isRequired\n\t};\n\tvar AlbumTracksTable = exports.AlbumTracksTable = (0, _reactCssModules2.default)(AlbumTracksTableCSS, _Album2.default);\n\t\n\t/**\n\t * An entire album row containing art and tracks table.\n\t */\n\t\n\tvar AlbumRowCSS = function (_Component3) {\n\t _inherits(AlbumRowCSS, _Component3);\n\t\n\t function AlbumRowCSS() {\n\t _classCallCheck(this, AlbumRowCSS);\n\t\n\t return _possibleConstructorReturn(this, Object.getPrototypeOf(AlbumRowCSS).apply(this, arguments));\n\t }\n\t\n\t _createClass(AlbumRowCSS, [{\n\t key: \"render\",\n\t value: function render() {\n\t return _react2.default.createElement(\n\t \"div\",\n\t { className: \"row\", styleName: \"row\" },\n\t _react2.default.createElement(\n\t \"div\",\n\t { className: \"col-xs-9 col-sm-offset-2 col-sm-10\", styleName: \"nameRow\" },\n\t _react2.default.createElement(\n\t \"h2\",\n\t null,\n\t this.props.album.get(\"name\")\n\t )\n\t ),\n\t _react2.default.createElement(\n\t \"div\",\n\t { className: \"col-xs-3 col-sm-2\", styleName: \"artRow\" },\n\t _react2.default.createElement(\n\t \"p\",\n\t { className: \"text-center\" },\n\t _react2.default.createElement(\"img\", { src: this.props.album.get(\"art\"), width: \"200\", height: \"200\", className: \"img-responsive img-circle\", styleName: \"art\", alt: this.props.album.get(\"name\") })\n\t )\n\t ),\n\t _react2.default.createElement(\n\t \"div\",\n\t { className: \"col-xs-9 col-sm-10 table-responsive\" },\n\t this.props.songs.size > 0 ? _react2.default.createElement(AlbumTracksTable, { playAction: this.props.playAction, playNextAction: this.props.playNextAction, tracks: this.props.songs }) : null\n\t )\n\t );\n\t }\n\t }]);\n\t\n\t return AlbumRowCSS;\n\t}(_react.Component);\n\t\n\tAlbumRowCSS.propTypes = {\n\t playAction: _react.PropTypes.func.isRequired,\n\t playNextAction: _react.PropTypes.func.isRequired,\n\t album: _react.PropTypes.instanceOf(_immutable2.default.Map).isRequired,\n\t songs: _react.PropTypes.instanceOf(_immutable2.default.List).isRequired\n\t};\n\tvar AlbumRow = exports.AlbumRow = (0, _reactCssModules2.default)(AlbumRowCSS, _Album2.default);\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(16)))\n\n/***/ },\n/* 338 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\"use strict\";\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\t\n\tvar _react = __webpack_require__(2);\n\t\n\tvar _react2 = _interopRequireDefault(_react);\n\t\n\tvar _immutable = __webpack_require__(15);\n\t\n\tvar _immutable2 = _interopRequireDefault(_immutable);\n\t\n\tvar _Grid = __webpack_require__(214);\n\t\n\tvar _Grid2 = _interopRequireDefault(_Grid);\n\t\n\tvar _DismissibleAlert = __webpack_require__(104);\n\t\n\tvar _DismissibleAlert2 = _interopRequireDefault(_DismissibleAlert);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\t\n\tfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\t\n\tfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // NPM imports\n\t\n\t\n\t// Local imports\n\t\n\t\n\t/**\n\t * Paginated albums grid\n\t */\n\tvar Albums = function (_Component) {\n\t _inherits(Albums, _Component);\n\t\n\t function Albums() {\n\t _classCallCheck(this, Albums);\n\t\n\t return _possibleConstructorReturn(this, Object.getPrototypeOf(Albums).apply(this, arguments));\n\t }\n\t\n\t _createClass(Albums, [{\n\t key: \"render\",\n\t value: function render() {\n\t // Handle error\n\t var error = null;\n\t if (this.props.error) {\n\t error = _react2.default.createElement(_DismissibleAlert2.default, { type: \"danger\", text: this.props.error });\n\t }\n\t\n\t // Set grid props\n\t var artists = this.props.artists;\n\t var grid = {\n\t isFetching: this.props.isFetching,\n\t items: this.props.albums,\n\t itemsType: \"album\",\n\t itemsLabel: \"app.common.album\",\n\t subItemsType: \"tracks\",\n\t subItemsLabel: \"app.common.track\",\n\t buildLinkTo: function buildLinkTo(itemType, item) {\n\t var artist = encodeURIComponent(item.get(\"artist\"));\n\t if (artists && artists.size > 0) {\n\t var id = item.get(\"artist\");\n\t artist = encodeURIComponent(id + \"-\" + artists.getIn([id, \"name\"]));\n\t }\n\t return \"/artist/\" + artist + \"/album/\" + item.get(\"id\") + \"-\" + encodeURIComponent(item.get(\"name\"));\n\t }\n\t };\n\t\n\t return _react2.default.createElement(\n\t \"div\",\n\t null,\n\t error,\n\t _react2.default.createElement(_Grid2.default, { grid: grid, pagination: this.props.pagination })\n\t );\n\t }\n\t }]);\n\t\n\t return Albums;\n\t}(_react.Component);\n\t\n\texports.default = Albums;\n\t\n\tAlbums.propTypes = {\n\t error: _react.PropTypes.string,\n\t isFetching: _react.PropTypes.bool.isRequired,\n\t albums: _react.PropTypes.instanceOf(_immutable2.default.List).isRequired,\n\t artists: _react.PropTypes.instanceOf(_immutable2.default.Map),\n\t pagination: _react.PropTypes.object.isRequired\n\t};\n\n/***/ },\n/* 339 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/* WEBPACK VAR INJECTION */(function($) {\"use strict\";\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\t\n\tvar _react = __webpack_require__(2);\n\t\n\tvar _react2 = _interopRequireDefault(_react);\n\t\n\tvar _reactDom = __webpack_require__(285);\n\t\n\tvar _reactDom2 = _interopRequireDefault(_reactDom);\n\t\n\tvar _reactCssModules = __webpack_require__(46);\n\t\n\tvar _reactCssModules2 = _interopRequireDefault(_reactCssModules);\n\t\n\tvar _reactIntl = __webpack_require__(18);\n\t\n\tvar _reactFontawesome = __webpack_require__(78);\n\t\n\tvar _reactFontawesome2 = _interopRequireDefault(_reactFontawesome);\n\t\n\tvar _immutable = __webpack_require__(15);\n\t\n\tvar _immutable2 = _interopRequireDefault(_immutable);\n\t\n\tvar _utils = __webpack_require__(12);\n\t\n\tvar _Album = __webpack_require__(337);\n\t\n\tvar _DismissibleAlert = __webpack_require__(104);\n\t\n\tvar _DismissibleAlert2 = _interopRequireDefault(_DismissibleAlert);\n\t\n\tvar _common = __webpack_require__(50);\n\t\n\tvar _common2 = _interopRequireDefault(_common);\n\t\n\tvar _Artist = __webpack_require__(606);\n\t\n\tvar _Artist2 = _interopRequireDefault(_Artist);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\t\n\tfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\t\n\tfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // NPM imports\n\t\n\t\n\t// Local imports\n\t\n\t\n\t// Other components\n\t\n\t\n\t// Translations\n\t\n\t\n\t// Styles\n\t\n\t\n\t// Define translations\n\tvar artistMessages = (0, _reactIntl.defineMessages)((0, _utils.messagesMap)(Array.concat([], _common2.default)));\n\t\n\t/**\n\t * Single artist page\n\t */\n\t\n\tvar ArtistCSS = function (_Component) {\n\t _inherits(ArtistCSS, _Component);\n\t\n\t function ArtistCSS(props) {\n\t _classCallCheck(this, ArtistCSS);\n\t\n\t // Set state\n\t var _this = _possibleConstructorReturn(this, Object.getPrototypeOf(ArtistCSS).call(this, props));\n\t\n\t _this.state = {\n\t hasScrolled: false };\n\t return _this;\n\t }\n\t\n\t _createClass(ArtistCSS, [{\n\t key: \"componentDidUpdate\",\n\t value: function componentDidUpdate() {\n\t // After each update, check if we need to scroll to a given element\n\t // State prevents scrolling at each and every update\n\t if (this.refs.scroll && !this.state.hasScrolled) {\n\t $(\"html, body\").animate({ scrollTop: $(_reactDom2.default.findDOMNode(this.refs.scroll)).offset().top }, 600);\n\t this.setState({\n\t hasScrolled: true\n\t });\n\t }\n\t }\n\t }, {\n\t key: \"render\",\n\t value: function render() {\n\t // Define loading message\n\t var loading = null;\n\t if (this.props.isFetching) {\n\t loading = _react2.default.createElement(\n\t \"div\",\n\t { className: \"row text-center\" },\n\t _react2.default.createElement(\n\t \"p\",\n\t null,\n\t _react2.default.createElement(_reactFontawesome2.default, { name: \"spinner\", className: \"fa-pulse fa-3x fa-fw\", \"aria-hidden\": \"true\" }),\n\t _react2.default.createElement(\n\t \"span\",\n\t { className: \"sr-only\" },\n\t _react2.default.createElement(_reactIntl.FormattedMessage, artistMessages[\"app.common.loading\"])\n\t )\n\t )\n\t );\n\t }\n\t\n\t // Handle error\n\t var error = null;\n\t if (this.props.error) {\n\t error = _react2.default.createElement(_DismissibleAlert2.default, { type: \"danger\", text: this.props.error });\n\t }\n\t\n\t // Build album rows\n\t var albumsRows = [];\n\t var _props = this.props;\n\t var albums = _props.albums;\n\t var songs = _props.songs;\n\t var playAction = _props.playAction;\n\t var playNextAction = _props.playNextAction;\n\t var scrollToAlbum = _props.scrollToAlbum;\n\t\n\t if (albums && songs) {\n\t albums.forEach(function (album) {\n\t // Get songs of this album\n\t var albumSongs = album.get(\"tracks\").map(function (id) {\n\t return songs.get(id);\n\t });\n\t // Handle scrolling to a specific album by applying a given ref\n\t var ref = scrollToAlbum == album.get(\"id\") ? \"scroll\" : null;\n\t\n\t albumsRows.push(_react2.default.createElement(_Album.AlbumRow, { playAction: playAction, playNextAction: playNextAction, album: album, songs: albumSongs, key: album.get(\"id\"), ref: ref }));\n\t });\n\t }\n\t\n\t return _react2.default.createElement(\n\t \"div\",\n\t null,\n\t error,\n\t _react2.default.createElement(\n\t \"div\",\n\t { className: \"row\", styleName: \"name\" },\n\t _react2.default.createElement(\n\t \"div\",\n\t { className: \"col-xs-12\" },\n\t _react2.default.createElement(\n\t \"h1\",\n\t null,\n\t this.props.artist.get(\"name\")\n\t ),\n\t _react2.default.createElement(\"hr\", null)\n\t )\n\t ),\n\t _react2.default.createElement(\n\t \"div\",\n\t { className: \"row\" },\n\t _react2.default.createElement(\n\t \"div\",\n\t { className: \"col-xs-9\" },\n\t _react2.default.createElement(\n\t \"p\",\n\t null,\n\t this.props.artist.get(\"summary\")\n\t )\n\t ),\n\t _react2.default.createElement(\n\t \"div\",\n\t { className: \"col-xs-3 text-center\" },\n\t _react2.default.createElement(\n\t \"p\",\n\t null,\n\t _react2.default.createElement(\"img\", { src: this.props.artist.get(\"art\"), width: \"200\", height: \"200\", className: \"img-responsive img-circle\", styleName: \"art\", alt: this.props.artist.get(\"name\") })\n\t )\n\t )\n\t ),\n\t albumsRows,\n\t loading\n\t );\n\t }\n\t }]);\n\t\n\t return ArtistCSS;\n\t}(_react.Component);\n\t\n\tArtistCSS.propTypes = {\n\t error: _react.PropTypes.string,\n\t isFetching: _react.PropTypes.bool.isRequired,\n\t playAction: _react.PropTypes.func.isRequired,\n\t playNextAction: _react.PropTypes.func.isRequired,\n\t artist: _react.PropTypes.instanceOf(_immutable2.default.Map),\n\t albums: _react.PropTypes.instanceOf(_immutable2.default.List),\n\t songs: _react.PropTypes.instanceOf(_immutable2.default.Map),\n\t scrollToAlbum: _react.PropTypes.number\n\t};\n\texports.default = (0, _reactCssModules2.default)(ArtistCSS, _Artist2.default);\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(16)))\n\n/***/ },\n/* 340 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\"use strict\";\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\t\n\tvar _react = __webpack_require__(2);\n\t\n\tvar _react2 = _interopRequireDefault(_react);\n\t\n\tvar _immutable = __webpack_require__(15);\n\t\n\tvar _immutable2 = _interopRequireDefault(_immutable);\n\t\n\tvar _Grid = __webpack_require__(214);\n\t\n\tvar _Grid2 = _interopRequireDefault(_Grid);\n\t\n\tvar _DismissibleAlert = __webpack_require__(104);\n\t\n\tvar _DismissibleAlert2 = _interopRequireDefault(_DismissibleAlert);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\t\n\tfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\t\n\tfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // NPM imports\n\t\n\t\n\t// Other components\n\t\n\t\n\t/**\n\t * Paginated artists grid\n\t */\n\tvar Artists = function (_Component) {\n\t _inherits(Artists, _Component);\n\t\n\t function Artists() {\n\t _classCallCheck(this, Artists);\n\t\n\t return _possibleConstructorReturn(this, Object.getPrototypeOf(Artists).apply(this, arguments));\n\t }\n\t\n\t _createClass(Artists, [{\n\t key: \"render\",\n\t value: function render() {\n\t // Handle error\n\t var error = null;\n\t if (this.props.error) {\n\t error = _react2.default.createElement(_DismissibleAlert2.default, { type: \"danger\", text: this.props.error });\n\t }\n\t\n\t // Define grid props\n\t var grid = {\n\t isFetching: this.props.isFetching,\n\t items: this.props.artists,\n\t itemsType: \"artist\",\n\t itemsLabel: \"app.common.artist\",\n\t subItemsType: \"albums\",\n\t subItemsLabel: \"app.common.album\",\n\t buildLinkTo: function buildLinkTo(itemType, item) {\n\t return \"/artist/\" + item.get(\"id\") + \"-\" + encodeURIComponent(item.get(\"name\"));\n\t }\n\t };\n\t\n\t return _react2.default.createElement(\n\t \"div\",\n\t null,\n\t error,\n\t _react2.default.createElement(_Grid2.default, { grid: grid, pagination: this.props.pagination })\n\t );\n\t }\n\t }]);\n\t\n\t return Artists;\n\t}(_react.Component);\n\t\n\texports.default = Artists;\n\t\n\tArtists.propTypes = {\n\t error: _react.PropTypes.string,\n\t isFetching: _react.PropTypes.bool.isRequired,\n\t artists: _react.PropTypes.instanceOf(_immutable2.default.List).isRequired,\n\t pagination: _react.PropTypes.object.isRequired\n\t};\n\n/***/ },\n/* 341 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\"use strict\";\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\t\n\tvar _react = __webpack_require__(2);\n\t\n\tvar _react2 = _interopRequireDefault(_react);\n\t\n\tvar _reactCssModules = __webpack_require__(46);\n\t\n\tvar _reactCssModules2 = _interopRequireDefault(_reactCssModules);\n\t\n\tvar _reactFontawesome = __webpack_require__(78);\n\t\n\tvar _reactFontawesome2 = _interopRequireDefault(_reactFontawesome);\n\t\n\tvar _Discover = __webpack_require__(607);\n\t\n\tvar _Discover2 = _interopRequireDefault(_Discover);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\t\n\tfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\t\n\tfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // TODO: Discover view is not done\n\t\n\t\n\tvar DiscoverCSS = function (_Component) {\n\t _inherits(DiscoverCSS, _Component);\n\t\n\t function DiscoverCSS() {\n\t _classCallCheck(this, DiscoverCSS);\n\t\n\t return _possibleConstructorReturn(this, Object.getPrototypeOf(DiscoverCSS).apply(this, arguments));\n\t }\n\t\n\t _createClass(DiscoverCSS, [{\n\t key: \"render\",\n\t value: function render() {\n\t var artistsAlbumsSongsDropdown = _react2.default.createElement(\n\t \"div\",\n\t { className: \"btn-group\" },\n\t _react2.default.createElement(\n\t \"button\",\n\t { type: \"button\", className: \"btn btn-default dropdown-toggle\", styleName: \"h2Title\", \"data-toggle\": \"dropdown\", \"aria-haspopup\": \"true\", \"aria-expanded\": \"false\" },\n\t _react2.default.createElement(\n\t \"span\",\n\t { styleName: \"dashedUnderline\" },\n\t \"albums\"\n\t ),\n\t _react2.default.createElement(\"span\", { className: \"caret\", styleName: \"caret\" })\n\t ),\n\t _react2.default.createElement(\n\t \"ul\",\n\t { className: \"dropdown-menu\", styleName: \"dropdown-menu\" },\n\t _react2.default.createElement(\n\t \"li\",\n\t null,\n\t _react2.default.createElement(\n\t \"a\",\n\t { href: \"#\", role: \"button\" },\n\t \"artists\"\n\t )\n\t ),\n\t _react2.default.createElement(\n\t \"li\",\n\t { className: \"active\" },\n\t _react2.default.createElement(\n\t \"a\",\n\t { href: \"#\", role: \"button\" },\n\t \"albums\"\n\t )\n\t ),\n\t _react2.default.createElement(\n\t \"li\",\n\t null,\n\t _react2.default.createElement(\n\t \"a\",\n\t { href: \"#\", role: \"button\" },\n\t \"songs\"\n\t )\n\t )\n\t )\n\t );\n\t var bobDylan = _react2.default.createElement(\n\t \"div\",\n\t { className: \"col-xs-4 col-sm-2\" },\n\t _react2.default.createElement(\n\t \"div\",\n\t { className: \"text-center\" },\n\t _react2.default.createElement(\n\t \"a\",\n\t { title: \"Aller à la page de l'artiste\", href: \"#/artist/15\" },\n\t _react2.default.createElement(\"img\", { src: \"\", width: \"200\", height: \"200\", className: \"img-responsive img-circle art\", alt: \"Bob Dylan\" })\n\t ),\n\t _react2.default.createElement(\n\t \"h4\",\n\t null,\n\t \"Bob Dylan\"\n\t )\n\t )\n\t );\n\t return _react2.default.createElement(\n\t \"div\",\n\t { className: \"row\" },\n\t _react2.default.createElement(\n\t \"h2\",\n\t { styleName: \"noMarginTop\" },\n\t _react2.default.createElement(_reactFontawesome2.default, { name: \"heart\", \"aria-hidden\": \"true\" }),\n\t \" More \",\n\t artistsAlbumsSongsDropdown,\n\t \" you might like\"\n\t ),\n\t _react2.default.createElement(\n\t \"div\",\n\t { className: \"col-xs-12\" },\n\t _react2.default.createElement(\n\t \"div\",\n\t { className: \"row\" },\n\t _react2.default.createElement(\n\t \"div\",\n\t { className: \"col-xs-4 col-sm-2 col-sm-offset-1\" },\n\t _react2.default.createElement(\n\t \"div\",\n\t { className: \"text-center\" },\n\t _react2.default.createElement(\n\t \"a\",\n\t { title: \"Aller à la page de l'artiste\", href: \"#/artist/15\" },\n\t _react2.default.createElement(\"img\", { src: \"\", width: \"200\", height: \"200\", className: \"img-responsive img-circle art\", alt: \"Bob Dylan\" })\n\t ),\n\t _react2.default.createElement(\n\t \"h4\",\n\t null,\n\t \"Bob Dylan\"\n\t )\n\t )\n\t ),\n\t bobDylan,\n\t bobDylan,\n\t bobDylan,\n\t bobDylan\n\t ),\n\t _react2.default.createElement(\"hr\", null)\n\t ),\n\t _react2.default.createElement(\n\t \"h2\",\n\t null,\n\t _react2.default.createElement(_reactFontawesome2.default, { name: \"thumbs-up\", \"aria-hidden\": \"true\" }),\n\t \" Popular \",\n\t artistsAlbumsSongsDropdown\n\t ),\n\t _react2.default.createElement(\n\t \"div\",\n\t { className: \"col-xs-12\" },\n\t _react2.default.createElement(\n\t \"div\",\n\t { className: \"row\" },\n\t _react2.default.createElement(\n\t \"div\",\n\t { className: \"col-xs-4 col-sm-2 col-sm-offset-1\" },\n\t _react2.default.createElement(\n\t \"div\",\n\t { className: \"text-center\" },\n\t _react2.default.createElement(\n\t \"a\",\n\t { title: \"Aller à la page de l'artiste\", href: \"#/artist/15\" },\n\t _react2.default.createElement(\"img\", { src: \"\", width: \"200\", height: \"200\", className: \"img-responsive img-circle art\", alt: \"Bob Dylan\" })\n\t ),\n\t _react2.default.createElement(\n\t \"h4\",\n\t null,\n\t \"Bob Dylan\"\n\t )\n\t )\n\t ),\n\t bobDylan,\n\t bobDylan,\n\t bobDylan,\n\t bobDylan\n\t ),\n\t _react2.default.createElement(\"hr\", null)\n\t ),\n\t _react2.default.createElement(\n\t \"h2\",\n\t null,\n\t _react2.default.createElement(_reactFontawesome2.default, { name: \"plus-square\", \"aria-hidden\": \"true\" }),\n\t \" Recent additions\"\n\t ),\n\t _react2.default.createElement(\n\t \"div\",\n\t { className: \"col-xs-12\" },\n\t _react2.default.createElement(\n\t \"div\",\n\t { className: \"row\" },\n\t _react2.default.createElement(\n\t \"div\",\n\t { className: \"col-xs-4 col-sm-2 col-sm-offset-1\" },\n\t _react2.default.createElement(\n\t \"div\",\n\t { className: \"text-center\" },\n\t _react2.default.createElement(\n\t \"a\",\n\t { title: \"Aller à la page de l'artiste\", href: \"#/artist/15\" },\n\t _react2.default.createElement(\"img\", { src: \"\", width: \"200\", height: \"200\", className: \"img-responsive img-circle art\", alt: \"Bob Dylan\" })\n\t ),\n\t _react2.default.createElement(\n\t \"h4\",\n\t null,\n\t \"Bob Dylan\"\n\t )\n\t )\n\t ),\n\t bobDylan,\n\t bobDylan,\n\t bobDylan,\n\t bobDylan\n\t ),\n\t _react2.default.createElement(\"hr\", null)\n\t ),\n\t _react2.default.createElement(\n\t \"h2\",\n\t null,\n\t _react2.default.createElement(_reactFontawesome2.default, { name: \"volume-up\", \"aria-hidden\": \"true\" }),\n\t \" Currently playing\"\n\t ),\n\t _react2.default.createElement(\"table\", null)\n\t );\n\t }\n\t }]);\n\t\n\t return DiscoverCSS;\n\t}(_react.Component);\n\t\n\texports.default = DiscoverCSS;\n\t\n\t\n\tDiscoverCSS.propTypes = {};\n\t\n\texports.default = (0, _reactCssModules2.default)(DiscoverCSS, _Discover2.default);\n\n/***/ },\n/* 342 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/* WEBPACK VAR INJECTION */(function($) {\"use strict\";\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.LoginForm = undefined;\n\t\n\tvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\t\n\tvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\t\n\tvar _react = __webpack_require__(2);\n\t\n\tvar _react2 = _interopRequireDefault(_react);\n\t\n\tvar _reactCssModules = __webpack_require__(46);\n\t\n\tvar _reactCssModules2 = _interopRequireDefault(_reactCssModules);\n\t\n\tvar _reactIntl = __webpack_require__(18);\n\t\n\tvar _reactFontawesome = __webpack_require__(78);\n\t\n\tvar _reactFontawesome2 = _interopRequireDefault(_reactFontawesome);\n\t\n\tvar _i18n = __webpack_require__(80);\n\t\n\tvar _utils = __webpack_require__(12);\n\t\n\tvar _api = __webpack_require__(91);\n\t\n\tvar _api2 = _interopRequireDefault(_api);\n\t\n\tvar _Login = __webpack_require__(354);\n\t\n\tvar _Login2 = _interopRequireDefault(_Login);\n\t\n\tvar _Login3 = __webpack_require__(608);\n\t\n\tvar _Login4 = _interopRequireDefault(_Login3);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\t\n\tfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\t\n\tfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // NPM imports\n\t\n\t\n\t// Local imports\n\t\n\t\n\t// Translations\n\t\n\t\n\t// Styles\n\t\n\t\n\t// Define translations\n\tvar loginMessages = (0, _reactIntl.defineMessages)((0, _utils.messagesMap)(Array.concat([], _api2.default, _Login2.default)));\n\t\n\t/**\n\t * Login form component\n\t */\n\t\n\tvar LoginFormCSSIntl = function (_Component) {\n\t _inherits(LoginFormCSSIntl, _Component);\n\t\n\t function LoginFormCSSIntl(props) {\n\t _classCallCheck(this, LoginFormCSSIntl);\n\t\n\t var _this = _possibleConstructorReturn(this, Object.getPrototypeOf(LoginFormCSSIntl).call(this, props));\n\t\n\t _this.handleSubmit = _this.handleSubmit.bind(_this); // bind this to handleSubmit\n\t return _this;\n\t }\n\t\n\t /**\n\t * Set an error on a form element.\n\t *\n\t * @param formGroup A form element.\n\t * @param hasError Whether or not an error should be set.\n\t *\n\t * @return True if an error is set, false otherwise\n\t */\n\t\n\t\n\t _createClass(LoginFormCSSIntl, [{\n\t key: \"setError\",\n\t value: function setError(formGroup, hasError) {\n\t if (hasError) {\n\t // If error is true, then add error class\n\t formGroup.classList.add(\"has-error\");\n\t formGroup.classList.remove(\"has-success\");\n\t return true;\n\t }\n\t // Else, drop it and put success class\n\t formGroup.classList.remove(\"has-error\");\n\t formGroup.classList.add(\"has-success\");\n\t return false;\n\t }\n\t\n\t /**\n\t * Form submission handler.\n\t *\n\t * @param e JS Event.\n\t */\n\t\n\t }, {\n\t key: \"handleSubmit\",\n\t value: function handleSubmit(e) {\n\t e.preventDefault();\n\t\n\t // Don't handle submit if already logging in\n\t if (this.props.isAuthenticating) {\n\t return;\n\t }\n\t\n\t // Get field values\n\t var username = this.refs.username.value.trim();\n\t var password = this.refs.password.value.trim();\n\t var endpoint = this.refs.endpoint.value.trim();\n\t var rememberMe = this.refs.rememberMe.checked;\n\t\n\t // Check for errors on each field\n\t var hasError = this.setError(this.refs.usernameFormGroup, !username);\n\t hasError |= this.setError(this.refs.passwordFormGroup, !password);\n\t hasError |= this.setError(this.refs.endpointFormGroup, !endpoint);\n\t\n\t if (!hasError) {\n\t // Submit if no error is found\n\t this.props.onSubmit(username, password, endpoint, rememberMe);\n\t }\n\t }\n\t }, {\n\t key: \"componentDidUpdate\",\n\t value: function componentDidUpdate() {\n\t if (this.props.error) {\n\t // On unsuccessful login, set error classes and shake the form\n\t $(this.refs.loginForm).shake(3, 10, 300);\n\t this.setError(this.refs.usernameFormGroup, this.props.error);\n\t this.setError(this.refs.passwordFormGroup, this.props.error);\n\t this.setError(this.refs.endpointFormGroup, this.props.error);\n\t }\n\t }\n\t }, {\n\t key: \"render\",\n\t value: function render() {\n\t var formatMessage = this.props.intl.formatMessage;\n\t\n\t // Handle info message\n\t\n\t var infoMessage = this.props.info;\n\t if (this.props.info && this.props.info instanceof _i18n.i18nRecord) {\n\t infoMessage = _react2.default.createElement(_reactIntl.FormattedMessage, _extends({}, loginMessages[this.props.info.id], { values: this.props.info.values }));\n\t }\n\t\n\t // Handle error message\n\t var errorMessage = this.props.error;\n\t if (this.props.error && this.props.error instanceof _i18n.i18nRecord) {\n\t errorMessage = _react2.default.createElement(_reactIntl.FormattedMessage, _extends({}, loginMessages[this.props.error.id], { values: this.props.error.values }));\n\t }\n\t\n\t return _react2.default.createElement(\n\t \"div\",\n\t null,\n\t this.props.error ? _react2.default.createElement(\n\t \"div\",\n\t { className: \"row\" },\n\t _react2.default.createElement(\n\t \"div\",\n\t { className: \"alert alert-danger\", id: \"loginFormError\", role: \"alert\" },\n\t _react2.default.createElement(\n\t \"p\",\n\t null,\n\t _react2.default.createElement(_reactFontawesome2.default, { name: \"exclamation\", \"aria-hidden\": \"true\" }),\n\t \" \",\n\t errorMessage\n\t )\n\t )\n\t ) : null,\n\t this.props.info ? _react2.default.createElement(\n\t \"div\",\n\t { className: \"row\" },\n\t _react2.default.createElement(\n\t \"div\",\n\t { className: \"alert alert-info\", id: \"loginFormInfo\", role: \"alert\" },\n\t _react2.default.createElement(\n\t \"p\",\n\t null,\n\t infoMessage\n\t )\n\t )\n\t ) : null,\n\t _react2.default.createElement(\n\t \"div\",\n\t { className: \"row\" },\n\t _react2.default.createElement(\n\t \"form\",\n\t { className: \"col-xs-9 col-xs-offset-1 col-md-6 col-md-offset-3 text-left form-horizontal login\", onSubmit: this.handleSubmit, ref: \"loginForm\", \"aria-describedby\": \"loginFormInfo loginFormError\" },\n\t _react2.default.createElement(\n\t \"div\",\n\t { className: \"row\" },\n\t _react2.default.createElement(\n\t \"div\",\n\t { className: \"form-group\", ref: \"usernameFormGroup\" },\n\t _react2.default.createElement(\n\t \"div\",\n\t { className: \"col-xs-12\" },\n\t _react2.default.createElement(\"input\", { type: \"text\", className: \"form-control\", ref: \"username\", \"aria-label\": formatMessage(loginMessages[\"app.login.username\"]), placeholder: formatMessage(loginMessages[\"app.login.username\"]), autoFocus: true, defaultValue: this.props.username })\n\t )\n\t ),\n\t _react2.default.createElement(\n\t \"div\",\n\t { className: \"form-group\", ref: \"passwordFormGroup\" },\n\t _react2.default.createElement(\n\t \"div\",\n\t { className: \"col-xs-12\" },\n\t _react2.default.createElement(\"input\", { type: \"password\", className: \"form-control\", ref: \"password\", \"aria-label\": formatMessage(loginMessages[\"app.login.password\"]), placeholder: formatMessage(loginMessages[\"app.login.password\"]) })\n\t )\n\t ),\n\t _react2.default.createElement(\n\t \"div\",\n\t { className: \"form-group\", ref: \"endpointFormGroup\" },\n\t _react2.default.createElement(\n\t \"div\",\n\t { className: \"col-xs-12\" },\n\t _react2.default.createElement(\"input\", { type: \"text\", className: \"form-control\", ref: \"endpoint\", \"aria-label\": formatMessage(loginMessages[\"app.login.endpointInputAriaLabel\"]), placeholder: \"http://ampache.example.com\", defaultValue: this.props.endpoint })\n\t )\n\t ),\n\t _react2.default.createElement(\n\t \"div\",\n\t { className: \"form-group\" },\n\t _react2.default.createElement(\n\t \"div\",\n\t { className: \"col-xs-12\" },\n\t _react2.default.createElement(\n\t \"div\",\n\t { className: \"row\" },\n\t _react2.default.createElement(\n\t \"div\",\n\t { className: \"col-sm-6 col-xs-12 checkbox\" },\n\t _react2.default.createElement(\n\t \"label\",\n\t { id: \"rememberMeLabel\" },\n\t _react2.default.createElement(\"input\", { type: \"checkbox\", ref: \"rememberMe\", defaultChecked: this.props.rememberMe, \"aria-labelledby\": \"rememberMeLabel\" }),\n\t _react2.default.createElement(_reactIntl.FormattedMessage, loginMessages[\"app.login.rememberMe\"])\n\t )\n\t ),\n\t _react2.default.createElement(\n\t \"div\",\n\t { className: \"col-sm-6 col-xs-12 text-right\", styleName: \"submit\" },\n\t _react2.default.createElement(\"input\", { type: \"submit\", className: \"btn btn-default\", \"aria-label\": formatMessage(loginMessages[\"app.login.signIn\"]), defaultValue: formatMessage(loginMessages[\"app.login.signIn\"]), disabled: this.props.isAuthenticating })\n\t )\n\t )\n\t )\n\t )\n\t )\n\t )\n\t )\n\t );\n\t }\n\t }]);\n\t\n\t return LoginFormCSSIntl;\n\t}(_react.Component);\n\t\n\tLoginFormCSSIntl.propTypes = {\n\t username: _react.PropTypes.string,\n\t endpoint: _react.PropTypes.string,\n\t rememberMe: _react.PropTypes.bool,\n\t onSubmit: _react.PropTypes.func.isRequired,\n\t isAuthenticating: _react.PropTypes.bool,\n\t error: _react.PropTypes.oneOfType([_react.PropTypes.string, _react.PropTypes.instanceOf(_i18n.i18nRecord)]),\n\t info: _react.PropTypes.oneOfType([_react.PropTypes.string, _react.PropTypes.instanceOf(_i18n.i18nRecord)]),\n\t intl: _reactIntl.intlShape.isRequired\n\t};\n\tvar LoginForm = exports.LoginForm = (0, _reactIntl.injectIntl)((0, _reactCssModules2.default)(LoginFormCSSIntl, _Login4.default));\n\t\n\t/**\n\t * Main login page, including title and login form.\n\t */\n\t\n\tvar LoginCSS = function (_Component2) {\n\t _inherits(LoginCSS, _Component2);\n\t\n\t function LoginCSS() {\n\t _classCallCheck(this, LoginCSS);\n\t\n\t return _possibleConstructorReturn(this, Object.getPrototypeOf(LoginCSS).apply(this, arguments));\n\t }\n\t\n\t _createClass(LoginCSS, [{\n\t key: \"render\",\n\t value: function render() {\n\t var greeting = _react2.default.createElement(\n\t \"p\",\n\t null,\n\t _react2.default.createElement(_reactIntl.FormattedMessage, loginMessages[\"app.login.greeting\"])\n\t );\n\t return _react2.default.createElement(\n\t \"div\",\n\t { className: \"text-center container-fluid\" },\n\t _react2.default.createElement(\n\t \"h1\",\n\t null,\n\t _react2.default.createElement(\"img\", { styleName: \"titleImage\", src: \"./img/ampache-blue.png\", alt: \"A\" }),\n\t \"mpache\"\n\t ),\n\t _react2.default.createElement(\"hr\", null),\n\t !this.props.error && !this.props.info ? greeting : null,\n\t _react2.default.createElement(\n\t \"div\",\n\t { className: \"col-xs-9 col-xs-offset-2 col-md-6 col-md-offset-3\" },\n\t _react2.default.createElement(LoginForm, { onSubmit: this.props.onSubmit, username: this.props.username, endpoint: this.props.endpoint, rememberMe: this.props.rememberMe, isAuthenticating: this.props.isAuthenticating, error: this.props.error, info: this.props.info })\n\t )\n\t );\n\t }\n\t }]);\n\t\n\t return LoginCSS;\n\t}(_react.Component);\n\t\n\tLoginCSS.propTypes = {\n\t username: _react.PropTypes.string,\n\t endpoint: _react.PropTypes.string,\n\t rememberMe: _react.PropTypes.bool,\n\t onSubmit: _react.PropTypes.func.isRequired,\n\t isAuthenticating: _react.PropTypes.bool,\n\t info: _react.PropTypes.oneOfType([_react.PropTypes.string, _react.PropTypes.object]),\n\t error: _react.PropTypes.oneOfType([_react.PropTypes.string, _react.PropTypes.object])\n\t};\n\texports.default = (0, _reactCssModules2.default)(LoginCSS, _Login4.default);\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(16)))\n\n/***/ },\n/* 343 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\"use strict\";\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\t\n\tvar _react = __webpack_require__(2);\n\t\n\tvar _react2 = _interopRequireDefault(_react);\n\t\n\tvar _immutable = __webpack_require__(15);\n\t\n\tvar _immutable2 = _interopRequireDefault(_immutable);\n\t\n\tvar _reactIntl = __webpack_require__(18);\n\t\n\tvar _utils = __webpack_require__(12);\n\t\n\tvar _Songs = __webpack_require__(212);\n\t\n\tvar _common = __webpack_require__(50);\n\t\n\tvar _common2 = _interopRequireDefault(_common);\n\t\n\tvar _Playlist = __webpack_require__(355);\n\t\n\tvar _Playlist2 = _interopRequireDefault(_Playlist);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\t\n\tfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\t\n\tfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // TODO: Styling\n\t// NPM import\n\t\n\t\n\t// Local imports\n\t\n\t\n\t// Other components\n\t\n\t\n\t// Translations\n\t\n\t\n\t// Define translations\n\tvar playlistMessages = (0, _reactIntl.defineMessages)((0, _utils.messagesMap)(Array.concat([], _common2.default, _Playlist2.default)));\n\t\n\t/**\n\t * An entire album row containing art and tracks table.\n\t */\n\t\n\tvar PlaylistIntl = function (_Component) {\n\t _inherits(PlaylistIntl, _Component);\n\t\n\t function PlaylistIntl() {\n\t _classCallCheck(this, PlaylistIntl);\n\t\n\t return _possibleConstructorReturn(this, Object.getPrototypeOf(PlaylistIntl).apply(this, arguments));\n\t }\n\t\n\t _createClass(PlaylistIntl, [{\n\t key: \"render\",\n\t value: function render() {\n\t var _this2 = this;\n\t\n\t var playlistText = null;\n\t if (this.props.songs.size > 0) {\n\t var currentSongSongsTableProps = {\n\t playAction: this.props.playAction,\n\t playNextAction: this.props.playNextAction,\n\t songs: this.props.songs.slice(this.props.currentIndex, this.props.currentIndex + 1)\n\t };\n\t var fullPlaylistSongsTableProps = {\n\t playAction: this.props.playAction,\n\t playNextAction: this.props.playNextAction,\n\t songs: this.props.songs\n\t };\n\t playlistText = _react2.default.createElement(\n\t \"div\",\n\t null,\n\t _react2.default.createElement(\n\t \"p\",\n\t { className: \"text-center\" },\n\t _react2.default.createElement(\n\t \"button\",\n\t { onClick: function onClick() {\n\t return _this2.props.flushAction();\n\t } },\n\t _react2.default.createElement(_reactIntl.FormattedMessage, playlistMessages[\"app.playlist.flushPlaylist\"])\n\t )\n\t ),\n\t _react2.default.createElement(\n\t \"h3\",\n\t null,\n\t _react2.default.createElement(_reactIntl.FormattedMessage, playlistMessages[\"app.playlist.currentSongPlaying\"])\n\t ),\n\t _react2.default.createElement(_Songs.SongsTable, currentSongSongsTableProps),\n\t _react2.default.createElement(\n\t \"h3\",\n\t null,\n\t _react2.default.createElement(_reactIntl.FormattedMessage, playlistMessages[\"app.playlist.fullPlaylist\"])\n\t ),\n\t _react2.default.createElement(_Songs.SongsTable, fullPlaylistSongsTableProps)\n\t );\n\t } else {\n\t playlistText = _react2.default.createElement(\n\t \"p\",\n\t null,\n\t _react2.default.createElement(_reactIntl.FormattedMessage, playlistMessages[\"app.playlist.emptyPlaylist\"])\n\t );\n\t }\n\t return _react2.default.createElement(\n\t \"div\",\n\t null,\n\t _react2.default.createElement(\n\t \"div\",\n\t { className: \"row\" },\n\t _react2.default.createElement(\n\t \"div\",\n\t { className: \"col-xs-12\" },\n\t _react2.default.createElement(\n\t \"h2\",\n\t null,\n\t _react2.default.createElement(_reactIntl.FormattedMessage, playlistMessages[\"app.playlist.playlist\"])\n\t ),\n\t _react2.default.createElement(\"hr\", null)\n\t )\n\t ),\n\t _react2.default.createElement(\n\t \"div\",\n\t { className: \"row\" },\n\t _react2.default.createElement(\n\t \"div\",\n\t { className: \"col-xs-12\" },\n\t playlistText\n\t )\n\t )\n\t );\n\t }\n\t }]);\n\t\n\t return PlaylistIntl;\n\t}(_react.Component);\n\t\n\tPlaylistIntl.propTypes = {\n\t playAction: _react.PropTypes.func.isRequired,\n\t playNextAction: _react.PropTypes.func,\n\t flushAction: _react.PropTypes.func.isRequired,\n\t songs: _react.PropTypes.instanceOf(_immutable2.default.List).isRequired,\n\t currentIndex: _react.PropTypes.number.isRequired,\n\t intl: _reactIntl.intlShape.isRequired\n\t};\n\texports.default = (0, _reactIntl.injectIntl)(PlaylistIntl);\n\n/***/ },\n/* 344 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\"use strict\";\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\t\n\tvar _react = __webpack_require__(2);\n\t\n\tvar _react2 = _interopRequireDefault(_react);\n\t\n\tvar _reactIntl = __webpack_require__(18);\n\t\n\tvar _utils = __webpack_require__(12);\n\t\n\tvar _common = __webpack_require__(50);\n\t\n\tvar _common2 = _interopRequireDefault(_common);\n\t\n\tvar _Settings = __webpack_require__(356);\n\t\n\tvar _Settings2 = _interopRequireDefault(_Settings);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\t\n\tfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\t\n\tfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // NPM imports\n\t\n\t\n\t// Local imports\n\t\n\t\n\t// Translations\n\t\n\t\n\t// Define translations\n\tvar settingsMessages = (0, _reactIntl.defineMessages)((0, _utils.messagesMap)(Array.concat([], _common2.default, _Settings2.default)));\n\t\n\t/**\n\t * A single row for a single song in the songs table.\n\t */\n\t\n\tvar SettingsIntl = function (_Component) {\n\t _inherits(SettingsIntl, _Component);\n\t\n\t function SettingsIntl() {\n\t _classCallCheck(this, SettingsIntl);\n\t\n\t return _possibleConstructorReturn(this, Object.getPrototypeOf(SettingsIntl).apply(this, arguments));\n\t }\n\t\n\t _createClass(SettingsIntl, [{\n\t key: \"render\",\n\t value: function render() {\n\t return _react2.default.createElement(\n\t \"div\",\n\t null,\n\t _react2.default.createElement(\n\t \"div\",\n\t { className: \"row\" },\n\t _react2.default.createElement(\n\t \"div\",\n\t { className: \"col-xs-12\" },\n\t _react2.default.createElement(\n\t \"h2\",\n\t null,\n\t _react2.default.createElement(_reactIntl.FormattedMessage, settingsMessages[\"app.settings.settings\"])\n\t ),\n\t _react2.default.createElement(\"hr\", null)\n\t )\n\t ),\n\t _react2.default.createElement(\n\t \"div\",\n\t { className: \"row\" },\n\t _react2.default.createElement(\n\t \"div\",\n\t { className: \"col-xs-12\" },\n\t _react2.default.createElement(\n\t \"p\",\n\t null,\n\t \"TODO\"\n\t )\n\t )\n\t )\n\t );\n\t }\n\t }]);\n\t\n\t return SettingsIntl;\n\t}(_react.Component);\n\t\n\tSettingsIntl.propTypes = {\n\t intl: _reactIntl.intlShape.isRequired\n\t};\n\texports.default = (0, _reactIntl.injectIntl)(SettingsIntl);\n\n/***/ },\n/* 345 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/* WEBPACK VAR INJECTION */(function($) {\"use strict\";\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\t\n\tvar _react = __webpack_require__(2);\n\t\n\tvar _react2 = _interopRequireDefault(_react);\n\t\n\tvar _reactCssModules = __webpack_require__(46);\n\t\n\tvar _reactCssModules2 = _interopRequireDefault(_reactCssModules);\n\t\n\tvar _reactIntl = __webpack_require__(18);\n\t\n\tvar _reactRouter = __webpack_require__(54);\n\t\n\tvar _immutable = __webpack_require__(15);\n\t\n\tvar _immutable2 = _interopRequireDefault(_immutable);\n\t\n\tvar _reactFontawesome = __webpack_require__(78);\n\t\n\tvar _reactFontawesome2 = _interopRequireDefault(_reactFontawesome);\n\t\n\tvar _utils = __webpack_require__(12);\n\t\n\tvar _WebPlayer = __webpack_require__(613);\n\t\n\tvar _WebPlayer2 = _interopRequireDefault(_WebPlayer);\n\t\n\tvar _common = __webpack_require__(50);\n\t\n\tvar _common2 = _interopRequireDefault(_common);\n\t\n\tvar _WebPlayer3 = __webpack_require__(216);\n\t\n\tvar _WebPlayer4 = _interopRequireDefault(_WebPlayer3);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\t\n\tfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\t\n\tfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // NPM imports\n\t\n\t\n\t// Local imports\n\t\n\t\n\t// Styles\n\t\n\t\n\t// Translations\n\t\n\t\n\t// Define translations\n\tvar webplayerMessages = (0, _reactIntl.defineMessages)((0, _utils.messagesMap)(Array.concat([], _common2.default, _WebPlayer4.default)));\n\t\n\t/**\n\t * Webplayer component.\n\t */\n\t\n\tvar WebPlayerCSSIntl = function (_Component) {\n\t _inherits(WebPlayerCSSIntl, _Component);\n\t\n\t function WebPlayerCSSIntl(props) {\n\t _classCallCheck(this, WebPlayerCSSIntl);\n\t\n\t // Bind this\n\t var _this = _possibleConstructorReturn(this, Object.getPrototypeOf(WebPlayerCSSIntl).call(this, props));\n\t\n\t _this.artOpacityHandler = _this.artOpacityHandler.bind(_this);\n\t return _this;\n\t }\n\t\n\t /**\n\t * Handle opacity on album art.\n\t *\n\t * Set opacity on mouseover / mouseout.\n\t *\n\t * @param ev A JS event.\n\t */\n\t\n\t\n\t _createClass(WebPlayerCSSIntl, [{\n\t key: \"artOpacityHandler\",\n\t value: function artOpacityHandler(ev) {\n\t if (ev.type == \"mouseover\") {\n\t // On mouse over, reduce opacity\n\t this.refs.art.style.opacity = \"1\";\n\t this.refs.artText.style.display = \"none\";\n\t } else {\n\t // On mouse out, set opacity back\n\t this.refs.art.style.opacity = \"0.75\";\n\t this.refs.artText.style.display = \"block\";\n\t }\n\t }\n\t }, {\n\t key: \"render\",\n\t value: function render() {\n\t var formatMessage = this.props.intl.formatMessage;\n\t\n\t // Get current song (eventually undefined)\n\t\n\t var song = this.props.currentSong;\n\t\n\t // Current status (play or pause) for localization\n\t var playPause = this.props.isPlaying ? \"pause\" : \"play\";\n\t // Volume fontawesome icon\n\t var volumeIcon = this.props.isMute ? \"volume-off\" : \"volume-up\";\n\t\n\t // Get classes for random and repeat buttons\n\t var randomBtnStyles = [\"randomBtn\"];\n\t var repeatBtnStyles = [\"repeatBtn\"];\n\t var playlistBtnStyles = [\"playlistBtn\"];\n\t if (this.props.isRandom) {\n\t randomBtnStyles.push(\"active\");\n\t }\n\t if (this.props.isRepeat) {\n\t repeatBtnStyles.push(\"active\");\n\t }\n\t if (this.props.isPlaylistViewActive) {\n\t playlistBtnStyles.push(\"active\");\n\t }\n\t\n\t // Check if a song is currently playing\n\t var art = null;\n\t var songTitle = null;\n\t var artistName = null;\n\t if (song) {\n\t art = song.get(\"art\");\n\t songTitle = song.get(\"title\");\n\t if (this.props.currentArtist) {\n\t artistName = this.props.currentArtist.get(\"name\");\n\t }\n\t }\n\t\n\t // Click handlers\n\t var onPrev = function () {\n\t $(this.refs.prevBtn).blur();\n\t this.props.onPrev();\n\t }.bind(this);\n\t var onPlayPause = function () {\n\t $(this.refs.playPauseBtn).blur();\n\t this.props.onPlayPause();\n\t }.bind(this);\n\t var onSkip = function () {\n\t $(this.refs.nextBtn).blur();\n\t this.props.onSkip();\n\t }.bind(this);\n\t var onMute = function () {\n\t $(this.refs.volumeBtn).blur();\n\t this.props.onMute();\n\t }.bind(this);\n\t var onRepeat = function () {\n\t $(this.refs.repeatBtn).blur();\n\t this.props.onRepeat();\n\t }.bind(this);\n\t var onRandom = function () {\n\t $(this.refs.randomBtn).blur();\n\t this.props.onRandom();\n\t }.bind(this);\n\t\n\t return _react2.default.createElement(\n\t \"div\",\n\t { id: \"row\", styleName: \"webplayer\" },\n\t _react2.default.createElement(\n\t \"div\",\n\t { className: \"col-xs-12\" },\n\t _react2.default.createElement(\n\t \"div\",\n\t { className: \"row\", styleName: \"artRow\", onMouseOver: this.artOpacityHandler, onMouseOut: this.artOpacityHandler },\n\t _react2.default.createElement(\n\t \"div\",\n\t { className: \"col-xs-12\" },\n\t _react2.default.createElement(\"div\", { styleName: \"artTimer\" }),\n\t _react2.default.createElement(\"img\", { src: art, width: \"200\", height: \"200\", alt: formatMessage(webplayerMessages[\"app.common.art\"]), ref: \"art\", styleName: \"art\" }),\n\t _react2.default.createElement(\n\t \"div\",\n\t { ref: \"artText\" },\n\t artistName && songTitle ? _react2.default.createElement(\n\t \"div\",\n\t null,\n\t _react2.default.createElement(\n\t \"h2\",\n\t null,\n\t songTitle\n\t ),\n\t _react2.default.createElement(\n\t \"h3\",\n\t null,\n\t _react2.default.createElement(\n\t \"span\",\n\t { className: \"text-capitalize\" },\n\t _react2.default.createElement(_reactIntl.FormattedMessage, webplayerMessages[\"app.webplayer.by\"])\n\t ),\n\t \" \",\n\t artistName\n\t )\n\t ) : null\n\t )\n\t )\n\t ),\n\t this.props.error ? _react2.default.createElement(\n\t \"div\",\n\t { className: \"row text-center\" },\n\t _react2.default.createElement(\n\t \"p\",\n\t null,\n\t this.props.error\n\t )\n\t ) : null,\n\t _react2.default.createElement(\n\t \"div\",\n\t { className: \"row text-center\", styleName: \"controls\" },\n\t _react2.default.createElement(\n\t \"div\",\n\t { className: \"col-xs-12\" },\n\t _react2.default.createElement(\n\t \"button\",\n\t { styleName: \"prevBtn\", \"aria-label\": formatMessage(webplayerMessages[\"app.webplayer.previous\"]), title: formatMessage(webplayerMessages[\"app.webplayer.previous\"]), onClick: onPrev, ref: \"prevBtn\" },\n\t _react2.default.createElement(_reactFontawesome2.default, { name: \"step-backward\" })\n\t ),\n\t _react2.default.createElement(\n\t \"button\",\n\t { className: \"play\", styleName: \"playPauseBtn\", \"aria-label\": formatMessage(webplayerMessages[\"app.common.\" + playPause]), title: formatMessage(webplayerMessages[\"app.common.\" + playPause]), onClick: onPlayPause.bind(this), ref: \"playPauseBtn\" },\n\t _react2.default.createElement(_reactFontawesome2.default, { name: playPause })\n\t ),\n\t _react2.default.createElement(\n\t \"button\",\n\t { styleName: \"nextBtn\", \"aria-label\": formatMessage(webplayerMessages[\"app.webplayer.next\"]), title: formatMessage(webplayerMessages[\"app.webplayer.next\"]), onClick: onSkip, ref: \"nextBtn\" },\n\t _react2.default.createElement(_reactFontawesome2.default, { name: \"step-forward\" })\n\t )\n\t ),\n\t _react2.default.createElement(\n\t \"div\",\n\t { className: \"col-xs-12\" },\n\t _react2.default.createElement(\n\t \"button\",\n\t { styleName: \"volumeBtn\", \"aria-label\": formatMessage(webplayerMessages[\"app.webplayer.volume\"]), title: formatMessage(webplayerMessages[\"app.webplayer.volume\"]), onClick: onMute, ref: \"volumeBtn\" },\n\t _react2.default.createElement(_reactFontawesome2.default, { name: volumeIcon })\n\t ),\n\t _react2.default.createElement(\n\t \"button\",\n\t { styleName: repeatBtnStyles.join(\" \"), \"aria-label\": formatMessage(webplayerMessages[\"app.webplayer.repeat\"]), title: formatMessage(webplayerMessages[\"app.webplayer.repeat\"]), \"aria-pressed\": this.props.isRepeat, onClick: onRepeat, ref: \"repeatBtn\" },\n\t _react2.default.createElement(_reactFontawesome2.default, { name: \"repeat\" })\n\t ),\n\t _react2.default.createElement(\n\t \"button\",\n\t { styleName: randomBtnStyles.join(\" \"), \"aria-label\": formatMessage(webplayerMessages[\"app.webplayer.random\"]), title: formatMessage(webplayerMessages[\"app.webplayer.random\"]), \"aria-pressed\": this.props.isRandom, onClick: onRandom, ref: \"randomBtn\" },\n\t _react2.default.createElement(_reactFontawesome2.default, { name: \"random\" })\n\t ),\n\t _react2.default.createElement(\n\t _reactRouter.Link,\n\t { to: \"/playlist\", styleName: playlistBtnStyles.join(\" \"), \"aria-label\": formatMessage(webplayerMessages[\"app.webplayer.playlist\"]), title: formatMessage(webplayerMessages[\"app.webplayer.playlist\"]) },\n\t _react2.default.createElement(_reactFontawesome2.default, { name: \"list\" })\n\t )\n\t )\n\t )\n\t )\n\t );\n\t }\n\t }]);\n\t\n\t return WebPlayerCSSIntl;\n\t}(_react.Component);\n\t\n\tWebPlayerCSSIntl.propTypes = {\n\t isPlaying: _react.PropTypes.bool.isRequired,\n\t isRandom: _react.PropTypes.bool.isRequired,\n\t isRepeat: _react.PropTypes.bool.isRequired,\n\t isMute: _react.PropTypes.bool.isRequired,\n\t volume: _react.PropTypes.number.isRequired,\n\t currentIndex: _react.PropTypes.number.isRequired,\n\t playlist: _react.PropTypes.instanceOf(_immutable2.default.List).isRequired,\n\t error: _react.PropTypes.string,\n\t currentSong: _react.PropTypes.instanceOf(_immutable2.default.Map),\n\t currentArtist: _react.PropTypes.instanceOf(_immutable2.default.Map),\n\t onPlayPause: _react.PropTypes.func.isRequired,\n\t onPrev: _react.PropTypes.func.isRequired,\n\t onSkip: _react.PropTypes.func.isRequired,\n\t onRandom: _react.PropTypes.func.isRequired,\n\t onRepeat: _react.PropTypes.func.isRequired,\n\t onMute: _react.PropTypes.func.isRequired,\n\t isPlaylistViewActive: _react.PropTypes.bool,\n\t intl: _reactIntl.intlShape.isRequired\n\t};\n\t\n\texports.default = (0, _reactIntl.injectIntl)((0, _reactCssModules2.default)(WebPlayerCSSIntl, _WebPlayer2.default, { allowMultiple: true }));\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(16)))\n\n/***/ },\n/* 346 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/* WEBPACK VAR INJECTION */(function($) {\"use strict\";\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\t\n\tvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\t\n\tvar _react = __webpack_require__(2);\n\t\n\tvar _react2 = _interopRequireDefault(_react);\n\t\n\tvar _reactRouter = __webpack_require__(54);\n\t\n\tvar _reactCssModules = __webpack_require__(46);\n\t\n\tvar _reactCssModules2 = _interopRequireDefault(_reactCssModules);\n\t\n\tvar _reactIntl = __webpack_require__(18);\n\t\n\tvar _utils = __webpack_require__(12);\n\t\n\tvar _WebPlayer = __webpack_require__(392);\n\t\n\tvar _WebPlayer2 = _interopRequireDefault(_WebPlayer);\n\t\n\tvar _common = __webpack_require__(50);\n\t\n\tvar _common2 = _interopRequireDefault(_common);\n\t\n\tvar _Sidebar = __webpack_require__(361);\n\t\n\tvar _Sidebar2 = _interopRequireDefault(_Sidebar);\n\t\n\tvar _Sidebar3 = __webpack_require__(614);\n\t\n\tvar _Sidebar4 = _interopRequireDefault(_Sidebar3);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\t\n\tfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\t\n\tfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // NPM imports\n\t\n\t\n\t// Local imports\n\t\n\t\n\t// Other components\n\t\n\t\n\t// Translations\n\t\n\t\n\t// Styles\n\t\n\t\n\t// Define translations\n\tvar sidebarLayoutMessages = (0, _reactIntl.defineMessages)((0, _utils.messagesMap)(Array.concat([], _common2.default, _Sidebar2.default)));\n\t\n\t/**\n\t * Sidebar layout component, putting children next to the sidebar menu.\n\t */\n\t\n\tvar SidebarLayoutIntl = function (_Component) {\n\t _inherits(SidebarLayoutIntl, _Component);\n\t\n\t function SidebarLayoutIntl() {\n\t _classCallCheck(this, SidebarLayoutIntl);\n\t\n\t return _possibleConstructorReturn(this, Object.getPrototypeOf(SidebarLayoutIntl).apply(this, arguments));\n\t }\n\t\n\t _createClass(SidebarLayoutIntl, [{\n\t key: \"render\",\n\t value: function render() {\n\t var _React$createElement;\n\t\n\t var formatMessage = this.props.intl.formatMessage;\n\t\n\t // Check active links\n\t\n\t var isActive = {\n\t discover: this.props.location.pathname == \"/discover\" ? \"active\" : \"link\",\n\t browse: this.props.location.pathname == \"/browse\" ? \"active\" : \"link\",\n\t artists: this.props.location.pathname == \"/artists\" ? \"active\" : \"link\",\n\t albums: this.props.location.pathname == \"/albums\" ? \"active\" : \"link\",\n\t songs: this.props.location.pathname == \"/songs\" ? \"active\" : \"link\",\n\t search: this.props.location.pathname == \"/search\" ? \"active\" : \"link\"\n\t };\n\t\n\t // Hamburger collapsing function\n\t var collapseHamburger = function collapseHamburger() {\n\t $(\"#main-navbar\").collapse(\"hide\");\n\t };\n\t\n\t return _react2.default.createElement(\n\t \"div\",\n\t null,\n\t _react2.default.createElement(\n\t \"div\",\n\t { className: \"row\" },\n\t _react2.default.createElement(\n\t \"div\",\n\t { className: \"col-xs-12 col-md-1 col-lg-2 sidebar\", styleName: \"sidebar\" },\n\t _react2.default.createElement(\n\t \"button\",\n\t { type: \"button\", className: \"navbar-toggle collapsed\", \"data-toggle\": \"collapse\", \"data-target\": \"#main-navbar\", \"aria-expanded\": \"false\", styleName: \"toggle\" },\n\t _react2.default.createElement(\n\t \"span\",\n\t { className: \"sr-only\" },\n\t _react2.default.createElement(_reactIntl.FormattedMessage, sidebarLayoutMessages[\"app.sidebarLayout.toggleNavigation\"])\n\t ),\n\t _react2.default.createElement(\"span\", { className: \"icon-bar\", styleName: \"icon-bar\" }),\n\t _react2.default.createElement(\"span\", { className: \"icon-bar\", styleName: \"icon-bar\" }),\n\t _react2.default.createElement(\"span\", { className: \"icon-bar\", styleName: \"icon-bar\" })\n\t ),\n\t _react2.default.createElement(\n\t \"h1\",\n\t { className: \"text-center\", styleName: \"title\" },\n\t _react2.default.createElement(\n\t _reactRouter.IndexLink,\n\t (_React$createElement = { styleName: \"link\", to: \"/\" }, _defineProperty(_React$createElement, \"styleName\", \"link\"), _defineProperty(_React$createElement, \"onClick\", collapseHamburger), _React$createElement),\n\t _react2.default.createElement(\"img\", { alt: \"A\", src: \"./img/ampache-blue.png\", styleName: \"imgTitle\" }),\n\t _react2.default.createElement(\n\t \"span\",\n\t { className: \"hidden-md\" },\n\t \"mpache\"\n\t )\n\t )\n\t ),\n\t _react2.default.createElement(\n\t \"nav\",\n\t { className: \"collapse\", styleName: \"collapse\", \"aria-label\": formatMessage(sidebarLayoutMessages[\"app.sidebarLayout.mainNavigationMenu\"]), id: \"main-navbar\", role: \"navigation\" },\n\t _react2.default.createElement(\n\t \"div\",\n\t { className: \"navbar text-center\", styleName: \"icon-navbar\" },\n\t _react2.default.createElement(\n\t \"div\",\n\t { className: \"container-fluid\", styleName: \"container-fluid\" },\n\t _react2.default.createElement(\n\t \"ul\",\n\t { className: \"nav navbar-nav\", styleName: \"nav\" },\n\t _react2.default.createElement(\n\t \"li\",\n\t null,\n\t _react2.default.createElement(\n\t _reactRouter.Link,\n\t { to: \"/\", title: formatMessage(sidebarLayoutMessages[\"app.sidebarLayout.home\"]), styleName: \"link\", onClick: collapseHamburger },\n\t _react2.default.createElement(\"span\", { className: \"glyphicon glyphicon-home\", \"aria-hidden\": \"true\" }),\n\t _react2.default.createElement(\n\t \"span\",\n\t { className: \"sr-only\" },\n\t _react2.default.createElement(_reactIntl.FormattedMessage, sidebarLayoutMessages[\"app.sidebarLayout.home\"])\n\t )\n\t )\n\t ),\n\t _react2.default.createElement(\n\t \"li\",\n\t null,\n\t _react2.default.createElement(\n\t _reactRouter.Link,\n\t { to: \"/settings\", title: formatMessage(sidebarLayoutMessages[\"app.sidebarLayout.settings\"]), styleName: \"link\", onClick: collapseHamburger },\n\t _react2.default.createElement(\"span\", { className: \"glyphicon glyphicon-wrench\", \"aria-hidden\": \"true\" }),\n\t _react2.default.createElement(\n\t \"span\",\n\t { className: \"sr-only\" },\n\t _react2.default.createElement(_reactIntl.FormattedMessage, sidebarLayoutMessages[\"app.sidebarLayout.settings\"])\n\t )\n\t )\n\t ),\n\t _react2.default.createElement(\n\t \"li\",\n\t null,\n\t _react2.default.createElement(\n\t _reactRouter.Link,\n\t { to: \"/logout\", title: formatMessage(sidebarLayoutMessages[\"app.sidebarLayout.logout\"]), styleName: \"link\", onClick: collapseHamburger },\n\t _react2.default.createElement(\"span\", { className: \"glyphicon glyphicon-off\", \"aria-hidden\": \"true\" }),\n\t _react2.default.createElement(\n\t \"span\",\n\t { className: \"sr-only\" },\n\t _react2.default.createElement(_reactIntl.FormattedMessage, sidebarLayoutMessages[\"app.sidebarLayout.logout\"])\n\t )\n\t )\n\t )\n\t )\n\t )\n\t ),\n\t _react2.default.createElement(\n\t \"ul\",\n\t { className: \"nav\", styleName: \"nav\" },\n\t _react2.default.createElement(\n\t \"li\",\n\t null,\n\t _react2.default.createElement(\n\t _reactRouter.Link,\n\t { to: \"/discover\", title: formatMessage(sidebarLayoutMessages[\"app.sidebarLayout.discover\"]), styleName: isActive.discover, onClick: collapseHamburger },\n\t _react2.default.createElement(\"span\", { className: \"glyphicon glyphicon-globe\", \"aria-hidden\": \"true\" }),\n\t _react2.default.createElement(\n\t \"span\",\n\t { className: \"hidden-md\" },\n\t \" \",\n\t _react2.default.createElement(_reactIntl.FormattedMessage, sidebarLayoutMessages[\"app.sidebarLayout.discover\"])\n\t )\n\t )\n\t ),\n\t _react2.default.createElement(\n\t \"li\",\n\t null,\n\t _react2.default.createElement(\n\t _reactRouter.Link,\n\t { to: \"/browse\", title: formatMessage(sidebarLayoutMessages[\"app.sidebarLayout.browse\"]), styleName: isActive.browse, onClick: collapseHamburger },\n\t _react2.default.createElement(\"span\", { className: \"glyphicon glyphicon-headphones\", \"aria-hidden\": \"true\" }),\n\t _react2.default.createElement(\n\t \"span\",\n\t { className: \"hidden-md\" },\n\t \" \",\n\t _react2.default.createElement(_reactIntl.FormattedMessage, sidebarLayoutMessages[\"app.sidebarLayout.browse\"])\n\t )\n\t ),\n\t _react2.default.createElement(\n\t \"ul\",\n\t { className: \"nav text-center\", styleName: \"nav-list\" },\n\t _react2.default.createElement(\n\t \"li\",\n\t null,\n\t _react2.default.createElement(\n\t _reactRouter.Link,\n\t { to: \"/artists\", title: formatMessage(sidebarLayoutMessages[\"app.sidebarLayout.browseArtists\"]), styleName: isActive.artists, onClick: collapseHamburger },\n\t _react2.default.createElement(\"span\", { className: \"glyphicon glyphicon-user\", \"aria-hidden\": \"true\" }),\n\t _react2.default.createElement(\n\t \"span\",\n\t { className: \"sr-only text-capitalize\" },\n\t _react2.default.createElement(_reactIntl.FormattedMessage, _extends({}, sidebarLayoutMessages[\"app.common.artist\"], { values: { itemCount: 42 } }))\n\t ),\n\t _react2.default.createElement(\n\t \"span\",\n\t { className: \"hidden-md text-capitalize\" },\n\t \" \",\n\t _react2.default.createElement(_reactIntl.FormattedMessage, _extends({}, sidebarLayoutMessages[\"app.common.artist\"], { values: { itemCount: 42 } }))\n\t )\n\t )\n\t ),\n\t _react2.default.createElement(\n\t \"li\",\n\t null,\n\t _react2.default.createElement(\n\t _reactRouter.Link,\n\t { to: \"/albums\", title: formatMessage(sidebarLayoutMessages[\"app.sidebarLayout.browseAlbums\"]), styleName: isActive.albums, onClick: collapseHamburger },\n\t _react2.default.createElement(\"span\", { className: \"glyphicon glyphicon-cd\", \"aria-hidden\": \"true\" }),\n\t _react2.default.createElement(\n\t \"span\",\n\t { className: \"sr-only text-capitalize\" },\n\t _react2.default.createElement(_reactIntl.FormattedMessage, _extends({}, sidebarLayoutMessages[\"app.common.album\"], { values: { itemCount: 42 } }))\n\t ),\n\t _react2.default.createElement(\n\t \"span\",\n\t { className: \"hidden-md text-capitalize\" },\n\t \" \",\n\t _react2.default.createElement(_reactIntl.FormattedMessage, _extends({}, sidebarLayoutMessages[\"app.common.album\"], { values: { itemCount: 42 } }))\n\t )\n\t )\n\t ),\n\t _react2.default.createElement(\n\t \"li\",\n\t null,\n\t _react2.default.createElement(\n\t _reactRouter.Link,\n\t { to: \"/songs\", title: formatMessage(sidebarLayoutMessages[\"app.sidebarLayout.browseSongs\"]), styleName: isActive.songs, onClick: collapseHamburger },\n\t _react2.default.createElement(\"span\", { className: \"glyphicon glyphicon-music\", \"aria-hidden\": \"true\" }),\n\t _react2.default.createElement(\n\t \"span\",\n\t { className: \"sr-only text-capitalize\" },\n\t _react2.default.createElement(_reactIntl.FormattedMessage, _extends({}, sidebarLayoutMessages[\"app.common.track\"], { values: { itemCount: 42 } }))\n\t ),\n\t _react2.default.createElement(\n\t \"span\",\n\t { className: \"hidden-md text-capitalize\" },\n\t \" \",\n\t _react2.default.createElement(_reactIntl.FormattedMessage, _extends({}, sidebarLayoutMessages[\"app.common.track\"], { values: { itemCount: 42 } }))\n\t )\n\t )\n\t )\n\t )\n\t )\n\t )\n\t ),\n\t _react2.default.createElement(_WebPlayer2.default, { location: this.props.location })\n\t )\n\t ),\n\t _react2.default.createElement(\n\t \"div\",\n\t { className: \"col-xs-12 col-md-11 col-md-offset-1 col-lg-10 col-lg-offset-2 main-panel\", styleName: \"main-panel\", onClick: collapseHamburger, role: \"main\" },\n\t this.props.children\n\t )\n\t );\n\t }\n\t }]);\n\t\n\t return SidebarLayoutIntl;\n\t}(_react.Component);\n\t\n\tSidebarLayoutIntl.propTypes = {\n\t children: _react.PropTypes.node,\n\t intl: _reactIntl.intlShape.isRequired\n\t};\n\texports.default = (0, _reactIntl.injectIntl)((0, _reactCssModules2.default)(SidebarLayoutIntl, _Sidebar4.default));\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(16)))\n\n/***/ },\n/* 347 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\"use strict\";\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\t\n\tvar _react = __webpack_require__(2);\n\t\n\tvar _react2 = _interopRequireDefault(_react);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\t\n\tfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\t\n\tfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // NPM imports\n\t\n\t\n\t/**\n\t * Simple layout, meaning just enclosing children in a div.\n\t */\n\tvar SimpleLayout = function (_Component) {\n\t _inherits(SimpleLayout, _Component);\n\t\n\t function SimpleLayout() {\n\t _classCallCheck(this, SimpleLayout);\n\t\n\t return _possibleConstructorReturn(this, Object.getPrototypeOf(SimpleLayout).apply(this, arguments));\n\t }\n\t\n\t _createClass(SimpleLayout, [{\n\t key: \"render\",\n\t value: function render() {\n\t return _react2.default.createElement(\n\t \"div\",\n\t null,\n\t this.props.children\n\t );\n\t }\n\t }]);\n\t\n\t return SimpleLayout;\n\t}(_react.Component);\n\t\n\texports.default = SimpleLayout;\n\n/***/ },\n/* 348 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\"use strict\";\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\t\n\tvar _react = __webpack_require__(2);\n\t\n\tvar _react2 = _interopRequireDefault(_react);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\t\n\tfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\t\n\tfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } /**\n\t * Main container at the top of our application components tree.\n\t *\n\t * Just a div wrapper around children for now.\n\t */\n\t\n\t\n\tvar App = function (_Component) {\n\t _inherits(App, _Component);\n\t\n\t function App() {\n\t _classCallCheck(this, App);\n\t\n\t return _possibleConstructorReturn(this, Object.getPrototypeOf(App).apply(this, arguments));\n\t }\n\t\n\t _createClass(App, [{\n\t key: \"render\",\n\t value: function render() {\n\t return _react2.default.createElement(\n\t \"div\",\n\t null,\n\t this.props.children\n\t );\n\t }\n\t }]);\n\t\n\t return App;\n\t}(_react.Component);\n\t\n\texports.default = App;\n\t\n\t\n\tApp.propTypes = {\n\t children: _react.PropTypes.node\n\t};\n\n/***/ },\n/* 349 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\"use strict\";\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.RequireAuthentication = undefined;\n\t\n\tvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\t\n\tvar _react = __webpack_require__(2);\n\t\n\tvar _react2 = _interopRequireDefault(_react);\n\t\n\tvar _reactRedux = __webpack_require__(47);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\t\n\tfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\t\n\tfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } /**\n\t * Container wrapping elements neeeding a valid session. Automatically\n\t * redirects to login form in case such session does not exist.\n\t */\n\t\n\t\n\tvar RequireAuthentication = exports.RequireAuthentication = function (_Component) {\n\t _inherits(RequireAuthentication, _Component);\n\t\n\t function RequireAuthentication() {\n\t _classCallCheck(this, RequireAuthentication);\n\t\n\t return _possibleConstructorReturn(this, Object.getPrototypeOf(RequireAuthentication).apply(this, arguments));\n\t }\n\t\n\t _createClass(RequireAuthentication, [{\n\t key: \"componentWillMount\",\n\t value: function componentWillMount() {\n\t // Check authentication on mount\n\t this.checkAuth(this.props.isAuthenticated);\n\t }\n\t }, {\n\t key: \"componentWillUpdate\",\n\t value: function componentWillUpdate(newProps) {\n\t // Check authentication on update\n\t this.checkAuth(newProps.isAuthenticated);\n\t }\n\t\n\t /**\n\t * Handle redirection in case user is not authenticated.\n\t *\n\t * @param isAuthenticated A boolean stating whether user has a valid\n\t * session or not.\n\t */\n\t\n\t }, {\n\t key: \"checkAuth\",\n\t value: function checkAuth(isAuthenticated) {\n\t if (!isAuthenticated) {\n\t // Redirect to login, redirecting to the actual page after login.\n\t this.context.router.replace({\n\t pathname: \"/login\",\n\t state: {\n\t nextPathname: this.props.location.pathname,\n\t nextQuery: this.props.location.query\n\t }\n\t });\n\t }\n\t }\n\t }, {\n\t key: \"render\",\n\t value: function render() {\n\t return _react2.default.createElement(\n\t \"div\",\n\t null,\n\t this.props.isAuthenticated === true ? this.props.children : null\n\t );\n\t }\n\t }]);\n\t\n\t return RequireAuthentication;\n\t}(_react.Component);\n\t\n\tRequireAuthentication.propTypes = {\n\t // Injected by React Router\n\t children: _react.PropTypes.node\n\t};\n\t\n\tRequireAuthentication.contextTypes = {\n\t router: _react.PropTypes.object.isRequired\n\t};\n\t\n\tvar mapStateToProps = function mapStateToProps(state) {\n\t return {\n\t isAuthenticated: state.auth.isAuthenticated\n\t };\n\t};\n\t\n\texports.default = (0, _reactRedux.connect)(mapStateToProps)(RequireAuthentication);\n\n/***/ },\n/* 350 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\"use strict\";\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\t\n\tvar _react = __webpack_require__(2);\n\t\n\tvar _react2 = _interopRequireDefault(_react);\n\t\n\tvar _reactRedux = __webpack_require__(47);\n\t\n\tvar _reactRouter = __webpack_require__(54);\n\t\n\tvar _reactIntl = __webpack_require__(18);\n\t\n\tvar _routes = __webpack_require__(372);\n\t\n\tvar _routes2 = _interopRequireDefault(_routes);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\t\n\tfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\t\n\tfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } /**\n\t * Root component to render, setting locale, messages, Router and Store.\n\t */\n\t\n\t\n\tvar Root = function (_Component) {\n\t _inherits(Root, _Component);\n\t\n\t function Root() {\n\t _classCallCheck(this, Root);\n\t\n\t return _possibleConstructorReturn(this, Object.getPrototypeOf(Root).apply(this, arguments));\n\t }\n\t\n\t _createClass(Root, [{\n\t key: \"render\",\n\t value: function render() {\n\t var _props = this.props;\n\t var locale = _props.locale;\n\t var messages = _props.messages;\n\t var defaultLocale = _props.defaultLocale;\n\t var store = _props.store;\n\t var history = _props.history;\n\t var render = _props.render;\n\t\n\t return _react2.default.createElement(\n\t _reactRedux.Provider,\n\t { store: store },\n\t _react2.default.createElement(\n\t _reactIntl.IntlProvider,\n\t { locale: locale, messages: messages, defaultLocale: defaultLocale },\n\t _react2.default.createElement(_reactRouter.Router, { history: history, routes: _routes2.default, render: render })\n\t )\n\t );\n\t }\n\t }]);\n\t\n\t return Root;\n\t}(_react.Component);\n\t\n\texports.default = Root;\n\t\n\t\n\tRoot.propTypes = {\n\t store: _react.PropTypes.object.isRequired,\n\t history: _react.PropTypes.object.isRequired,\n\t render: _react.PropTypes.func,\n\t locale: _react.PropTypes.string.isRequired,\n\t messages: _react.PropTypes.object.isRequired,\n\t defaultLocale: _react.PropTypes.string.isRequired\n\t};\n\n/***/ },\n/* 351 */\n/***/ function(module, exports) {\n\n\t\"use strict\";\n\t\n\tmodule.exports = {\n\t \"app.api.invalidResponse\": \"Invalid response text.\", // Invalid response from the API\n\t \"app.api.emptyResponse\": \"Empty response text.\", // Empty response from the API\n\t \"app.api.error\": \"Unknown API error.\", // An unknown error occurred from the API\n\t \"app.common.album\": \"{itemCount, plural, one {album} other {albums}}\", // Album\n\t \"app.common.art\": \"Art\", // Art\n\t \"app.common.artist\": \"{itemCount, plural, one {artist} other {artists}}\", // Artist\n\t \"app.common.cancel\": \"Cancel\", // Cancel\n\t \"app.common.close\": \"Close\", // Close\n\t \"app.common.go\": \"Go\", // Go\n\t \"app.common.loading\": \"Loading…\", // Loading indicator\n\t \"app.common.pause\": \"Pause\", // Pause icon description\n\t \"app.common.play\": \"Play\", // Play icon description\n\t \"app.common.playNext\": \"Play next\", // Play next icon descripton\n\t \"app.common.track\": \"{itemCount, plural, one {track} other {tracks}}\", // Track\n\t \"app.filter.filter\": \"Filter…\", // Filtering input placeholder\n\t \"app.filter.whatAreWeListeningToToday\": \"What are we listening to today?\", // Description for the filter bar\n\t \"app.grid.goToArtistPage\": \"Go to artist page\", // Artist thumbnail link title\n\t \"app.grid.goToAlbumPage\": \"Go to album page\", // Album thumbnail link title\n\t \"app.login.byebye\": \"See you soon!\", // Info message on successful logout\n\t \"app.login.connecting\": \"Connecting…\", // Info message while trying to connect\n\t \"app.login.endpointInputAriaLabel\": \"URL of your Ampache instance (e.g. http://ampache.example.com)\", // ARIA label for the endpoint input\n\t \"app.login.expired\": \"Your session expired… =(\", // Error message on expired session\n\t \"app.login.greeting\": \"Welcome back on Ampache, let's go!\", // Greeting to welcome the user to the app\n\t \"app.login.password\": \"Password\", // Password input placeholder\n\t \"app.login.rememberMe\": \"Remember me\", // Remember me checkbox label\n\t \"app.login.signIn\": \"Sign in\", // Sign in\n\t \"app.login.success\": \"Successfully logged in as { username }!\", // Info message on successful login.\n\t \"app.login.username\": \"Username\", // Username input placeholder\n\t \"app.pagination.current\": \"current\", // Current (page)\n\t \"app.pagination.goToPage\": \"
Go to page {pageNumber}\", // Link content to go to page N. span is here for screen-readers\n\t \"app.pagination.goToPageWithoutMarkup\": \"Go to page {pageNumber}\", // Link title to go to page N\n\t \"app.pagination.pageNavigation\": \"Page navigation\", // ARIA label for the nav block containing pagination\n\t \"app.pagination.pageToGoTo\": \"Page to go to?\", // Title of the pagination modal\n\t \"app.playlist.currentSongPlaying\": \"Current song playing\", // Current song playing\n\t \"app.playlist.emptyPlaylist\": \"Empty playlist\", // Empty playlist message\n\t \"app.playlist.flushPlaylist\": \"Empty the playlist\", // Empty the playlist link label\n\t \"app.playlist.fullPlaylist\": \"Full playlist\", // Full playlist\n\t \"app.playlist.playlist\": \"Playlist\", // Playlist translation\n\t \"app.settings.settings\": \"Settings\", // Settings translation\n\t \"app.sidebarLayout.browse\": \"Browse\", // Browse\n\t \"app.sidebarLayout.browseAlbums\": \"Browse albums\", // Browse albums\n\t \"app.sidebarLayout.browseArtists\": \"Browse artists\", // Browse artists\n\t \"app.sidebarLayout.browseSongs\": \"Browse songs\", // Browse songs\n\t \"app.sidebarLayout.discover\": \"Discover\", // Discover\n\t \"app.sidebarLayout.home\": \"Home\", // Home\n\t \"app.sidebarLayout.logout\": \"Logout\", // Logout\n\t \"app.sidebarLayout.mainNavigationMenu\": \"Main navigation menu\", // ARIA label for the main navigation menu\n\t \"app.sidebarLayout.settings\": \"Settings\", // Settings\n\t \"app.sidebarLayout.toggleNavigation\": \"Toggle navigation\", // Screen reader description of toggle navigation button\n\t \"app.songs.genre\": \"Genre\", // Genre (song)\n\t \"app.songs.length\": \"Length\", // Length (song)\n\t \"app.songs.title\": \"Title\", // Title (song)\n\t \"app.webplayer.by\": \"by\", // Artist affiliation of a song\n\t \"app.webplayer.next\": \"Next\", // Next button description\n\t \"app.webplayer.onLoadError\": \"Unable to load song\", // Error message in case a song could not be loaded\n\t \"app.webplayer.playlist\": \"Playlist\", // Playlist button description\n\t \"app.webplayer.previous\": \"Previous\", // Previous button description\n\t \"app.webplayer.random\": \"Random\", // Random button description\n\t \"app.webplayer.repeat\": \"Repeat\", // Repeat button description\n\t \"app.webplayer.unsupported\": \"Unsupported media type\", // Unsupported media type\n\t \"app.webplayer.volume\": \"Volume\" };\n\n/***/ },\n/* 352 */\n/***/ function(module, exports) {\n\n\t\"use strict\";\n\t\n\tmodule.exports = {\n\t \"app.api.invalidResponse\": \"Réponse invalide reçue.\", // Invalid response from the API\n\t \"app.api.emptyResponse\": \"Réponse vide reçue.\", // Empty response from the API\n\t \"app.api.error\": \"Erreur inconnue.\", // An unknown error occurred from the API\n\t \"app.common.album\": \"{itemCount, plural, one {album} other {albums}}\", // Albums\n\t \"app.common.art\": \"Pochette\", // Art\n\t \"app.common.artist\": \"{itemCount, plural, one {artiste} other {artistes}}\", // Artists\n\t \"app.common.cancel\": \"Annuler\", // Cancel\n\t \"app.common.close\": \"Fermer\", // Close\n\t \"app.common.go\": \"Aller\", // Go\n\t \"app.common.loading\": \"Chargement…\", // Loading indicator\n\t \"app.common.pause\": \"Pause\", // Pause icon description\n\t \"app.common.play\": \"Jouer\", // PLay icon description\n\t \"app.common.playNext\": \"Jouer après\", // Play next icon descripton\n\t \"app.common.track\": \"{itemCount, plural, one {piste} other {pistes}}\", // Track\n\t \"app.filter.filter\": \"Filtrer…\", // Filtering input placeholder\n\t \"app.filter.whatAreWeListeningToToday\": \"Que voulez-vous écouter aujourd'hui ?\", // Description for the filter bar\n\t \"app.grid.goToArtistPage\": \"Aller à la page de l'artiste\", // Artist thumbnail link title\n\t \"app.grid.goToAlbumPage\": \"Aller à la page de l'album\", // Album thumbnail link title\n\t \"app.login.byebye\": \"À bientôt !\", // Info message on successful logout\n\t \"app.login.connecting\": \"Connexion…\", // Info message while trying to connect\n\t \"app.login.endpointInputAriaLabel\": \"URL de votre Ampache (e.g. http://ampache.example.com)\", // ARIA label for the endpoint input\n\t \"app.login.expired\": \"Session expirée… =(\", // Error message on expired session\n\t \"app.login.greeting\": \"Bon retour sur Ampache, c'est parti !\", // Greeting to welcome the user to the app\n\t \"app.login.password\": \"Mot de passe\", // Password input placeholder\n\t \"app.login.rememberMe\": \"Se souvenir\", // Remember me checkbox label\n\t \"app.login.signIn\": \"Connexion\", // Sign in\n\t \"app.login.success\": \"Connecté en tant que { username } !\", // Info message on successful login.\n\t \"app.login.username\": \"Utilisateur\", // Username input placeholder\n\t \"app.pagination.current\": \"actuelle\", // Current (page)\n\t \"app.pagination.goToPage\": \"
Aller à la page {pageNumber}\", // Link content to go to page N. span is here for screen-readers\n\t \"app.pagination.goToPageWithoutMarkup\": \"Aller à la page {pageNumber}\", // Link title to go to page N\n\t \"app.pagination.pageNavigation\": \"Navigation entre les pages\", // ARIA label for the nav block containing pagination\n\t \"app.pagination.pageToGoTo\": \"Page à laquelle aller ?\", // Title of the pagination modal\n\t \"app.playlist.currentSongPlaying\": \"Piste en cours de lecture\", // Current song playing\n\t \"app.playlist.emptyPlaylist\": \"Liste de lecture vide\", // Empty playlist message\n\t \"app.playlist.flushPlaylist\": \"Vider la playlist\", // Empty the playlist link label\n\t \"app.playlist.fullPlaylist\": \"Playlist complète\", // Full playlist\n\t \"app.playlist.playlist\": \"Liste de lecture\", // Playlist translation\n\t \"app.settings.settings\": \"Préférences\", // Settings translation\n\t \"app.sidebarLayout.browse\": \"Explorer\", // Browse\n\t \"app.sidebarLayout.browseAlbums\": \"Parcourir les albums\", // Browse albums\n\t \"app.sidebarLayout.browseArtists\": \"Parcourir les artistes\", // Browse artists\n\t \"app.sidebarLayout.browseSongs\": \"Parcourir les pistes\", // Browse songs\n\t \"app.sidebarLayout.discover\": \"Découvrir\", // Discover\n\t \"app.sidebarLayout.home\": \"Accueil\", // Home\n\t \"app.sidebarLayout.logout\": \"Déconnexion\", // Logout\n\t \"app.sidebarLayout.mainNavigationMenu\": \"Menu principal\", // ARIA label for the main navigation menu\n\t \"app.sidebarLayout.settings\": \"Préférences\", // Settings\n\t \"app.sidebarLayout.toggleNavigation\": \"Afficher le menu\", // Screen reader description of toggle navigation button\n\t \"app.songs.genre\": \"Genre\", // Genre (song)\n\t \"app.songs.length\": \"Durée\", // Length (song)\n\t \"app.songs.title\": \"Titre\", // Title (song)\n\t \"app.webplayer.by\": \"par\", // Artist affiliation of a song\n\t \"app.webplayer.next\": \"Suivant\", // Next button description\n\t \"app.webplayer.onLoadError\": \"Impossible de charger la piste\", // Error message in case a song could not be loaded\n\t \"app.webplayer.playlist\": \"Liste de lecture\", // Playlist button description\n\t \"app.webplayer.previous\": \"Précédent\", // Previous button description\n\t \"app.webplayer.random\": \"Aléatoire\", // Random button description\n\t \"app.webplayer.repeat\": \"Répéter\", // Repeat button description\n\t \"app.webplayer.unsupported\": \"Format non supporté\", // Unsupported media type\n\t \"app.webplayer.volume\": \"Volume\" };\n\n/***/ },\n/* 353 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\"use strict\";\n\t\n\t// Export all the existing locales\n\tmodule.exports = {\n\t \"en-US\": __webpack_require__(351),\n\t \"fr-FR\": __webpack_require__(352)\n\t};\n\n/***/ },\n/* 354 */\n/***/ function(module, exports) {\n\n\t\"use strict\";\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\tvar messages = [{\n\t id: \"app.login.username\",\n\t defaultMessage: \"Username\",\n\t description: \"Username input placeholder\"\n\t}, {\n\t id: \"app.login.password\",\n\t defaultMessage: \"Password\",\n\t description: \"Password input placeholder\"\n\t}, {\n\t id: \"app.login.signIn\",\n\t defaultMessage: \"Sign in\",\n\t description: \"Sign in\"\n\t}, {\n\t id: \"app.login.endpointInputAriaLabel\",\n\t defaultMessage: \"URL of your Ampache instance (e.g. http://ampache.example.com)\",\n\t description: \"ARIA label for the endpoint input\"\n\t}, {\n\t id: \"app.login.rememberMe\",\n\t description: \"Remember me checkbox label\",\n\t defaultMessage: \"Remember me\"\n\t}, {\n\t id: \"app.login.greeting\",\n\t description: \"Greeting to welcome the user to the app\",\n\t defaultMessage: \"Welcome back on Ampache, let's go!\"\n\t},\n\t\n\t// From the auth reducer\n\t{\n\t id: \"app.login.connecting\",\n\t defaultMessage: \"Connecting…\",\n\t description: \"Info message while trying to connect\"\n\t}, {\n\t id: \"app.login.success\",\n\t defaultMessage: \"Successfully logged in as { username }!\",\n\t description: \"Info message on successful login.\"\n\t}, {\n\t id: \"app.login.byebye\",\n\t defaultMessage: \"See you soon!\",\n\t description: \"Info message on successful logout\"\n\t}, {\n\t id: \"app.login.expired\",\n\t defaultMessage: \"Your session expired… =(\",\n\t description: \"Error message on expired session\"\n\t}];\n\t\n\texports.default = messages;\n\n/***/ },\n/* 355 */\n/***/ function(module, exports) {\n\n\t\"use strict\";\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\tvar messages = [{\n\t \"id\": \"app.playlist.playlist\",\n\t \"defaultMessage\": \"Playlist\",\n\t \"description\": \"Playlist translation\"\n\t}, {\n\t \"id\": \"app.playlist.currentSongPlaying\",\n\t \"defaultMessage\": \"Current song playing\",\n\t \"description\": \"Current song playing\"\n\t}, {\n\t \"id\": \"app.playlist.fullPlaylist\",\n\t \"defaultMessage\": \"Full playlist\",\n\t \"description\": \"Full playlist\"\n\t}, {\n\t \"id\": \"app.playlist.emptyPlaylist\",\n\t \"defaultMessage\": \"Empty playlist\",\n\t \"description\": \"Empty playlist message\"\n\t}, {\n\t \"id\": \"app.playlist.flushPlaylist\",\n\t \"defaultMessage\": \"Empty the playlist\",\n\t \"description\": \"Empty the playlist link label\"\n\t}];\n\t\n\texports.default = messages;\n\n/***/ },\n/* 356 */\n/***/ function(module, exports) {\n\n\t\"use strict\";\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\tvar messages = [{\n\t \"id\": \"app.settings.settings\",\n\t \"defaultMessage\": \"Settings\",\n\t \"description\": \"Settings translation\"\n\t}];\n\t\n\texports.default = messages;\n\n/***/ },\n/* 357 */\n/***/ function(module, exports) {\n\n\t\"use strict\";\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\tvar messages = [{\n\t \"id\": \"app.songs.title\",\n\t \"description\": \"Title (song)\",\n\t \"defaultMessage\": \"Title\"\n\t}, {\n\t \"id\": \"app.songs.genre\",\n\t \"description\": \"Genre (song)\",\n\t \"defaultMessage\": \"Genre\"\n\t}, {\n\t \"id\": \"app.songs.length\",\n\t \"description\": \"Length (song)\",\n\t \"defaultMessage\": \"Length\"\n\t}];\n\t\n\texports.default = messages;\n\n/***/ },\n/* 358 */\n/***/ function(module, exports) {\n\n\t\"use strict\";\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\tvar messages = [{\n\t id: \"app.filter.filter\",\n\t defaultMessage: \"Filter…\",\n\t description: \"Filtering input placeholder\"\n\t}, {\n\t id: \"app.filter.whatAreWeListeningToToday\",\n\t description: \"Description for the filter bar\",\n\t defaultMessage: \"What are we listening to today?\"\n\t}];\n\t\n\texports.default = messages;\n\n/***/ },\n/* 359 */\n/***/ function(module, exports) {\n\n\t\"use strict\";\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\tvar messages = [{\n\t id: \"app.pagination.goToPage\",\n\t defaultMessage: \"
Go to page {pageNumber}\",\n\t description: \"Link content to go to page N. span is here for screen-readers\"\n\t}, {\n\t id: \"app.pagination.goToPageWithoutMarkup\",\n\t defaultMessage: \"Go to page {pageNumber}\",\n\t description: \"Link title to go to page N\"\n\t}, {\n\t id: \"app.pagination.pageNavigation\",\n\t defaultMessage: \"Page navigation\",\n\t description: \"ARIA label for the nav block containing pagination\"\n\t}, {\n\t id: \"app.pagination.pageToGoTo\",\n\t description: \"Title of the pagination modal\",\n\t defaultMessage: \"Page to go to?\"\n\t}, {\n\t id: \"app.pagination.current\",\n\t description: \"Current (page)\",\n\t defaultMessage: \"current\"\n\t}];\n\t\n\texports.default = messages;\n\n/***/ },\n/* 360 */\n/***/ function(module, exports) {\n\n\t\"use strict\";\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\tvar messages = [{\n\t id: \"app.grid.goToArtistPage\",\n\t defaultMessage: \"Go to artist page\",\n\t description: \"Artist thumbnail link title\"\n\t}, {\n\t id: \"app.grid.goToAlbumPage\",\n\t defaultMessage: \"Go to album page\",\n\t description: \"Album thumbnail link title\"\n\t}];\n\t\n\texports.default = messages;\n\n/***/ },\n/* 361 */\n/***/ function(module, exports) {\n\n\t\"use strict\";\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\tvar messages = [{\n\t id: \"app.sidebarLayout.mainNavigationMenu\",\n\t description: \"ARIA label for the main navigation menu\",\n\t defaultMessage: \"Main navigation menu\"\n\t}, {\n\t id: \"app.sidebarLayout.home\",\n\t description: \"Home\",\n\t defaultMessage: \"Home\"\n\t}, {\n\t id: \"app.sidebarLayout.settings\",\n\t description: \"Settings\",\n\t defaultMessage: \"Settings\"\n\t}, {\n\t id: \"app.sidebarLayout.logout\",\n\t description: \"Logout\",\n\t defaultMessage: \"Logout\"\n\t}, {\n\t id: \"app.sidebarLayout.discover\",\n\t description: \"Discover\",\n\t defaultMessage: \"Discover\"\n\t}, {\n\t id: \"app.sidebarLayout.browse\",\n\t description: \"Browse\",\n\t defaultMessage: \"Browse\"\n\t}, {\n\t id: \"app.sidebarLayout.browseArtists\",\n\t description: \"Browse artists\",\n\t defaultMessage: \"Browse artists\"\n\t}, {\n\t id: \"app.sidebarLayout.browseAlbums\",\n\t description: \"Browse albums\",\n\t defaultMessage: \"Browse albums\"\n\t}, {\n\t id: \"app.sidebarLayout.browseSongs\",\n\t description: \"Browse songs\",\n\t defaultMessage: \"Browse songs\"\n\t}, {\n\t id: \"app.sidebarLayout.toggleNavigation\",\n\t description: \"Screen reader description of toggle navigation button\",\n\t defaultMessage: \"Toggle navigation\"\n\t}];\n\t\n\texports.default = messages;\n\n/***/ },\n/* 362 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\"use strict\";\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.song = exports.album = exports.artist = undefined;\n\t\n\tvar _normalizr = __webpack_require__(283);\n\t\n\t// Define normalizr schemas for major entities returned by the API\n\tvar artist = exports.artist = new _normalizr.Schema(\"artist\"); /** Artist schema */\n\t/**\n\t * This file defines API related models.\n\t */\n\t\n\t// NPM imports\n\tvar album = exports.album = new _normalizr.Schema(\"album\"); /** Album schema */\n\tvar song = exports.song = new _normalizr.Schema(\"song\"); /** Song schema */\n\t\n\t// Explicit relations between them\n\tartist.define({ // Artist has albums and songs (tracks)\n\t albums: (0, _normalizr.arrayOf)(album),\n\t songs: (0, _normalizr.arrayOf)(song)\n\t});\n\t\n\talbum.define({ // Album has artist, tracks and tags\n\t artist: artist,\n\t tracks: (0, _normalizr.arrayOf)(song)\n\t});\n\t\n\tsong.define({ // Track has artist and album\n\t artist: artist,\n\t album: album\n\t});\n\n/***/ },\n/* 363 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\"use strict\";\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.stateRecord = exports.tokenRecord = undefined;\n\t\n\tvar _immutable = __webpack_require__(15);\n\t\n\tvar _immutable2 = _interopRequireDefault(_immutable);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\t/** Record to store token parameters */\n\tvar tokenRecord = exports.tokenRecord = _immutable2.default.Record({\n\t token: null, /** Token string */\n\t expires: null });\n\t\n\t/** Record to store the full auth state */\n\t/**\n\t * This file defines authentication related models.\n\t */\n\t\n\t// NPM imports\n\tvar stateRecord = exports.stateRecord = new _immutable2.default.Record({\n\t token: new tokenRecord(), /** Auth token */\n\t username: null, /** Username */\n\t endpoint: null, /** Ampache server base URL */\n\t rememberMe: false, /** Whether to remember me or not */\n\t isAuthenticated: false, /** Whether authentication is ok or not */\n\t isAuthenticating: false, /** Whether authentication is in progress or not */\n\t error: null, /** An error string */\n\t info: null, /** An info string */\n\t timerID: null });\n\n/***/ },\n/* 364 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\"use strict\";\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.stateRecord = undefined;\n\t\n\tvar _immutable = __webpack_require__(15);\n\t\n\tvar _immutable2 = _interopRequireDefault(_immutable);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\t/** Record to store the shared entities. */\n\tvar stateRecord = exports.stateRecord = new _immutable2.default.Record({\n\t isFetching: false, /** Whether API fetching is in progress */\n\t error: null, /** An error string */\n\t refCounts: new _immutable2.default.Map({\n\t album: new _immutable2.default.Map(),\n\t artist: new _immutable2.default.Map(),\n\t song: new _immutable2.default.Map()\n\t }), /** Map of id => reference count for each object type (garbage collection) */\n\t entities: new _immutable2.default.Map({\n\t album: new _immutable2.default.Map(),\n\t artist: new _immutable2.default.Map(),\n\t song: new _immutable2.default.Map()\n\t }) }); /**\n\t * This file defines entities storage models.\n\t */\n\t\n\t// NPM imports\n\n/***/ },\n/* 365 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\"use strict\";\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.stateRecord = undefined;\n\t\n\tvar _immutable = __webpack_require__(15);\n\t\n\tvar _immutable2 = _interopRequireDefault(_immutable);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\t/** Record to store the paginated pages state. */\n\tvar stateRecord = exports.stateRecord = new _immutable2.default.Record({\n\t type: null, /** Type of the paginated entries */\n\t result: new _immutable2.default.List(), /** List of IDs of the resulting entries, maps to the entities store */\n\t currentPage: 1, /** Number of current page */\n\t nPages: 1 }); // NPM import\n\n/***/ },\n/* 366 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\"use strict\";\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.stateRecord = undefined;\n\t\n\tvar _immutable = __webpack_require__(15);\n\t\n\tvar _immutable2 = _interopRequireDefault(_immutable);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\t/** Record to store the webplayer state. */\n\tvar stateRecord = exports.stateRecord = new _immutable2.default.Record({\n\t isPlaying: false, /** Whether webplayer is playing */\n\t isRandom: false, /** Whether random mode is on */\n\t isRepeat: false, /** Whether repeat mode is on */\n\t isMute: false, /** Whether sound is muted or not */\n\t volume: 100, /** Current volume, between 0 and 100 */\n\t currentIndex: 0, /** Current index in the playlist */\n\t playlist: new _immutable2.default.List(), /** List of songs IDs, references songs in the entities store */\n\t error: null }); /**\n\t * This file defines authentication related models.\n\t */\n\t\n\t// NPM imports\n\n/***/ },\n/* 367 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\"use strict\";\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _createReducer;\n\t\n\tvar _jsCookie = __webpack_require__(258);\n\t\n\tvar _jsCookie2 = _interopRequireDefault(_jsCookie);\n\t\n\tvar _utils = __webpack_require__(12);\n\t\n\tvar _i18n = __webpack_require__(80);\n\t\n\tvar _auth = __webpack_require__(363);\n\t\n\tvar _actions = __webpack_require__(26);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } /**\n\t * This implements the auth reducer, storing and updating authentication state.\n\t */\n\t\n\t// NPM imports\n\t\n\t\n\t// Local imports\n\t\n\t\n\t// Models\n\t\n\t\n\t// Actions\n\t\n\t\n\t/**\n\t * Initial state, load data from cookies if set\n\t */\n\tvar initialState = new _auth.stateRecord();\n\t// Get token\n\tvar initialToken = _jsCookie2.default.getJSON(\"token\");\n\tif (initialToken) {\n\t initialToken.expires = new Date(initialToken.expires);\n\t initialState = initialState.set(\"token\", new _auth.tokenRecord({ token: initialToken.token, expires: new Date(initialToken.expires) }));\n\t}\n\t// Get username\n\tvar initialUsername = _jsCookie2.default.get(\"username\");\n\tif (initialUsername) {\n\t initialState = initialState.set(\"username\", initialUsername);\n\t}\n\t// Get endpoint\n\tvar initialEndpoint = _jsCookie2.default.get(\"endpoint\");\n\tif (initialEndpoint) {\n\t initialState = initialState.set(\"endpoint\", initialEndpoint);\n\t}\n\t// Set remember me\n\tif (initialUsername && initialEndpoint) {\n\t initialState = initialState.set(\"rememberMe\", true);\n\t}\n\t\n\t/**\n\t * Reducers\n\t */\n\texports.default = (0, _utils.createReducer)(initialState, (_createReducer = {}, _defineProperty(_createReducer, _actions.LOGIN_USER_REQUEST, function () {\n\t return new _auth.stateRecord({\n\t isAuthenticating: true,\n\t info: new _i18n.i18nRecord({\n\t id: \"app.login.connecting\",\n\t values: {}\n\t })\n\t });\n\t}), _defineProperty(_createReducer, _actions.LOGIN_USER_SUCCESS, function (state, payload) {\n\t return new _auth.stateRecord({\n\t \"isAuthenticated\": true,\n\t \"token\": new _auth.tokenRecord(payload.token),\n\t \"username\": payload.username,\n\t \"endpoint\": payload.endpoint,\n\t \"rememberMe\": payload.rememberMe,\n\t \"info\": new _i18n.i18nRecord({\n\t id: \"app.login.success\",\n\t values: { username: payload.username }\n\t }),\n\t \"timerID\": payload.timerID\n\t });\n\t}), _defineProperty(_createReducer, _actions.LOGIN_USER_FAILURE, function (state, payload) {\n\t return new _auth.stateRecord({\n\t \"error\": payload.error\n\t });\n\t}), _defineProperty(_createReducer, _actions.LOGIN_USER_EXPIRED, function (state, payload) {\n\t return new _auth.stateRecord({\n\t \"isAuthenticated\": false,\n\t \"error\": payload.error\n\t });\n\t}), _defineProperty(_createReducer, _actions.LOGOUT_USER, function () {\n\t return new _auth.stateRecord({\n\t info: new _i18n.i18nRecord({\n\t id: \"app.login.byebye\",\n\t values: {}\n\t })\n\t });\n\t}), _createReducer));\n\n/***/ },\n/* 368 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\"use strict\";\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _createReducer;\n\t\n\tvar _immutable = __webpack_require__(15);\n\t\n\tvar _immutable2 = _interopRequireDefault(_immutable);\n\t\n\tvar _utils = __webpack_require__(12);\n\t\n\tvar _entities = __webpack_require__(364);\n\t\n\tvar _actions = __webpack_require__(26);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } /**\n\t * This implements the global entities reducer.\n\t */\n\t\n\t// NPM imports\n\t\n\t\n\t// Local imports\n\t\n\t\n\t// Models\n\t\n\t\n\t// Actions\n\t\n\t\n\t/**\n\t * Helper methods\n\t */\n\t\n\t/**\n\t * Update the reference counter for a given item.\n\t *\n\t * Do not do any garbage collection.\n\t *\n\t * @param state The state object to update.\n\t * @param keyPath The keyPath to update, from the refCount key.\n\t * @param incr The increment (or decrement) for the reference counter.\n\t *\n\t * @return An updated state.\n\t */\n\tfunction updateRefCount(state, keyPath, incr) {\n\t // Prepend refCounts to keyPath\n\t var refCountKeyPath = Array.concat([\"refCounts\"], keyPath);\n\t // Get updated value\n\t var newRefCount = state.getIn(refCountKeyPath) + incr;\n\t if (isNaN(newRefCount)) {\n\t // If NaN, reference does not exist, so set it to ±1\n\t newRefCount = Math.sign(incr);\n\t }\n\t // Update state\n\t return state.setIn(refCountKeyPath, newRefCount);\n\t}\n\t\n\t/**\n\t * Update the reference counter of a given entity, taking into account the\n\t * nested objects.\n\t *\n\t * Do not do any garbage collection.\n\t *\n\t * @param state The state object to update.\n\t * @param itemName The type of the entity object.\n\t * @param id The id of the entity.\n\t * @param entity The entity object, as Immutable.\n\t * @param incr The increment (or decrement) for the reference counter.\n\t *\n\t * @return An updated state.\n\t */\n\tfunction updateEntityRefCount(state, itemName, id, entity, incr) {\n\t var newState = state;\n\t var albums = null;\n\t var tracks = null;\n\t switch (itemName) {\n\t case \"artist\":\n\t // Update artist refCount\n\t newState = updateRefCount(newState, [\"artist\", id], incr);\n\t // Update nested albums refCount\n\t albums = entity.get(\"albums\");\n\t if (_immutable2.default.List.isList(albums)) {\n\t albums.forEach(function (id) {\n\t newState = updateRefCount(newState, [\"album\", id], incr);\n\t });\n\t }\n\t // Update nested tracks refCount\n\t tracks = entity.get(\"songs\");\n\t if (_immutable2.default.List.isList(tracks)) {\n\t tracks.forEach(function (id) {\n\t newState = updateRefCount(newState, [\"song\", id], incr);\n\t });\n\t }\n\t break;\n\t case \"album\":\n\t // Update album refCount\n\t newState = updateRefCount(newState, [\"album\", id], incr);\n\t // Update nested artist refCount\n\t newState = updateRefCount(newState, [\"artist\", entity.get(\"artist\")], incr);\n\t // Update nested tracks refCount\n\t tracks = entity.get(\"tracks\");\n\t if (_immutable2.default.List.isList(tracks)) {\n\t tracks.forEach(function (id) {\n\t newState = updateRefCount(newState, [\"song\", id], incr);\n\t });\n\t }\n\t break;\n\t case \"song\":\n\t // Update track refCount\n\t newState = updateRefCount(newState, [\"song\", id], incr);\n\t // Update nested artist refCount\n\t newState = updateRefCount(newState, [\"artist\", entity.get(\"artist\")], incr);\n\t // Update nested album refCount\n\t newState = updateRefCount(newState, [\"album\", entity.get(\"album\")], incr);\n\t break;\n\t default:\n\t // Just update the entity, no nested entities\n\t newState = updateRefCount(newState, [itemName, id], incr);\n\t break;\n\t }\n\t return newState;\n\t}\n\t\n\t/**\n\t *\n\t */\n\tfunction garbageCollection(state) {\n\t var newState = state;\n\t state.refCounts.forEach(function (refCounts, itemName) {\n\t refCounts.forEach(function (refCount, id) {\n\t if (refCount < 1) {\n\t // Garbage collection\n\t newState = newState.deleteIn([\"entities\", itemName, id]);\n\t newState = newState.deleteIn([\"refCounts\", itemName, id]);\n\t }\n\t });\n\t });\n\t return newState;\n\t}\n\t\n\t/**\n\t * Initial state\n\t */\n\tvar initialState = new _entities.stateRecord();\n\t\n\t/**\n\t * Reducer\n\t */\n\texports.default = (0, _utils.createReducer)(initialState, (_createReducer = {}, _defineProperty(_createReducer, _actions.API_REQUEST, function (state) {\n\t return state.set(\"isFetching\", true).set(\"error\", null);\n\t}), _defineProperty(_createReducer, _actions.API_FAILURE, function (state, payload) {\n\t return state.set(\"isFetching\", false).set(\"error\", payload.error);\n\t}), _defineProperty(_createReducer, _actions.PUSH_ENTITIES, function (state, payload) {\n\t var newState = state;\n\t\n\t // Unset error and isFetching\n\t newState = state.set(\"isFetching\", false).set(\"error\", payload.error);\n\t\n\t // Merge entities\n\t newState = newState.mergeDeepIn([\"entities\"], payload.entities);\n\t\n\t // Increment reference counter\n\t payload.refCountType.forEach(function (itemName) {\n\t var entities = payload.entities[itemName];\n\t for (var id in entities) {\n\t var entity = newState.getIn([\"entities\", itemName, id]);\n\t newState = updateEntityRefCount(newState, itemName, id, entity, 1);\n\t }\n\t });\n\t\n\t return newState;\n\t}), _defineProperty(_createReducer, _actions.INCREMENT_REFCOUNT, function (state, payload) {\n\t var newState = state;\n\t\n\t // Increment reference counter\n\t\n\t var _loop = function _loop(itemName) {\n\t var entities = payload.entities[itemName];\n\t entities.forEach(function (id) {\n\t var entity = newState.getIn([\"entities\", itemName, id]);\n\t newState = updateEntityRefCount(newState, itemName, id, entity, 1);\n\t });\n\t };\n\t\n\t for (var itemName in payload.entities) {\n\t _loop(itemName);\n\t }\n\t\n\t return newState;\n\t}), _defineProperty(_createReducer, _actions.DECREMENT_REFCOUNT, function (state, payload) {\n\t var newState = state;\n\t\n\t // Decrement reference counter\n\t\n\t var _loop2 = function _loop2(itemName) {\n\t var entities = payload.entities[itemName];\n\t entities.forEach(function (id) {\n\t var entity = newState.getIn([\"entities\", itemName, id]);\n\t newState = updateEntityRefCount(newState, itemName, id, entity, -1);\n\t });\n\t };\n\t\n\t for (var itemName in payload.entities) {\n\t _loop2(itemName);\n\t }\n\t\n\t // Perform garbage collection\n\t newState = garbageCollection(newState);\n\t\n\t return newState;\n\t}), _defineProperty(_createReducer, _actions.INVALIDATE_STORE, function () {\n\t return new _entities.stateRecord();\n\t}), _createReducer));\n\n/***/ },\n/* 369 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\"use strict\";\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _reactRouterRedux = __webpack_require__(97);\n\t\n\tvar _redux = __webpack_require__(39);\n\t\n\tvar _auth = __webpack_require__(367);\n\t\n\tvar _auth2 = _interopRequireDefault(_auth);\n\t\n\tvar _entities = __webpack_require__(368);\n\t\n\tvar _entities2 = _interopRequireDefault(_entities);\n\t\n\tvar _paginated = __webpack_require__(370);\n\t\n\tvar _paginated2 = _interopRequireDefault(_paginated);\n\t\n\tvar _webplayer = __webpack_require__(371);\n\t\n\tvar _webplayer2 = _interopRequireDefault(_webplayer);\n\t\n\tvar _actions = __webpack_require__(26);\n\t\n\tvar ActionTypes = _interopRequireWildcard(_actions);\n\t\n\tfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\t// Build paginated reducer\n\tvar paginated = (0, _paginated2.default)([ActionTypes.API_REQUEST, ActionTypes.API_SUCCESS, ActionTypes.API_FAILURE]);\n\t\n\t// Export the combined reducers\n\t\n\t\n\t// Actions\n\t\n\t\n\t// Import all the available reducers\n\t/**\n\t *\n\t */\n\t\n\t// NPM imports\n\texports.default = (0, _redux.combineReducers)({\n\t routing: _reactRouterRedux.routerReducer,\n\t auth: _auth2.default,\n\t entities: _entities2.default,\n\t paginated: paginated,\n\t webplayer: _webplayer2.default\n\t});\n\n/***/ },\n/* 370 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\"use strict\";\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }(); /**\n\t * This implements a wrapper to create reducers for paginated content.\n\t */\n\t\n\t// NPM imports\n\t\n\t\n\t// Local imports\n\t\n\t\n\t// Models\n\t\n\t\n\t// Actions\n\t\n\t\n\texports.default = paginated;\n\t\n\tvar _immutable = __webpack_require__(15);\n\t\n\tvar _immutable2 = _interopRequireDefault(_immutable);\n\t\n\tvar _utils = __webpack_require__(12);\n\t\n\tvar _paginated = __webpack_require__(365);\n\t\n\tvar _actions = __webpack_require__(26);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\t\n\t/** Initial state of the reducer */\n\tvar initialState = new _paginated.stateRecord();\n\t\n\t/**\n\t * Creates a reducer managing pagination, given the action types to handle.\n\t */\n\tfunction paginated(types) {\n\t var _createReducer;\n\t\n\t // Check parameters\n\t if (!Array.isArray(types) || types.length !== 3) {\n\t throw new Error(\"Expected types to be an array of three elements.\");\n\t }\n\t if (!types.every(function (t) {\n\t return typeof t === \"string\";\n\t })) {\n\t throw new Error(\"Expected types to be strings.\");\n\t }\n\t\n\t var _types = _slicedToArray(types, 3);\n\t\n\t var requestType = _types[0];\n\t var successType = _types[1];\n\t var failureType = _types[2];\n\t\n\t // Create reducer\n\t\n\t return (0, _utils.createReducer)(initialState, (_createReducer = {}, _defineProperty(_createReducer, requestType, function (state) {\n\t return state;\n\t }), _defineProperty(_createReducer, successType, function (state, payload) {\n\t return state.set(\"type\", payload.type).set(\"result\", _immutable2.default.fromJS(payload.result)).set(\"nPages\", payload.nPages).set(\"currentPage\", payload.currentPage);\n\t }), _defineProperty(_createReducer, failureType, function (state) {\n\t return state;\n\t }), _defineProperty(_createReducer, _actions.CLEAR_PAGINATED_RESULTS, function (state) {\n\t return state.set(\"result\", new _immutable2.default.List());\n\t }), _defineProperty(_createReducer, _actions.INVALIDATE_STORE, function () {\n\t // Reset state on invalidation\n\t return new _paginated.stateRecord();\n\t }), _createReducer));\n\t}\n\n/***/ },\n/* 371 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\"use strict\";\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _createReducer;\n\t\n\tvar _immutable = __webpack_require__(15);\n\t\n\tvar _immutable2 = _interopRequireDefault(_immutable);\n\t\n\tvar _utils = __webpack_require__(12);\n\t\n\tvar _webplayer = __webpack_require__(366);\n\t\n\tvar _actions = __webpack_require__(26);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } /**\n\t * This implements the webplayer reducers.\n\t */\n\t\n\t// NPM imports\n\t\n\t\n\t// Local imports\n\t\n\t\n\t// Models\n\t\n\t\n\t// Actions\n\t\n\t\n\t/**\n\t * Initial state\n\t */\n\t\n\tvar initialState = new _webplayer.stateRecord();\n\t\n\t/**\n\t * Reducers\n\t */\n\t\n\texports.default = (0, _utils.createReducer)(initialState, (_createReducer = {}, _defineProperty(_createReducer, _actions.PLAY_PAUSE, function (state, payload) {\n\t // Force play or pause\n\t return state.set(\"isPlaying\", payload.isPlaying).set(\"error\", null);\n\t}), _defineProperty(_createReducer, _actions.STOP_PLAYBACK, function (state) {\n\t // Clear the playlist\n\t return state.set(\"isPlaying\", false).set(\"currentIndex\", 0).set(\"playlist\", new _immutable2.default.List()).set(\"error\", null);\n\t}), _defineProperty(_createReducer, _actions.SET_PLAYLIST, function (state, payload) {\n\t // Set current playlist, reset playlist index\n\t return state.set(\"playlist\", new _immutable2.default.List(payload.playlist)).set(\"currentIndex\", 0).set(\"error\", null);\n\t}), _defineProperty(_createReducer, _actions.PUSH_SONG, function (state, payload) {\n\t // Push song to playlist\n\t var newState = state;\n\t if (payload.index) {\n\t // If index is specified, insert it at this position\n\t newState = newState.set(\"playlist\", newState.get(\"playlist\").insert(payload.index, payload.song));\n\t if (payload.index <= newState.get(\"currentIndex\")) {\n\t // \"<=\" because insertion is made before\n\t // If we insert before the current position in the playlist, we\n\t // update the current position to keep the currently played\n\t // music\n\t newState = newState.set(\"currentIndex\", Math.min(newState.get(\"currentIndex\") + 1, newState.get(\"playlist\").size));\n\t }\n\t } else {\n\t // Else, push at the end of the playlist\n\t newState = newState.set(\"playlist\", newState.get(\"playlist\").push(payload.song));\n\t }\n\t return newState;\n\t}), _defineProperty(_createReducer, _actions.POP_SONG, function (state, payload) {\n\t // Pop song from playlist\n\t var newState = state.deleteIn([\"playlist\", payload.index]);\n\t if (payload.index < state.get(\"currentIndex\")) {\n\t // If we delete before the current position in the playlist, we\n\t // update the current position to keep the currently played\n\t // music\n\t newState = newState.set(\"currentIndex\", Math.max(newState.get(\"currentIndex\") - 1, 0));\n\t } else if (payload.index == state.get(\"currentIndex\")) {\n\t // If we remove current song, clear the error as well\n\t newState = newState.set(\"error\", null);\n\t }\n\t return newState;\n\t}), _defineProperty(_createReducer, _actions.JUMP_TO_SONG, function (state, payload) {\n\t // Set current index\n\t var newCurrentIndex = state.get(\"playlist\").findKey(function (x) {\n\t return x == payload.song;\n\t });\n\t return state.set(\"currentIndex\", newCurrentIndex);\n\t}), _defineProperty(_createReducer, _actions.PLAY_PREVIOUS_SONG, function (state) {\n\t var newIndex = state.get(\"currentIndex\") - 1;\n\t if (newIndex < 0) {\n\t // If there is an overlow on the left of the playlist, just play\n\t // first music again\n\t // TODO: Should seek to beginning of music\n\t return state.set(\"error\", null);\n\t } else {\n\t return state.set(\"currentIndex\", newIndex).set(\"error\", null);\n\t }\n\t}), _defineProperty(_createReducer, _actions.PLAY_NEXT_SONG, function (state) {\n\t var newIndex = state.get(\"currentIndex\") + 1;\n\t if (newIndex >= state.get(\"playlist\").size) {\n\t // If there is an overflow\n\t if (state.get(\"isRepeat\")) {\n\t // If we are at the end of the playlist and repeat mode is on,\n\t // just play back first song.\n\t newIndex = 0;\n\t } else {\n\t // Just stop playback\n\t return state.set(\"isPlaying\", false).set(\"error\", null);\n\t }\n\t } else {\n\t // Else, play next item\n\t return state.set(\"currentIndex\", newIndex).set(\"error\", null);\n\t }\n\t}), _defineProperty(_createReducer, _actions.TOGGLE_RANDOM, function (state) {\n\t return state.set(\"isRandom\", !state.get(\"isRandom\"));\n\t}), _defineProperty(_createReducer, _actions.TOGGLE_REPEAT, function (state) {\n\t return state.set(\"isRepeat\", !state.get(\"isRepeat\"));\n\t}), _defineProperty(_createReducer, _actions.TOGGLE_MUTE, function (state) {\n\t return state.set(\"isMute\", !state.get(\"isMute\"));\n\t}), _defineProperty(_createReducer, _actions.SET_VOLUME, function (state, payload) {\n\t return state.set(\"volume\", payload.volume);\n\t}), _defineProperty(_createReducer, _actions.SET_ERROR, function (state, payload) {\n\t return state.set(\"isPlaying\", false).set(\"error\", payload.error);\n\t}), _defineProperty(_createReducer, _actions.INVALIDATE_STORE, function () {\n\t return new _webplayer.stateRecord();\n\t}), _createReducer));\n\n/***/ },\n/* 372 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\"use strict\";\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _react = __webpack_require__(2);\n\t\n\tvar _react2 = _interopRequireDefault(_react);\n\t\n\tvar _reactRouter = __webpack_require__(54);\n\t\n\tvar _RequireAuthentication = __webpack_require__(349);\n\t\n\tvar _RequireAuthentication2 = _interopRequireDefault(_RequireAuthentication);\n\t\n\tvar _App = __webpack_require__(348);\n\t\n\tvar _App2 = _interopRequireDefault(_App);\n\t\n\tvar _Simple = __webpack_require__(347);\n\t\n\tvar _Simple2 = _interopRequireDefault(_Simple);\n\t\n\tvar _Sidebar = __webpack_require__(346);\n\t\n\tvar _Sidebar2 = _interopRequireDefault(_Sidebar);\n\t\n\tvar _ArtistPage = __webpack_require__(383);\n\t\n\tvar _ArtistPage2 = _interopRequireDefault(_ArtistPage);\n\t\n\tvar _ArtistsPage = __webpack_require__(142);\n\t\n\tvar _ArtistsPage2 = _interopRequireDefault(_ArtistsPage);\n\t\n\tvar _AlbumsPage = __webpack_require__(382);\n\t\n\tvar _AlbumsPage2 = _interopRequireDefault(_AlbumsPage);\n\t\n\tvar _BrowsePage = __webpack_require__(384);\n\t\n\tvar _BrowsePage2 = _interopRequireDefault(_BrowsePage);\n\t\n\tvar _DiscoverPage = __webpack_require__(385);\n\t\n\tvar _DiscoverPage2 = _interopRequireDefault(_DiscoverPage);\n\t\n\tvar _HomePage = __webpack_require__(386);\n\t\n\tvar _HomePage2 = _interopRequireDefault(_HomePage);\n\t\n\tvar _LoginPage = __webpack_require__(387);\n\t\n\tvar _LoginPage2 = _interopRequireDefault(_LoginPage);\n\t\n\tvar _LogoutPage = __webpack_require__(388);\n\t\n\tvar _LogoutPage2 = _interopRequireDefault(_LogoutPage);\n\t\n\tvar _PlaylistPage = __webpack_require__(389);\n\t\n\tvar _PlaylistPage2 = _interopRequireDefault(_PlaylistPage);\n\t\n\tvar _SongsPage = __webpack_require__(391);\n\t\n\tvar _SongsPage2 = _interopRequireDefault(_SongsPage);\n\t\n\tvar _SettingsPage = __webpack_require__(390);\n\t\n\tvar _SettingsPage2 = _interopRequireDefault(_SettingsPage);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\texports.default = _react2.default.createElement(\n\t _reactRouter.Route,\n\t { path: \"/\", component: _App2.default },\n\t \" // Main container is App\",\n\t _react2.default.createElement(\n\t _reactRouter.Route,\n\t { path: \"login\", component: _Simple2.default },\n\t \" // Login is a SimpleLayout\",\n\t _react2.default.createElement(_reactRouter.IndexRoute, { component: _LoginPage2.default })\n\t ),\n\t _react2.default.createElement(\n\t _reactRouter.Route,\n\t { component: _Sidebar2.default },\n\t \" // All the rest is a SidebarLayout\",\n\t _react2.default.createElement(_reactRouter.Route, { path: \"logout\", component: _LogoutPage2.default }),\n\t _react2.default.createElement(\n\t _reactRouter.Route,\n\t { component: _RequireAuthentication2.default },\n\t \" // And some pages require authentication\",\n\t _react2.default.createElement(_reactRouter.Route, { path: \"discover\", component: _DiscoverPage2.default }),\n\t _react2.default.createElement(_reactRouter.Route, { path: \"browse\", component: _BrowsePage2.default }),\n\t _react2.default.createElement(_reactRouter.Route, { path: \"artists\", component: _ArtistsPage2.default }),\n\t _react2.default.createElement(_reactRouter.Route, { path: \"artist/:artist\", component: _ArtistPage2.default }),\n\t _react2.default.createElement(_reactRouter.Route, { path: \"albums\", component: _AlbumsPage2.default }),\n\t _react2.default.createElement(_reactRouter.Route, { path: \"artist/:artist/album/:album\", component: _ArtistPage2.default }),\n\t _react2.default.createElement(_reactRouter.Route, { path: \"songs\", component: _SongsPage2.default }),\n\t _react2.default.createElement(_reactRouter.Route, { path: \"playlist\", component: _PlaylistPage2.default }),\n\t _react2.default.createElement(_reactRouter.Route, { path: \"settings\", component: _SettingsPage2.default }),\n\t _react2.default.createElement(_reactRouter.IndexRoute, { component: _HomePage2.default })\n\t )\n\t )\n\t); /**\n\t * Routes for the React app.\n\t */\n\n/***/ },\n/* 373 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\"use strict\";\n\t\n\t/**\n\t * Store configuration\n\t */\n\tif (true) {\n\t module.exports = __webpack_require__(374);\n\t} else {\n\t module.exports = require(\"./configureStore.development.js\");\n\t}\n\n/***/ },\n/* 374 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\"use strict\";\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.default = configureStore;\n\t\n\tvar _redux = __webpack_require__(39);\n\t\n\tvar _reactRouter = __webpack_require__(54);\n\t\n\tvar _reactRouterRedux = __webpack_require__(97);\n\t\n\tvar _reduxThunk = __webpack_require__(864);\n\t\n\tvar _reduxThunk2 = _interopRequireDefault(_reduxThunk);\n\t\n\tvar _reducers = __webpack_require__(369);\n\t\n\tvar _reducers2 = _interopRequireDefault(_reducers);\n\t\n\tvar _api = __webpack_require__(141);\n\t\n\tvar _api2 = _interopRequireDefault(_api);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\t// Use history\n\tvar historyMiddleware = (0, _reactRouterRedux.routerMiddleware)(_reactRouter.hashHistory);\n\t\n\tfunction configureStore(preloadedState) {\n\t return (0, _redux.createStore)(_reducers2.default, preloadedState, (0, _redux.applyMiddleware)(_reduxThunk2.default, _api2.default, historyMiddleware));\n\t}\n\n/***/ },\n/* 375 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\"use strict\";\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.buildHMAC = buildHMAC;\n\t\n\tvar _jssha = __webpack_require__(664);\n\t\n\tvar _jssha2 = _interopRequireDefault(_jssha);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\t/**\n\t * Build an HMAC token for authentication against Ampache API.\n\t *\n\t * @param password User password to derive HMAC from.\n\t * @return An object with the generated HMAC and time used.\n\t *\n\t * @remark This builds an HMAC as expected by Ampache API, which is not a\n\t * standard HMAC.\n\t */\n\tfunction buildHMAC(password) {\n\t var time = Math.floor(Date.now() / 1000);\n\t\n\t var shaObj = new _jssha2.default(\"SHA-256\", \"TEXT\");\n\t shaObj.update(password);\n\t var key = shaObj.getHash(\"HEX\");\n\t\n\t shaObj = new _jssha2.default(\"SHA-256\", \"TEXT\");\n\t shaObj.update(time + key);\n\t\n\t return {\n\t time: time,\n\t passphrase: shaObj.getHash(\"HEX\")\n\t };\n\t} /**\n\t * Collection of helper function that are Ampache specific.\n\t */\n\t\n\t// NPM imports\n\n/***/ },\n/* 376 */\n/***/ function(module, exports) {\n\n\t\"use strict\";\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.immutableDiff = immutableDiff;\n\t/**\n\t * Collection of helper function to act on Immutable objects.\n\t */\n\t\n\t/**\n\t * Diff two immutables objects supporting the filter method.\n\t *\n\t * @param a First Immutable object.\n\t * @param b Second Immutable object.\n\t * @returns An Immutable object equal to a except for the items in b.\n\t */\n\tfunction immutableDiff(a, b) {\n\t return a.filter(function (i) {\n\t return b.indexOf(i) < 0;\n\t });\n\t}\n\n/***/ },\n/* 377 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\"use strict\";\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.getBrowserLocales = getBrowserLocales;\n\texports.messagesMap = messagesMap;\n\texports.handleErrorI18nObject = handleErrorI18nObject;\n\t\n\tvar _i18n = __webpack_require__(80);\n\t\n\t/**\n\t * Get the preferred locales from the browser, as an array sorted by preferences.\n\t */\n\tfunction getBrowserLocales() {\n\t var langs = [];\n\t\n\t if (navigator.languages) {\n\t // Chrome does not currently set navigator.language correctly\n\t // https://code.google.com/p/chromium/issues/detail?id=101138\n\t // but it does set the first element of navigator.languages correctly\n\t langs = navigator.languages;\n\t } else if (navigator.userLanguage) {\n\t // IE only\n\t langs = [navigator.userLanguage];\n\t } else {\n\t // as of this writing the latest version of firefox + safari set this correctly\n\t langs = [navigator.language];\n\t }\n\t\n\t // Some browsers does not return uppercase for second part\n\t var locales = langs.map(function (lang) {\n\t var locale = lang.split(\"-\");\n\t return locale[1] ? locale[0] + \"-\" + locale[1].toUpperCase() : lang;\n\t });\n\t\n\t return locales;\n\t}\n\t\n\t/**\n\t * Convert an array of messagesDescriptors to a map.\n\t */\n\t/**\n\t * Collection of helper functions to deal with localization.\n\t */\n\tfunction messagesMap(messagesDescriptorsArray) {\n\t var messagesDescriptorsMap = {};\n\t\n\t messagesDescriptorsArray.forEach(function (item) {\n\t messagesDescriptorsMap[item.id] = item;\n\t });\n\t\n\t return messagesDescriptorsMap;\n\t}\n\t\n\t/**\n\t * Format an error message from the state.\n\t *\n\t * Error message can be either an i18nRecord, which is to be formatted, or a\n\t * raw string. This function performs the check and returns the correctly\n\t * formatted string.\n\t *\n\t * @param errorMessage The error message from the state, either plain\n\t * string or i18nRecord.\n\t * @param formatMessage react-i18n formatMessage.\n\t * @param messages List of messages to use for formatting.\n\t *\n\t * @return A string for the error.\n\t */\n\tfunction handleErrorI18nObject(errorMessage, formatMessage, messages) {\n\t if (errorMessage instanceof _i18n.i18nRecord) {\n\t // If it is an object, format it and return it\n\t return formatMessage(messages[errorMessage.id], errorMessage.values);\n\t }\n\t // Else, it's a string, just return it\n\t return errorMessage;\n\t}\n\n/***/ },\n/* 378 */\n/***/ function(module, exports) {\n\n\t\"use strict\";\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.filterInt = filterInt;\n\texports.formatLength = formatLength;\n\t/**\n\t * Miscellaneous helper functions.\n\t */\n\t\n\t/**\n\t * Strict int checking function.\n\t *\n\t * @param value The value to check for int.\n\t * @return Either NaN if the string was not a valid int representation, or the\n\t * int.\n\t */\n\tfunction filterInt(value) {\n\t if (/^(\\-|\\+)?([0-9]+|Infinity)$/.test(value)) {\n\t return Number(value);\n\t }\n\t return NaN;\n\t}\n\t\n\t/**\n\t * Helper to format song length.\n\t *\n\t * @param time Length of the song in seconds.\n\t * @return Formatted length as MM:SS.\n\t */\n\tfunction formatLength(time) {\n\t var min = Math.floor(time / 60);\n\t var sec = time - 60 * min;\n\t if (sec < 10) {\n\t sec = \"0\" + sec;\n\t }\n\t return min + \":\" + sec;\n\t}\n\n/***/ },\n/* 379 */\n/***/ function(module, exports) {\n\n\t\"use strict\";\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.buildPaginationObject = buildPaginationObject;\n\texports.computePaginationBounds = computePaginationBounds;\n\t/**\n\t * Collection of helper functions to deal with pagination.\n\t */\n\t\n\t/**\n\t * Helper function to build a pagination object to pass down the component tree.\n\t *\n\t * @param location react-router location props.\n\t * @param currentPage Number of the current page.\n\t * @param nPages Total number of pages.\n\t * @param goToPageAction Action to dispatch to go to a specific page.\n\t *\n\t * @return An object containing all the props for the Pagination component.\n\t */\n\tfunction buildPaginationObject(location, currentPage, nPages, goToPageAction) {\n\t var buildLinkToPage = function buildLinkToPage(pageNumber) {\n\t return {\n\t pathname: location.pathname,\n\t query: Object.assign({}, location.query, { page: pageNumber })\n\t };\n\t };\n\t return {\n\t currentPage: currentPage,\n\t nPages: nPages,\n\t goToPage: function goToPage(pageNumber) {\n\t return goToPageAction(buildLinkToPage(pageNumber));\n\t },\n\t buildLinkToPage: buildLinkToPage\n\t };\n\t}\n\t\n\t/**\n\t * Helper function to compute the buttons to display.\n\t *\n\t * Taken from http://stackoverflow.com/a/8608998/2626416\n\t *\n\t * @param currentPage Number of the current page.\n\t * @param nPages Total number of pages.\n\t * @param maxNumberPagesShown Maximum number of pages button to show.\n\t *\n\t * @return An object containing lower limit and upper limit bounds.\n\t */\n\tfunction computePaginationBounds(currentPage, nPages) {\n\t var maxNumberPagesShown = arguments.length <= 2 || arguments[2] === undefined ? 5 : arguments[2];\n\t\n\t var lowerLimit = currentPage;\n\t var upperLimit = currentPage;\n\t\n\t for (var b = 1; b < maxNumberPagesShown && b < nPages;) {\n\t if (lowerLimit > 1) {\n\t lowerLimit--;\n\t b++;\n\t }\n\t if (b < maxNumberPagesShown && upperLimit < nPages) {\n\t upperLimit++;\n\t b++;\n\t }\n\t }\n\t\n\t return {\n\t lowerLimit: lowerLimit,\n\t upperLimit: upperLimit + 1 };\n\t}\n\n/***/ },\n/* 380 */\n/***/ function(module, exports) {\n\n\t\"use strict\";\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.createReducer = createReducer;\n\t/**\n\t * Collection of helper functions to deal with reducers.\n\t */\n\t\n\t/**\n\t * Utility function to create a reducer.\n\t *\n\t * @param initialState Initial state of the reducer.\n\t * @param reducerMap Map between action types and reducing functions.\n\t *\n\t * @return A reducer.\n\t */\n\tfunction createReducer(initialState, reducerMap) {\n\t return function () {\n\t var state = arguments.length <= 0 || arguments[0] === undefined ? initialState : arguments[0];\n\t var action = arguments[1];\n\t\n\t var reducer = reducerMap[action.type];\n\t\n\t return reducer ? reducer(state, action.payload) : state;\n\t };\n\t}\n\n/***/ },\n/* 381 */\n/***/ function(module, exports) {\n\n\t\"use strict\";\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.assembleURLAndParams = assembleURLAndParams;\n\texports.cleanURL = cleanURL;\n\t/**\n\t * Collection of helper functions to deal with URLs.\n\t */\n\t\n\t/**\n\t * Assemble a base URL and its GET parameters.\n\t *\n\t * @param endpoint Base URL.\n\t * @param params An object of GET params and their values.\n\t *\n\t * @return A string with the full URL with GET params.\n\t */\n\tfunction assembleURLAndParams(endpoint, params) {\n\t var url = endpoint + \"?\";\n\t Object.keys(params).forEach(function (key) {\n\t if (Array.isArray(params[key])) {\n\t params[key].forEach(function (value) {\n\t return url += key + \"[]=\" + value + \"&\";\n\t });\n\t } else {\n\t url += key + \"=\" + params[key] + \"&\";\n\t }\n\t });\n\t return url.rstrip(\"&\");\n\t}\n\t\n\t/**\n\t * Clean an endpoint URL.\n\t *\n\t * Adds the protocol prefix if not specified, remove trailing slash\n\t *\n\t * @param An URL\n\t * @return The cleaned URL\n\t */\n\tfunction cleanURL(endpoint) {\n\t if (!endpoint.startsWith(\"//\") && !endpoint.startsWith(\"http://\") && !endpoint.startsWith(\"https://\")) {\n\t // Handle endpoints of the form \"ampache.example.com\"\n\t // Append same protocol as currently in use, to avoid mixed content.\n\t endpoint = window.location.protocol + \"//\" + endpoint;\n\t }\n\t\n\t // Remove trailing slash\n\t endpoint = endpoint.replace(/\\/$/, \"\");\n\t\n\t return endpoint;\n\t}\n\n/***/ },\n/* 382 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\"use strict\";\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\t\n\tvar _react = __webpack_require__(2);\n\t\n\tvar _react2 = _interopRequireDefault(_react);\n\t\n\tvar _redux = __webpack_require__(39);\n\t\n\tvar _reactRedux = __webpack_require__(47);\n\t\n\tvar _reactIntl = __webpack_require__(18);\n\t\n\tvar _immutable = __webpack_require__(15);\n\t\n\tvar _immutable2 = _interopRequireDefault(_immutable);\n\t\n\tvar _utils = __webpack_require__(12);\n\t\n\tvar _actions = __webpack_require__(26);\n\t\n\tvar actionCreators = _interopRequireWildcard(_actions);\n\t\n\tvar _Albums = __webpack_require__(338);\n\t\n\tvar _Albums2 = _interopRequireDefault(_Albums);\n\t\n\tvar _api = __webpack_require__(91);\n\t\n\tvar _api2 = _interopRequireDefault(_api);\n\t\n\tfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\t\n\tfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\t\n\tfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // NPM imports\n\t\n\t\n\t// Local imports\n\t\n\t\n\t// Actions\n\t\n\t\n\t// Components\n\t\n\t\n\t// Translations\n\t\n\t\n\t// Define translations\n\tvar albumsMessages = (0, _reactIntl.defineMessages)((0, _utils.messagesMap)(Array.concat([], _api2.default)));\n\t\n\t/**\n\t * Albums page, grid layout of albums arts.\n\t */\n\t\n\tvar AlbumsPageIntl = function (_Component) {\n\t _inherits(AlbumsPageIntl, _Component);\n\t\n\t function AlbumsPageIntl() {\n\t _classCallCheck(this, AlbumsPageIntl);\n\t\n\t return _possibleConstructorReturn(this, Object.getPrototypeOf(AlbumsPageIntl).apply(this, arguments));\n\t }\n\t\n\t _createClass(AlbumsPageIntl, [{\n\t key: \"componentWillMount\",\n\t value: function componentWillMount() {\n\t // Load the data for current page\n\t var currentPage = parseInt(this.props.location.query.page) || 1;\n\t this.props.actions.loadPaginatedAlbums({ pageNumber: currentPage });\n\t }\n\t }, {\n\t key: \"componentWillReceiveProps\",\n\t value: function componentWillReceiveProps(nextProps) {\n\t // Load the data if page has changed\n\t var currentPage = parseInt(this.props.location.query.page) || 1;\n\t var nextPage = parseInt(nextProps.location.query.page) || 1;\n\t if (currentPage != nextPage) {\n\t // Unload data on page change\n\t this.props.actions.clearPaginatedResults();\n\t // Load new data\n\t this.props.actions.loadPaginatedAlbums({ pageNumber: nextPage });\n\t }\n\t }\n\t }, {\n\t key: \"componentWillUnmount\",\n\t value: function componentWillUnmount() {\n\t // Unload data on page change\n\t this.props.actions.clearPaginatedResults();\n\t }\n\t }, {\n\t key: \"render\",\n\t value: function render() {\n\t var formatMessage = this.props.intl.formatMessage;\n\t\n\t\n\t var pagination = (0, _utils.buildPaginationObject)(this.props.location, this.props.currentPage, this.props.nPages, this.props.actions.goToPage);\n\t\n\t var error = (0, _utils.handleErrorI18nObject)(this.props.error, formatMessage, albumsMessages);\n\t\n\t return _react2.default.createElement(_Albums2.default, { isFetching: this.props.isFetching, error: error, albums: this.props.albumsList, artists: this.props.artistsList, pagination: pagination });\n\t }\n\t }]);\n\t\n\t return AlbumsPageIntl;\n\t}(_react.Component);\n\t\n\tAlbumsPageIntl.propTypes = {\n\t intl: _reactIntl.intlShape.isRequired\n\t};\n\t\n\tvar mapStateToProps = function mapStateToProps(state) {\n\t var albumsList = new _immutable2.default.List();\n\t var artistsList = new _immutable2.default.Map();\n\t if (state.paginated.type == \"album\" && state.paginated.result.size > 0) {\n\t albumsList = state.paginated.result.map(function (id) {\n\t return state.entities.getIn([\"entities\", \"album\", id]);\n\t });\n\t albumsList.forEach(function (album) {\n\t var albumArtist = album.get(\"artist\"); // TODO: get on undefined\n\t artistsList = artistsList.set(albumArtist, state.entities.getIn([\"entities\", \"artist\", albumArtist]));\n\t });\n\t }\n\t return {\n\t isFetching: state.entities.isFetching,\n\t error: state.entities.error,\n\t albumsList: albumsList,\n\t artistsList: artistsList,\n\t currentPage: state.paginated.currentPage,\n\t nPages: state.paginated.nPages\n\t };\n\t};\n\t\n\tvar mapDispatchToProps = function mapDispatchToProps(dispatch) {\n\t return {\n\t actions: (0, _redux.bindActionCreators)(actionCreators, dispatch)\n\t };\n\t};\n\t\n\texports.default = (0, _reactRedux.connect)(mapStateToProps, mapDispatchToProps)((0, _reactIntl.injectIntl)(AlbumsPageIntl));\n\n/***/ },\n/* 383 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\"use strict\";\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\t\n\tvar _react = __webpack_require__(2);\n\t\n\tvar _react2 = _interopRequireDefault(_react);\n\t\n\tvar _redux = __webpack_require__(39);\n\t\n\tvar _reactRedux = __webpack_require__(47);\n\t\n\tvar _reactIntl = __webpack_require__(18);\n\t\n\tvar _immutable = __webpack_require__(15);\n\t\n\tvar _immutable2 = _interopRequireDefault(_immutable);\n\t\n\tvar _utils = __webpack_require__(12);\n\t\n\tvar _actions = __webpack_require__(26);\n\t\n\tvar actionCreators = _interopRequireWildcard(_actions);\n\t\n\tvar _Artist = __webpack_require__(339);\n\t\n\tvar _Artist2 = _interopRequireDefault(_Artist);\n\t\n\tvar _api = __webpack_require__(91);\n\t\n\tvar _api2 = _interopRequireDefault(_api);\n\t\n\tfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\t\n\tfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\t\n\tfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // NPM imports\n\t\n\t\n\t// Local imports\n\t\n\t\n\t// Actions\n\t\n\t\n\t// Components\n\t\n\t\n\t// Translations\n\t\n\t\n\t// Define translations\n\tvar artistMessages = (0, _reactIntl.defineMessages)((0, _utils.messagesMap)(Array.concat([], _api2.default)));\n\t\n\t/**\n\t * Single artist page.\n\t */\n\t\n\tvar ArtistPageIntl = function (_Component) {\n\t _inherits(ArtistPageIntl, _Component);\n\t\n\t function ArtistPageIntl() {\n\t _classCallCheck(this, ArtistPageIntl);\n\t\n\t return _possibleConstructorReturn(this, Object.getPrototypeOf(ArtistPageIntl).apply(this, arguments));\n\t }\n\t\n\t _createClass(ArtistPageIntl, [{\n\t key: \"componentWillMount\",\n\t value: function componentWillMount() {\n\t var id = (0, _utils.filterInt)(this.props.params.artist.split(\"-\")[0]);\n\t if (isNaN(id)) {\n\t // Redirect to homepage\n\t this.context.router.replace({\n\t pathname: \"/\"\n\t });\n\t }\n\t // Load the data\n\t this.props.actions.loadArtist({\n\t filter: id,\n\t include: [\"albums\", \"songs\"]\n\t });\n\t }\n\t }, {\n\t key: \"componentWillUnmount\",\n\t value: function componentWillUnmount() {\n\t this.props.actions.decrementRefCount({\n\t \"artist\": [this.props.artist.get(\"id\")]\n\t });\n\t }\n\t }, {\n\t key: \"render\",\n\t value: function render() {\n\t var formatMessage = this.props.intl.formatMessage;\n\t\n\t\n\t var error = (0, _utils.handleErrorI18nObject)(this.props.error, formatMessage, artistMessages);\n\t\n\t return _react2.default.createElement(_Artist2.default, { playAction: this.props.actions.playSong, playNextAction: this.props.actions.pushSong, isFetching: this.props.isFetching, error: error, artist: this.props.artist, albums: this.props.albums, songs: this.props.songs, scrollToAlbum: parseInt(this.props.params.album) });\n\t }\n\t }]);\n\t\n\t return ArtistPageIntl;\n\t}(_react.Component);\n\t\n\tArtistPageIntl.propTypes = {\n\t intl: _reactIntl.intlShape.isRequired\n\t};\n\tArtistPageIntl.contextTypes = {\n\t router: _react.PropTypes.object.isRequired\n\t};\n\t\n\tvar mapStateToProps = function mapStateToProps(state, ownProps) {\n\t var id = ownProps.params.artist.split(\"-\")[0];\n\t // Get artist\n\t var artist = state.entities.getIn([\"entities\", \"artist\", id]);\n\t var albums = new _immutable2.default.List();\n\t var songs = new _immutable2.default.Map();\n\t if (artist) {\n\t (function () {\n\t // Get albums\n\t var artistAlbums = artist.get(\"albums\");\n\t if (_immutable2.default.List.isList(artistAlbums)) {\n\t albums = artistAlbums.map(function (id) {\n\t return state.entities.getIn([\"entities\", \"album\", id]);\n\t });\n\t }\n\t // Get songs\n\t var artistSongs = artist.get(\"songs\");\n\t if (_immutable2.default.List.isList(artistSongs)) {\n\t songs = state.entities.getIn([\"entities\", \"song\"]).filter(function (song) {\n\t return artistSongs.includes(song.get(\"id\"));\n\t });\n\t }\n\t })();\n\t } else {\n\t artist = new _immutable2.default.Map();\n\t }\n\t return {\n\t isFetching: state.entities.isFetching,\n\t error: state.entities.error,\n\t artist: artist,\n\t albums: albums,\n\t songs: songs\n\t };\n\t};\n\t\n\tvar mapDispatchToProps = function mapDispatchToProps(dispatch) {\n\t return {\n\t actions: (0, _redux.bindActionCreators)(actionCreators, dispatch)\n\t };\n\t};\n\t\n\texports.default = (0, _reactRedux.connect)(mapStateToProps, mapDispatchToProps)((0, _reactIntl.injectIntl)(ArtistPageIntl));\n\n/***/ },\n/* 384 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\"use strict\";\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\t\n\tvar _react = __webpack_require__(2);\n\t\n\tvar _react2 = _interopRequireDefault(_react);\n\t\n\tvar _ArtistsPage = __webpack_require__(142);\n\t\n\tvar _ArtistsPage2 = _interopRequireDefault(_ArtistsPage);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\t\n\tfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\t\n\tfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // NPM imports\n\t\n\t\n\t// Other views\n\t\n\t\n\t/**\n\t * Browse page is an alias for artists page at the moment.\n\t */\n\tvar BrowsePage = function (_Component) {\n\t _inherits(BrowsePage, _Component);\n\t\n\t function BrowsePage() {\n\t _classCallCheck(this, BrowsePage);\n\t\n\t return _possibleConstructorReturn(this, Object.getPrototypeOf(BrowsePage).apply(this, arguments));\n\t }\n\t\n\t _createClass(BrowsePage, [{\n\t key: \"render\",\n\t value: function render() {\n\t return _react2.default.createElement(_ArtistsPage2.default, this.props);\n\t }\n\t }]);\n\t\n\t return BrowsePage;\n\t}(_react.Component);\n\t\n\texports.default = BrowsePage;\n\n/***/ },\n/* 385 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\"use strict\";\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\t\n\tvar _react = __webpack_require__(2);\n\t\n\tvar _react2 = _interopRequireDefault(_react);\n\t\n\tvar _Discover = __webpack_require__(341);\n\t\n\tvar _Discover2 = _interopRequireDefault(_Discover);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\t\n\tfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\t\n\tfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // NPM imports\n\t\n\t\n\t// Components\n\t\n\t\n\t/**\n\t * Discover page\n\t */\n\tvar DiscoverPage = function (_Component) {\n\t _inherits(DiscoverPage, _Component);\n\t\n\t function DiscoverPage() {\n\t _classCallCheck(this, DiscoverPage);\n\t\n\t return _possibleConstructorReturn(this, Object.getPrototypeOf(DiscoverPage).apply(this, arguments));\n\t }\n\t\n\t _createClass(DiscoverPage, [{\n\t key: \"render\",\n\t value: function render() {\n\t return _react2.default.createElement(_Discover2.default, null);\n\t }\n\t }]);\n\t\n\t return DiscoverPage;\n\t}(_react.Component);\n\t\n\texports.default = DiscoverPage;\n\n/***/ },\n/* 386 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\"use strict\";\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\t\n\tvar _react = __webpack_require__(2);\n\t\n\tvar _react2 = _interopRequireDefault(_react);\n\t\n\tvar _ArtistsPage = __webpack_require__(142);\n\t\n\tvar _ArtistsPage2 = _interopRequireDefault(_ArtistsPage);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\t\n\tfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\t\n\tfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // NPM imports\n\t\n\t\n\t// Other views\n\t\n\t\n\t/**\n\t * Homepage is an alias for Artists page at the moment.\n\t */\n\tvar HomePage = function (_Component) {\n\t _inherits(HomePage, _Component);\n\t\n\t function HomePage() {\n\t _classCallCheck(this, HomePage);\n\t\n\t return _possibleConstructorReturn(this, Object.getPrototypeOf(HomePage).apply(this, arguments));\n\t }\n\t\n\t _createClass(HomePage, [{\n\t key: \"render\",\n\t value: function render() {\n\t return _react2.default.createElement(_ArtistsPage2.default, this.props);\n\t }\n\t }]);\n\t\n\t return HomePage;\n\t}(_react.Component);\n\t\n\texports.default = HomePage;\n\n/***/ },\n/* 387 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\"use strict\";\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.LoginPage = undefined;\n\t\n\tvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\t\n\tvar _react = __webpack_require__(2);\n\t\n\tvar _react2 = _interopRequireDefault(_react);\n\t\n\tvar _redux = __webpack_require__(39);\n\t\n\tvar _reactRedux = __webpack_require__(47);\n\t\n\tvar _actions = __webpack_require__(26);\n\t\n\tvar actionCreators = _interopRequireWildcard(_actions);\n\t\n\tvar _Login = __webpack_require__(342);\n\t\n\tvar _Login2 = _interopRequireDefault(_Login);\n\t\n\tfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\t\n\tfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\t\n\tfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // NPM imports\n\t\n\t\n\t// Actions\n\t\n\t\n\t// Components\n\t\n\t\n\t/**\n\t * Login page\n\t */\n\tvar LoginPage = exports.LoginPage = function (_Component) {\n\t _inherits(LoginPage, _Component);\n\t\n\t function LoginPage(props) {\n\t _classCallCheck(this, LoginPage);\n\t\n\t // Bind this\n\t var _this = _possibleConstructorReturn(this, Object.getPrototypeOf(LoginPage).call(this, props));\n\t\n\t _this.handleSubmit = _this.handleSubmit.bind(_this);\n\t _this._getRedirectTo = _this._getRedirectTo.bind(_this);\n\t return _this;\n\t }\n\t\n\t /**\n\t * Get URL to redirect to based on location props.\n\t */\n\t\n\t\n\t _createClass(LoginPage, [{\n\t key: \"_getRedirectTo\",\n\t value: function _getRedirectTo() {\n\t var redirectPathname = \"/\";\n\t var redirectQuery = {};\n\t var location = this.props.location;\n\t\n\t if (location.state && location.state.nextPathname) {\n\t redirectPathname = location.state.nextPathname;\n\t }\n\t if (location.state && location.state.nextQuery) {\n\t redirectQuery = location.state.nextQuery;\n\t }\n\t return {\n\t pathname: redirectPathname,\n\t query: redirectQuery\n\t };\n\t }\n\t }, {\n\t key: \"componentWillMount\",\n\t value: function componentWillMount() {\n\t // This checks if the user is already connected or not and redirects\n\t // them if it is the case.\n\t\n\t // Get next page to redirect to\n\t var redirectTo = this._getRedirectTo();\n\t\n\t if (this.props.isAuthenticated) {\n\t // If user is already authenticated, redirects them\n\t this.context.router.replace(redirectTo);\n\t } else if (this.props.rememberMe) {\n\t // Else if remember me is set, try to reconnect them\n\t this.props.actions.loginUser(this.props.username, this.props.token, this.props.endpoint, true, redirectTo, true);\n\t }\n\t }\n\t\n\t /**\n\t * Handle click on submit button.\n\t */\n\t\n\t }, {\n\t key: \"handleSubmit\",\n\t value: function handleSubmit(username, password, endpoint, rememberMe) {\n\t // Get page to redirect to\n\t var redirectTo = this._getRedirectTo();\n\t // Trigger login action\n\t this.props.actions.loginUser(username, password, endpoint, rememberMe, redirectTo);\n\t }\n\t }, {\n\t key: \"render\",\n\t value: function render() {\n\t return _react2.default.createElement(_Login2.default, { onSubmit: this.handleSubmit, username: this.props.username, endpoint: this.props.endpoint, rememberMe: this.props.rememberMe, isAuthenticating: this.props.isAuthenticating, error: this.props.error, info: this.props.info });\n\t }\n\t }]);\n\t\n\t return LoginPage;\n\t}(_react.Component);\n\t\n\tLoginPage.contextTypes = {\n\t router: _react.PropTypes.object.isRequired\n\t};\n\t\n\tvar mapStateToProps = function mapStateToProps(state) {\n\t return {\n\t username: state.auth.username,\n\t endpoint: state.auth.endpoint,\n\t rememberMe: state.auth.rememberMe,\n\t isAuthenticating: state.auth.isAuthenticating,\n\t isAuthenticated: state.auth.isAuthenticated,\n\t token: state.auth.token,\n\t error: state.auth.error,\n\t info: state.auth.info\n\t };\n\t};\n\t\n\tvar mapDispatchToProps = function mapDispatchToProps(dispatch) {\n\t return {\n\t actions: (0, _redux.bindActionCreators)(actionCreators, dispatch)\n\t };\n\t};\n\t\n\texports.default = (0, _reactRedux.connect)(mapStateToProps, mapDispatchToProps)(LoginPage);\n\n/***/ },\n/* 388 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\"use strict\";\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.LogoutPage = undefined;\n\t\n\tvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\t\n\tvar _react = __webpack_require__(2);\n\t\n\tvar _react2 = _interopRequireDefault(_react);\n\t\n\tvar _redux = __webpack_require__(39);\n\t\n\tvar _reactRedux = __webpack_require__(47);\n\t\n\tvar _actions = __webpack_require__(26);\n\t\n\tvar actionCreators = _interopRequireWildcard(_actions);\n\t\n\tfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\t\n\tfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\t\n\tfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // NPM imports\n\t\n\t\n\t// Actions\n\t\n\t\n\t/**\n\t * Logout page\n\t */\n\tvar LogoutPage = exports.LogoutPage = function (_Component) {\n\t _inherits(LogoutPage, _Component);\n\t\n\t function LogoutPage() {\n\t _classCallCheck(this, LogoutPage);\n\t\n\t return _possibleConstructorReturn(this, Object.getPrototypeOf(LogoutPage).apply(this, arguments));\n\t }\n\t\n\t _createClass(LogoutPage, [{\n\t key: \"componentWillMount\",\n\t value: function componentWillMount() {\n\t // Logout when component is mounted\n\t this.props.actions.logoutAndRedirect();\n\t }\n\t }, {\n\t key: \"render\",\n\t value: function render() {\n\t return _react2.default.createElement(\"div\", null);\n\t }\n\t }]);\n\t\n\t return LogoutPage;\n\t}(_react.Component);\n\t\n\tvar mapDispatchToProps = function mapDispatchToProps(dispatch) {\n\t return {\n\t actions: (0, _redux.bindActionCreators)(actionCreators, dispatch)\n\t };\n\t};\n\t\n\texports.default = (0, _reactRedux.connect)(null, mapDispatchToProps)(LogoutPage);\n\n/***/ },\n/* 389 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\"use strict\";\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\t\n\tvar _react = __webpack_require__(2);\n\t\n\tvar _react2 = _interopRequireDefault(_react);\n\t\n\tvar _redux = __webpack_require__(39);\n\t\n\tvar _reactRedux = __webpack_require__(47);\n\t\n\tvar _immutable = __webpack_require__(15);\n\t\n\tvar _immutable2 = _interopRequireDefault(_immutable);\n\t\n\tvar _actions = __webpack_require__(26);\n\t\n\tvar actionCreators = _interopRequireWildcard(_actions);\n\t\n\tvar _Playlist = __webpack_require__(343);\n\t\n\tvar _Playlist2 = _interopRequireDefault(_Playlist);\n\t\n\tfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\t\n\tfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\t\n\tfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // NPM imports\n\t\n\t\n\t// Actions\n\t\n\t\n\t// Components\n\t\n\t\n\t/**\n\t * Table of songs in the current playlist.\n\t */\n\tvar PlaylistPage = function (_Component) {\n\t _inherits(PlaylistPage, _Component);\n\t\n\t function PlaylistPage() {\n\t _classCallCheck(this, PlaylistPage);\n\t\n\t return _possibleConstructorReturn(this, Object.getPrototypeOf(PlaylistPage).apply(this, arguments));\n\t }\n\t\n\t _createClass(PlaylistPage, [{\n\t key: \"render\",\n\t value: function render() {\n\t return _react2.default.createElement(_Playlist2.default, { playAction: this.props.actions.jumpToSong, playNextAction: null, flushAction: this.props.actions.stopPlayback, songs: this.props.songsList, currentIndex: this.props.currentIndex });\n\t }\n\t }]);\n\t\n\t return PlaylistPage;\n\t}(_react.Component);\n\t\n\tvar mapStateToProps = function mapStateToProps(state) {\n\t var songsList = new _immutable2.default.List();\n\t if (state.webplayer.playlist.size > 0) {\n\t songsList = state.webplayer.playlist.map(function (id) {\n\t var song = state.entities.getIn([\"entities\", \"song\", id]);\n\t // Add artist and album infos to song\n\t var artist = state.entities.getIn([\"entities\", \"artist\", song.get(\"artist\")]);\n\t var album = state.entities.getIn([\"entities\", \"album\", song.get(\"album\")]);\n\t return song.set(\"artist\", new _immutable2.default.Map({ id: artist.get(\"id\"), name: artist.get(\"name\") })).set(\"album\", new _immutable2.default.Map({ id: album.get(\"id\"), name: album.get(\"name\") }));\n\t });\n\t }\n\t return {\n\t songsList: songsList,\n\t currentIndex: state.webplayer.currentIndex\n\t };\n\t};\n\tvar mapDispatchToProps = function mapDispatchToProps(dispatch) {\n\t return {\n\t actions: (0, _redux.bindActionCreators)(actionCreators, dispatch)\n\t };\n\t};\n\texports.default = (0, _reactRedux.connect)(mapStateToProps, mapDispatchToProps)(PlaylistPage);\n\n/***/ },\n/* 390 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\"use strict\";\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\t\n\tvar _react = __webpack_require__(2);\n\t\n\tvar _react2 = _interopRequireDefault(_react);\n\t\n\tvar _Settings = __webpack_require__(344);\n\t\n\tvar _Settings2 = _interopRequireDefault(_Settings);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\t\n\tfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\t\n\tfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // NPM imports\n\t\n\t\n\t// Components\n\t\n\t\n\t/**\n\t * Paginated table of available songs\n\t */\n\tvar SettingsPage = function (_Component) {\n\t _inherits(SettingsPage, _Component);\n\t\n\t function SettingsPage() {\n\t _classCallCheck(this, SettingsPage);\n\t\n\t return _possibleConstructorReturn(this, Object.getPrototypeOf(SettingsPage).apply(this, arguments));\n\t }\n\t\n\t _createClass(SettingsPage, [{\n\t key: \"render\",\n\t value: function render() {\n\t return _react2.default.createElement(_Settings2.default, null);\n\t }\n\t }]);\n\t\n\t return SettingsPage;\n\t}(_react.Component);\n\t\n\texports.default = SettingsPage;\n\n/***/ },\n/* 391 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\"use strict\";\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\t\n\tvar _react = __webpack_require__(2);\n\t\n\tvar _react2 = _interopRequireDefault(_react);\n\t\n\tvar _redux = __webpack_require__(39);\n\t\n\tvar _reactRedux = __webpack_require__(47);\n\t\n\tvar _reactIntl = __webpack_require__(18);\n\t\n\tvar _immutable = __webpack_require__(15);\n\t\n\tvar _immutable2 = _interopRequireDefault(_immutable);\n\t\n\tvar _utils = __webpack_require__(12);\n\t\n\tvar _actions = __webpack_require__(26);\n\t\n\tvar actionCreators = _interopRequireWildcard(_actions);\n\t\n\tvar _Songs = __webpack_require__(212);\n\t\n\tvar _Songs2 = _interopRequireDefault(_Songs);\n\t\n\tvar _api = __webpack_require__(91);\n\t\n\tvar _api2 = _interopRequireDefault(_api);\n\t\n\tfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\t\n\tfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\t\n\tfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // NPM imports\n\t\n\t\n\t// Local imports\n\t\n\t\n\t// Actions\n\t\n\t\n\t// Components\n\t\n\t\n\t// Translations\n\t\n\t\n\t// Define translations\n\tvar songsMessages = (0, _reactIntl.defineMessages)((0, _utils.messagesMap)(Array.concat([], _api2.default)));\n\t\n\t/**\n\t * Paginated table of available songs\n\t */\n\t\n\tvar SongsPageIntl = function (_Component) {\n\t _inherits(SongsPageIntl, _Component);\n\t\n\t function SongsPageIntl() {\n\t _classCallCheck(this, SongsPageIntl);\n\t\n\t return _possibleConstructorReturn(this, Object.getPrototypeOf(SongsPageIntl).apply(this, arguments));\n\t }\n\t\n\t _createClass(SongsPageIntl, [{\n\t key: \"componentWillMount\",\n\t value: function componentWillMount() {\n\t // Load the data for current page\n\t var currentPage = parseInt(this.props.location.query.page) || 1;\n\t this.props.actions.loadPaginatedSongs({ pageNumber: currentPage });\n\t }\n\t }, {\n\t key: \"componentWillReceiveProps\",\n\t value: function componentWillReceiveProps(nextProps) {\n\t // Load the data if page has changed\n\t var currentPage = parseInt(this.props.location.query.page) || 1;\n\t var nextPage = parseInt(nextProps.location.query.page) || 1;\n\t if (currentPage != nextPage) {\n\t // Unload data on page change\n\t this.props.actions.clearPaginatedResults();\n\t // Load new data\n\t this.props.actions.loadPaginatedSongs({ pageNumber: nextPage });\n\t }\n\t }\n\t }, {\n\t key: \"componentWillUnmount\",\n\t value: function componentWillUnmount() {\n\t // Unload data on page change\n\t this.props.actions.clearPaginatedResults();\n\t }\n\t }, {\n\t key: \"render\",\n\t value: function render() {\n\t var formatMessage = this.props.intl.formatMessage;\n\t\n\t\n\t var pagination = (0, _utils.buildPaginationObject)(this.props.location, this.props.currentPage, this.props.nPages, this.props.actions.goToPage);\n\t\n\t var error = (0, _utils.handleErrorI18nObject)(this.props.error, formatMessage, songsMessages);\n\t\n\t return _react2.default.createElement(_Songs2.default, { playAction: this.props.actions.playSong, playNextAction: this.props.actions.pushSong, isFetching: this.props.isFetching, error: error, songs: this.props.songsList, pagination: pagination });\n\t }\n\t }]);\n\t\n\t return SongsPageIntl;\n\t}(_react.Component);\n\t\n\tSongsPageIntl.propTypes = {\n\t intl: _reactIntl.intlShape.isRequired\n\t};\n\t\n\tvar mapStateToProps = function mapStateToProps(state) {\n\t var songsList = new _immutable2.default.List();\n\t if (state.paginated.type == \"song\" && state.paginated.result.size > 0) {\n\t songsList = state.paginated.result.map(function (id) {\n\t var song = state.entities.getIn([\"entities\", \"song\", id]);\n\t // Add artist and album infos to song\n\t var artist = state.entities.getIn([\"entities\", \"artist\", song.get(\"artist\")]); // TODO: get on undefined\n\t var album = state.entities.getIn([\"entities\", \"album\", song.get(\"album\")]);\n\t return song.set(\"artist\", new _immutable2.default.Map({ id: artist.get(\"id\"), name: artist.get(\"name\") })).set(\"album\", new _immutable2.default.Map({ id: album.get(\"id\"), name: album.get(\"name\") }));\n\t });\n\t }\n\t return {\n\t isFetching: state.entities.isFetching,\n\t error: state.entities.error,\n\t songsList: songsList,\n\t currentPage: state.paginated.currentPage,\n\t nPages: state.paginated.nPages\n\t };\n\t};\n\t\n\tvar mapDispatchToProps = function mapDispatchToProps(dispatch) {\n\t return {\n\t actions: (0, _redux.bindActionCreators)(actionCreators, dispatch)\n\t };\n\t};\n\t\n\texports.default = (0, _reactRedux.connect)(mapStateToProps, mapDispatchToProps)((0, _reactIntl.injectIntl)(SongsPageIntl));\n\n/***/ },\n/* 392 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\"use strict\";\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\t\n\tvar _react = __webpack_require__(2);\n\t\n\tvar _react2 = _interopRequireDefault(_react);\n\t\n\tvar _redux = __webpack_require__(39);\n\t\n\tvar _reactRedux = __webpack_require__(47);\n\t\n\tvar _reactIntl = __webpack_require__(18);\n\t\n\tvar _howler = __webpack_require__(639);\n\t\n\tvar _utils = __webpack_require__(12);\n\t\n\tvar _webplayer = __webpack_require__(211);\n\t\n\tvar _actions = __webpack_require__(26);\n\t\n\tvar actionCreators = _interopRequireWildcard(_actions);\n\t\n\tvar _WebPlayer = __webpack_require__(345);\n\t\n\tvar _WebPlayer2 = _interopRequireDefault(_WebPlayer);\n\t\n\tvar _WebPlayer3 = __webpack_require__(216);\n\t\n\tvar _WebPlayer4 = _interopRequireDefault(_WebPlayer3);\n\t\n\tfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\t\n\tfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\t\n\tfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // NPM imports\n\t\n\t\n\t// Local imports\n\t\n\t\n\t// Actions\n\t\n\t\n\t// Components\n\t\n\t\n\t// Translations\n\t\n\t\n\t// Define translations\n\tvar webplayerMessages = (0, _reactIntl.defineMessages)((0, _utils.messagesMap)(Array.concat([], _WebPlayer4.default)));\n\t\n\t/**\n\t * Webplayer container.\n\t */\n\t\n\tvar WebPlayerIntl = function (_Component) {\n\t _inherits(WebPlayerIntl, _Component);\n\t\n\t function WebPlayerIntl(props) {\n\t _classCallCheck(this, WebPlayerIntl);\n\t\n\t // Data attributes\n\t var _this = _possibleConstructorReturn(this, Object.getPrototypeOf(WebPlayerIntl).call(this, props));\n\t\n\t _this.howl = null;\n\t\n\t // Bind this\n\t _this.startPlaying = _this.startPlaying.bind(_this);\n\t _this.stopPlaying = _this.stopPlaying.bind(_this);\n\t _this.isPlaying = _this.isPlaying.bind(_this);\n\t return _this;\n\t }\n\t\n\t _createClass(WebPlayerIntl, [{\n\t key: \"componentDidMount\",\n\t value: function componentDidMount() {\n\t // Start playback upon component mount\n\t this.startPlaying(this.props);\n\t }\n\t }, {\n\t key: \"componentWillUpdate\",\n\t value: function componentWillUpdate(nextProps) {\n\t // Handle stop\n\t if (\n\t // No current song in updated props\n\t !nextProps.currentSong ||\n\t // No playlist in updated props\n\t nextProps.playlist.size < 1 ||\n\t // Song played is not the song currently played\n\t this.props.currentSong && nextProps.currentSong.get(\"id\") != this.props.currentSong.get(\"id\")) {\n\t if (this.howl) {\n\t this.stopPlaying();\n\t }\n\t }\n\t\n\t // Toggle play / pause\n\t if (\n\t // This check ensure we do not start playing multiple times the\n\t // same song\n\t nextProps.isPlaying != this.props.isPlaying ||\n\t // Or we should be playing but there is no howl object playing\n\t nextProps.isPlaying && !this.isPlaying()) {\n\t this.startPlaying(nextProps);\n\t }\n\t\n\t // If something is playing back\n\t if (this.howl) {\n\t // Set mute / unmute\n\t this.howl.mute(nextProps.isMute);\n\t // Set volume\n\t this.howl.volume(nextProps.volume / 100);\n\t }\n\t }\n\t\n\t /**\n\t * Handle playback through Howler and Web Audio API.\n\t *\n\t * @params props A set of props to use for setting play parameters.\n\t */\n\t\n\t }, {\n\t key: \"startPlaying\",\n\t value: function startPlaying(props) {\n\t if (props.isPlaying && props.currentSong) {\n\t // If it should be playing any song\n\t var url = props.currentSong.get(\"url\");\n\t var format = url.split(\".\").pop();\n\t var isPlayable = _howler.Howler.codecs(format);\n\t if (isPlayable) {\n\t // Build a new Howler object with current song to play\n\t this.howl = new _howler.Howl({\n\t src: [url],\n\t html5: true, // Use HTML5 by default to allow streaming\n\t mute: props.isMute,\n\t volume: props.volume / 100, // Set current volume\n\t autoplay: false, // No autoplay, we handle it manually\n\t format: format, // Specify format as Howler is unable to fetch it from URL\n\t onloaderror: function onloaderror() {\n\t return props.actions.setError(_webplayer.ONLOAD_ERROR);\n\t }, // Display error if song cannot be loaded\n\t onend: function onend() {\n\t return props.actions.playNextSong();\n\t } });\n\t // Start playing\n\t this.howl.play();\n\t } else {\n\t // Howler already performs this check on his own, but we have\n\t // to do it ourselves to be able to display localized errors\n\t // for every possible error.\n\t // TODO: This could most likely be simplified.\n\t props.actions.setError(_webplayer.UNSUPPORTED_MEDIA_TYPE);\n\t }\n\t } else {\n\t // If it should not be playing\n\t if (this.howl) {\n\t // Pause any running music\n\t this.howl.pause();\n\t }\n\t }\n\t }\n\t\n\t /**\n\t * Stop playback through Howler and Web Audio API.\n\t */\n\t\n\t }, {\n\t key: \"stopPlaying\",\n\t value: function stopPlaying() {\n\t // Stop music playback\n\t this.howl.stop();\n\t // Reset howl object\n\t this.howl = null;\n\t }\n\t\n\t /**\n\t * Check whether some music is currently playing or not.\n\t *\n\t * @return True / False whether music is playing.\n\t */\n\t\n\t }, {\n\t key: \"isPlaying\",\n\t value: function isPlaying() {\n\t if (this.howl) {\n\t return this.howl.playing();\n\t }\n\t return false;\n\t }\n\t }, {\n\t key: \"render\",\n\t value: function render() {\n\t var _this2 = this;\n\t\n\t var formatMessage = this.props.intl.formatMessage;\n\t\n\t\n\t var webplayerProps = {\n\t isPlaying: this.props.isPlaying,\n\t isRandom: this.props.isRandom,\n\t isRepeat: this.props.isRepeat,\n\t isMute: this.props.isMute,\n\t volume: this.props.volume,\n\t currentIndex: this.props.currentIndex,\n\t playlist: this.props.playlist,\n\t error: (0, _utils.handleErrorI18nObject)(this.props.error, formatMessage, webplayerMessages),\n\t currentSong: this.props.currentSong,\n\t currentArtist: this.props.currentArtist,\n\t // Use a lambda to ensure no first argument is passed to\n\t // togglePlaying\n\t onPlayPause: function onPlayPause() {\n\t return _this2.props.actions.togglePlaying();\n\t },\n\t onPrev: this.props.actions.playPreviousSong,\n\t onSkip: this.props.actions.playNextSong,\n\t onRandom: this.props.actions.toggleRandom,\n\t onRepeat: this.props.actions.toggleRepeat,\n\t onMute: this.props.actions.toggleMute,\n\t isPlaylistViewActive: this.props.location && this.props.location.pathname == \"/playlist\" ? true : false\n\t };\n\t return this.props.playlist.size > 0 ? _react2.default.createElement(_WebPlayer2.default, webplayerProps) : _react2.default.createElement(\"div\", null);\n\t }\n\t }]);\n\t\n\t return WebPlayerIntl;\n\t}(_react.Component);\n\t\n\tWebPlayerIntl.propTypes = {\n\t location: _react.PropTypes.object,\n\t intl: _reactIntl.intlShape.isRequired\n\t};\n\tvar mapStateToProps = function mapStateToProps(state) {\n\t var currentIndex = state.webplayer.currentIndex;\n\t var playlist = state.webplayer.playlist;\n\t\n\t // Get current song and artist from entities store\n\t var currentSong = state.entities.getIn([\"entities\", \"song\", playlist.get(currentIndex)]);\n\t var currentArtist = undefined;\n\t if (currentSong) {\n\t currentArtist = state.entities.getIn([\"entities\", \"artist\", currentSong.get(\"artist\")]);\n\t }\n\t return {\n\t isPlaying: state.webplayer.isPlaying,\n\t isRandom: state.webplayer.isRandom,\n\t isRepeat: state.webplayer.isRepeat,\n\t isMute: state.webplayer.isMute,\n\t volume: state.webplayer.volume,\n\t currentIndex: currentIndex,\n\t playlist: playlist,\n\t error: state.webplayer.error,\n\t currentSong: currentSong,\n\t currentArtist: currentArtist\n\t };\n\t};\n\tvar mapDispatchToProps = function mapDispatchToProps(dispatch) {\n\t return {\n\t actions: (0, _redux.bindActionCreators)(actionCreators, dispatch)\n\t };\n\t};\n\texports.default = (0, _reactRedux.connect)(mapStateToProps, mapDispatchToProps)((0, _reactIntl.injectIntl)(WebPlayerIntl));\n\n/***/ },\n/* 393 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\"use strict\";\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.rootElement = undefined;\n\texports.onWindowIntl = onWindowIntl;\n\texports.Intl = Intl;\n\t\n\tvar _react = __webpack_require__(2);\n\t\n\tvar _react2 = _interopRequireDefault(_react);\n\t\n\tvar _reactDom = __webpack_require__(285);\n\t\n\tvar _reactDom2 = _interopRequireDefault(_reactDom);\n\t\n\tvar _reactRouter = __webpack_require__(54);\n\t\n\tvar _reactRouterRedux = __webpack_require__(97);\n\t\n\tvar _reactRouterScroll = __webpack_require__(777);\n\t\n\tvar _reactRouterScroll2 = _interopRequireDefault(_reactRouterScroll);\n\t\n\tvar _configureStore = __webpack_require__(373);\n\t\n\tvar _configureStore2 = _interopRequireDefault(_configureStore);\n\t\n\tvar _reactIntl = __webpack_require__(18);\n\t\n\tvar _en = __webpack_require__(768);\n\t\n\tvar _en2 = _interopRequireDefault(_en);\n\t\n\tvar _fr = __webpack_require__(769);\n\t\n\tvar _fr2 = _interopRequireDefault(_fr);\n\t\n\tvar _utils = __webpack_require__(12);\n\t\n\tvar _locales = __webpack_require__(353);\n\t\n\tvar _locales2 = _interopRequireDefault(_locales);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } } /**\n\t * Main JS entry point for all the builds.\n\t *\n\t * Performs i18n and initial render.\n\t */\n\t// React stuff\n\t\n\t\n\t// Store\n\t\n\t\n\t// i18n stuff\n\t\n\t\n\t// Init store and history\n\tvar store = (0, _configureStore2.default)();\n\tvar history = (0, _reactRouterRedux.syncHistoryWithStore)(_reactRouter.hashHistory, store);\n\t\n\t// Get root element\n\tvar rootElement = exports.rootElement = document.getElementById(\"root\");\n\t\n\t/**\n\t * Main function to be called once window.Intl has been populated.\n\t *\n\t * Populates the locales messages and perform render.\n\t */\n\tfunction onWindowIntl() {\n\t // Add locales we support\n\t (0, _reactIntl.addLocaleData)([].concat(_toConsumableArray(_en2.default), _toConsumableArray(_fr2.default)));\n\t\n\t // Fetch current preferred locales from the browser\n\t var locales = (0, _utils.getBrowserLocales)();\n\t\n\t var locale = \"en-US\"; // Safe default\n\t // Populate strings with best matching locale\n\t var strings = {};\n\t for (var i = 0; i < locales.length; ++i) {\n\t if (_locales2.default[locales[i]]) {\n\t locale = locales[i];\n\t strings = _locales2.default[locale];\n\t break; // Break at first matching locale\n\t }\n\t }\n\t // Overload strings with default English translation, in case of missing translations\n\t strings = Object.assign(_locales2.default[\"en-US\"], strings);\n\t\n\t // Dynamically set html lang attribute\n\t document.documentElement.lang = locale;\n\t\n\t // Return a rendering function\n\t return function () {\n\t var Root = __webpack_require__(350).default;\n\t _reactDom2.default.render(_react2.default.createElement(Root, { store: store, history: history, render: (0, _reactRouter.applyRouterMiddleware)((0, _reactRouterScroll2.default)()), locale: locale, defaultLocale: \"en-US\", messages: strings }), rootElement);\n\t };\n\t};\n\t\n\t/**\n\t * Ensure window.Intl exists, or polyfill it.\n\t *\n\t * @param render Initial rendering function.\n\t */\n\tfunction Intl(render) {\n\t if (!window.Intl) {\n\t __webpack_require__.e/* nsure */(1, function (require) {\n\t __webpack_require__(327);\n\t __webpack_require__(328);\n\t __webpack_require__(329);\n\t render();\n\t });\n\t } else {\n\t render();\n\t }\n\t};\n\n/***/ },\n/* 394 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\"use strict\";\n\t\n\t/**\n\t * This is the main JS entry point.\n\t * It loads either the production or the development index file, based on the\n\t * environment variables in use.\n\t */\n\tif (true) {\n\t module.exports = __webpack_require__(395);\n\t} else {\n\t module.exports = require(\"./index.development.js\");\n\t}\n\n/***/ },\n/* 395 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\"use strict\";\n\t\n\t/**\n\t * This is the main JS entry point in production builds.\n\t */\n\t\n\t// Load the common index\n\tvar index = __webpack_require__(393);\n\t\n\t// Get the rendering function\n\tvar render = index.onWindowIntl();\n\t\n\t// Perform i18n and render\n\tindex.Intl(render);\n\n/***/ },\n/* 396 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/* WEBPACK VAR INJECTION */(function(global) {\"use strict\";\n\t\n\t__webpack_require__(593);\n\t\n\t__webpack_require__(868);\n\t\n\t__webpack_require__(412);\n\t\n\t/* eslint max-len: 0 */\n\t\n\tif (global._babelPolyfill) {\n\t throw new Error(\"only one instance of babel-polyfill is allowed\");\n\t}\n\tglobal._babelPolyfill = true;\n\t\n\t// Should be removed in the next major release:\n\t\n\tvar DEFINE_PROPERTY = \"defineProperty\";\n\tfunction define(O, key, value) {\n\t O[key] || Object[DEFINE_PROPERTY](O, key, {\n\t writable: true,\n\t configurable: true,\n\t value: value\n\t });\n\t}\n\t\n\tdefine(String.prototype, \"padLeft\", \"\".padStart);\n\tdefine(String.prototype, \"padRight\", \"\".padEnd);\n\t\n\t\"pop,reverse,shift,keys,values,entries,indexOf,every,some,forEach,map,filter,find,findIndex,includes,join,slice,concat,push,splice,unshift,sort,lastIndexOf,reduce,reduceRight,copyWithin,fill\".split(\",\").forEach(function (key) {\n\t [][key] && define(Array, key, Function.call.bind([][key]));\n\t});\n\t/* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }())))\n\n/***/ },\n/* 397 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t__webpack_require__ (602);\n\t__webpack_require__ (398);\n\n\n/***/ },\n/* 398 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t__webpack_require__ (411);\n\t__webpack_require__ (401);\n\t__webpack_require__ (402);\n\t__webpack_require__ (403);\n\t__webpack_require__ (404);\n\t__webpack_require__ (405);\n\t__webpack_require__ (406);\n\t__webpack_require__ (410);\n\t__webpack_require__ (407);\n\t__webpack_require__ (408);\n\t__webpack_require__ (409);\n\t__webpack_require__ (400);\n\n\n/***/ },\n/* 399 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t__webpack_require__(397);\n\n\n/***/ },\n/* 400 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/* WEBPACK VAR INJECTION */(function(jQuery) {/* ========================================================================\n\t * Bootstrap: affix.js v3.3.7\n\t * http://getbootstrap.com/javascript/#affix\n\t * ========================================================================\n\t * Copyright 2011-2016 Twitter, Inc.\n\t * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n\t * ======================================================================== */\n\t\n\t\n\t+function ($) {\n\t 'use strict';\n\t\n\t // AFFIX CLASS DEFINITION\n\t // ======================\n\t\n\t var Affix = function (element, options) {\n\t this.options = $.extend({}, Affix.DEFAULTS, options)\n\t\n\t this.$target = $(this.options.target)\n\t .on('scroll.bs.affix.data-api', $.proxy(this.checkPosition, this))\n\t .on('click.bs.affix.data-api', $.proxy(this.checkPositionWithEventLoop, this))\n\t\n\t this.$element = $(element)\n\t this.affixed = null\n\t this.unpin = null\n\t this.pinnedOffset = null\n\t\n\t this.checkPosition()\n\t }\n\t\n\t Affix.VERSION = '3.3.7'\n\t\n\t Affix.RESET = 'affix affix-top affix-bottom'\n\t\n\t Affix.DEFAULTS = {\n\t offset: 0,\n\t target: window\n\t }\n\t\n\t Affix.prototype.getState = function (scrollHeight, height, offsetTop, offsetBottom) {\n\t var scrollTop = this.$target.scrollTop()\n\t var position = this.$element.offset()\n\t var targetHeight = this.$target.height()\n\t\n\t if (offsetTop != null && this.affixed == 'top') return scrollTop < offsetTop ? 'top' : false\n\t\n\t if (this.affixed == 'bottom') {\n\t if (offsetTop != null) return (scrollTop + this.unpin <= position.top) ? false : 'bottom'\n\t return (scrollTop + targetHeight <= scrollHeight - offsetBottom) ? false : 'bottom'\n\t }\n\t\n\t var initializing = this.affixed == null\n\t var colliderTop = initializing ? scrollTop : position.top\n\t var colliderHeight = initializing ? targetHeight : height\n\t\n\t if (offsetTop != null && scrollTop <= offsetTop) return 'top'\n\t if (offsetBottom != null && (colliderTop + colliderHeight >= scrollHeight - offsetBottom)) return 'bottom'\n\t\n\t return false\n\t }\n\t\n\t Affix.prototype.getPinnedOffset = function () {\n\t if (this.pinnedOffset) return this.pinnedOffset\n\t this.$element.removeClass(Affix.RESET).addClass('affix')\n\t var scrollTop = this.$target.scrollTop()\n\t var position = this.$element.offset()\n\t return (this.pinnedOffset = position.top - scrollTop)\n\t }\n\t\n\t Affix.prototype.checkPositionWithEventLoop = function () {\n\t setTimeout($.proxy(this.checkPosition, this), 1)\n\t }\n\t\n\t Affix.prototype.checkPosition = function () {\n\t if (!this.$element.is(':visible')) return\n\t\n\t var height = this.$element.height()\n\t var offset = this.options.offset\n\t var offsetTop = offset.top\n\t var offsetBottom = offset.bottom\n\t var scrollHeight = Math.max($(document).height(), $(document.body).height())\n\t\n\t if (typeof offset != 'object') offsetBottom = offsetTop = offset\n\t if (typeof offsetTop == 'function') offsetTop = offset.top(this.$element)\n\t if (typeof offsetBottom == 'function') offsetBottom = offset.bottom(this.$element)\n\t\n\t var affix = this.getState(scrollHeight, height, offsetTop, offsetBottom)\n\t\n\t if (this.affixed != affix) {\n\t if (this.unpin != null) this.$element.css('top', '')\n\t\n\t var affixType = 'affix' + (affix ? '-' + affix : '')\n\t var e = $.Event(affixType + '.bs.affix')\n\t\n\t this.$element.trigger(e)\n\t\n\t if (e.isDefaultPrevented()) return\n\t\n\t this.affixed = affix\n\t this.unpin = affix == 'bottom' ? this.getPinnedOffset() : null\n\t\n\t this.$element\n\t .removeClass(Affix.RESET)\n\t .addClass(affixType)\n\t .trigger(affixType.replace('affix', 'affixed') + '.bs.affix')\n\t }\n\t\n\t if (affix == 'bottom') {\n\t this.$element.offset({\n\t top: scrollHeight - height - offsetBottom\n\t })\n\t }\n\t }\n\t\n\t\n\t // AFFIX PLUGIN DEFINITION\n\t // =======================\n\t\n\t function Plugin(option) {\n\t return this.each(function () {\n\t var $this = $(this)\n\t var data = $this.data('bs.affix')\n\t var options = typeof option == 'object' && option\n\t\n\t if (!data) $this.data('bs.affix', (data = new Affix(this, options)))\n\t if (typeof option == 'string') data[option]()\n\t })\n\t }\n\t\n\t var old = $.fn.affix\n\t\n\t $.fn.affix = Plugin\n\t $.fn.affix.Constructor = Affix\n\t\n\t\n\t // AFFIX NO CONFLICT\n\t // =================\n\t\n\t $.fn.affix.noConflict = function () {\n\t $.fn.affix = old\n\t return this\n\t }\n\t\n\t\n\t // AFFIX DATA-API\n\t // ==============\n\t\n\t $(window).on('load', function () {\n\t $('[data-spy=\"affix\"]').each(function () {\n\t var $spy = $(this)\n\t var data = $spy.data()\n\t\n\t data.offset = data.offset || {}\n\t\n\t if (data.offsetBottom != null) data.offset.bottom = data.offsetBottom\n\t if (data.offsetTop != null) data.offset.top = data.offsetTop\n\t\n\t Plugin.call($spy, data)\n\t })\n\t })\n\t\n\t}(jQuery);\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(16)))\n\n/***/ },\n/* 401 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/* WEBPACK VAR INJECTION */(function(jQuery) {/* ========================================================================\n\t * Bootstrap: alert.js v3.3.7\n\t * http://getbootstrap.com/javascript/#alerts\n\t * ========================================================================\n\t * Copyright 2011-2016 Twitter, Inc.\n\t * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n\t * ======================================================================== */\n\t\n\t\n\t+function ($) {\n\t 'use strict';\n\t\n\t // ALERT CLASS DEFINITION\n\t // ======================\n\t\n\t var dismiss = '[data-dismiss=\"alert\"]'\n\t var Alert = function (el) {\n\t $(el).on('click', dismiss, this.close)\n\t }\n\t\n\t Alert.VERSION = '3.3.7'\n\t\n\t Alert.TRANSITION_DURATION = 150\n\t\n\t Alert.prototype.close = function (e) {\n\t var $this = $(this)\n\t var selector = $this.attr('data-target')\n\t\n\t if (!selector) {\n\t selector = $this.attr('href')\n\t selector = selector && selector.replace(/.*(?=#[^\\s]*$)/, '') // strip for ie7\n\t }\n\t\n\t var $parent = $(selector === '#' ? [] : selector)\n\t\n\t if (e) e.preventDefault()\n\t\n\t if (!$parent.length) {\n\t $parent = $this.closest('.alert')\n\t }\n\t\n\t $parent.trigger(e = $.Event('close.bs.alert'))\n\t\n\t if (e.isDefaultPrevented()) return\n\t\n\t $parent.removeClass('in')\n\t\n\t function removeElement() {\n\t // detach from parent, fire event then clean up data\n\t $parent.detach().trigger('closed.bs.alert').remove()\n\t }\n\t\n\t $.support.transition && $parent.hasClass('fade') ?\n\t $parent\n\t .one('bsTransitionEnd', removeElement)\n\t .emulateTransitionEnd(Alert.TRANSITION_DURATION) :\n\t removeElement()\n\t }\n\t\n\t\n\t // ALERT PLUGIN DEFINITION\n\t // =======================\n\t\n\t function Plugin(option) {\n\t return this.each(function () {\n\t var $this = $(this)\n\t var data = $this.data('bs.alert')\n\t\n\t if (!data) $this.data('bs.alert', (data = new Alert(this)))\n\t if (typeof option == 'string') data[option].call($this)\n\t })\n\t }\n\t\n\t var old = $.fn.alert\n\t\n\t $.fn.alert = Plugin\n\t $.fn.alert.Constructor = Alert\n\t\n\t\n\t // ALERT NO CONFLICT\n\t // =================\n\t\n\t $.fn.alert.noConflict = function () {\n\t $.fn.alert = old\n\t return this\n\t }\n\t\n\t\n\t // ALERT DATA-API\n\t // ==============\n\t\n\t $(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close)\n\t\n\t}(jQuery);\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(16)))\n\n/***/ },\n/* 402 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/* WEBPACK VAR INJECTION */(function(jQuery) {/* ========================================================================\n\t * Bootstrap: button.js v3.3.7\n\t * http://getbootstrap.com/javascript/#buttons\n\t * ========================================================================\n\t * Copyright 2011-2016 Twitter, Inc.\n\t * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n\t * ======================================================================== */\n\t\n\t\n\t+function ($) {\n\t 'use strict';\n\t\n\t // BUTTON PUBLIC CLASS DEFINITION\n\t // ==============================\n\t\n\t var Button = function (element, options) {\n\t this.$element = $(element)\n\t this.options = $.extend({}, Button.DEFAULTS, options)\n\t this.isLoading = false\n\t }\n\t\n\t Button.VERSION = '3.3.7'\n\t\n\t Button.DEFAULTS = {\n\t loadingText: 'loading...'\n\t }\n\t\n\t Button.prototype.setState = function (state) {\n\t var d = 'disabled'\n\t var $el = this.$element\n\t var val = $el.is('input') ? 'val' : 'html'\n\t var data = $el.data()\n\t\n\t state += 'Text'\n\t\n\t if (data.resetText == null) $el.data('resetText', $el[val]())\n\t\n\t // push to event loop to allow forms to submit\n\t setTimeout($.proxy(function () {\n\t $el[val](data[state] == null ? this.options[state] : data[state])\n\t\n\t if (state == 'loadingText') {\n\t this.isLoading = true\n\t $el.addClass(d).attr(d, d).prop(d, true)\n\t } else if (this.isLoading) {\n\t this.isLoading = false\n\t $el.removeClass(d).removeAttr(d).prop(d, false)\n\t }\n\t }, this), 0)\n\t }\n\t\n\t Button.prototype.toggle = function () {\n\t var changed = true\n\t var $parent = this.$element.closest('[data-toggle=\"buttons\"]')\n\t\n\t if ($parent.length) {\n\t var $input = this.$element.find('input')\n\t if ($input.prop('type') == 'radio') {\n\t if ($input.prop('checked')) changed = false\n\t $parent.find('.active').removeClass('active')\n\t this.$element.addClass('active')\n\t } else if ($input.prop('type') == 'checkbox') {\n\t if (($input.prop('checked')) !== this.$element.hasClass('active')) changed = false\n\t this.$element.toggleClass('active')\n\t }\n\t $input.prop('checked', this.$element.hasClass('active'))\n\t if (changed) $input.trigger('change')\n\t } else {\n\t this.$element.attr('aria-pressed', !this.$element.hasClass('active'))\n\t this.$element.toggleClass('active')\n\t }\n\t }\n\t\n\t\n\t // BUTTON PLUGIN DEFINITION\n\t // ========================\n\t\n\t function Plugin(option) {\n\t return this.each(function () {\n\t var $this = $(this)\n\t var data = $this.data('bs.button')\n\t var options = typeof option == 'object' && option\n\t\n\t if (!data) $this.data('bs.button', (data = new Button(this, options)))\n\t\n\t if (option == 'toggle') data.toggle()\n\t else if (option) data.setState(option)\n\t })\n\t }\n\t\n\t var old = $.fn.button\n\t\n\t $.fn.button = Plugin\n\t $.fn.button.Constructor = Button\n\t\n\t\n\t // BUTTON NO CONFLICT\n\t // ==================\n\t\n\t $.fn.button.noConflict = function () {\n\t $.fn.button = old\n\t return this\n\t }\n\t\n\t\n\t // BUTTON DATA-API\n\t // ===============\n\t\n\t $(document)\n\t .on('click.bs.button.data-api', '[data-toggle^=\"button\"]', function (e) {\n\t var $btn = $(e.target).closest('.btn')\n\t Plugin.call($btn, 'toggle')\n\t if (!($(e.target).is('input[type=\"radio\"], input[type=\"checkbox\"]'))) {\n\t // Prevent double click on radios, and the double selections (so cancellation) on checkboxes\n\t e.preventDefault()\n\t // The target component still receive the focus\n\t if ($btn.is('input,button')) $btn.trigger('focus')\n\t else $btn.find('input:visible,button:visible').first().trigger('focus')\n\t }\n\t })\n\t .on('focus.bs.button.data-api blur.bs.button.data-api', '[data-toggle^=\"button\"]', function (e) {\n\t $(e.target).closest('.btn').toggleClass('focus', /^focus(in)?$/.test(e.type))\n\t })\n\t\n\t}(jQuery);\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(16)))\n\n/***/ },\n/* 403 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/* WEBPACK VAR INJECTION */(function(jQuery) {/* ========================================================================\n\t * Bootstrap: carousel.js v3.3.7\n\t * http://getbootstrap.com/javascript/#carousel\n\t * ========================================================================\n\t * Copyright 2011-2016 Twitter, Inc.\n\t * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n\t * ======================================================================== */\n\t\n\t\n\t+function ($) {\n\t 'use strict';\n\t\n\t // CAROUSEL CLASS DEFINITION\n\t // =========================\n\t\n\t var Carousel = function (element, options) {\n\t this.$element = $(element)\n\t this.$indicators = this.$element.find('.carousel-indicators')\n\t this.options = options\n\t this.paused = null\n\t this.sliding = null\n\t this.interval = null\n\t this.$active = null\n\t this.$items = null\n\t\n\t this.options.keyboard && this.$element.on('keydown.bs.carousel', $.proxy(this.keydown, this))\n\t\n\t this.options.pause == 'hover' && !('ontouchstart' in document.documentElement) && this.$element\n\t .on('mouseenter.bs.carousel', $.proxy(this.pause, this))\n\t .on('mouseleave.bs.carousel', $.proxy(this.cycle, this))\n\t }\n\t\n\t Carousel.VERSION = '3.3.7'\n\t\n\t Carousel.TRANSITION_DURATION = 600\n\t\n\t Carousel.DEFAULTS = {\n\t interval: 5000,\n\t pause: 'hover',\n\t wrap: true,\n\t keyboard: true\n\t }\n\t\n\t Carousel.prototype.keydown = function (e) {\n\t if (/input|textarea/i.test(e.target.tagName)) return\n\t switch (e.which) {\n\t case 37: this.prev(); break\n\t case 39: this.next(); break\n\t default: return\n\t }\n\t\n\t e.preventDefault()\n\t }\n\t\n\t Carousel.prototype.cycle = function (e) {\n\t e || (this.paused = false)\n\t\n\t this.interval && clearInterval(this.interval)\n\t\n\t this.options.interval\n\t && !this.paused\n\t && (this.interval = setInterval($.proxy(this.next, this), this.options.interval))\n\t\n\t return this\n\t }\n\t\n\t Carousel.prototype.getItemIndex = function (item) {\n\t this.$items = item.parent().children('.item')\n\t return this.$items.index(item || this.$active)\n\t }\n\t\n\t Carousel.prototype.getItemForDirection = function (direction, active) {\n\t var activeIndex = this.getItemIndex(active)\n\t var willWrap = (direction == 'prev' && activeIndex === 0)\n\t || (direction == 'next' && activeIndex == (this.$items.length - 1))\n\t if (willWrap && !this.options.wrap) return active\n\t var delta = direction == 'prev' ? -1 : 1\n\t var itemIndex = (activeIndex + delta) % this.$items.length\n\t return this.$items.eq(itemIndex)\n\t }\n\t\n\t Carousel.prototype.to = function (pos) {\n\t var that = this\n\t var activeIndex = this.getItemIndex(this.$active = this.$element.find('.item.active'))\n\t\n\t if (pos > (this.$items.length - 1) || pos < 0) return\n\t\n\t if (this.sliding) return this.$element.one('slid.bs.carousel', function () { that.to(pos) }) // yes, \"slid\"\n\t if (activeIndex == pos) return this.pause().cycle()\n\t\n\t return this.slide(pos > activeIndex ? 'next' : 'prev', this.$items.eq(pos))\n\t }\n\t\n\t Carousel.prototype.pause = function (e) {\n\t e || (this.paused = true)\n\t\n\t if (this.$element.find('.next, .prev').length && $.support.transition) {\n\t this.$element.trigger($.support.transition.end)\n\t this.cycle(true)\n\t }\n\t\n\t this.interval = clearInterval(this.interval)\n\t\n\t return this\n\t }\n\t\n\t Carousel.prototype.next = function () {\n\t if (this.sliding) return\n\t return this.slide('next')\n\t }\n\t\n\t Carousel.prototype.prev = function () {\n\t if (this.sliding) return\n\t return this.slide('prev')\n\t }\n\t\n\t Carousel.prototype.slide = function (type, next) {\n\t var $active = this.$element.find('.item.active')\n\t var $next = next || this.getItemForDirection(type, $active)\n\t var isCycling = this.interval\n\t var direction = type == 'next' ? 'left' : 'right'\n\t var that = this\n\t\n\t if ($next.hasClass('active')) return (this.sliding = false)\n\t\n\t var relatedTarget = $next[0]\n\t var slideEvent = $.Event('slide.bs.carousel', {\n\t relatedTarget: relatedTarget,\n\t direction: direction\n\t })\n\t this.$element.trigger(slideEvent)\n\t if (slideEvent.isDefaultPrevented()) return\n\t\n\t this.sliding = true\n\t\n\t isCycling && this.pause()\n\t\n\t if (this.$indicators.length) {\n\t this.$indicators.find('.active').removeClass('active')\n\t var $nextIndicator = $(this.$indicators.children()[this.getItemIndex($next)])\n\t $nextIndicator && $nextIndicator.addClass('active')\n\t }\n\t\n\t var slidEvent = $.Event('slid.bs.carousel', { relatedTarget: relatedTarget, direction: direction }) // yes, \"slid\"\n\t if ($.support.transition && this.$element.hasClass('slide')) {\n\t $next.addClass(type)\n\t $next[0].offsetWidth // force reflow\n\t $active.addClass(direction)\n\t $next.addClass(direction)\n\t $active\n\t .one('bsTransitionEnd', function () {\n\t $next.removeClass([type, direction].join(' ')).addClass('active')\n\t $active.removeClass(['active', direction].join(' '))\n\t that.sliding = false\n\t setTimeout(function () {\n\t that.$element.trigger(slidEvent)\n\t }, 0)\n\t })\n\t .emulateTransitionEnd(Carousel.TRANSITION_DURATION)\n\t } else {\n\t $active.removeClass('active')\n\t $next.addClass('active')\n\t this.sliding = false\n\t this.$element.trigger(slidEvent)\n\t }\n\t\n\t isCycling && this.cycle()\n\t\n\t return this\n\t }\n\t\n\t\n\t // CAROUSEL PLUGIN DEFINITION\n\t // ==========================\n\t\n\t function Plugin(option) {\n\t return this.each(function () {\n\t var $this = $(this)\n\t var data = $this.data('bs.carousel')\n\t var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option)\n\t var action = typeof option == 'string' ? option : options.slide\n\t\n\t if (!data) $this.data('bs.carousel', (data = new Carousel(this, options)))\n\t if (typeof option == 'number') data.to(option)\n\t else if (action) data[action]()\n\t else if (options.interval) data.pause().cycle()\n\t })\n\t }\n\t\n\t var old = $.fn.carousel\n\t\n\t $.fn.carousel = Plugin\n\t $.fn.carousel.Constructor = Carousel\n\t\n\t\n\t // CAROUSEL NO CONFLICT\n\t // ====================\n\t\n\t $.fn.carousel.noConflict = function () {\n\t $.fn.carousel = old\n\t return this\n\t }\n\t\n\t\n\t // CAROUSEL DATA-API\n\t // =================\n\t\n\t var clickHandler = function (e) {\n\t var href\n\t var $this = $(this)\n\t var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\\s]+$)/, '')) // strip for ie7\n\t if (!$target.hasClass('carousel')) return\n\t var options = $.extend({}, $target.data(), $this.data())\n\t var slideIndex = $this.attr('data-slide-to')\n\t if (slideIndex) options.interval = false\n\t\n\t Plugin.call($target, options)\n\t\n\t if (slideIndex) {\n\t $target.data('bs.carousel').to(slideIndex)\n\t }\n\t\n\t e.preventDefault()\n\t }\n\t\n\t $(document)\n\t .on('click.bs.carousel.data-api', '[data-slide]', clickHandler)\n\t .on('click.bs.carousel.data-api', '[data-slide-to]', clickHandler)\n\t\n\t $(window).on('load', function () {\n\t $('[data-ride=\"carousel\"]').each(function () {\n\t var $carousel = $(this)\n\t Plugin.call($carousel, $carousel.data())\n\t })\n\t })\n\t\n\t}(jQuery);\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(16)))\n\n/***/ },\n/* 404 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/* WEBPACK VAR INJECTION */(function(jQuery) {/* ========================================================================\n\t * Bootstrap: collapse.js v3.3.7\n\t * http://getbootstrap.com/javascript/#collapse\n\t * ========================================================================\n\t * Copyright 2011-2016 Twitter, Inc.\n\t * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n\t * ======================================================================== */\n\t\n\t/* jshint latedef: false */\n\t\n\t+function ($) {\n\t 'use strict';\n\t\n\t // COLLAPSE PUBLIC CLASS DEFINITION\n\t // ================================\n\t\n\t var Collapse = function (element, options) {\n\t this.$element = $(element)\n\t this.options = $.extend({}, Collapse.DEFAULTS, options)\n\t this.$trigger = $('[data-toggle=\"collapse\"][href=\"#' + element.id + '\"],' +\n\t '[data-toggle=\"collapse\"][data-target=\"#' + element.id + '\"]')\n\t this.transitioning = null\n\t\n\t if (this.options.parent) {\n\t this.$parent = this.getParent()\n\t } else {\n\t this.addAriaAndCollapsedClass(this.$element, this.$trigger)\n\t }\n\t\n\t if (this.options.toggle) this.toggle()\n\t }\n\t\n\t Collapse.VERSION = '3.3.7'\n\t\n\t Collapse.TRANSITION_DURATION = 350\n\t\n\t Collapse.DEFAULTS = {\n\t toggle: true\n\t }\n\t\n\t Collapse.prototype.dimension = function () {\n\t var hasWidth = this.$element.hasClass('width')\n\t return hasWidth ? 'width' : 'height'\n\t }\n\t\n\t Collapse.prototype.show = function () {\n\t if (this.transitioning || this.$element.hasClass('in')) return\n\t\n\t var activesData\n\t var actives = this.$parent && this.$parent.children('.panel').children('.in, .collapsing')\n\t\n\t if (actives && actives.length) {\n\t activesData = actives.data('bs.collapse')\n\t if (activesData && activesData.transitioning) return\n\t }\n\t\n\t var startEvent = $.Event('show.bs.collapse')\n\t this.$element.trigger(startEvent)\n\t if (startEvent.isDefaultPrevented()) return\n\t\n\t if (actives && actives.length) {\n\t Plugin.call(actives, 'hide')\n\t activesData || actives.data('bs.collapse', null)\n\t }\n\t\n\t var dimension = this.dimension()\n\t\n\t this.$element\n\t .removeClass('collapse')\n\t .addClass('collapsing')[dimension](0)\n\t .attr('aria-expanded', true)\n\t\n\t this.$trigger\n\t .removeClass('collapsed')\n\t .attr('aria-expanded', true)\n\t\n\t this.transitioning = 1\n\t\n\t var complete = function () {\n\t this.$element\n\t .removeClass('collapsing')\n\t .addClass('collapse in')[dimension]('')\n\t this.transitioning = 0\n\t this.$element\n\t .trigger('shown.bs.collapse')\n\t }\n\t\n\t if (!$.support.transition) return complete.call(this)\n\t\n\t var scrollSize = $.camelCase(['scroll', dimension].join('-'))\n\t\n\t this.$element\n\t .one('bsTransitionEnd', $.proxy(complete, this))\n\t .emulateTransitionEnd(Collapse.TRANSITION_DURATION)[dimension](this.$element[0][scrollSize])\n\t }\n\t\n\t Collapse.prototype.hide = function () {\n\t if (this.transitioning || !this.$element.hasClass('in')) return\n\t\n\t var startEvent = $.Event('hide.bs.collapse')\n\t this.$element.trigger(startEvent)\n\t if (startEvent.isDefaultPrevented()) return\n\t\n\t var dimension = this.dimension()\n\t\n\t this.$element[dimension](this.$element[dimension]())[0].offsetHeight\n\t\n\t this.$element\n\t .addClass('collapsing')\n\t .removeClass('collapse in')\n\t .attr('aria-expanded', false)\n\t\n\t this.$trigger\n\t .addClass('collapsed')\n\t .attr('aria-expanded', false)\n\t\n\t this.transitioning = 1\n\t\n\t var complete = function () {\n\t this.transitioning = 0\n\t this.$element\n\t .removeClass('collapsing')\n\t .addClass('collapse')\n\t .trigger('hidden.bs.collapse')\n\t }\n\t\n\t if (!$.support.transition) return complete.call(this)\n\t\n\t this.$element\n\t [dimension](0)\n\t .one('bsTransitionEnd', $.proxy(complete, this))\n\t .emulateTransitionEnd(Collapse.TRANSITION_DURATION)\n\t }\n\t\n\t Collapse.prototype.toggle = function () {\n\t this[this.$element.hasClass('in') ? 'hide' : 'show']()\n\t }\n\t\n\t Collapse.prototype.getParent = function () {\n\t return $(this.options.parent)\n\t .find('[data-toggle=\"collapse\"][data-parent=\"' + this.options.parent + '\"]')\n\t .each($.proxy(function (i, element) {\n\t var $element = $(element)\n\t this.addAriaAndCollapsedClass(getTargetFromTrigger($element), $element)\n\t }, this))\n\t .end()\n\t }\n\t\n\t Collapse.prototype.addAriaAndCollapsedClass = function ($element, $trigger) {\n\t var isOpen = $element.hasClass('in')\n\t\n\t $element.attr('aria-expanded', isOpen)\n\t $trigger\n\t .toggleClass('collapsed', !isOpen)\n\t .attr('aria-expanded', isOpen)\n\t }\n\t\n\t function getTargetFromTrigger($trigger) {\n\t var href\n\t var target = $trigger.attr('data-target')\n\t || (href = $trigger.attr('href')) && href.replace(/.*(?=#[^\\s]+$)/, '') // strip for ie7\n\t\n\t return $(target)\n\t }\n\t\n\t\n\t // COLLAPSE PLUGIN DEFINITION\n\t // ==========================\n\t\n\t function Plugin(option) {\n\t return this.each(function () {\n\t var $this = $(this)\n\t var data = $this.data('bs.collapse')\n\t var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option)\n\t\n\t if (!data && options.toggle && /show|hide/.test(option)) options.toggle = false\n\t if (!data) $this.data('bs.collapse', (data = new Collapse(this, options)))\n\t if (typeof option == 'string') data[option]()\n\t })\n\t }\n\t\n\t var old = $.fn.collapse\n\t\n\t $.fn.collapse = Plugin\n\t $.fn.collapse.Constructor = Collapse\n\t\n\t\n\t // COLLAPSE NO CONFLICT\n\t // ====================\n\t\n\t $.fn.collapse.noConflict = function () {\n\t $.fn.collapse = old\n\t return this\n\t }\n\t\n\t\n\t // COLLAPSE DATA-API\n\t // =================\n\t\n\t $(document).on('click.bs.collapse.data-api', '[data-toggle=\"collapse\"]', function (e) {\n\t var $this = $(this)\n\t\n\t if (!$this.attr('data-target')) e.preventDefault()\n\t\n\t var $target = getTargetFromTrigger($this)\n\t var data = $target.data('bs.collapse')\n\t var option = data ? 'toggle' : $this.data()\n\t\n\t Plugin.call($target, option)\n\t })\n\t\n\t}(jQuery);\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(16)))\n\n/***/ },\n/* 405 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/* WEBPACK VAR INJECTION */(function(jQuery) {/* ========================================================================\n\t * Bootstrap: dropdown.js v3.3.7\n\t * http://getbootstrap.com/javascript/#dropdowns\n\t * ========================================================================\n\t * Copyright 2011-2016 Twitter, Inc.\n\t * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n\t * ======================================================================== */\n\t\n\t\n\t+function ($) {\n\t 'use strict';\n\t\n\t // DROPDOWN CLASS DEFINITION\n\t // =========================\n\t\n\t var backdrop = '.dropdown-backdrop'\n\t var toggle = '[data-toggle=\"dropdown\"]'\n\t var Dropdown = function (element) {\n\t $(element).on('click.bs.dropdown', this.toggle)\n\t }\n\t\n\t Dropdown.VERSION = '3.3.7'\n\t\n\t function getParent($this) {\n\t var selector = $this.attr('data-target')\n\t\n\t if (!selector) {\n\t selector = $this.attr('href')\n\t selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\\s]*$)/, '') // strip for ie7\n\t }\n\t\n\t var $parent = selector && $(selector)\n\t\n\t return $parent && $parent.length ? $parent : $this.parent()\n\t }\n\t\n\t function clearMenus(e) {\n\t if (e && e.which === 3) return\n\t $(backdrop).remove()\n\t $(toggle).each(function () {\n\t var $this = $(this)\n\t var $parent = getParent($this)\n\t var relatedTarget = { relatedTarget: this }\n\t\n\t if (!$parent.hasClass('open')) return\n\t\n\t if (e && e.type == 'click' && /input|textarea/i.test(e.target.tagName) && $.contains($parent[0], e.target)) return\n\t\n\t $parent.trigger(e = $.Event('hide.bs.dropdown', relatedTarget))\n\t\n\t if (e.isDefaultPrevented()) return\n\t\n\t $this.attr('aria-expanded', 'false')\n\t $parent.removeClass('open').trigger($.Event('hidden.bs.dropdown', relatedTarget))\n\t })\n\t }\n\t\n\t Dropdown.prototype.toggle = function (e) {\n\t var $this = $(this)\n\t\n\t if ($this.is('.disabled, :disabled')) return\n\t\n\t var $parent = getParent($this)\n\t var isActive = $parent.hasClass('open')\n\t\n\t clearMenus()\n\t\n\t if (!isActive) {\n\t if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) {\n\t // if mobile we use a backdrop because click events don't delegate\n\t $(document.createElement('div'))\n\t .addClass('dropdown-backdrop')\n\t .insertAfter($(this))\n\t .on('click', clearMenus)\n\t }\n\t\n\t var relatedTarget = { relatedTarget: this }\n\t $parent.trigger(e = $.Event('show.bs.dropdown', relatedTarget))\n\t\n\t if (e.isDefaultPrevented()) return\n\t\n\t $this\n\t .trigger('focus')\n\t .attr('aria-expanded', 'true')\n\t\n\t $parent\n\t .toggleClass('open')\n\t .trigger($.Event('shown.bs.dropdown', relatedTarget))\n\t }\n\t\n\t return false\n\t }\n\t\n\t Dropdown.prototype.keydown = function (e) {\n\t if (!/(38|40|27|32)/.test(e.which) || /input|textarea/i.test(e.target.tagName)) return\n\t\n\t var $this = $(this)\n\t\n\t e.preventDefault()\n\t e.stopPropagation()\n\t\n\t if ($this.is('.disabled, :disabled')) return\n\t\n\t var $parent = getParent($this)\n\t var isActive = $parent.hasClass('open')\n\t\n\t if (!isActive && e.which != 27 || isActive && e.which == 27) {\n\t if (e.which == 27) $parent.find(toggle).trigger('focus')\n\t return $this.trigger('click')\n\t }\n\t\n\t var desc = ' li:not(.disabled):visible a'\n\t var $items = $parent.find('.dropdown-menu' + desc)\n\t\n\t if (!$items.length) return\n\t\n\t var index = $items.index(e.target)\n\t\n\t if (e.which == 38 && index > 0) index-- // up\n\t if (e.which == 40 && index < $items.length - 1) index++ // down\n\t if (!~index) index = 0\n\t\n\t $items.eq(index).trigger('focus')\n\t }\n\t\n\t\n\t // DROPDOWN PLUGIN DEFINITION\n\t // ==========================\n\t\n\t function Plugin(option) {\n\t return this.each(function () {\n\t var $this = $(this)\n\t var data = $this.data('bs.dropdown')\n\t\n\t if (!data) $this.data('bs.dropdown', (data = new Dropdown(this)))\n\t if (typeof option == 'string') data[option].call($this)\n\t })\n\t }\n\t\n\t var old = $.fn.dropdown\n\t\n\t $.fn.dropdown = Plugin\n\t $.fn.dropdown.Constructor = Dropdown\n\t\n\t\n\t // DROPDOWN NO CONFLICT\n\t // ====================\n\t\n\t $.fn.dropdown.noConflict = function () {\n\t $.fn.dropdown = old\n\t return this\n\t }\n\t\n\t\n\t // APPLY TO STANDARD DROPDOWN ELEMENTS\n\t // ===================================\n\t\n\t $(document)\n\t .on('click.bs.dropdown.data-api', clearMenus)\n\t .on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() })\n\t .on('click.bs.dropdown.data-api', toggle, Dropdown.prototype.toggle)\n\t .on('keydown.bs.dropdown.data-api', toggle, Dropdown.prototype.keydown)\n\t .on('keydown.bs.dropdown.data-api', '.dropdown-menu', Dropdown.prototype.keydown)\n\t\n\t}(jQuery);\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(16)))\n\n/***/ },\n/* 406 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/* WEBPACK VAR INJECTION */(function(jQuery) {/* ========================================================================\n\t * Bootstrap: modal.js v3.3.7\n\t * http://getbootstrap.com/javascript/#modals\n\t * ========================================================================\n\t * Copyright 2011-2016 Twitter, Inc.\n\t * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n\t * ======================================================================== */\n\t\n\t\n\t+function ($) {\n\t 'use strict';\n\t\n\t // MODAL CLASS DEFINITION\n\t // ======================\n\t\n\t var Modal = function (element, options) {\n\t this.options = options\n\t this.$body = $(document.body)\n\t this.$element = $(element)\n\t this.$dialog = this.$element.find('.modal-dialog')\n\t this.$backdrop = null\n\t this.isShown = null\n\t this.originalBodyPad = null\n\t this.scrollbarWidth = 0\n\t this.ignoreBackdropClick = false\n\t\n\t if (this.options.remote) {\n\t this.$element\n\t .find('.modal-content')\n\t .load(this.options.remote, $.proxy(function () {\n\t this.$element.trigger('loaded.bs.modal')\n\t }, this))\n\t }\n\t }\n\t\n\t Modal.VERSION = '3.3.7'\n\t\n\t Modal.TRANSITION_DURATION = 300\n\t Modal.BACKDROP_TRANSITION_DURATION = 150\n\t\n\t Modal.DEFAULTS = {\n\t backdrop: true,\n\t keyboard: true,\n\t show: true\n\t }\n\t\n\t Modal.prototype.toggle = function (_relatedTarget) {\n\t return this.isShown ? this.hide() : this.show(_relatedTarget)\n\t }\n\t\n\t Modal.prototype.show = function (_relatedTarget) {\n\t var that = this\n\t var e = $.Event('show.bs.modal', { relatedTarget: _relatedTarget })\n\t\n\t this.$element.trigger(e)\n\t\n\t if (this.isShown || e.isDefaultPrevented()) return\n\t\n\t this.isShown = true\n\t\n\t this.checkScrollbar()\n\t this.setScrollbar()\n\t this.$body.addClass('modal-open')\n\t\n\t this.escape()\n\t this.resize()\n\t\n\t this.$element.on('click.dismiss.bs.modal', '[data-dismiss=\"modal\"]', $.proxy(this.hide, this))\n\t\n\t this.$dialog.on('mousedown.dismiss.bs.modal', function () {\n\t that.$element.one('mouseup.dismiss.bs.modal', function (e) {\n\t if ($(e.target).is(that.$element)) that.ignoreBackdropClick = true\n\t })\n\t })\n\t\n\t this.backdrop(function () {\n\t var transition = $.support.transition && that.$element.hasClass('fade')\n\t\n\t if (!that.$element.parent().length) {\n\t that.$element.appendTo(that.$body) // don't move modals dom position\n\t }\n\t\n\t that.$element\n\t .show()\n\t .scrollTop(0)\n\t\n\t that.adjustDialog()\n\t\n\t if (transition) {\n\t that.$element[0].offsetWidth // force reflow\n\t }\n\t\n\t that.$element.addClass('in')\n\t\n\t that.enforceFocus()\n\t\n\t var e = $.Event('shown.bs.modal', { relatedTarget: _relatedTarget })\n\t\n\t transition ?\n\t that.$dialog // wait for modal to slide in\n\t .one('bsTransitionEnd', function () {\n\t that.$element.trigger('focus').trigger(e)\n\t })\n\t .emulateTransitionEnd(Modal.TRANSITION_DURATION) :\n\t that.$element.trigger('focus').trigger(e)\n\t })\n\t }\n\t\n\t Modal.prototype.hide = function (e) {\n\t if (e) e.preventDefault()\n\t\n\t e = $.Event('hide.bs.modal')\n\t\n\t this.$element.trigger(e)\n\t\n\t if (!this.isShown || e.isDefaultPrevented()) return\n\t\n\t this.isShown = false\n\t\n\t this.escape()\n\t this.resize()\n\t\n\t $(document).off('focusin.bs.modal')\n\t\n\t this.$element\n\t .removeClass('in')\n\t .off('click.dismiss.bs.modal')\n\t .off('mouseup.dismiss.bs.modal')\n\t\n\t this.$dialog.off('mousedown.dismiss.bs.modal')\n\t\n\t $.support.transition && this.$element.hasClass('fade') ?\n\t this.$element\n\t .one('bsTransitionEnd', $.proxy(this.hideModal, this))\n\t .emulateTransitionEnd(Modal.TRANSITION_DURATION) :\n\t this.hideModal()\n\t }\n\t\n\t Modal.prototype.enforceFocus = function () {\n\t $(document)\n\t .off('focusin.bs.modal') // guard against infinite focus loop\n\t .on('focusin.bs.modal', $.proxy(function (e) {\n\t if (document !== e.target &&\n\t this.$element[0] !== e.target &&\n\t !this.$element.has(e.target).length) {\n\t this.$element.trigger('focus')\n\t }\n\t }, this))\n\t }\n\t\n\t Modal.prototype.escape = function () {\n\t if (this.isShown && this.options.keyboard) {\n\t this.$element.on('keydown.dismiss.bs.modal', $.proxy(function (e) {\n\t e.which == 27 && this.hide()\n\t }, this))\n\t } else if (!this.isShown) {\n\t this.$element.off('keydown.dismiss.bs.modal')\n\t }\n\t }\n\t\n\t Modal.prototype.resize = function () {\n\t if (this.isShown) {\n\t $(window).on('resize.bs.modal', $.proxy(this.handleUpdate, this))\n\t } else {\n\t $(window).off('resize.bs.modal')\n\t }\n\t }\n\t\n\t Modal.prototype.hideModal = function () {\n\t var that = this\n\t this.$element.hide()\n\t this.backdrop(function () {\n\t that.$body.removeClass('modal-open')\n\t that.resetAdjustments()\n\t that.resetScrollbar()\n\t that.$element.trigger('hidden.bs.modal')\n\t })\n\t }\n\t\n\t Modal.prototype.removeBackdrop = function () {\n\t this.$backdrop && this.$backdrop.remove()\n\t this.$backdrop = null\n\t }\n\t\n\t Modal.prototype.backdrop = function (callback) {\n\t var that = this\n\t var animate = this.$element.hasClass('fade') ? 'fade' : ''\n\t\n\t if (this.isShown && this.options.backdrop) {\n\t var doAnimate = $.support.transition && animate\n\t\n\t this.$backdrop = $(document.createElement('div'))\n\t .addClass('modal-backdrop ' + animate)\n\t .appendTo(this.$body)\n\t\n\t this.$element.on('click.dismiss.bs.modal', $.proxy(function (e) {\n\t if (this.ignoreBackdropClick) {\n\t this.ignoreBackdropClick = false\n\t return\n\t }\n\t if (e.target !== e.currentTarget) return\n\t this.options.backdrop == 'static'\n\t ? this.$element[0].focus()\n\t : this.hide()\n\t }, this))\n\t\n\t if (doAnimate) this.$backdrop[0].offsetWidth // force reflow\n\t\n\t this.$backdrop.addClass('in')\n\t\n\t if (!callback) return\n\t\n\t doAnimate ?\n\t this.$backdrop\n\t .one('bsTransitionEnd', callback)\n\t .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) :\n\t callback()\n\t\n\t } else if (!this.isShown && this.$backdrop) {\n\t this.$backdrop.removeClass('in')\n\t\n\t var callbackRemove = function () {\n\t that.removeBackdrop()\n\t callback && callback()\n\t }\n\t $.support.transition && this.$element.hasClass('fade') ?\n\t this.$backdrop\n\t .one('bsTransitionEnd', callbackRemove)\n\t .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) :\n\t callbackRemove()\n\t\n\t } else if (callback) {\n\t callback()\n\t }\n\t }\n\t\n\t // these following methods are used to handle overflowing modals\n\t\n\t Modal.prototype.handleUpdate = function () {\n\t this.adjustDialog()\n\t }\n\t\n\t Modal.prototype.adjustDialog = function () {\n\t var modalIsOverflowing = this.$element[0].scrollHeight > document.documentElement.clientHeight\n\t\n\t this.$element.css({\n\t paddingLeft: !this.bodyIsOverflowing && modalIsOverflowing ? this.scrollbarWidth : '',\n\t paddingRight: this.bodyIsOverflowing && !modalIsOverflowing ? this.scrollbarWidth : ''\n\t })\n\t }\n\t\n\t Modal.prototype.resetAdjustments = function () {\n\t this.$element.css({\n\t paddingLeft: '',\n\t paddingRight: ''\n\t })\n\t }\n\t\n\t Modal.prototype.checkScrollbar = function () {\n\t var fullWindowWidth = window.innerWidth\n\t if (!fullWindowWidth) { // workaround for missing window.innerWidth in IE8\n\t var documentElementRect = document.documentElement.getBoundingClientRect()\n\t fullWindowWidth = documentElementRect.right - Math.abs(documentElementRect.left)\n\t }\n\t this.bodyIsOverflowing = document.body.clientWidth < fullWindowWidth\n\t this.scrollbarWidth = this.measureScrollbar()\n\t }\n\t\n\t Modal.prototype.setScrollbar = function () {\n\t var bodyPad = parseInt((this.$body.css('padding-right') || 0), 10)\n\t this.originalBodyPad = document.body.style.paddingRight || ''\n\t if (this.bodyIsOverflowing) this.$body.css('padding-right', bodyPad + this.scrollbarWidth)\n\t }\n\t\n\t Modal.prototype.resetScrollbar = function () {\n\t this.$body.css('padding-right', this.originalBodyPad)\n\t }\n\t\n\t Modal.prototype.measureScrollbar = function () { // thx walsh\n\t var scrollDiv = document.createElement('div')\n\t scrollDiv.className = 'modal-scrollbar-measure'\n\t this.$body.append(scrollDiv)\n\t var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth\n\t this.$body[0].removeChild(scrollDiv)\n\t return scrollbarWidth\n\t }\n\t\n\t\n\t // MODAL PLUGIN DEFINITION\n\t // =======================\n\t\n\t function Plugin(option, _relatedTarget) {\n\t return this.each(function () {\n\t var $this = $(this)\n\t var data = $this.data('bs.modal')\n\t var options = $.extend({}, Modal.DEFAULTS, $this.data(), typeof option == 'object' && option)\n\t\n\t if (!data) $this.data('bs.modal', (data = new Modal(this, options)))\n\t if (typeof option == 'string') data[option](_relatedTarget)\n\t else if (options.show) data.show(_relatedTarget)\n\t })\n\t }\n\t\n\t var old = $.fn.modal\n\t\n\t $.fn.modal = Plugin\n\t $.fn.modal.Constructor = Modal\n\t\n\t\n\t // MODAL NO CONFLICT\n\t // =================\n\t\n\t $.fn.modal.noConflict = function () {\n\t $.fn.modal = old\n\t return this\n\t }\n\t\n\t\n\t // MODAL DATA-API\n\t // ==============\n\t\n\t $(document).on('click.bs.modal.data-api', '[data-toggle=\"modal\"]', function (e) {\n\t var $this = $(this)\n\t var href = $this.attr('href')\n\t var $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\\s]+$)/, ''))) // strip for ie7\n\t var option = $target.data('bs.modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data())\n\t\n\t if ($this.is('a')) e.preventDefault()\n\t\n\t $target.one('show.bs.modal', function (showEvent) {\n\t if (showEvent.isDefaultPrevented()) return // only register focus restorer if modal will actually get shown\n\t $target.one('hidden.bs.modal', function () {\n\t $this.is(':visible') && $this.trigger('focus')\n\t })\n\t })\n\t Plugin.call($target, option, this)\n\t })\n\t\n\t}(jQuery);\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(16)))\n\n/***/ },\n/* 407 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/* WEBPACK VAR INJECTION */(function(jQuery) {/* ========================================================================\n\t * Bootstrap: popover.js v3.3.7\n\t * http://getbootstrap.com/javascript/#popovers\n\t * ========================================================================\n\t * Copyright 2011-2016 Twitter, Inc.\n\t * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n\t * ======================================================================== */\n\t\n\t\n\t+function ($) {\n\t 'use strict';\n\t\n\t // POPOVER PUBLIC CLASS DEFINITION\n\t // ===============================\n\t\n\t var Popover = function (element, options) {\n\t this.init('popover', element, options)\n\t }\n\t\n\t if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js')\n\t\n\t Popover.VERSION = '3.3.7'\n\t\n\t Popover.DEFAULTS = $.extend({}, $.fn.tooltip.Constructor.DEFAULTS, {\n\t placement: 'right',\n\t trigger: 'click',\n\t content: '',\n\t template: '