diff --git a/client/source/scripts/components/torrent-list/ActionBar.js b/client/source/scripts/components/torrent-list/ActionBar.js index c41c15ea..cbf1c2b3 100644 --- a/client/source/scripts/components/torrent-list/ActionBar.js +++ b/client/source/scripts/components/torrent-list/ActionBar.js @@ -8,7 +8,7 @@ import Remove from '../icons/Remove'; import SortDropdown from './SortDropdown'; import Start from '../icons/Start'; import Stop from '../icons/Stop'; -import stringUtil from '../../../../../util/stringUtil'; +import stringUtil from '../../../../../shared/util/stringUtil'; import TorrentActions from '../../actions/TorrentActions'; import TorrentFilterStore from '../../stores/TorrentFilterStore'; import TorrentStore from '../../stores/TorrentStore'; diff --git a/client/source/scripts/stores/TorrentStore.js b/client/source/scripts/stores/TorrentStore.js index 77854443..716105d2 100644 --- a/client/source/scripts/stores/TorrentStore.js +++ b/client/source/scripts/stores/TorrentStore.js @@ -17,12 +17,12 @@ class TorrentStoreClass extends BaseStore { constructor() { super(); - this.filteredTorrents = []; + this.filteredTorrents = {}; this.pollTorrentDetailsIntervalID = null; this.pollTorrentsIntervalID = null; this.selectedTorrents = []; - this.torrentDetails = {}; - this.torrents = []; + this.sortedTorrents = []; + this.torrents = {}; } fetchTorrentDetails() { @@ -42,11 +42,11 @@ class TorrentStoreClass extends BaseStore { } getTorrentDetails(hash) { - return this.torrentDetails[hash] || {}; + return this.torrents[hash].details || {}; } setTorrentDetails(hash, torrentDetails) { - this.torrentDetails[hash] = torrentDetails; + this.torrents[hash].details = torrentDetails; this.emit(EventTypes.CLIENT_TORRENT_DETAILS_CHANGE); } @@ -59,15 +59,13 @@ class TorrentStoreClass extends BaseStore { event, hash, selectedTorrents: this.selectedTorrents, - torrentList: this.torrents + torrentList: this.sortedTorrents }); this.emit(EventTypes.UI_TORRENT_SELECTION_CHANGE); } getTorrent(hash) { - return _.find(this.torrents, (torrent) => { - return torrent.hash === hash; - }); + return this.torrents[hash]; } getTorrents() { @@ -76,21 +74,22 @@ class TorrentStoreClass extends BaseStore { return this.filteredTorrents; } - return this.torrents; + return this.sortedTorrents; } setTorrents(torrents) { let torrentsSort = TorrentFilterStore.getTorrentsSort(); - this.torrents = sortTorrents( - Object.assign([], torrents), - {direction: torrentsSort.direction, property: torrentsSort.value} - ); + this.torrents = torrents; + + // Convert torrents hash to array and sort it. + this.sortedTorrents = sortTorrents(this.torrents, + {direction: torrentsSort.direction, property: torrentsSort.value}); let statusFilter = TorrentFilterStore.getStatusFilter(); let searchFilter = TorrentFilterStore.getSearchFilter(); - let filteredTorrents = Object.assign([], this.torrents); + let filteredTorrents = Object.assign([], this.sortedTorrents); if (statusFilter && statusFilter !== 'all') { filteredTorrents = filterTorrents(filteredTorrents, statusFilter); diff --git a/client/source/scripts/util/sortTorrents.js b/client/source/scripts/util/sortTorrents.js index 8b63d790..9ebedc4e 100644 --- a/client/source/scripts/util/sortTorrents.js +++ b/client/source/scripts/util/sortTorrents.js @@ -1,4 +1,8 @@ -export function sortTorrents(torrents, sortBy) { +export function sortTorrents(torrentsHash, sortBy) { + let torrents = Object.keys(torrentsHash).map((hash) => { + return {hash, ...torrentsHash[hash]}; + }); + if (torrents.length) { let direction = sortBy.direction; let property = sortBy.property; diff --git a/server/assets/app.js b/server/assets/app.js index b01e3c0e..778f309d 100644 --- a/server/assets/app.js +++ b/server/assets/app.js @@ -1424,7 +1424,7 @@ /* 230 */ /***/ function(module, exports, __webpack_require__) { - eval("'use strict';\n\nObject.defineProperty(exports, '__esModule', {\n value: true\n});\n\nvar _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\nvar _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nfunction _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\nvar _lodash = __webpack_require__(161);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _constantsActionTypes = __webpack_require__(197);\n\nvar _constantsActionTypes2 = _interopRequireDefault(_constantsActionTypes);\n\nvar _dispatcherAppDispatcher = __webpack_require__(193);\n\nvar _dispatcherAppDispatcher2 = _interopRequireDefault(_dispatcherAppDispatcher);\n\nvar _BaseStore2 = __webpack_require__(200);\n\nvar _BaseStore3 = _interopRequireDefault(_BaseStore2);\n\nvar _config = __webpack_require__(212);\n\nvar _config2 = _interopRequireDefault(_config);\n\nvar _constantsEventTypes = __webpack_require__(172);\n\nvar _constantsEventTypes2 = _interopRequireDefault(_constantsEventTypes);\n\nvar _utilFilterTorrents = __webpack_require__(231);\n\nvar _utilSearchTorrents = __webpack_require__(233);\n\nvar _utilSelectTorrents = __webpack_require__(202);\n\nvar _utilSortTorrents = __webpack_require__(234);\n\nvar _actionsTorrentActions = __webpack_require__(178);\n\nvar _actionsTorrentActions2 = _interopRequireDefault(_actionsTorrentActions);\n\nvar _TorrentFilterStore = __webpack_require__(229);\n\nvar _TorrentFilterStore2 = _interopRequireDefault(_TorrentFilterStore);\n\nvar _UIStore = __webpack_require__(199);\n\nvar _UIStore2 = _interopRequireDefault(_UIStore);\n\nvar TorrentStoreClass = (function (_BaseStore) {\n _inherits(TorrentStoreClass, _BaseStore);\n\n function TorrentStoreClass() {\n _classCallCheck(this, TorrentStoreClass);\n\n _get(Object.getPrototypeOf(TorrentStoreClass.prototype), 'constructor', this).call(this);\n\n this.filteredTorrents = [];\n this.pollTorrentDetailsIntervalID = null;\n this.pollTorrentsIntervalID = null;\n this.selectedTorrents = [];\n this.torrentDetails = {};\n this.torrents = [];\n }\n\n _createClass(TorrentStoreClass, [{\n key: 'fetchTorrentDetails',\n value: function fetchTorrentDetails() {\n _actionsTorrentActions2['default'].fetchTorrentDetails(_UIStore2['default'].getTorrentDetailsHash());\n if (this.pollTorrentDetailsIntervalID === null) {\n this.stopPollingTorrentDetails();\n this.startPollingTorrentDetails();\n }\n }\n }, {\n key: 'fetchTorrents',\n value: function fetchTorrents() {\n _actionsTorrentActions2['default'].fetchTorrents();\n\n if (this.pollTorrentsIntervalID === null) {\n this.startPollingTorrents();\n }\n }\n }, {\n key: 'getTorrentDetails',\n value: function getTorrentDetails(hash) {\n return this.torrentDetails[hash] || {};\n }\n }, {\n key: 'setTorrentDetails',\n value: function setTorrentDetails(hash, torrentDetails) {\n this.torrentDetails[hash] = torrentDetails;\n this.emit(_constantsEventTypes2['default'].CLIENT_TORRENT_DETAILS_CHANGE);\n }\n }, {\n key: 'getSelectedTorrents',\n value: function getSelectedTorrents() {\n return this.selectedTorrents;\n }\n }, {\n key: 'setSelectedTorrents',\n value: function setSelectedTorrents(event, hash) {\n this.selectedTorrents = (0, _utilSelectTorrents.selectTorrents)({\n event: event,\n hash: hash,\n selectedTorrents: this.selectedTorrents,\n torrentList: this.torrents\n });\n this.emit(_constantsEventTypes2['default'].UI_TORRENT_SELECTION_CHANGE);\n }\n }, {\n key: 'getTorrent',\n value: function getTorrent(hash) {\n return _lodash2['default'].find(this.torrents, function (torrent) {\n return torrent.hash === hash;\n });\n }\n }, {\n key: 'getTorrents',\n value: function getTorrents() {\n if (_TorrentFilterStore2['default'].getStatusFilter() || _TorrentFilterStore2['default'].getSearchFilter()) {\n return this.filteredTorrents;\n }\n\n return this.torrents;\n }\n }, {\n key: 'setTorrents',\n value: function setTorrents(torrents) {\n var torrentsSort = _TorrentFilterStore2['default'].getTorrentsSort();\n\n this.torrents = (0, _utilSortTorrents.sortTorrents)(Object.assign([], torrents), { direction: torrentsSort.direction, property: torrentsSort.value });\n\n var statusFilter = _TorrentFilterStore2['default'].getStatusFilter();\n var searchFilter = _TorrentFilterStore2['default'].getSearchFilter();\n\n var filteredTorrents = Object.assign([], this.torrents);\n\n if (statusFilter && statusFilter !== 'all') {\n filteredTorrents = (0, _utilFilterTorrents.filterTorrents)(filteredTorrents, statusFilter);\n }\n\n if (searchFilter && searchFilter !== '') {\n filteredTorrents = (0, _utilSearchTorrents.searchTorrents)(filteredTorrents, searchFilter);\n }\n\n this.filteredTorrents = filteredTorrents;\n\n this.emit(_constantsEventTypes2['default'].CLIENT_TORRENTS_REQUEST_SUCCESS);\n }\n }, {\n key: 'startPollingTorrentDetails',\n value: function startPollingTorrentDetails() {\n this.pollTorrentDetailsIntervalID = setInterval(this.fetchTorrentDetails.bind(this), _config2['default'].pollInterval);\n }\n }, {\n key: 'startPollingTorrents',\n value: function startPollingTorrents() {\n this.pollTorrentsIntervalID = setInterval(this.fetchTorrents.bind(this), _config2['default'].pollInterval);\n }\n }, {\n key: 'stopPollingTorrentDetails',\n value: function stopPollingTorrentDetails() {\n clearInterval(this.pollTorrentDetailsIntervalID);\n this.pollTorrentDetailsIntervalID = null;\n }\n }, {\n key: 'stopPollingTorrents',\n value: function stopPollingTorrents() {\n clearInterval(this.pollTorrentsIntervalID);\n this.pollTorrentsIntervalID = null;\n }\n }, {\n key: 'triggerTorrentsFilter',\n value: function triggerTorrentsFilter() {\n this.setTorrents(this.torrents);\n }\n }]);\n\n return TorrentStoreClass;\n})(_BaseStore3['default']);\n\nvar TorrentStore = new TorrentStoreClass();\n\n_dispatcherAppDispatcher2['default'].register(function (payload) {\n var action = payload.action;\n var source = payload.source;\n\n switch (action.type) {\n case _constantsActionTypes2['default'].CLIENT_FETCH_TORRENT_DETAILS_SUCCESS:\n TorrentStore.setTorrentDetails(action.data.hash, action.data.torrentDetails);\n break;\n case _constantsActionTypes2['default'].CLIENT_FETCH_TORRENTS_SUCCESS:\n TorrentStore.setTorrents(action.data.torrents);\n break;\n case _constantsActionTypes2['default'].CLIENT_FETCH_TORRENTS_ERROR:\n console.log(action);\n break;\n case _constantsActionTypes2['default'].UI_CLICK_TORRENT:\n TorrentStore.setSelectedTorrents(action.data.event, action.data.hash);\n break;\n case _constantsActionTypes2['default'].UI_SET_TORRENT_STATUS_FILTER:\n case _constantsActionTypes2['default'].UI_SET_TORRENT_SEARCH_FILTER:\n case _constantsActionTypes2['default'].UI_SET_TORRENT_SORT:\n TorrentStore.triggerTorrentsFilter();\n break;\n case _constantsActionTypes2['default'].CLIENT_ADD_TORRENT_SUCCESS:\n case _constantsActionTypes2['default'].CLIENT_START_TORRENT_SUCCESS:\n case _constantsActionTypes2['default'].CLIENT_STOP_TORRENT_SUCCESS:\n TorrentStore.fetchTorrents();\n break;\n }\n});\n\nexports['default'] = TorrentStore;\nmodule.exports = exports['default'];//@ sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9jbGllbnQvc291cmNlL3NjcmlwdHMvc3RvcmVzL1RvcnJlbnRTdG9yZS5qcz9lMDY2Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztBQUVBO0FBQ0E7QUFDQSxDQUFDOztBQUVELGlDQUFpQywyQ0FBMkMsZ0JBQWdCLGtCQUFrQixPQUFPLDJCQUEyQix3REFBd0QsZ0NBQWdDLHVEQUF1RCwyREFBMkQsRUFBRSxFQUFFLHlEQUF5RCxxRUFBcUUsNkRBQTZELG9CQUFvQixHQUFHLEVBQUU7O0FBRWxqQix1Q0FBdUMsbUJBQW1CLDRCQUE0QixpREFBaUQsZ0JBQWdCLGtEQUFrRCw4REFBOEQsMEJBQTBCLDRDQUE0Qyx1QkFBdUIsa0JBQWtCLEVBQUUsT0FBTyxhQUFhLGdCQUFnQixnQkFBZ0IsZUFBZSwyQkFBMkIsb0JBQW9CLEVBQUUsRUFBRSw0QkFBNEIsbUJBQW1CLEVBQUUsT0FBTyx1QkFBdUIsNEJBQTRCLGtCQUFrQixFQUFFLDhCQUE4QixFQUFFLEVBQUU7O0FBRS9vQixzQ0FBc0MsdUNBQXVDLGtCQUFrQjs7QUFFL0YsaURBQWlELDBDQUEwQywwREFBMEQsRUFBRTs7QUFFdkosMENBQTBDLCtEQUErRCxxR0FBcUcsRUFBRSx5RUFBeUUsZUFBZSx5RUFBeUUsRUFBRSxFQUFFLHVIQUF1SDs7QUFFNWU7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUEsd0ZBQXdGLGtFQUFrRTs7QUFFMUo7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBLENBQUM7O0FBRUQ7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQSIsImZpbGUiOiIyMzAuanMiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX2NyZWF0ZUNsYXNzID0gKGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmICgndmFsdWUnIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfSByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9OyB9KSgpO1xuXG52YXIgX2dldCA9IGZ1bmN0aW9uIGdldChfeCwgX3gyLCBfeDMpIHsgdmFyIF9hZ2FpbiA9IHRydWU7IF9mdW5jdGlvbjogd2hpbGUgKF9hZ2FpbikgeyB2YXIgb2JqZWN0ID0gX3gsIHByb3BlcnR5ID0gX3gyLCByZWNlaXZlciA9IF94MzsgX2FnYWluID0gZmFsc2U7IGlmIChvYmplY3QgPT09IG51bGwpIG9iamVjdCA9IEZ1bmN0aW9uLnByb3RvdHlwZTsgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgcHJvcGVydHkpOyBpZiAoZGVzYyA9PT0gdW5kZWZpbmVkKSB7IHZhciBwYXJlbnQgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Yob2JqZWN0KTsgaWYgKHBhcmVudCA9PT0gbnVsbCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9IGVsc2UgeyBfeCA9IHBhcmVudDsgX3gyID0gcHJvcGVydHk7IF94MyA9IHJlY2VpdmVyOyBfYWdhaW4gPSB0cnVlOyBkZXNjID0gcGFyZW50ID0gdW5kZWZpbmVkOyBjb250aW51ZSBfZnVuY3Rpb247IH0gfSBlbHNlIGlmICgndmFsdWUnIGluIGRlc2MpIHsgcmV0dXJuIGRlc2MudmFsdWU7IH0gZWxzZSB7IHZhciBnZXR0ZXIgPSBkZXNjLmdldDsgaWYgKGdldHRlciA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH0gcmV0dXJuIGdldHRlci5jYWxsKHJlY2VpdmVyKTsgfSB9IH07XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKCdDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24nKTsgfSB9XG5cbmZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09ICdmdW5jdGlvbicgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKCdTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90ICcgKyB0eXBlb2Ygc3VwZXJDbGFzcyk7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgZW51bWVyYWJsZTogZmFsc2UsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgaWYgKHN1cGVyQ2xhc3MpIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcykgOiBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzOyB9XG5cbnZhciBfbG9kYXNoID0gcmVxdWlyZSgnbG9kYXNoJyk7XG5cbnZhciBfbG9kYXNoMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2xvZGFzaCk7XG5cbnZhciBfY29uc3RhbnRzQWN0aW9uVHlwZXMgPSByZXF1aXJlKCcuLi9jb25zdGFudHMvQWN0aW9uVHlwZXMnKTtcblxudmFyIF9jb25zdGFudHNBY3Rpb25UeXBlczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jb25zdGFudHNBY3Rpb25UeXBlcyk7XG5cbnZhciBfZGlzcGF0Y2hlckFwcERpc3BhdGNoZXIgPSByZXF1aXJlKCcuLi9kaXNwYXRjaGVyL0FwcERpc3BhdGNoZXInKTtcblxudmFyIF9kaXNwYXRjaGVyQXBwRGlzcGF0Y2hlcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9kaXNwYXRjaGVyQXBwRGlzcGF0Y2hlcik7XG5cbnZhciBfQmFzZVN0b3JlMiA9IHJlcXVpcmUoJy4vQmFzZVN0b3JlJyk7XG5cbnZhciBfQmFzZVN0b3JlMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX0Jhc2VTdG9yZTIpO1xuXG52YXIgX2NvbmZpZyA9IHJlcXVpcmUoJy4uLy4uLy4uLy4uL2NvbmZpZycpO1xuXG52YXIgX2NvbmZpZzIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jb25maWcpO1xuXG52YXIgX2NvbnN0YW50c0V2ZW50VHlwZXMgPSByZXF1aXJlKCcuLi9jb25zdGFudHMvRXZlbnRUeXBlcycpO1xuXG52YXIgX2NvbnN0YW50c0V2ZW50VHlwZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY29uc3RhbnRzRXZlbnRUeXBlcyk7XG5cbnZhciBfdXRpbEZpbHRlclRvcnJlbnRzID0gcmVxdWlyZSgnLi4vdXRpbC9maWx0ZXJUb3JyZW50cycpO1xuXG52YXIgX3V0aWxTZWFyY2hUb3JyZW50cyA9IHJlcXVpcmUoJy4uL3V0aWwvc2VhcmNoVG9ycmVudHMnKTtcblxudmFyIF91dGlsU2VsZWN0VG9ycmVudHMgPSByZXF1aXJlKCcuLi91dGlsL3NlbGVjdFRvcnJlbnRzJyk7XG5cbnZhciBfdXRpbFNvcnRUb3JyZW50cyA9IHJlcXVpcmUoJy4uL3V0aWwvc29ydFRvcnJlbnRzJyk7XG5cbnZhciBfYWN0aW9uc1RvcnJlbnRBY3Rpb25zID0gcmVxdWlyZSgnLi4vYWN0aW9ucy9Ub3JyZW50QWN0aW9ucycpO1xuXG52YXIgX2FjdGlvbnNUb3JyZW50QWN0aW9uczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9hY3Rpb25zVG9ycmVudEFjdGlvbnMpO1xuXG52YXIgX1RvcnJlbnRGaWx0ZXJTdG9yZSA9IHJlcXVpcmUoJy4vVG9ycmVudEZpbHRlclN0b3JlJyk7XG5cbnZhciBfVG9ycmVudEZpbHRlclN0b3JlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX1RvcnJlbnRGaWx0ZXJTdG9yZSk7XG5cbnZhciBfVUlTdG9yZSA9IHJlcXVpcmUoJy4vVUlTdG9yZScpO1xuXG52YXIgX1VJU3RvcmUyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfVUlTdG9yZSk7XG5cbnZhciBUb3JyZW50U3RvcmVDbGFzcyA9IChmdW5jdGlvbiAoX0Jhc2VTdG9yZSkge1xuICBfaW5oZXJpdHMoVG9ycmVudFN0b3JlQ2xhc3MsIF9CYXNlU3RvcmUpO1xuXG4gIGZ1bmN0aW9uIFRvcnJlbnRTdG9yZUNsYXNzKCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBUb3JyZW50U3RvcmVDbGFzcyk7XG5cbiAgICBfZ2V0KE9iamVjdC5nZXRQcm90b3R5cGVPZihUb3JyZW50U3RvcmVDbGFzcy5wcm90b3R5cGUpLCAnY29uc3RydWN0b3InLCB0aGlzKS5jYWxsKHRoaXMpO1xuXG4gICAgdGhpcy5maWx0ZXJlZFRvcnJlbnRzID0gW107XG4gICAgdGhpcy5wb2xsVG9ycmVudERldGFpbHNJbnRlcnZhbElEID0gbnVsbDtcbiAgICB0aGlzLnBvbGxUb3JyZW50c0ludGVydmFsSUQgPSBudWxsO1xuICAgIHRoaXMuc2VsZWN0ZWRUb3JyZW50cyA9IFtdO1xuICAgIHRoaXMudG9ycmVudERldGFpbHMgPSB7fTtcbiAgICB0aGlzLnRvcnJlbnRzID0gW107XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoVG9ycmVudFN0b3JlQ2xhc3MsIFt7XG4gICAga2V5OiAnZmV0Y2hUb3JyZW50RGV0YWlscycsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGZldGNoVG9ycmVudERldGFpbHMoKSB7XG4gICAgICBfYWN0aW9uc1RvcnJlbnRBY3Rpb25zMlsnZGVmYXVsdCddLmZldGNoVG9ycmVudERldGFpbHMoX1VJU3RvcmUyWydkZWZhdWx0J10uZ2V0VG9ycmVudERldGFpbHNIYXNoKCkpO1xuICAgICAgaWYgKHRoaXMucG9sbFRvcnJlbnREZXRhaWxzSW50ZXJ2YWxJRCA9PT0gbnVsbCkge1xuICAgICAgICB0aGlzLnN0b3BQb2xsaW5nVG9ycmVudERldGFpbHMoKTtcbiAgICAgICAgdGhpcy5zdGFydFBvbGxpbmdUb3JyZW50RGV0YWlscygpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2ZldGNoVG9ycmVudHMnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBmZXRjaFRvcnJlbnRzKCkge1xuICAgICAgX2FjdGlvbnNUb3JyZW50QWN0aW9uczJbJ2RlZmF1bHQnXS5mZXRjaFRvcnJlbnRzKCk7XG5cbiAgICAgIGlmICh0aGlzLnBvbGxUb3JyZW50c0ludGVydmFsSUQgPT09IG51bGwpIHtcbiAgICAgICAgdGhpcy5zdGFydFBvbGxpbmdUb3JyZW50cygpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2dldFRvcnJlbnREZXRhaWxzJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0VG9ycmVudERldGFpbHMoaGFzaCkge1xuICAgICAgcmV0dXJuIHRoaXMudG9ycmVudERldGFpbHNbaGFzaF0gfHwge307XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnc2V0VG9ycmVudERldGFpbHMnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRUb3JyZW50RGV0YWlscyhoYXNoLCB0b3JyZW50RGV0YWlscykge1xuICAgICAgdGhpcy50b3JyZW50RGV0YWlsc1toYXNoXSA9IHRvcnJlbnREZXRhaWxzO1xuICAgICAgdGhpcy5lbWl0KF9jb25zdGFudHNFdmVudFR5cGVzMlsnZGVmYXVsdCddLkNMSUVOVF9UT1JSRU5UX0RFVEFJTFNfQ0hBTkdFKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdnZXRTZWxlY3RlZFRvcnJlbnRzJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0U2VsZWN0ZWRUb3JyZW50cygpIHtcbiAgICAgIHJldHVybiB0aGlzLnNlbGVjdGVkVG9ycmVudHM7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnc2V0U2VsZWN0ZWRUb3JyZW50cycsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldFNlbGVjdGVkVG9ycmVudHMoZXZlbnQsIGhhc2gpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRUb3JyZW50cyA9ICgwLCBfdXRpbFNlbGVjdFRvcnJlbnRzLnNlbGVjdFRvcnJlbnRzKSh7XG4gICAgICAgIGV2ZW50OiBldmVudCxcbiAgICAgICAgaGFzaDogaGFzaCxcbiAgICAgICAgc2VsZWN0ZWRUb3JyZW50czogdGhpcy5zZWxlY3RlZFRvcnJlbnRzLFxuICAgICAgICB0b3JyZW50TGlzdDogdGhpcy50b3JyZW50c1xuICAgICAgfSk7XG4gICAgICB0aGlzLmVtaXQoX2NvbnN0YW50c0V2ZW50VHlwZXMyWydkZWZhdWx0J10uVUlfVE9SUkVOVF9TRUxFQ1RJT05fQ0hBTkdFKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdnZXRUb3JyZW50JyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0VG9ycmVudChoYXNoKSB7XG4gICAgICByZXR1cm4gX2xvZGFzaDJbJ2RlZmF1bHQnXS5maW5kKHRoaXMudG9ycmVudHMsIGZ1bmN0aW9uICh0b3JyZW50KSB7XG4gICAgICAgIHJldHVybiB0b3JyZW50Lmhhc2ggPT09IGhhc2g7XG4gICAgICB9KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdnZXRUb3JyZW50cycsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldFRvcnJlbnRzKCkge1xuICAgICAgaWYgKF9Ub3JyZW50RmlsdGVyU3RvcmUyWydkZWZhdWx0J10uZ2V0U3RhdHVzRmlsdGVyKCkgfHwgX1RvcnJlbnRGaWx0ZXJTdG9yZTJbJ2RlZmF1bHQnXS5nZXRTZWFyY2hGaWx0ZXIoKSkge1xuICAgICAgICByZXR1cm4gdGhpcy5maWx0ZXJlZFRvcnJlbnRzO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy50b3JyZW50cztcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdzZXRUb3JyZW50cycsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldFRvcnJlbnRzKHRvcnJlbnRzKSB7XG4gICAgICB2YXIgdG9ycmVudHNTb3J0ID0gX1RvcnJlbnRGaWx0ZXJTdG9yZTJbJ2RlZmF1bHQnXS5nZXRUb3JyZW50c1NvcnQoKTtcblxuICAgICAgdGhpcy50b3JyZW50cyA9ICgwLCBfdXRpbFNvcnRUb3JyZW50cy5zb3J0VG9ycmVudHMpKE9iamVjdC5hc3NpZ24oW10sIHRvcnJlbnRzKSwgeyBkaXJlY3Rpb246IHRvcnJlbnRzU29ydC5kaXJlY3Rpb24sIHByb3BlcnR5OiB0b3JyZW50c1NvcnQudmFsdWUgfSk7XG5cbiAgICAgIHZhciBzdGF0dXNGaWx0ZXIgPSBfVG9ycmVudEZpbHRlclN0b3JlMlsnZGVmYXVsdCddLmdldFN0YXR1c0ZpbHRlcigpO1xuICAgICAgdmFyIHNlYXJjaEZpbHRlciA9IF9Ub3JyZW50RmlsdGVyU3RvcmUyWydkZWZhdWx0J10uZ2V0U2VhcmNoRmlsdGVyKCk7XG5cbiAgICAgIHZhciBmaWx0ZXJlZFRvcnJlbnRzID0gT2JqZWN0LmFzc2lnbihbXSwgdGhpcy50b3JyZW50cyk7XG5cbiAgICAgIGlmIChzdGF0dXNGaWx0ZXIgJiYgc3RhdHVzRmlsdGVyICE9PSAnYWxsJykge1xuICAgICAgICBmaWx0ZXJlZFRvcnJlbnRzID0gKDAsIF91dGlsRmlsdGVyVG9ycmVudHMuZmlsdGVyVG9ycmVudHMpKGZpbHRlcmVkVG9ycmVudHMsIHN0YXR1c0ZpbHRlcik7XG4gICAgICB9XG5cbiAgICAgIGlmIChzZWFyY2hGaWx0ZXIgJiYgc2VhcmNoRmlsdGVyICE9PSAnJykge1xuICAgICAgICBmaWx0ZXJlZFRvcnJlbnRzID0gKDAsIF91dGlsU2VhcmNoVG9ycmVudHMuc2VhcmNoVG9ycmVudHMpKGZpbHRlcmVkVG9ycmVudHMsIHNlYXJjaEZpbHRlcik7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuZmlsdGVyZWRUb3JyZW50cyA9IGZpbHRlcmVkVG9ycmVudHM7XG5cbiAgICAgIHRoaXMuZW1pdChfY29uc3RhbnRzRXZlbnRUeXBlczJbJ2RlZmF1bHQnXS5DTElFTlRfVE9SUkVOVFNfUkVRVUVTVF9TVUNDRVNTKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdzdGFydFBvbGxpbmdUb3JyZW50RGV0YWlscycsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHN0YXJ0UG9sbGluZ1RvcnJlbnREZXRhaWxzKCkge1xuICAgICAgdGhpcy5wb2xsVG9ycmVudERldGFpbHNJbnRlcnZhbElEID0gc2V0SW50ZXJ2YWwodGhpcy5mZXRjaFRvcnJlbnREZXRhaWxzLmJpbmQodGhpcyksIF9jb25maWcyWydkZWZhdWx0J10ucG9sbEludGVydmFsKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdzdGFydFBvbGxpbmdUb3JyZW50cycsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHN0YXJ0UG9sbGluZ1RvcnJlbnRzKCkge1xuICAgICAgdGhpcy5wb2xsVG9ycmVudHNJbnRlcnZhbElEID0gc2V0SW50ZXJ2YWwodGhpcy5mZXRjaFRvcnJlbnRzLmJpbmQodGhpcyksIF9jb25maWcyWydkZWZhdWx0J10ucG9sbEludGVydmFsKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdzdG9wUG9sbGluZ1RvcnJlbnREZXRhaWxzJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gc3RvcFBvbGxpbmdUb3JyZW50RGV0YWlscygpIHtcbiAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5wb2xsVG9ycmVudERldGFpbHNJbnRlcnZhbElEKTtcbiAgICAgIHRoaXMucG9sbFRvcnJlbnREZXRhaWxzSW50ZXJ2YWxJRCA9IG51bGw7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnc3RvcFBvbGxpbmdUb3JyZW50cycsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHN0b3BQb2xsaW5nVG9ycmVudHMoKSB7XG4gICAgICBjbGVhckludGVydmFsKHRoaXMucG9sbFRvcnJlbnRzSW50ZXJ2YWxJRCk7XG4gICAgICB0aGlzLnBvbGxUb3JyZW50c0ludGVydmFsSUQgPSBudWxsO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ3RyaWdnZXJUb3JyZW50c0ZpbHRlcicsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHRyaWdnZXJUb3JyZW50c0ZpbHRlcigpIHtcbiAgICAgIHRoaXMuc2V0VG9ycmVudHModGhpcy50b3JyZW50cyk7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFRvcnJlbnRTdG9yZUNsYXNzO1xufSkoX0Jhc2VTdG9yZTNbJ2RlZmF1bHQnXSk7XG5cbnZhciBUb3JyZW50U3RvcmUgPSBuZXcgVG9ycmVudFN0b3JlQ2xhc3MoKTtcblxuX2Rpc3BhdGNoZXJBcHBEaXNwYXRjaGVyMlsnZGVmYXVsdCddLnJlZ2lzdGVyKGZ1bmN0aW9uIChwYXlsb2FkKSB7XG4gIHZhciBhY3Rpb24gPSBwYXlsb2FkLmFjdGlvbjtcbiAgdmFyIHNvdXJjZSA9IHBheWxvYWQuc291cmNlO1xuXG4gIHN3aXRjaCAoYWN0aW9uLnR5cGUpIHtcbiAgICBjYXNlIF9jb25zdGFudHNBY3Rpb25UeXBlczJbJ2RlZmF1bHQnXS5DTElFTlRfRkVUQ0hfVE9SUkVOVF9ERVRBSUxTX1NVQ0NFU1M6XG4gICAgICBUb3JyZW50U3RvcmUuc2V0VG9ycmVudERldGFpbHMoYWN0aW9uLmRhdGEuaGFzaCwgYWN0aW9uLmRhdGEudG9ycmVudERldGFpbHMpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBfY29uc3RhbnRzQWN0aW9uVHlwZXMyWydkZWZhdWx0J10uQ0xJRU5UX0ZFVENIX1RPUlJFTlRTX1NVQ0NFU1M6XG4gICAgICBUb3JyZW50U3RvcmUuc2V0VG9ycmVudHMoYWN0aW9uLmRhdGEudG9ycmVudHMpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBfY29uc3RhbnRzQWN0aW9uVHlwZXMyWydkZWZhdWx0J10uQ0xJRU5UX0ZFVENIX1RPUlJFTlRTX0VSUk9SOlxuICAgICAgY29uc29sZS5sb2coYWN0aW9uKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgX2NvbnN0YW50c0FjdGlvblR5cGVzMlsnZGVmYXVsdCddLlVJX0NMSUNLX1RPUlJFTlQ6XG4gICAgICBUb3JyZW50U3RvcmUuc2V0U2VsZWN0ZWRUb3JyZW50cyhhY3Rpb24uZGF0YS5ldmVudCwgYWN0aW9uLmRhdGEuaGFzaCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIF9jb25zdGFudHNBY3Rpb25UeXBlczJbJ2RlZmF1bHQnXS5VSV9TRVRfVE9SUkVOVF9TVEFUVVNfRklMVEVSOlxuICAgIGNhc2UgX2NvbnN0YW50c0FjdGlvblR5cGVzMlsnZGVmYXVsdCddLlVJX1NFVF9UT1JSRU5UX1NFQVJDSF9GSUxURVI6XG4gICAgY2FzZSBfY29uc3RhbnRzQWN0aW9uVHlwZXMyWydkZWZhdWx0J10uVUlfU0VUX1RPUlJFTlRfU09SVDpcbiAgICAgIFRvcnJlbnRTdG9yZS50cmlnZ2VyVG9ycmVudHNGaWx0ZXIoKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgX2NvbnN0YW50c0FjdGlvblR5cGVzMlsnZGVmYXVsdCddLkNMSUVOVF9BRERfVE9SUkVOVF9TVUNDRVNTOlxuICAgIGNhc2UgX2NvbnN0YW50c0FjdGlvblR5cGVzMlsnZGVmYXVsdCddLkNMSUVOVF9TVEFSVF9UT1JSRU5UX1NVQ0NFU1M6XG4gICAgY2FzZSBfY29uc3RhbnRzQWN0aW9uVHlwZXMyWydkZWZhdWx0J10uQ0xJRU5UX1NUT1BfVE9SUkVOVF9TVUNDRVNTOlxuICAgICAgVG9ycmVudFN0b3JlLmZldGNoVG9ycmVudHMoKTtcbiAgICAgIGJyZWFrO1xuICB9XG59KTtcblxuZXhwb3J0c1snZGVmYXVsdCddID0gVG9ycmVudFN0b3JlO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL2NsaWVudC9zb3VyY2Uvc2NyaXB0cy9zdG9yZXMvVG9ycmVudFN0b3JlLmpzXG4gKiogbW9kdWxlIGlkID0gMjMwXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iXSwic291cmNlUm9vdCI6IiJ9"); + eval("'use strict';\n\nObject.defineProperty(exports, '__esModule', {\n value: true\n});\n\nvar _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\nvar _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nfunction _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\nvar _lodash = __webpack_require__(161);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _constantsActionTypes = __webpack_require__(197);\n\nvar _constantsActionTypes2 = _interopRequireDefault(_constantsActionTypes);\n\nvar _dispatcherAppDispatcher = __webpack_require__(193);\n\nvar _dispatcherAppDispatcher2 = _interopRequireDefault(_dispatcherAppDispatcher);\n\nvar _BaseStore2 = __webpack_require__(200);\n\nvar _BaseStore3 = _interopRequireDefault(_BaseStore2);\n\nvar _config = __webpack_require__(212);\n\nvar _config2 = _interopRequireDefault(_config);\n\nvar _constantsEventTypes = __webpack_require__(172);\n\nvar _constantsEventTypes2 = _interopRequireDefault(_constantsEventTypes);\n\nvar _utilFilterTorrents = __webpack_require__(231);\n\nvar _utilSearchTorrents = __webpack_require__(233);\n\nvar _utilSelectTorrents = __webpack_require__(202);\n\nvar _utilSortTorrents = __webpack_require__(234);\n\nvar _actionsTorrentActions = __webpack_require__(178);\n\nvar _actionsTorrentActions2 = _interopRequireDefault(_actionsTorrentActions);\n\nvar _TorrentFilterStore = __webpack_require__(229);\n\nvar _TorrentFilterStore2 = _interopRequireDefault(_TorrentFilterStore);\n\nvar _UIStore = __webpack_require__(199);\n\nvar _UIStore2 = _interopRequireDefault(_UIStore);\n\nvar TorrentStoreClass = (function (_BaseStore) {\n _inherits(TorrentStoreClass, _BaseStore);\n\n function TorrentStoreClass() {\n _classCallCheck(this, TorrentStoreClass);\n\n _get(Object.getPrototypeOf(TorrentStoreClass.prototype), 'constructor', this).call(this);\n\n this.filteredTorrents = {};\n this.pollTorrentDetailsIntervalID = null;\n this.pollTorrentsIntervalID = null;\n this.selectedTorrents = [];\n this.sortedTorrents = [];\n this.torrents = {};\n }\n\n _createClass(TorrentStoreClass, [{\n key: 'fetchTorrentDetails',\n value: function fetchTorrentDetails() {\n _actionsTorrentActions2['default'].fetchTorrentDetails(_UIStore2['default'].getTorrentDetailsHash());\n if (this.pollTorrentDetailsIntervalID === null) {\n this.stopPollingTorrentDetails();\n this.startPollingTorrentDetails();\n }\n }\n }, {\n key: 'fetchTorrents',\n value: function fetchTorrents() {\n _actionsTorrentActions2['default'].fetchTorrents();\n\n if (this.pollTorrentsIntervalID === null) {\n this.startPollingTorrents();\n }\n }\n }, {\n key: 'getTorrentDetails',\n value: function getTorrentDetails(hash) {\n return this.torrents[hash].details || {};\n }\n }, {\n key: 'setTorrentDetails',\n value: function setTorrentDetails(hash, torrentDetails) {\n this.torrents[hash].details = torrentDetails;\n this.emit(_constantsEventTypes2['default'].CLIENT_TORRENT_DETAILS_CHANGE);\n }\n }, {\n key: 'getSelectedTorrents',\n value: function getSelectedTorrents() {\n return this.selectedTorrents;\n }\n }, {\n key: 'setSelectedTorrents',\n value: function setSelectedTorrents(event, hash) {\n this.selectedTorrents = (0, _utilSelectTorrents.selectTorrents)({\n event: event,\n hash: hash,\n selectedTorrents: this.selectedTorrents,\n torrentList: this.sortedTorrents\n });\n this.emit(_constantsEventTypes2['default'].UI_TORRENT_SELECTION_CHANGE);\n }\n }, {\n key: 'getTorrent',\n value: function getTorrent(hash) {\n return this.torrents[hash];\n }\n }, {\n key: 'getTorrents',\n value: function getTorrents() {\n if (_TorrentFilterStore2['default'].getStatusFilter() || _TorrentFilterStore2['default'].getSearchFilter()) {\n return this.filteredTorrents;\n }\n\n return this.sortedTorrents;\n }\n }, {\n key: 'setTorrents',\n value: function setTorrents(torrents) {\n var torrentsSort = _TorrentFilterStore2['default'].getTorrentsSort();\n\n this.torrents = torrents;\n\n // Convert torrents hash to array and sort it.\n this.sortedTorrents = (0, _utilSortTorrents.sortTorrents)(this.torrents, { direction: torrentsSort.direction, property: torrentsSort.value });\n\n var statusFilter = _TorrentFilterStore2['default'].getStatusFilter();\n var searchFilter = _TorrentFilterStore2['default'].getSearchFilter();\n\n var filteredTorrents = Object.assign([], this.sortedTorrents);\n\n if (statusFilter && statusFilter !== 'all') {\n filteredTorrents = (0, _utilFilterTorrents.filterTorrents)(filteredTorrents, statusFilter);\n }\n\n if (searchFilter && searchFilter !== '') {\n filteredTorrents = (0, _utilSearchTorrents.searchTorrents)(filteredTorrents, searchFilter);\n }\n\n this.filteredTorrents = filteredTorrents;\n\n this.emit(_constantsEventTypes2['default'].CLIENT_TORRENTS_REQUEST_SUCCESS);\n }\n }, {\n key: 'startPollingTorrentDetails',\n value: function startPollingTorrentDetails() {\n this.pollTorrentDetailsIntervalID = setInterval(this.fetchTorrentDetails.bind(this), _config2['default'].pollInterval);\n }\n }, {\n key: 'startPollingTorrents',\n value: function startPollingTorrents() {\n this.pollTorrentsIntervalID = setInterval(this.fetchTorrents.bind(this), _config2['default'].pollInterval);\n }\n }, {\n key: 'stopPollingTorrentDetails',\n value: function stopPollingTorrentDetails() {\n clearInterval(this.pollTorrentDetailsIntervalID);\n this.pollTorrentDetailsIntervalID = null;\n }\n }, {\n key: 'stopPollingTorrents',\n value: function stopPollingTorrents() {\n clearInterval(this.pollTorrentsIntervalID);\n this.pollTorrentsIntervalID = null;\n }\n }, {\n key: 'triggerTorrentsFilter',\n value: function triggerTorrentsFilter() {\n this.setTorrents(this.torrents);\n }\n }]);\n\n return TorrentStoreClass;\n})(_BaseStore3['default']);\n\nvar TorrentStore = new TorrentStoreClass();\n\n_dispatcherAppDispatcher2['default'].register(function (payload) {\n var action = payload.action;\n var source = payload.source;\n\n switch (action.type) {\n case _constantsActionTypes2['default'].CLIENT_FETCH_TORRENT_DETAILS_SUCCESS:\n TorrentStore.setTorrentDetails(action.data.hash, action.data.torrentDetails);\n break;\n case _constantsActionTypes2['default'].CLIENT_FETCH_TORRENTS_SUCCESS:\n TorrentStore.setTorrents(action.data.torrents);\n break;\n case _constantsActionTypes2['default'].CLIENT_FETCH_TORRENTS_ERROR:\n console.log(action);\n break;\n case _constantsActionTypes2['default'].UI_CLICK_TORRENT:\n TorrentStore.setSelectedTorrents(action.data.event, action.data.hash);\n break;\n case _constantsActionTypes2['default'].UI_SET_TORRENT_STATUS_FILTER:\n case _constantsActionTypes2['default'].UI_SET_TORRENT_SEARCH_FILTER:\n case _constantsActionTypes2['default'].UI_SET_TORRENT_SORT:\n TorrentStore.triggerTorrentsFilter();\n break;\n case _constantsActionTypes2['default'].CLIENT_ADD_TORRENT_SUCCESS:\n case _constantsActionTypes2['default'].CLIENT_START_TORRENT_SUCCESS:\n case _constantsActionTypes2['default'].CLIENT_STOP_TORRENT_SUCCESS:\n TorrentStore.fetchTorrents();\n break;\n }\n});\n\nexports['default'] = TorrentStore;\nmodule.exports = exports['default'];//@ sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9jbGllbnQvc291cmNlL3NjcmlwdHMvc3RvcmVzL1RvcnJlbnRTdG9yZS5qcz9lMDY2Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztBQUVBO0FBQ0E7QUFDQSxDQUFDOztBQUVELGlDQUFpQywyQ0FBMkMsZ0JBQWdCLGtCQUFrQixPQUFPLDJCQUEyQix3REFBd0QsZ0NBQWdDLHVEQUF1RCwyREFBMkQsRUFBRSxFQUFFLHlEQUF5RCxxRUFBcUUsNkRBQTZELG9CQUFvQixHQUFHLEVBQUU7O0FBRWxqQix1Q0FBdUMsbUJBQW1CLDRCQUE0QixpREFBaUQsZ0JBQWdCLGtEQUFrRCw4REFBOEQsMEJBQTBCLDRDQUE0Qyx1QkFBdUIsa0JBQWtCLEVBQUUsT0FBTyxhQUFhLGdCQUFnQixnQkFBZ0IsZUFBZSwyQkFBMkIsb0JBQW9CLEVBQUUsRUFBRSw0QkFBNEIsbUJBQW1CLEVBQUUsT0FBTyx1QkFBdUIsNEJBQTRCLGtCQUFrQixFQUFFLDhCQUE4QixFQUFFLEVBQUU7O0FBRS9vQixzQ0FBc0MsdUNBQXVDLGtCQUFrQjs7QUFFL0YsaURBQWlELDBDQUEwQywwREFBMEQsRUFBRTs7QUFFdkosMENBQTBDLCtEQUErRCxxR0FBcUcsRUFBRSx5RUFBeUUsZUFBZSx5RUFBeUUsRUFBRSxFQUFFLHVIQUF1SDs7QUFFNWU7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxnRkFBZ0Ysa0VBQWtFOztBQUVsSjtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0EsQ0FBQzs7QUFFRDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBIiwiZmlsZSI6IjIzMC5qcyIsInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfY3JlYXRlQ2xhc3MgPSAoZnVuY3Rpb24gKCkgeyBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKCd2YWx1ZScgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9IHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH07IH0pKCk7XG5cbnZhciBfZ2V0ID0gZnVuY3Rpb24gZ2V0KF94LCBfeDIsIF94MykgeyB2YXIgX2FnYWluID0gdHJ1ZTsgX2Z1bmN0aW9uOiB3aGlsZSAoX2FnYWluKSB7IHZhciBvYmplY3QgPSBfeCwgcHJvcGVydHkgPSBfeDIsIHJlY2VpdmVyID0gX3gzOyBfYWdhaW4gPSBmYWxzZTsgaWYgKG9iamVjdCA9PT0gbnVsbCkgb2JqZWN0ID0gRnVuY3Rpb24ucHJvdG90eXBlOyB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBwcm9wZXJ0eSk7IGlmIChkZXNjID09PSB1bmRlZmluZWQpIHsgdmFyIHBhcmVudCA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihvYmplY3QpOyBpZiAocGFyZW50ID09PSBudWxsKSB7IHJldHVybiB1bmRlZmluZWQ7IH0gZWxzZSB7IF94ID0gcGFyZW50OyBfeDIgPSBwcm9wZXJ0eTsgX3gzID0gcmVjZWl2ZXI7IF9hZ2FpbiA9IHRydWU7IGRlc2MgPSBwYXJlbnQgPSB1bmRlZmluZWQ7IGNvbnRpbnVlIF9mdW5jdGlvbjsgfSB9IGVsc2UgaWYgKCd2YWx1ZScgaW4gZGVzYykgeyByZXR1cm4gZGVzYy52YWx1ZTsgfSBlbHNlIHsgdmFyIGdldHRlciA9IGRlc2MuZ2V0OyBpZiAoZ2V0dGVyID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfSByZXR1cm4gZ2V0dGVyLmNhbGwocmVjZWl2ZXIpOyB9IH0gfTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoJ0Nhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbicpOyB9IH1cblxuZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gJ2Z1bmN0aW9uJyAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoJ1N1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgJyArIHR5cGVvZiBzdXBlckNsYXNzKTsgfSBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsgY29uc3RydWN0b3I6IHsgdmFsdWU6IHN1YkNsYXNzLCBlbnVtZXJhYmxlOiBmYWxzZSwgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH0pOyBpZiAoc3VwZXJDbGFzcykgT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LnNldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKSA6IHN1YkNsYXNzLl9fcHJvdG9fXyA9IHN1cGVyQ2xhc3M7IH1cblxudmFyIF9sb2Rhc2ggPSByZXF1aXJlKCdsb2Rhc2gnKTtcblxudmFyIF9sb2Rhc2gyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfbG9kYXNoKTtcblxudmFyIF9jb25zdGFudHNBY3Rpb25UeXBlcyA9IHJlcXVpcmUoJy4uL2NvbnN0YW50cy9BY3Rpb25UeXBlcycpO1xuXG52YXIgX2NvbnN0YW50c0FjdGlvblR5cGVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NvbnN0YW50c0FjdGlvblR5cGVzKTtcblxudmFyIF9kaXNwYXRjaGVyQXBwRGlzcGF0Y2hlciA9IHJlcXVpcmUoJy4uL2Rpc3BhdGNoZXIvQXBwRGlzcGF0Y2hlcicpO1xuXG52YXIgX2Rpc3BhdGNoZXJBcHBEaXNwYXRjaGVyMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2Rpc3BhdGNoZXJBcHBEaXNwYXRjaGVyKTtcblxudmFyIF9CYXNlU3RvcmUyID0gcmVxdWlyZSgnLi9CYXNlU3RvcmUnKTtcblxudmFyIF9CYXNlU3RvcmUzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfQmFzZVN0b3JlMik7XG5cbnZhciBfY29uZmlnID0gcmVxdWlyZSgnLi4vLi4vLi4vLi4vY29uZmlnJyk7XG5cbnZhciBfY29uZmlnMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NvbmZpZyk7XG5cbnZhciBfY29uc3RhbnRzRXZlbnRUeXBlcyA9IHJlcXVpcmUoJy4uL2NvbnN0YW50cy9FdmVudFR5cGVzJyk7XG5cbnZhciBfY29uc3RhbnRzRXZlbnRUeXBlczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jb25zdGFudHNFdmVudFR5cGVzKTtcblxudmFyIF91dGlsRmlsdGVyVG9ycmVudHMgPSByZXF1aXJlKCcuLi91dGlsL2ZpbHRlclRvcnJlbnRzJyk7XG5cbnZhciBfdXRpbFNlYXJjaFRvcnJlbnRzID0gcmVxdWlyZSgnLi4vdXRpbC9zZWFyY2hUb3JyZW50cycpO1xuXG52YXIgX3V0aWxTZWxlY3RUb3JyZW50cyA9IHJlcXVpcmUoJy4uL3V0aWwvc2VsZWN0VG9ycmVudHMnKTtcblxudmFyIF91dGlsU29ydFRvcnJlbnRzID0gcmVxdWlyZSgnLi4vdXRpbC9zb3J0VG9ycmVudHMnKTtcblxudmFyIF9hY3Rpb25zVG9ycmVudEFjdGlvbnMgPSByZXF1aXJlKCcuLi9hY3Rpb25zL1RvcnJlbnRBY3Rpb25zJyk7XG5cbnZhciBfYWN0aW9uc1RvcnJlbnRBY3Rpb25zMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2FjdGlvbnNUb3JyZW50QWN0aW9ucyk7XG5cbnZhciBfVG9ycmVudEZpbHRlclN0b3JlID0gcmVxdWlyZSgnLi9Ub3JyZW50RmlsdGVyU3RvcmUnKTtcblxudmFyIF9Ub3JyZW50RmlsdGVyU3RvcmUyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfVG9ycmVudEZpbHRlclN0b3JlKTtcblxudmFyIF9VSVN0b3JlID0gcmVxdWlyZSgnLi9VSVN0b3JlJyk7XG5cbnZhciBfVUlTdG9yZTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9VSVN0b3JlKTtcblxudmFyIFRvcnJlbnRTdG9yZUNsYXNzID0gKGZ1bmN0aW9uIChfQmFzZVN0b3JlKSB7XG4gIF9pbmhlcml0cyhUb3JyZW50U3RvcmVDbGFzcywgX0Jhc2VTdG9yZSk7XG5cbiAgZnVuY3Rpb24gVG9ycmVudFN0b3JlQ2xhc3MoKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFRvcnJlbnRTdG9yZUNsYXNzKTtcblxuICAgIF9nZXQoT2JqZWN0LmdldFByb3RvdHlwZU9mKFRvcnJlbnRTdG9yZUNsYXNzLnByb3RvdHlwZSksICdjb25zdHJ1Y3RvcicsIHRoaXMpLmNhbGwodGhpcyk7XG5cbiAgICB0aGlzLmZpbHRlcmVkVG9ycmVudHMgPSB7fTtcbiAgICB0aGlzLnBvbGxUb3JyZW50RGV0YWlsc0ludGVydmFsSUQgPSBudWxsO1xuICAgIHRoaXMucG9sbFRvcnJlbnRzSW50ZXJ2YWxJRCA9IG51bGw7XG4gICAgdGhpcy5zZWxlY3RlZFRvcnJlbnRzID0gW107XG4gICAgdGhpcy5zb3J0ZWRUb3JyZW50cyA9IFtdO1xuICAgIHRoaXMudG9ycmVudHMgPSB7fTtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhUb3JyZW50U3RvcmVDbGFzcywgW3tcbiAgICBrZXk6ICdmZXRjaFRvcnJlbnREZXRhaWxzJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gZmV0Y2hUb3JyZW50RGV0YWlscygpIHtcbiAgICAgIF9hY3Rpb25zVG9ycmVudEFjdGlvbnMyWydkZWZhdWx0J10uZmV0Y2hUb3JyZW50RGV0YWlscyhfVUlTdG9yZTJbJ2RlZmF1bHQnXS5nZXRUb3JyZW50RGV0YWlsc0hhc2goKSk7XG4gICAgICBpZiAodGhpcy5wb2xsVG9ycmVudERldGFpbHNJbnRlcnZhbElEID09PSBudWxsKSB7XG4gICAgICAgIHRoaXMuc3RvcFBvbGxpbmdUb3JyZW50RGV0YWlscygpO1xuICAgICAgICB0aGlzLnN0YXJ0UG9sbGluZ1RvcnJlbnREZXRhaWxzKCk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnZmV0Y2hUb3JyZW50cycsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGZldGNoVG9ycmVudHMoKSB7XG4gICAgICBfYWN0aW9uc1RvcnJlbnRBY3Rpb25zMlsnZGVmYXVsdCddLmZldGNoVG9ycmVudHMoKTtcblxuICAgICAgaWYgKHRoaXMucG9sbFRvcnJlbnRzSW50ZXJ2YWxJRCA9PT0gbnVsbCkge1xuICAgICAgICB0aGlzLnN0YXJ0UG9sbGluZ1RvcnJlbnRzKCk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnZ2V0VG9ycmVudERldGFpbHMnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRUb3JyZW50RGV0YWlscyhoYXNoKSB7XG4gICAgICByZXR1cm4gdGhpcy50b3JyZW50c1toYXNoXS5kZXRhaWxzIHx8IHt9O1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ3NldFRvcnJlbnREZXRhaWxzJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0VG9ycmVudERldGFpbHMoaGFzaCwgdG9ycmVudERldGFpbHMpIHtcbiAgICAgIHRoaXMudG9ycmVudHNbaGFzaF0uZGV0YWlscyA9IHRvcnJlbnREZXRhaWxzO1xuICAgICAgdGhpcy5lbWl0KF9jb25zdGFudHNFdmVudFR5cGVzMlsnZGVmYXVsdCddLkNMSUVOVF9UT1JSRU5UX0RFVEFJTFNfQ0hBTkdFKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdnZXRTZWxlY3RlZFRvcnJlbnRzJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0U2VsZWN0ZWRUb3JyZW50cygpIHtcbiAgICAgIHJldHVybiB0aGlzLnNlbGVjdGVkVG9ycmVudHM7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnc2V0U2VsZWN0ZWRUb3JyZW50cycsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldFNlbGVjdGVkVG9ycmVudHMoZXZlbnQsIGhhc2gpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRUb3JyZW50cyA9ICgwLCBfdXRpbFNlbGVjdFRvcnJlbnRzLnNlbGVjdFRvcnJlbnRzKSh7XG4gICAgICAgIGV2ZW50OiBldmVudCxcbiAgICAgICAgaGFzaDogaGFzaCxcbiAgICAgICAgc2VsZWN0ZWRUb3JyZW50czogdGhpcy5zZWxlY3RlZFRvcnJlbnRzLFxuICAgICAgICB0b3JyZW50TGlzdDogdGhpcy5zb3J0ZWRUb3JyZW50c1xuICAgICAgfSk7XG4gICAgICB0aGlzLmVtaXQoX2NvbnN0YW50c0V2ZW50VHlwZXMyWydkZWZhdWx0J10uVUlfVE9SUkVOVF9TRUxFQ1RJT05fQ0hBTkdFKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdnZXRUb3JyZW50JyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0VG9ycmVudChoYXNoKSB7XG4gICAgICByZXR1cm4gdGhpcy50b3JyZW50c1toYXNoXTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdnZXRUb3JyZW50cycsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldFRvcnJlbnRzKCkge1xuICAgICAgaWYgKF9Ub3JyZW50RmlsdGVyU3RvcmUyWydkZWZhdWx0J10uZ2V0U3RhdHVzRmlsdGVyKCkgfHwgX1RvcnJlbnRGaWx0ZXJTdG9yZTJbJ2RlZmF1bHQnXS5nZXRTZWFyY2hGaWx0ZXIoKSkge1xuICAgICAgICByZXR1cm4gdGhpcy5maWx0ZXJlZFRvcnJlbnRzO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5zb3J0ZWRUb3JyZW50cztcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdzZXRUb3JyZW50cycsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldFRvcnJlbnRzKHRvcnJlbnRzKSB7XG4gICAgICB2YXIgdG9ycmVudHNTb3J0ID0gX1RvcnJlbnRGaWx0ZXJTdG9yZTJbJ2RlZmF1bHQnXS5nZXRUb3JyZW50c1NvcnQoKTtcblxuICAgICAgdGhpcy50b3JyZW50cyA9IHRvcnJlbnRzO1xuXG4gICAgICAvLyBDb252ZXJ0IHRvcnJlbnRzIGhhc2ggdG8gYXJyYXkgYW5kIHNvcnQgaXQuXG4gICAgICB0aGlzLnNvcnRlZFRvcnJlbnRzID0gKDAsIF91dGlsU29ydFRvcnJlbnRzLnNvcnRUb3JyZW50cykodGhpcy50b3JyZW50cywgeyBkaXJlY3Rpb246IHRvcnJlbnRzU29ydC5kaXJlY3Rpb24sIHByb3BlcnR5OiB0b3JyZW50c1NvcnQudmFsdWUgfSk7XG5cbiAgICAgIHZhciBzdGF0dXNGaWx0ZXIgPSBfVG9ycmVudEZpbHRlclN0b3JlMlsnZGVmYXVsdCddLmdldFN0YXR1c0ZpbHRlcigpO1xuICAgICAgdmFyIHNlYXJjaEZpbHRlciA9IF9Ub3JyZW50RmlsdGVyU3RvcmUyWydkZWZhdWx0J10uZ2V0U2VhcmNoRmlsdGVyKCk7XG5cbiAgICAgIHZhciBmaWx0ZXJlZFRvcnJlbnRzID0gT2JqZWN0LmFzc2lnbihbXSwgdGhpcy5zb3J0ZWRUb3JyZW50cyk7XG5cbiAgICAgIGlmIChzdGF0dXNGaWx0ZXIgJiYgc3RhdHVzRmlsdGVyICE9PSAnYWxsJykge1xuICAgICAgICBmaWx0ZXJlZFRvcnJlbnRzID0gKDAsIF91dGlsRmlsdGVyVG9ycmVudHMuZmlsdGVyVG9ycmVudHMpKGZpbHRlcmVkVG9ycmVudHMsIHN0YXR1c0ZpbHRlcik7XG4gICAgICB9XG5cbiAgICAgIGlmIChzZWFyY2hGaWx0ZXIgJiYgc2VhcmNoRmlsdGVyICE9PSAnJykge1xuICAgICAgICBmaWx0ZXJlZFRvcnJlbnRzID0gKDAsIF91dGlsU2VhcmNoVG9ycmVudHMuc2VhcmNoVG9ycmVudHMpKGZpbHRlcmVkVG9ycmVudHMsIHNlYXJjaEZpbHRlcik7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuZmlsdGVyZWRUb3JyZW50cyA9IGZpbHRlcmVkVG9ycmVudHM7XG5cbiAgICAgIHRoaXMuZW1pdChfY29uc3RhbnRzRXZlbnRUeXBlczJbJ2RlZmF1bHQnXS5DTElFTlRfVE9SUkVOVFNfUkVRVUVTVF9TVUNDRVNTKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdzdGFydFBvbGxpbmdUb3JyZW50RGV0YWlscycsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHN0YXJ0UG9sbGluZ1RvcnJlbnREZXRhaWxzKCkge1xuICAgICAgdGhpcy5wb2xsVG9ycmVudERldGFpbHNJbnRlcnZhbElEID0gc2V0SW50ZXJ2YWwodGhpcy5mZXRjaFRvcnJlbnREZXRhaWxzLmJpbmQodGhpcyksIF9jb25maWcyWydkZWZhdWx0J10ucG9sbEludGVydmFsKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdzdGFydFBvbGxpbmdUb3JyZW50cycsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHN0YXJ0UG9sbGluZ1RvcnJlbnRzKCkge1xuICAgICAgdGhpcy5wb2xsVG9ycmVudHNJbnRlcnZhbElEID0gc2V0SW50ZXJ2YWwodGhpcy5mZXRjaFRvcnJlbnRzLmJpbmQodGhpcyksIF9jb25maWcyWydkZWZhdWx0J10ucG9sbEludGVydmFsKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdzdG9wUG9sbGluZ1RvcnJlbnREZXRhaWxzJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gc3RvcFBvbGxpbmdUb3JyZW50RGV0YWlscygpIHtcbiAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5wb2xsVG9ycmVudERldGFpbHNJbnRlcnZhbElEKTtcbiAgICAgIHRoaXMucG9sbFRvcnJlbnREZXRhaWxzSW50ZXJ2YWxJRCA9IG51bGw7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnc3RvcFBvbGxpbmdUb3JyZW50cycsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHN0b3BQb2xsaW5nVG9ycmVudHMoKSB7XG4gICAgICBjbGVhckludGVydmFsKHRoaXMucG9sbFRvcnJlbnRzSW50ZXJ2YWxJRCk7XG4gICAgICB0aGlzLnBvbGxUb3JyZW50c0ludGVydmFsSUQgPSBudWxsO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ3RyaWdnZXJUb3JyZW50c0ZpbHRlcicsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHRyaWdnZXJUb3JyZW50c0ZpbHRlcigpIHtcbiAgICAgIHRoaXMuc2V0VG9ycmVudHModGhpcy50b3JyZW50cyk7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFRvcnJlbnRTdG9yZUNsYXNzO1xufSkoX0Jhc2VTdG9yZTNbJ2RlZmF1bHQnXSk7XG5cbnZhciBUb3JyZW50U3RvcmUgPSBuZXcgVG9ycmVudFN0b3JlQ2xhc3MoKTtcblxuX2Rpc3BhdGNoZXJBcHBEaXNwYXRjaGVyMlsnZGVmYXVsdCddLnJlZ2lzdGVyKGZ1bmN0aW9uIChwYXlsb2FkKSB7XG4gIHZhciBhY3Rpb24gPSBwYXlsb2FkLmFjdGlvbjtcbiAgdmFyIHNvdXJjZSA9IHBheWxvYWQuc291cmNlO1xuXG4gIHN3aXRjaCAoYWN0aW9uLnR5cGUpIHtcbiAgICBjYXNlIF9jb25zdGFudHNBY3Rpb25UeXBlczJbJ2RlZmF1bHQnXS5DTElFTlRfRkVUQ0hfVE9SUkVOVF9ERVRBSUxTX1NVQ0NFU1M6XG4gICAgICBUb3JyZW50U3RvcmUuc2V0VG9ycmVudERldGFpbHMoYWN0aW9uLmRhdGEuaGFzaCwgYWN0aW9uLmRhdGEudG9ycmVudERldGFpbHMpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBfY29uc3RhbnRzQWN0aW9uVHlwZXMyWydkZWZhdWx0J10uQ0xJRU5UX0ZFVENIX1RPUlJFTlRTX1NVQ0NFU1M6XG4gICAgICBUb3JyZW50U3RvcmUuc2V0VG9ycmVudHMoYWN0aW9uLmRhdGEudG9ycmVudHMpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBfY29uc3RhbnRzQWN0aW9uVHlwZXMyWydkZWZhdWx0J10uQ0xJRU5UX0ZFVENIX1RPUlJFTlRTX0VSUk9SOlxuICAgICAgY29uc29sZS5sb2coYWN0aW9uKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgX2NvbnN0YW50c0FjdGlvblR5cGVzMlsnZGVmYXVsdCddLlVJX0NMSUNLX1RPUlJFTlQ6XG4gICAgICBUb3JyZW50U3RvcmUuc2V0U2VsZWN0ZWRUb3JyZW50cyhhY3Rpb24uZGF0YS5ldmVudCwgYWN0aW9uLmRhdGEuaGFzaCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIF9jb25zdGFudHNBY3Rpb25UeXBlczJbJ2RlZmF1bHQnXS5VSV9TRVRfVE9SUkVOVF9TVEFUVVNfRklMVEVSOlxuICAgIGNhc2UgX2NvbnN0YW50c0FjdGlvblR5cGVzMlsnZGVmYXVsdCddLlVJX1NFVF9UT1JSRU5UX1NFQVJDSF9GSUxURVI6XG4gICAgY2FzZSBfY29uc3RhbnRzQWN0aW9uVHlwZXMyWydkZWZhdWx0J10uVUlfU0VUX1RPUlJFTlRfU09SVDpcbiAgICAgIFRvcnJlbnRTdG9yZS50cmlnZ2VyVG9ycmVudHNGaWx0ZXIoKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgX2NvbnN0YW50c0FjdGlvblR5cGVzMlsnZGVmYXVsdCddLkNMSUVOVF9BRERfVE9SUkVOVF9TVUNDRVNTOlxuICAgIGNhc2UgX2NvbnN0YW50c0FjdGlvblR5cGVzMlsnZGVmYXVsdCddLkNMSUVOVF9TVEFSVF9UT1JSRU5UX1NVQ0NFU1M6XG4gICAgY2FzZSBfY29uc3RhbnRzQWN0aW9uVHlwZXMyWydkZWZhdWx0J10uQ0xJRU5UX1NUT1BfVE9SUkVOVF9TVUNDRVNTOlxuICAgICAgVG9ycmVudFN0b3JlLmZldGNoVG9ycmVudHMoKTtcbiAgICAgIGJyZWFrO1xuICB9XG59KTtcblxuZXhwb3J0c1snZGVmYXVsdCddID0gVG9ycmVudFN0b3JlO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL2NsaWVudC9zb3VyY2Uvc2NyaXB0cy9zdG9yZXMvVG9ycmVudFN0b3JlLmpzXG4gKiogbW9kdWxlIGlkID0gMjMwXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iXSwic291cmNlUm9vdCI6IiJ9"); /***/ }, /* 231 */ @@ -1448,7 +1448,7 @@ /* 234 */ /***/ function(module, exports) { - eval("'use strict';\n\nObject.defineProperty(exports, '__esModule', {\n value: true\n});\nexports.sortTorrents = sortTorrents;\n\nfunction sortTorrents(torrents, sortBy) {\n if (torrents.length) {\n var _ret = (function () {\n var direction = sortBy.direction;\n var property = sortBy.property;\n\n torrents.sort(function (a, b) {\n var valA = a[property];\n var valB = b[property];\n\n if (property === 'eta') {\n // keep infinity at bottom of array when sorting by eta\n if (valA === 'Infinity' && valB !== 'Infinity') {\n return 1;\n } else if (valA !== 'Infinity' && valB === 'Infinity') {\n return -1;\n }\n // if it's not infinity, compare the second as numbers\n if (valA !== 'Infinity') {\n valA = Number(valA.seconds);\n }\n if (valB !== 'Infinity') {\n valB = Number(valB.seconds);\n }\n } else if (property === 'name') {\n valA = valA.toLowerCase();\n valB = valB.toLowerCase();\n } else {\n valA = Number(valA);\n valB = Number(valB);\n }\n\n if (direction === 'asc') {\n if (valA > valB) {\n return 1;\n }\n if (valA < valB) {\n return -1;\n }\n } else {\n if (valA > valB) {\n return -1;\n }\n if (valA < valB) {\n return 1;\n }\n }\n\n return 0;\n });\n\n return {\n v: torrents\n };\n })();\n\n if (typeof _ret === 'object') return _ret.v;\n } else {\n return torrents;\n }\n}//@ sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9jbGllbnQvc291cmNlL3NjcmlwdHMvdXRpbC9zb3J0VG9ycmVudHMuanM/YjliOSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7QUFFQTtBQUNBO0FBQ0EsQ0FBQztBQUNEOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE9BQU87O0FBRVA7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EiLCJmaWxlIjoiMjM0LmpzIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuc29ydFRvcnJlbnRzID0gc29ydFRvcnJlbnRzO1xuXG5mdW5jdGlvbiBzb3J0VG9ycmVudHModG9ycmVudHMsIHNvcnRCeSkge1xuICBpZiAodG9ycmVudHMubGVuZ3RoKSB7XG4gICAgdmFyIF9yZXQgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIGRpcmVjdGlvbiA9IHNvcnRCeS5kaXJlY3Rpb247XG4gICAgICB2YXIgcHJvcGVydHkgPSBzb3J0QnkucHJvcGVydHk7XG5cbiAgICAgIHRvcnJlbnRzLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgdmFyIHZhbEEgPSBhW3Byb3BlcnR5XTtcbiAgICAgICAgdmFyIHZhbEIgPSBiW3Byb3BlcnR5XTtcblxuICAgICAgICBpZiAocHJvcGVydHkgPT09ICdldGEnKSB7XG4gICAgICAgICAgLy8ga2VlcCBpbmZpbml0eSBhdCBib3R0b20gb2YgYXJyYXkgd2hlbiBzb3J0aW5nIGJ5IGV0YVxuICAgICAgICAgIGlmICh2YWxBID09PSAnSW5maW5pdHknICYmIHZhbEIgIT09ICdJbmZpbml0eScpIHtcbiAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICAgIH0gZWxzZSBpZiAodmFsQSAhPT0gJ0luZmluaXR5JyAmJiB2YWxCID09PSAnSW5maW5pdHknKSB7XG4gICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIGlmIGl0J3Mgbm90IGluZmluaXR5LCBjb21wYXJlIHRoZSBzZWNvbmQgYXMgbnVtYmVyc1xuICAgICAgICAgIGlmICh2YWxBICE9PSAnSW5maW5pdHknKSB7XG4gICAgICAgICAgICB2YWxBID0gTnVtYmVyKHZhbEEuc2Vjb25kcyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh2YWxCICE9PSAnSW5maW5pdHknKSB7XG4gICAgICAgICAgICB2YWxCID0gTnVtYmVyKHZhbEIuc2Vjb25kcyk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHByb3BlcnR5ID09PSAnbmFtZScpIHtcbiAgICAgICAgICB2YWxBID0gdmFsQS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgIHZhbEIgPSB2YWxCLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFsQSA9IE51bWJlcih2YWxBKTtcbiAgICAgICAgICB2YWxCID0gTnVtYmVyKHZhbEIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGRpcmVjdGlvbiA9PT0gJ2FzYycpIHtcbiAgICAgICAgICBpZiAodmFsQSA+IHZhbEIpIHtcbiAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodmFsQSA8IHZhbEIpIHtcbiAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHZhbEEgPiB2YWxCKSB7XG4gICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh2YWxBIDwgdmFsQikge1xuICAgICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdjogdG9ycmVudHNcbiAgICAgIH07XG4gICAgfSkoKTtcblxuICAgIGlmICh0eXBlb2YgX3JldCA9PT0gJ29iamVjdCcpIHJldHVybiBfcmV0LnY7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHRvcnJlbnRzO1xuICB9XG59XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL2NsaWVudC9zb3VyY2Uvc2NyaXB0cy91dGlsL3NvcnRUb3JyZW50cy5qc1xuICoqIG1vZHVsZSBpZCA9IDIzNFxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIl0sInNvdXJjZVJvb3QiOiIifQ=="); + eval("'use strict';\n\nObject.defineProperty(exports, '__esModule', {\n value: true\n});\n\nvar _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\nexports.sortTorrents = sortTorrents;\n\nfunction sortTorrents(torrentsHash, sortBy) {\n var torrents = Object.keys(torrentsHash).map(function (hash) {\n return _extends({ hash: hash }, torrentsHash[hash]);\n });\n\n if (torrents.length) {\n var _ret = (function () {\n var direction = sortBy.direction;\n var property = sortBy.property;\n\n torrents.sort(function (a, b) {\n var valA = a[property];\n var valB = b[property];\n\n if (property === 'eta') {\n // keep infinity at bottom of array when sorting by eta\n if (valA === 'Infinity' && valB !== 'Infinity') {\n return 1;\n } else if (valA !== 'Infinity' && valB === 'Infinity') {\n return -1;\n }\n // if it's not infinity, compare the second as numbers\n if (valA !== 'Infinity') {\n valA = Number(valA.seconds);\n }\n if (valB !== 'Infinity') {\n valB = Number(valB.seconds);\n }\n } else if (property === 'name') {\n valA = valA.toLowerCase();\n valB = valB.toLowerCase();\n } else {\n valA = Number(valA);\n valB = Number(valB);\n }\n\n if (direction === 'asc') {\n if (valA > valB) {\n return 1;\n }\n if (valA < valB) {\n return -1;\n }\n } else {\n if (valA > valB) {\n return -1;\n }\n if (valA < valB) {\n return 1;\n }\n }\n\n return 0;\n });\n\n return {\n v: torrents\n };\n })();\n\n if (typeof _ret === 'object') return _ret.v;\n } else {\n return torrents;\n }\n}//@ sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9jbGllbnQvc291cmNlL3NjcmlwdHMvdXRpbC9zb3J0VG9ycmVudHMuanM/YjliOSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7QUFFQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRCxtREFBbUQsZ0JBQWdCLHNCQUFzQixPQUFPLDJCQUEyQiwwQkFBMEIseURBQXlELDJCQUEyQixFQUFFLEVBQUUsRUFBRSxlQUFlOztBQUU5UDs7QUFFQTtBQUNBO0FBQ0EscUJBQXFCLGFBQWE7QUFDbEMsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsT0FBTzs7QUFFUDtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSIsImZpbGUiOiIyMzQuanMiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uICh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTsgZm9yICh2YXIga2V5IGluIHNvdXJjZSkgeyBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkgeyB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOyB9IH0gfSByZXR1cm4gdGFyZ2V0OyB9O1xuXG5leHBvcnRzLnNvcnRUb3JyZW50cyA9IHNvcnRUb3JyZW50cztcblxuZnVuY3Rpb24gc29ydFRvcnJlbnRzKHRvcnJlbnRzSGFzaCwgc29ydEJ5KSB7XG4gIHZhciB0b3JyZW50cyA9IE9iamVjdC5rZXlzKHRvcnJlbnRzSGFzaCkubWFwKGZ1bmN0aW9uIChoYXNoKSB7XG4gICAgcmV0dXJuIF9leHRlbmRzKHsgaGFzaDogaGFzaCB9LCB0b3JyZW50c0hhc2hbaGFzaF0pO1xuICB9KTtcblxuICBpZiAodG9ycmVudHMubGVuZ3RoKSB7XG4gICAgdmFyIF9yZXQgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIGRpcmVjdGlvbiA9IHNvcnRCeS5kaXJlY3Rpb247XG4gICAgICB2YXIgcHJvcGVydHkgPSBzb3J0QnkucHJvcGVydHk7XG5cbiAgICAgIHRvcnJlbnRzLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgdmFyIHZhbEEgPSBhW3Byb3BlcnR5XTtcbiAgICAgICAgdmFyIHZhbEIgPSBiW3Byb3BlcnR5XTtcblxuICAgICAgICBpZiAocHJvcGVydHkgPT09ICdldGEnKSB7XG4gICAgICAgICAgLy8ga2VlcCBpbmZpbml0eSBhdCBib3R0b20gb2YgYXJyYXkgd2hlbiBzb3J0aW5nIGJ5IGV0YVxuICAgICAgICAgIGlmICh2YWxBID09PSAnSW5maW5pdHknICYmIHZhbEIgIT09ICdJbmZpbml0eScpIHtcbiAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICAgIH0gZWxzZSBpZiAodmFsQSAhPT0gJ0luZmluaXR5JyAmJiB2YWxCID09PSAnSW5maW5pdHknKSB7XG4gICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIGlmIGl0J3Mgbm90IGluZmluaXR5LCBjb21wYXJlIHRoZSBzZWNvbmQgYXMgbnVtYmVyc1xuICAgICAgICAgIGlmICh2YWxBICE9PSAnSW5maW5pdHknKSB7XG4gICAgICAgICAgICB2YWxBID0gTnVtYmVyKHZhbEEuc2Vjb25kcyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh2YWxCICE9PSAnSW5maW5pdHknKSB7XG4gICAgICAgICAgICB2YWxCID0gTnVtYmVyKHZhbEIuc2Vjb25kcyk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHByb3BlcnR5ID09PSAnbmFtZScpIHtcbiAgICAgICAgICB2YWxBID0gdmFsQS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgIHZhbEIgPSB2YWxCLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFsQSA9IE51bWJlcih2YWxBKTtcbiAgICAgICAgICB2YWxCID0gTnVtYmVyKHZhbEIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGRpcmVjdGlvbiA9PT0gJ2FzYycpIHtcbiAgICAgICAgICBpZiAodmFsQSA+IHZhbEIpIHtcbiAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodmFsQSA8IHZhbEIpIHtcbiAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHZhbEEgPiB2YWxCKSB7XG4gICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh2YWxBIDwgdmFsQikge1xuICAgICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdjogdG9ycmVudHNcbiAgICAgIH07XG4gICAgfSkoKTtcblxuICAgIGlmICh0eXBlb2YgX3JldCA9PT0gJ29iamVjdCcpIHJldHVybiBfcmV0LnY7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHRvcnJlbnRzO1xuICB9XG59XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL2NsaWVudC9zb3VyY2Uvc2NyaXB0cy91dGlsL3NvcnRUb3JyZW50cy5qc1xuICoqIG1vZHVsZSBpZCA9IDIzNFxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIl0sInNvdXJjZVJvb3QiOiIifQ=="); /***/ }, /* 235 */ @@ -1574,7 +1574,7 @@ /* 255 */ /***/ function(module, exports, __webpack_require__) { - eval("'use strict';\n\nObject.defineProperty(exports, '__esModule', {\n value: true\n});\n\nvar _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\nvar _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nfunction _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\nvar _react = __webpack_require__(1);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _Action = __webpack_require__(256);\n\nvar _Action2 = _interopRequireDefault(_Action);\n\nvar _iconsAdd = __webpack_require__(258);\n\nvar _iconsAdd2 = _interopRequireDefault(_iconsAdd);\n\nvar _constantsEventTypes = __webpack_require__(172);\n\nvar _constantsEventTypes2 = _interopRequireDefault(_constantsEventTypes);\n\nvar _iconsPause = __webpack_require__(259);\n\nvar _iconsPause2 = _interopRequireDefault(_iconsPause);\n\nvar _iconsRemove = __webpack_require__(260);\n\nvar _iconsRemove2 = _interopRequireDefault(_iconsRemove);\n\nvar _SortDropdown = __webpack_require__(261);\n\nvar _SortDropdown2 = _interopRequireDefault(_SortDropdown);\n\nvar _iconsStart = __webpack_require__(262);\n\nvar _iconsStart2 = _interopRequireDefault(_iconsStart);\n\nvar _iconsStop = __webpack_require__(257);\n\nvar _iconsStop2 = _interopRequireDefault(_iconsStop);\n\nvar _utilStringUtil = __webpack_require__(263);\n\nvar _utilStringUtil2 = _interopRequireDefault(_utilStringUtil);\n\nvar _actionsTorrentActions = __webpack_require__(178);\n\nvar _actionsTorrentActions2 = _interopRequireDefault(_actionsTorrentActions);\n\nvar _storesTorrentFilterStore = __webpack_require__(229);\n\nvar _storesTorrentFilterStore2 = _interopRequireDefault(_storesTorrentFilterStore);\n\nvar _storesTorrentStore = __webpack_require__(230);\n\nvar _storesTorrentStore2 = _interopRequireDefault(_storesTorrentStore);\n\nvar _actionsUIActions = __webpack_require__(198);\n\nvar _actionsUIActions2 = _interopRequireDefault(_actionsUIActions);\n\nvar METHODS_TO_BIND = ['handleAddTorrents', 'handleRemoveTorrents', 'handleSortChange', 'handleStart', 'handleStop', 'onSortChange'];\n\nvar ActionBar = (function (_React$Component) {\n _inherits(ActionBar, _React$Component);\n\n function ActionBar() {\n var _this = this;\n\n _classCallCheck(this, ActionBar);\n\n _get(Object.getPrototypeOf(ActionBar.prototype), 'constructor', this).call(this);\n\n this.state = {\n sortBy: _storesTorrentFilterStore2['default'].getTorrentsSort()\n };\n\n METHODS_TO_BIND.forEach(function (method) {\n _this[method] = _this[method].bind(_this);\n });\n }\n\n _createClass(ActionBar, [{\n key: 'componentDidMount',\n value: function componentDidMount() {\n _storesTorrentFilterStore2['default'].fetchSortProps();\n _storesTorrentFilterStore2['default'].listen(_constantsEventTypes2['default'].UI_TORRENTS_SORT_CHANGE, this.onSortChange);\n }\n }, {\n key: 'componentWillUnmount',\n value: function componentWillUnmount() {\n _storesTorrentFilterStore2['default'].unlisten(_constantsEventTypes2['default'].UI_TORRENTS_SORT_CHANGE, this.onSortChange);\n }\n }, {\n key: 'handleAddTorrents',\n value: function handleAddTorrents() {\n _actionsUIActions2['default'].displayModal('add-torrents');\n }\n }, {\n key: 'handleRemoveTorrentConfirm',\n value: function handleRemoveTorrentConfirm(torrents) {\n _actionsTorrentActions2['default'].deleteTorrents(torrents);\n }\n }, {\n key: 'handleRemoveTorrents',\n value: function handleRemoveTorrents() {\n var selectedTorrents = _storesTorrentStore2['default'].getSelectedTorrents() || [];\n var selectedTorrentCount = selectedTorrents.length;\n\n var actions = [{\n clickHandler: this.handleRemoveTorrentDecline,\n content: 'No',\n triggerDismiss: true,\n type: 'secondary'\n }, {\n clickHandler: this.handleRemoveTorrentConfirm.bind(this, selectedTorrents),\n content: 'Yes',\n triggerDismiss: true,\n type: 'primary'\n }];\n var torrentText = _utilStringUtil2['default'].pluralize('torrent', selectedTorrentCount);\n var content = 'You are about to remove ' + selectedTorrentCount + ' ' + torrentText + '.';\n\n if (selectedTorrentCount === 0) {\n actions = [{\n clickHandler: null,\n content: 'OK',\n triggerDismiss: true,\n type: 'primary'\n }];\n content = 'You haven\\'t selected any torrents.';\n }\n\n _actionsUIActions2['default'].displayModal({\n actions: actions,\n content: content,\n heading: 'Are you sure?',\n type: 'confirm'\n });\n }\n }, {\n key: 'handleSortChange',\n value: function handleSortChange(sortBy) {\n _actionsUIActions2['default'].setTorrentsSort(sortBy);\n }\n }, {\n key: 'handleStart',\n value: function handleStart() {\n _actionsTorrentActions2['default'].startTorrents(_storesTorrentStore2['default'].getSelectedTorrents());\n }\n }, {\n key: 'handleStop',\n value: function handleStop() {\n _actionsTorrentActions2['default'].stopTorrents(_storesTorrentStore2['default'].getSelectedTorrents());\n }\n }, {\n key: 'onSortChange',\n value: function onSortChange() {\n this.setState({\n sortBy: _storesTorrentFilterStore2['default'].getTorrentsSort()\n });\n }\n }, {\n key: 'render',\n value: function render() {\n return _react2['default'].createElement(\n 'nav',\n { className: 'action-bar' },\n _react2['default'].createElement(\n 'div',\n { className: 'actions action-bar__item action-bar__item--sort-torrents' },\n _react2['default'].createElement(_SortDropdown2['default'], { onSortChange: this.handleSortChange,\n selectedItem: this.state.sortBy })\n ),\n _react2['default'].createElement(\n 'div',\n { className: 'actions action-bar__item action-bar__item--torrent-operations' },\n _react2['default'].createElement(\n 'div',\n { className: 'action-bar__group' },\n _react2['default'].createElement(_Action2['default'], { label: 'Start Torrent', slug: 'start-torrent', icon: _react2['default'].createElement(_iconsStart2['default'], null),\n clickHandler: this.handleStart }),\n _react2['default'].createElement(_Action2['default'], { label: 'Stop Torrent', slug: 'stop-torrent', icon: _react2['default'].createElement(_iconsStop2['default'], null),\n clickHandler: this.handleStop }),\n _react2['default'].createElement(_Action2['default'], { label: 'Pause Torrent', slug: 'pause-torrent', icon: _react2['default'].createElement(_iconsPause2['default'], null),\n clickHandler: this.handlePause })\n ),\n _react2['default'].createElement(\n 'div',\n { className: 'action-bar__group action-bar__group--has-divider' },\n _react2['default'].createElement(_Action2['default'], { label: 'Add Torrent', slug: 'add-torrent', icon: _react2['default'].createElement(_iconsAdd2['default'], null),\n clickHandler: this.handleAddTorrents }),\n _react2['default'].createElement(_Action2['default'], { label: 'Remove Torrent', slug: 'remove-torrent', icon: _react2['default'].createElement(_iconsRemove2['default'], null),\n clickHandler: this.handleRemoveTorrents })\n )\n )\n );\n }\n }]);\n\n return ActionBar;\n})(_react2['default'].Component);\n\nexports['default'] = ActionBar;\nmodule.exports = exports['default'];//@ sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9jbGllbnQvc291cmNlL3NjcmlwdHMvY29tcG9uZW50cy90b3JyZW50LWxpc3QvQWN0aW9uQmFyLmpzPzhjMDMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0FBRUE7QUFDQTtBQUNBLENBQUM7O0FBRUQsaUNBQWlDLDJDQUEyQyxnQkFBZ0Isa0JBQWtCLE9BQU8sMkJBQTJCLHdEQUF3RCxnQ0FBZ0MsdURBQXVELDJEQUEyRCxFQUFFLEVBQUUseURBQXlELHFFQUFxRSw2REFBNkQsb0JBQW9CLEdBQUcsRUFBRTs7QUFFbGpCLHVDQUF1QyxtQkFBbUIsNEJBQTRCLGlEQUFpRCxnQkFBZ0Isa0RBQWtELDhEQUE4RCwwQkFBMEIsNENBQTRDLHVCQUF1QixrQkFBa0IsRUFBRSxPQUFPLGFBQWEsZ0JBQWdCLGdCQUFnQixlQUFlLDJCQUEyQixvQkFBb0IsRUFBRSxFQUFFLDRCQUE0QixtQkFBbUIsRUFBRSxPQUFPLHVCQUF1Qiw0QkFBNEIsa0JBQWtCLEVBQUUsOEJBQThCLEVBQUUsRUFBRTs7QUFFL29CLHNDQUFzQyx1Q0FBdUMsa0JBQWtCOztBQUUvRixpREFBaUQsMENBQTBDLDBEQUEwRCxFQUFFOztBQUV2SiwwQ0FBMEMsK0RBQStELHFHQUFxRyxFQUFFLHlFQUF5RSxlQUFlLHlFQUF5RSxFQUFFLEVBQUUsdUhBQXVIOztBQUU1ZTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUywwQkFBMEI7QUFDbkM7QUFDQTtBQUNBLFdBQVcsd0VBQXdFO0FBQ25GLHVFQUF1RTtBQUN2RSw2Q0FBNkM7QUFDN0M7QUFDQTtBQUNBO0FBQ0EsV0FBVyw2RUFBNkU7QUFDeEY7QUFDQTtBQUNBLGFBQWEsaUNBQWlDO0FBQzlDLG1FQUFtRTtBQUNuRSw4Q0FBOEM7QUFDOUMsbUVBQW1FO0FBQ25FLDZDQUE2QztBQUM3QyxtRUFBbUU7QUFDbkUsOENBQThDO0FBQzlDO0FBQ0E7QUFDQTtBQUNBLGFBQWEsZ0VBQWdFO0FBQzdFLG1FQUFtRTtBQUNuRSxvREFBb0Q7QUFDcEQsbUVBQW1FO0FBQ25FLHVEQUF1RDtBQUN2RDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQSxDQUFDOztBQUVEO0FBQ0EiLCJmaWxlIjoiMjU1LmpzIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9jcmVhdGVDbGFzcyA9IChmdW5jdGlvbiAoKSB7IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoJ3ZhbHVlJyBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH0gcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfTsgfSkoKTtcblxudmFyIF9nZXQgPSBmdW5jdGlvbiBnZXQoX3gsIF94MiwgX3gzKSB7IHZhciBfYWdhaW4gPSB0cnVlOyBfZnVuY3Rpb246IHdoaWxlIChfYWdhaW4pIHsgdmFyIG9iamVjdCA9IF94LCBwcm9wZXJ0eSA9IF94MiwgcmVjZWl2ZXIgPSBfeDM7IF9hZ2FpbiA9IGZhbHNlOyBpZiAob2JqZWN0ID09PSBudWxsKSBvYmplY3QgPSBGdW5jdGlvbi5wcm90b3R5cGU7IHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHByb3BlcnR5KTsgaWYgKGRlc2MgPT09IHVuZGVmaW5lZCkgeyB2YXIgcGFyZW50ID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKG9iamVjdCk7IGlmIChwYXJlbnQgPT09IG51bGwpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfSBlbHNlIHsgX3ggPSBwYXJlbnQ7IF94MiA9IHByb3BlcnR5OyBfeDMgPSByZWNlaXZlcjsgX2FnYWluID0gdHJ1ZTsgZGVzYyA9IHBhcmVudCA9IHVuZGVmaW5lZDsgY29udGludWUgX2Z1bmN0aW9uOyB9IH0gZWxzZSBpZiAoJ3ZhbHVlJyBpbiBkZXNjKSB7IHJldHVybiBkZXNjLnZhbHVlOyB9IGVsc2UgeyB2YXIgZ2V0dGVyID0gZGVzYy5nZXQ7IGlmIChnZXR0ZXIgPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9IHJldHVybiBnZXR0ZXIuY2FsbChyZWNlaXZlcik7IH0gfSB9O1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAnZGVmYXVsdCc6IG9iaiB9OyB9XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcignQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uJyk7IH0gfVxuXG5mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSAnZnVuY3Rpb24nICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcignU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCAnICsgdHlwZW9mIHN1cGVyQ2xhc3MpOyB9IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwgeyBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogc3ViQ2xhc3MsIGVudW1lcmFibGU6IGZhbHNlLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0gfSk7IGlmIChzdXBlckNsYXNzKSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3Quc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIDogc3ViQ2xhc3MuX19wcm90b19fID0gc3VwZXJDbGFzczsgfVxuXG52YXIgX3JlYWN0ID0gcmVxdWlyZSgncmVhY3QnKTtcblxudmFyIF9yZWFjdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWFjdCk7XG5cbnZhciBfQWN0aW9uID0gcmVxdWlyZSgnLi9BY3Rpb24nKTtcblxudmFyIF9BY3Rpb24yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfQWN0aW9uKTtcblxudmFyIF9pY29uc0FkZCA9IHJlcXVpcmUoJy4uL2ljb25zL0FkZCcpO1xuXG52YXIgX2ljb25zQWRkMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2ljb25zQWRkKTtcblxudmFyIF9jb25zdGFudHNFdmVudFR5cGVzID0gcmVxdWlyZSgnLi4vLi4vY29uc3RhbnRzL0V2ZW50VHlwZXMnKTtcblxudmFyIF9jb25zdGFudHNFdmVudFR5cGVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NvbnN0YW50c0V2ZW50VHlwZXMpO1xuXG52YXIgX2ljb25zUGF1c2UgPSByZXF1aXJlKCcuLi9pY29ucy9QYXVzZScpO1xuXG52YXIgX2ljb25zUGF1c2UyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaWNvbnNQYXVzZSk7XG5cbnZhciBfaWNvbnNSZW1vdmUgPSByZXF1aXJlKCcuLi9pY29ucy9SZW1vdmUnKTtcblxudmFyIF9pY29uc1JlbW92ZTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9pY29uc1JlbW92ZSk7XG5cbnZhciBfU29ydERyb3Bkb3duID0gcmVxdWlyZSgnLi9Tb3J0RHJvcGRvd24nKTtcblxudmFyIF9Tb3J0RHJvcGRvd24yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfU29ydERyb3Bkb3duKTtcblxudmFyIF9pY29uc1N0YXJ0ID0gcmVxdWlyZSgnLi4vaWNvbnMvU3RhcnQnKTtcblxudmFyIF9pY29uc1N0YXJ0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2ljb25zU3RhcnQpO1xuXG52YXIgX2ljb25zU3RvcCA9IHJlcXVpcmUoJy4uL2ljb25zL1N0b3AnKTtcblxudmFyIF9pY29uc1N0b3AyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaWNvbnNTdG9wKTtcblxudmFyIF91dGlsU3RyaW5nVXRpbCA9IHJlcXVpcmUoJy4uLy4uLy4uLy4uLy4uL3V0aWwvc3RyaW5nVXRpbCcpO1xuXG52YXIgX3V0aWxTdHJpbmdVdGlsMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3V0aWxTdHJpbmdVdGlsKTtcblxudmFyIF9hY3Rpb25zVG9ycmVudEFjdGlvbnMgPSByZXF1aXJlKCcuLi8uLi9hY3Rpb25zL1RvcnJlbnRBY3Rpb25zJyk7XG5cbnZhciBfYWN0aW9uc1RvcnJlbnRBY3Rpb25zMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2FjdGlvbnNUb3JyZW50QWN0aW9ucyk7XG5cbnZhciBfc3RvcmVzVG9ycmVudEZpbHRlclN0b3JlID0gcmVxdWlyZSgnLi4vLi4vc3RvcmVzL1RvcnJlbnRGaWx0ZXJTdG9yZScpO1xuXG52YXIgX3N0b3Jlc1RvcnJlbnRGaWx0ZXJTdG9yZTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9zdG9yZXNUb3JyZW50RmlsdGVyU3RvcmUpO1xuXG52YXIgX3N0b3Jlc1RvcnJlbnRTdG9yZSA9IHJlcXVpcmUoJy4uLy4uL3N0b3Jlcy9Ub3JyZW50U3RvcmUnKTtcblxudmFyIF9zdG9yZXNUb3JyZW50U3RvcmUyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfc3RvcmVzVG9ycmVudFN0b3JlKTtcblxudmFyIF9hY3Rpb25zVUlBY3Rpb25zID0gcmVxdWlyZSgnLi4vLi4vYWN0aW9ucy9VSUFjdGlvbnMnKTtcblxudmFyIF9hY3Rpb25zVUlBY3Rpb25zMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2FjdGlvbnNVSUFjdGlvbnMpO1xuXG52YXIgTUVUSE9EU19UT19CSU5EID0gWydoYW5kbGVBZGRUb3JyZW50cycsICdoYW5kbGVSZW1vdmVUb3JyZW50cycsICdoYW5kbGVTb3J0Q2hhbmdlJywgJ2hhbmRsZVN0YXJ0JywgJ2hhbmRsZVN0b3AnLCAnb25Tb3J0Q2hhbmdlJ107XG5cbnZhciBBY3Rpb25CYXIgPSAoZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgX2luaGVyaXRzKEFjdGlvbkJhciwgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgZnVuY3Rpb24gQWN0aW9uQmFyKCkge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgQWN0aW9uQmFyKTtcblxuICAgIF9nZXQoT2JqZWN0LmdldFByb3RvdHlwZU9mKEFjdGlvbkJhci5wcm90b3R5cGUpLCAnY29uc3RydWN0b3InLCB0aGlzKS5jYWxsKHRoaXMpO1xuXG4gICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgIHNvcnRCeTogX3N0b3Jlc1RvcnJlbnRGaWx0ZXJTdG9yZTJbJ2RlZmF1bHQnXS5nZXRUb3JyZW50c1NvcnQoKVxuICAgIH07XG5cbiAgICBNRVRIT0RTX1RPX0JJTkQuZm9yRWFjaChmdW5jdGlvbiAobWV0aG9kKSB7XG4gICAgICBfdGhpc1ttZXRob2RdID0gX3RoaXNbbWV0aG9kXS5iaW5kKF90aGlzKTtcbiAgICB9KTtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhBY3Rpb25CYXIsIFt7XG4gICAga2V5OiAnY29tcG9uZW50RGlkTW91bnQnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICAgIF9zdG9yZXNUb3JyZW50RmlsdGVyU3RvcmUyWydkZWZhdWx0J10uZmV0Y2hTb3J0UHJvcHMoKTtcbiAgICAgIF9zdG9yZXNUb3JyZW50RmlsdGVyU3RvcmUyWydkZWZhdWx0J10ubGlzdGVuKF9jb25zdGFudHNFdmVudFR5cGVzMlsnZGVmYXVsdCddLlVJX1RPUlJFTlRTX1NPUlRfQ0hBTkdFLCB0aGlzLm9uU29ydENoYW5nZSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnY29tcG9uZW50V2lsbFVubW91bnQnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICAgIF9zdG9yZXNUb3JyZW50RmlsdGVyU3RvcmUyWydkZWZhdWx0J10udW5saXN0ZW4oX2NvbnN0YW50c0V2ZW50VHlwZXMyWydkZWZhdWx0J10uVUlfVE9SUkVOVFNfU09SVF9DSEFOR0UsIHRoaXMub25Tb3J0Q2hhbmdlKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdoYW5kbGVBZGRUb3JyZW50cycsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGhhbmRsZUFkZFRvcnJlbnRzKCkge1xuICAgICAgX2FjdGlvbnNVSUFjdGlvbnMyWydkZWZhdWx0J10uZGlzcGxheU1vZGFsKCdhZGQtdG9ycmVudHMnKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdoYW5kbGVSZW1vdmVUb3JyZW50Q29uZmlybScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGhhbmRsZVJlbW92ZVRvcnJlbnRDb25maXJtKHRvcnJlbnRzKSB7XG4gICAgICBfYWN0aW9uc1RvcnJlbnRBY3Rpb25zMlsnZGVmYXVsdCddLmRlbGV0ZVRvcnJlbnRzKHRvcnJlbnRzKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdoYW5kbGVSZW1vdmVUb3JyZW50cycsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGhhbmRsZVJlbW92ZVRvcnJlbnRzKCkge1xuICAgICAgdmFyIHNlbGVjdGVkVG9ycmVudHMgPSBfc3RvcmVzVG9ycmVudFN0b3JlMlsnZGVmYXVsdCddLmdldFNlbGVjdGVkVG9ycmVudHMoKSB8fCBbXTtcbiAgICAgIHZhciBzZWxlY3RlZFRvcnJlbnRDb3VudCA9IHNlbGVjdGVkVG9ycmVudHMubGVuZ3RoO1xuXG4gICAgICB2YXIgYWN0aW9ucyA9IFt7XG4gICAgICAgIGNsaWNrSGFuZGxlcjogdGhpcy5oYW5kbGVSZW1vdmVUb3JyZW50RGVjbGluZSxcbiAgICAgICAgY29udGVudDogJ05vJyxcbiAgICAgICAgdHJpZ2dlckRpc21pc3M6IHRydWUsXG4gICAgICAgIHR5cGU6ICdzZWNvbmRhcnknXG4gICAgICB9LCB7XG4gICAgICAgIGNsaWNrSGFuZGxlcjogdGhpcy5oYW5kbGVSZW1vdmVUb3JyZW50Q29uZmlybS5iaW5kKHRoaXMsIHNlbGVjdGVkVG9ycmVudHMpLFxuICAgICAgICBjb250ZW50OiAnWWVzJyxcbiAgICAgICAgdHJpZ2dlckRpc21pc3M6IHRydWUsXG4gICAgICAgIHR5cGU6ICdwcmltYXJ5J1xuICAgICAgfV07XG4gICAgICB2YXIgdG9ycmVudFRleHQgPSBfdXRpbFN0cmluZ1V0aWwyWydkZWZhdWx0J10ucGx1cmFsaXplKCd0b3JyZW50Jywgc2VsZWN0ZWRUb3JyZW50Q291bnQpO1xuICAgICAgdmFyIGNvbnRlbnQgPSAnWW91IGFyZSBhYm91dCB0byByZW1vdmUgJyArIHNlbGVjdGVkVG9ycmVudENvdW50ICsgJyAnICsgdG9ycmVudFRleHQgKyAnLic7XG5cbiAgICAgIGlmIChzZWxlY3RlZFRvcnJlbnRDb3VudCA9PT0gMCkge1xuICAgICAgICBhY3Rpb25zID0gW3tcbiAgICAgICAgICBjbGlja0hhbmRsZXI6IG51bGwsXG4gICAgICAgICAgY29udGVudDogJ09LJyxcbiAgICAgICAgICB0cmlnZ2VyRGlzbWlzczogdHJ1ZSxcbiAgICAgICAgICB0eXBlOiAncHJpbWFyeSdcbiAgICAgICAgfV07XG4gICAgICAgIGNvbnRlbnQgPSAnWW91IGhhdmVuXFwndCBzZWxlY3RlZCBhbnkgdG9ycmVudHMuJztcbiAgICAgIH1cblxuICAgICAgX2FjdGlvbnNVSUFjdGlvbnMyWydkZWZhdWx0J10uZGlzcGxheU1vZGFsKHtcbiAgICAgICAgYWN0aW9uczogYWN0aW9ucyxcbiAgICAgICAgY29udGVudDogY29udGVudCxcbiAgICAgICAgaGVhZGluZzogJ0FyZSB5b3Ugc3VyZT8nLFxuICAgICAgICB0eXBlOiAnY29uZmlybSdcbiAgICAgIH0pO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2hhbmRsZVNvcnRDaGFuZ2UnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBoYW5kbGVTb3J0Q2hhbmdlKHNvcnRCeSkge1xuICAgICAgX2FjdGlvbnNVSUFjdGlvbnMyWydkZWZhdWx0J10uc2V0VG9ycmVudHNTb3J0KHNvcnRCeSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnaGFuZGxlU3RhcnQnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBoYW5kbGVTdGFydCgpIHtcbiAgICAgIF9hY3Rpb25zVG9ycmVudEFjdGlvbnMyWydkZWZhdWx0J10uc3RhcnRUb3JyZW50cyhfc3RvcmVzVG9ycmVudFN0b3JlMlsnZGVmYXVsdCddLmdldFNlbGVjdGVkVG9ycmVudHMoKSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnaGFuZGxlU3RvcCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGhhbmRsZVN0b3AoKSB7XG4gICAgICBfYWN0aW9uc1RvcnJlbnRBY3Rpb25zMlsnZGVmYXVsdCddLnN0b3BUb3JyZW50cyhfc3RvcmVzVG9ycmVudFN0b3JlMlsnZGVmYXVsdCddLmdldFNlbGVjdGVkVG9ycmVudHMoKSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnb25Tb3J0Q2hhbmdlJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gb25Tb3J0Q2hhbmdlKCkge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIHNvcnRCeTogX3N0b3Jlc1RvcnJlbnRGaWx0ZXJTdG9yZTJbJ2RlZmF1bHQnXS5nZXRUb3JyZW50c1NvcnQoKVxuICAgICAgfSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAncmVuZGVyJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgICAgcmV0dXJuIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KFxuICAgICAgICAnbmF2JyxcbiAgICAgICAgeyBjbGFzc05hbWU6ICdhY3Rpb24tYmFyJyB9LFxuICAgICAgICBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChcbiAgICAgICAgICAnZGl2JyxcbiAgICAgICAgICB7IGNsYXNzTmFtZTogJ2FjdGlvbnMgYWN0aW9uLWJhcl9faXRlbSBhY3Rpb24tYmFyX19pdGVtLS1zb3J0LXRvcnJlbnRzJyB9LFxuICAgICAgICAgIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KF9Tb3J0RHJvcGRvd24yWydkZWZhdWx0J10sIHsgb25Tb3J0Q2hhbmdlOiB0aGlzLmhhbmRsZVNvcnRDaGFuZ2UsXG4gICAgICAgICAgICBzZWxlY3RlZEl0ZW06IHRoaXMuc3RhdGUuc29ydEJ5IH0pXG4gICAgICAgICksXG4gICAgICAgIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgICdkaXYnLFxuICAgICAgICAgIHsgY2xhc3NOYW1lOiAnYWN0aW9ucyBhY3Rpb24tYmFyX19pdGVtIGFjdGlvbi1iYXJfX2l0ZW0tLXRvcnJlbnQtb3BlcmF0aW9ucycgfSxcbiAgICAgICAgICBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChcbiAgICAgICAgICAgICdkaXYnLFxuICAgICAgICAgICAgeyBjbGFzc05hbWU6ICdhY3Rpb24tYmFyX19ncm91cCcgfSxcbiAgICAgICAgICAgIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KF9BY3Rpb24yWydkZWZhdWx0J10sIHsgbGFiZWw6ICdTdGFydCBUb3JyZW50Jywgc2x1ZzogJ3N0YXJ0LXRvcnJlbnQnLCBpY29uOiBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChfaWNvbnNTdGFydDJbJ2RlZmF1bHQnXSwgbnVsbCksXG4gICAgICAgICAgICAgIGNsaWNrSGFuZGxlcjogdGhpcy5oYW5kbGVTdGFydCB9KSxcbiAgICAgICAgICAgIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KF9BY3Rpb24yWydkZWZhdWx0J10sIHsgbGFiZWw6ICdTdG9wIFRvcnJlbnQnLCBzbHVnOiAnc3RvcC10b3JyZW50JywgaWNvbjogX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoX2ljb25zU3RvcDJbJ2RlZmF1bHQnXSwgbnVsbCksXG4gICAgICAgICAgICAgIGNsaWNrSGFuZGxlcjogdGhpcy5oYW5kbGVTdG9wIH0pLFxuICAgICAgICAgICAgX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoX0FjdGlvbjJbJ2RlZmF1bHQnXSwgeyBsYWJlbDogJ1BhdXNlIFRvcnJlbnQnLCBzbHVnOiAncGF1c2UtdG9ycmVudCcsIGljb246IF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KF9pY29uc1BhdXNlMlsnZGVmYXVsdCddLCBudWxsKSxcbiAgICAgICAgICAgICAgY2xpY2tIYW5kbGVyOiB0aGlzLmhhbmRsZVBhdXNlIH0pXG4gICAgICAgICAgKSxcbiAgICAgICAgICBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChcbiAgICAgICAgICAgICdkaXYnLFxuICAgICAgICAgICAgeyBjbGFzc05hbWU6ICdhY3Rpb24tYmFyX19ncm91cCBhY3Rpb24tYmFyX19ncm91cC0taGFzLWRpdmlkZXInIH0sXG4gICAgICAgICAgICBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChfQWN0aW9uMlsnZGVmYXVsdCddLCB7IGxhYmVsOiAnQWRkIFRvcnJlbnQnLCBzbHVnOiAnYWRkLXRvcnJlbnQnLCBpY29uOiBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChfaWNvbnNBZGQyWydkZWZhdWx0J10sIG51bGwpLFxuICAgICAgICAgICAgICBjbGlja0hhbmRsZXI6IHRoaXMuaGFuZGxlQWRkVG9ycmVudHMgfSksXG4gICAgICAgICAgICBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChfQWN0aW9uMlsnZGVmYXVsdCddLCB7IGxhYmVsOiAnUmVtb3ZlIFRvcnJlbnQnLCBzbHVnOiAncmVtb3ZlLXRvcnJlbnQnLCBpY29uOiBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChfaWNvbnNSZW1vdmUyWydkZWZhdWx0J10sIG51bGwpLFxuICAgICAgICAgICAgICBjbGlja0hhbmRsZXI6IHRoaXMuaGFuZGxlUmVtb3ZlVG9ycmVudHMgfSlcbiAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIEFjdGlvbkJhcjtcbn0pKF9yZWFjdDJbJ2RlZmF1bHQnXS5Db21wb25lbnQpO1xuXG5leHBvcnRzWydkZWZhdWx0J10gPSBBY3Rpb25CYXI7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vY2xpZW50L3NvdXJjZS9zY3JpcHRzL2NvbXBvbmVudHMvdG9ycmVudC1saXN0L0FjdGlvbkJhci5qc1xuICoqIG1vZHVsZSBpZCA9IDI1NVxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIl0sInNvdXJjZVJvb3QiOiIifQ=="); + eval("'use strict';\n\nObject.defineProperty(exports, '__esModule', {\n value: true\n});\n\nvar _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\nvar _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nfunction _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\nvar _react = __webpack_require__(1);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _Action = __webpack_require__(256);\n\nvar _Action2 = _interopRequireDefault(_Action);\n\nvar _iconsAdd = __webpack_require__(258);\n\nvar _iconsAdd2 = _interopRequireDefault(_iconsAdd);\n\nvar _constantsEventTypes = __webpack_require__(172);\n\nvar _constantsEventTypes2 = _interopRequireDefault(_constantsEventTypes);\n\nvar _iconsPause = __webpack_require__(259);\n\nvar _iconsPause2 = _interopRequireDefault(_iconsPause);\n\nvar _iconsRemove = __webpack_require__(260);\n\nvar _iconsRemove2 = _interopRequireDefault(_iconsRemove);\n\nvar _SortDropdown = __webpack_require__(261);\n\nvar _SortDropdown2 = _interopRequireDefault(_SortDropdown);\n\nvar _iconsStart = __webpack_require__(262);\n\nvar _iconsStart2 = _interopRequireDefault(_iconsStart);\n\nvar _iconsStop = __webpack_require__(257);\n\nvar _iconsStop2 = _interopRequireDefault(_iconsStop);\n\nvar _sharedUtilStringUtil = __webpack_require__(268);\n\nvar _sharedUtilStringUtil2 = _interopRequireDefault(_sharedUtilStringUtil);\n\nvar _actionsTorrentActions = __webpack_require__(178);\n\nvar _actionsTorrentActions2 = _interopRequireDefault(_actionsTorrentActions);\n\nvar _storesTorrentFilterStore = __webpack_require__(229);\n\nvar _storesTorrentFilterStore2 = _interopRequireDefault(_storesTorrentFilterStore);\n\nvar _storesTorrentStore = __webpack_require__(230);\n\nvar _storesTorrentStore2 = _interopRequireDefault(_storesTorrentStore);\n\nvar _actionsUIActions = __webpack_require__(198);\n\nvar _actionsUIActions2 = _interopRequireDefault(_actionsUIActions);\n\nvar METHODS_TO_BIND = ['handleAddTorrents', 'handleRemoveTorrents', 'handleSortChange', 'handleStart', 'handleStop', 'onSortChange'];\n\nvar ActionBar = (function (_React$Component) {\n _inherits(ActionBar, _React$Component);\n\n function ActionBar() {\n var _this = this;\n\n _classCallCheck(this, ActionBar);\n\n _get(Object.getPrototypeOf(ActionBar.prototype), 'constructor', this).call(this);\n\n this.state = {\n sortBy: _storesTorrentFilterStore2['default'].getTorrentsSort()\n };\n\n METHODS_TO_BIND.forEach(function (method) {\n _this[method] = _this[method].bind(_this);\n });\n }\n\n _createClass(ActionBar, [{\n key: 'componentDidMount',\n value: function componentDidMount() {\n _storesTorrentFilterStore2['default'].fetchSortProps();\n _storesTorrentFilterStore2['default'].listen(_constantsEventTypes2['default'].UI_TORRENTS_SORT_CHANGE, this.onSortChange);\n }\n }, {\n key: 'componentWillUnmount',\n value: function componentWillUnmount() {\n _storesTorrentFilterStore2['default'].unlisten(_constantsEventTypes2['default'].UI_TORRENTS_SORT_CHANGE, this.onSortChange);\n }\n }, {\n key: 'handleAddTorrents',\n value: function handleAddTorrents() {\n _actionsUIActions2['default'].displayModal('add-torrents');\n }\n }, {\n key: 'handleRemoveTorrentConfirm',\n value: function handleRemoveTorrentConfirm(torrents) {\n _actionsTorrentActions2['default'].deleteTorrents(torrents);\n }\n }, {\n key: 'handleRemoveTorrents',\n value: function handleRemoveTorrents() {\n var selectedTorrents = _storesTorrentStore2['default'].getSelectedTorrents() || [];\n var selectedTorrentCount = selectedTorrents.length;\n\n var actions = [{\n clickHandler: this.handleRemoveTorrentDecline,\n content: 'No',\n triggerDismiss: true,\n type: 'secondary'\n }, {\n clickHandler: this.handleRemoveTorrentConfirm.bind(this, selectedTorrents),\n content: 'Yes',\n triggerDismiss: true,\n type: 'primary'\n }];\n var torrentText = _sharedUtilStringUtil2['default'].pluralize('torrent', selectedTorrentCount);\n var content = 'You are about to remove ' + selectedTorrentCount + ' ' + torrentText + '.';\n\n if (selectedTorrentCount === 0) {\n actions = [{\n clickHandler: null,\n content: 'OK',\n triggerDismiss: true,\n type: 'primary'\n }];\n content = 'You haven\\'t selected any torrents.';\n }\n\n _actionsUIActions2['default'].displayModal({\n actions: actions,\n content: content,\n heading: 'Are you sure?',\n type: 'confirm'\n });\n }\n }, {\n key: 'handleSortChange',\n value: function handleSortChange(sortBy) {\n _actionsUIActions2['default'].setTorrentsSort(sortBy);\n }\n }, {\n key: 'handleStart',\n value: function handleStart() {\n _actionsTorrentActions2['default'].startTorrents(_storesTorrentStore2['default'].getSelectedTorrents());\n }\n }, {\n key: 'handleStop',\n value: function handleStop() {\n _actionsTorrentActions2['default'].stopTorrents(_storesTorrentStore2['default'].getSelectedTorrents());\n }\n }, {\n key: 'onSortChange',\n value: function onSortChange() {\n this.setState({\n sortBy: _storesTorrentFilterStore2['default'].getTorrentsSort()\n });\n }\n }, {\n key: 'render',\n value: function render() {\n return _react2['default'].createElement(\n 'nav',\n { className: 'action-bar' },\n _react2['default'].createElement(\n 'div',\n { className: 'actions action-bar__item action-bar__item--sort-torrents' },\n _react2['default'].createElement(_SortDropdown2['default'], { onSortChange: this.handleSortChange,\n selectedItem: this.state.sortBy })\n ),\n _react2['default'].createElement(\n 'div',\n { className: 'actions action-bar__item action-bar__item--torrent-operations' },\n _react2['default'].createElement(\n 'div',\n { className: 'action-bar__group' },\n _react2['default'].createElement(_Action2['default'], { label: 'Start Torrent', slug: 'start-torrent', icon: _react2['default'].createElement(_iconsStart2['default'], null),\n clickHandler: this.handleStart }),\n _react2['default'].createElement(_Action2['default'], { label: 'Stop Torrent', slug: 'stop-torrent', icon: _react2['default'].createElement(_iconsStop2['default'], null),\n clickHandler: this.handleStop }),\n _react2['default'].createElement(_Action2['default'], { label: 'Pause Torrent', slug: 'pause-torrent', icon: _react2['default'].createElement(_iconsPause2['default'], null),\n clickHandler: this.handlePause })\n ),\n _react2['default'].createElement(\n 'div',\n { className: 'action-bar__group action-bar__group--has-divider' },\n _react2['default'].createElement(_Action2['default'], { label: 'Add Torrent', slug: 'add-torrent', icon: _react2['default'].createElement(_iconsAdd2['default'], null),\n clickHandler: this.handleAddTorrents }),\n _react2['default'].createElement(_Action2['default'], { label: 'Remove Torrent', slug: 'remove-torrent', icon: _react2['default'].createElement(_iconsRemove2['default'], null),\n clickHandler: this.handleRemoveTorrents })\n )\n )\n );\n }\n }]);\n\n return ActionBar;\n})(_react2['default'].Component);\n\nexports['default'] = ActionBar;\nmodule.exports = exports['default'];//@ sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9jbGllbnQvc291cmNlL3NjcmlwdHMvY29tcG9uZW50cy90b3JyZW50LWxpc3QvQWN0aW9uQmFyLmpzPzhjMDMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0FBRUE7QUFDQTtBQUNBLENBQUM7O0FBRUQsaUNBQWlDLDJDQUEyQyxnQkFBZ0Isa0JBQWtCLE9BQU8sMkJBQTJCLHdEQUF3RCxnQ0FBZ0MsdURBQXVELDJEQUEyRCxFQUFFLEVBQUUseURBQXlELHFFQUFxRSw2REFBNkQsb0JBQW9CLEdBQUcsRUFBRTs7QUFFbGpCLHVDQUF1QyxtQkFBbUIsNEJBQTRCLGlEQUFpRCxnQkFBZ0Isa0RBQWtELDhEQUE4RCwwQkFBMEIsNENBQTRDLHVCQUF1QixrQkFBa0IsRUFBRSxPQUFPLGFBQWEsZ0JBQWdCLGdCQUFnQixlQUFlLDJCQUEyQixvQkFBb0IsRUFBRSxFQUFFLDRCQUE0QixtQkFBbUIsRUFBRSxPQUFPLHVCQUF1Qiw0QkFBNEIsa0JBQWtCLEVBQUUsOEJBQThCLEVBQUUsRUFBRTs7QUFFL29CLHNDQUFzQyx1Q0FBdUMsa0JBQWtCOztBQUUvRixpREFBaUQsMENBQTBDLDBEQUEwRCxFQUFFOztBQUV2SiwwQ0FBMEMsK0RBQStELHFHQUFxRyxFQUFFLHlFQUF5RSxlQUFlLHlFQUF5RSxFQUFFLEVBQUUsdUhBQXVIOztBQUU1ZTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUywwQkFBMEI7QUFDbkM7QUFDQTtBQUNBLFdBQVcsd0VBQXdFO0FBQ25GLHVFQUF1RTtBQUN2RSw2Q0FBNkM7QUFDN0M7QUFDQTtBQUNBO0FBQ0EsV0FBVyw2RUFBNkU7QUFDeEY7QUFDQTtBQUNBLGFBQWEsaUNBQWlDO0FBQzlDLG1FQUFtRTtBQUNuRSw4Q0FBOEM7QUFDOUMsbUVBQW1FO0FBQ25FLDZDQUE2QztBQUM3QyxtRUFBbUU7QUFDbkUsOENBQThDO0FBQzlDO0FBQ0E7QUFDQTtBQUNBLGFBQWEsZ0VBQWdFO0FBQzdFLG1FQUFtRTtBQUNuRSxvREFBb0Q7QUFDcEQsbUVBQW1FO0FBQ25FLHVEQUF1RDtBQUN2RDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQSxDQUFDOztBQUVEO0FBQ0EiLCJmaWxlIjoiMjU1LmpzIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9jcmVhdGVDbGFzcyA9IChmdW5jdGlvbiAoKSB7IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoJ3ZhbHVlJyBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH0gcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfTsgfSkoKTtcblxudmFyIF9nZXQgPSBmdW5jdGlvbiBnZXQoX3gsIF94MiwgX3gzKSB7IHZhciBfYWdhaW4gPSB0cnVlOyBfZnVuY3Rpb246IHdoaWxlIChfYWdhaW4pIHsgdmFyIG9iamVjdCA9IF94LCBwcm9wZXJ0eSA9IF94MiwgcmVjZWl2ZXIgPSBfeDM7IF9hZ2FpbiA9IGZhbHNlOyBpZiAob2JqZWN0ID09PSBudWxsKSBvYmplY3QgPSBGdW5jdGlvbi5wcm90b3R5cGU7IHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHByb3BlcnR5KTsgaWYgKGRlc2MgPT09IHVuZGVmaW5lZCkgeyB2YXIgcGFyZW50ID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKG9iamVjdCk7IGlmIChwYXJlbnQgPT09IG51bGwpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfSBlbHNlIHsgX3ggPSBwYXJlbnQ7IF94MiA9IHByb3BlcnR5OyBfeDMgPSByZWNlaXZlcjsgX2FnYWluID0gdHJ1ZTsgZGVzYyA9IHBhcmVudCA9IHVuZGVmaW5lZDsgY29udGludWUgX2Z1bmN0aW9uOyB9IH0gZWxzZSBpZiAoJ3ZhbHVlJyBpbiBkZXNjKSB7IHJldHVybiBkZXNjLnZhbHVlOyB9IGVsc2UgeyB2YXIgZ2V0dGVyID0gZGVzYy5nZXQ7IGlmIChnZXR0ZXIgPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9IHJldHVybiBnZXR0ZXIuY2FsbChyZWNlaXZlcik7IH0gfSB9O1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAnZGVmYXVsdCc6IG9iaiB9OyB9XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcignQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uJyk7IH0gfVxuXG5mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSAnZnVuY3Rpb24nICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcignU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCAnICsgdHlwZW9mIHN1cGVyQ2xhc3MpOyB9IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwgeyBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogc3ViQ2xhc3MsIGVudW1lcmFibGU6IGZhbHNlLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0gfSk7IGlmIChzdXBlckNsYXNzKSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3Quc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIDogc3ViQ2xhc3MuX19wcm90b19fID0gc3VwZXJDbGFzczsgfVxuXG52YXIgX3JlYWN0ID0gcmVxdWlyZSgncmVhY3QnKTtcblxudmFyIF9yZWFjdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWFjdCk7XG5cbnZhciBfQWN0aW9uID0gcmVxdWlyZSgnLi9BY3Rpb24nKTtcblxudmFyIF9BY3Rpb24yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfQWN0aW9uKTtcblxudmFyIF9pY29uc0FkZCA9IHJlcXVpcmUoJy4uL2ljb25zL0FkZCcpO1xuXG52YXIgX2ljb25zQWRkMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2ljb25zQWRkKTtcblxudmFyIF9jb25zdGFudHNFdmVudFR5cGVzID0gcmVxdWlyZSgnLi4vLi4vY29uc3RhbnRzL0V2ZW50VHlwZXMnKTtcblxudmFyIF9jb25zdGFudHNFdmVudFR5cGVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NvbnN0YW50c0V2ZW50VHlwZXMpO1xuXG52YXIgX2ljb25zUGF1c2UgPSByZXF1aXJlKCcuLi9pY29ucy9QYXVzZScpO1xuXG52YXIgX2ljb25zUGF1c2UyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaWNvbnNQYXVzZSk7XG5cbnZhciBfaWNvbnNSZW1vdmUgPSByZXF1aXJlKCcuLi9pY29ucy9SZW1vdmUnKTtcblxudmFyIF9pY29uc1JlbW92ZTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9pY29uc1JlbW92ZSk7XG5cbnZhciBfU29ydERyb3Bkb3duID0gcmVxdWlyZSgnLi9Tb3J0RHJvcGRvd24nKTtcblxudmFyIF9Tb3J0RHJvcGRvd24yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfU29ydERyb3Bkb3duKTtcblxudmFyIF9pY29uc1N0YXJ0ID0gcmVxdWlyZSgnLi4vaWNvbnMvU3RhcnQnKTtcblxudmFyIF9pY29uc1N0YXJ0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2ljb25zU3RhcnQpO1xuXG52YXIgX2ljb25zU3RvcCA9IHJlcXVpcmUoJy4uL2ljb25zL1N0b3AnKTtcblxudmFyIF9pY29uc1N0b3AyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaWNvbnNTdG9wKTtcblxudmFyIF9zaGFyZWRVdGlsU3RyaW5nVXRpbCA9IHJlcXVpcmUoJy4uLy4uLy4uLy4uLy4uL3NoYXJlZC91dGlsL3N0cmluZ1V0aWwnKTtcblxudmFyIF9zaGFyZWRVdGlsU3RyaW5nVXRpbDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9zaGFyZWRVdGlsU3RyaW5nVXRpbCk7XG5cbnZhciBfYWN0aW9uc1RvcnJlbnRBY3Rpb25zID0gcmVxdWlyZSgnLi4vLi4vYWN0aW9ucy9Ub3JyZW50QWN0aW9ucycpO1xuXG52YXIgX2FjdGlvbnNUb3JyZW50QWN0aW9uczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9hY3Rpb25zVG9ycmVudEFjdGlvbnMpO1xuXG52YXIgX3N0b3Jlc1RvcnJlbnRGaWx0ZXJTdG9yZSA9IHJlcXVpcmUoJy4uLy4uL3N0b3Jlcy9Ub3JyZW50RmlsdGVyU3RvcmUnKTtcblxudmFyIF9zdG9yZXNUb3JyZW50RmlsdGVyU3RvcmUyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfc3RvcmVzVG9ycmVudEZpbHRlclN0b3JlKTtcblxudmFyIF9zdG9yZXNUb3JyZW50U3RvcmUgPSByZXF1aXJlKCcuLi8uLi9zdG9yZXMvVG9ycmVudFN0b3JlJyk7XG5cbnZhciBfc3RvcmVzVG9ycmVudFN0b3JlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3N0b3Jlc1RvcnJlbnRTdG9yZSk7XG5cbnZhciBfYWN0aW9uc1VJQWN0aW9ucyA9IHJlcXVpcmUoJy4uLy4uL2FjdGlvbnMvVUlBY3Rpb25zJyk7XG5cbnZhciBfYWN0aW9uc1VJQWN0aW9uczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9hY3Rpb25zVUlBY3Rpb25zKTtcblxudmFyIE1FVEhPRFNfVE9fQklORCA9IFsnaGFuZGxlQWRkVG9ycmVudHMnLCAnaGFuZGxlUmVtb3ZlVG9ycmVudHMnLCAnaGFuZGxlU29ydENoYW5nZScsICdoYW5kbGVTdGFydCcsICdoYW5kbGVTdG9wJywgJ29uU29ydENoYW5nZSddO1xuXG52YXIgQWN0aW9uQmFyID0gKGZ1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gIF9pbmhlcml0cyhBY3Rpb25CYXIsIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIEFjdGlvbkJhcigpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEFjdGlvbkJhcik7XG5cbiAgICBfZ2V0KE9iamVjdC5nZXRQcm90b3R5cGVPZihBY3Rpb25CYXIucHJvdG90eXBlKSwgJ2NvbnN0cnVjdG9yJywgdGhpcykuY2FsbCh0aGlzKTtcblxuICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICBzb3J0Qnk6IF9zdG9yZXNUb3JyZW50RmlsdGVyU3RvcmUyWydkZWZhdWx0J10uZ2V0VG9ycmVudHNTb3J0KClcbiAgICB9O1xuXG4gICAgTUVUSE9EU19UT19CSU5ELmZvckVhY2goZnVuY3Rpb24gKG1ldGhvZCkge1xuICAgICAgX3RoaXNbbWV0aG9kXSA9IF90aGlzW21ldGhvZF0uYmluZChfdGhpcyk7XG4gICAgfSk7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoQWN0aW9uQmFyLCBbe1xuICAgIGtleTogJ2NvbXBvbmVudERpZE1vdW50JyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgICBfc3RvcmVzVG9ycmVudEZpbHRlclN0b3JlMlsnZGVmYXVsdCddLmZldGNoU29ydFByb3BzKCk7XG4gICAgICBfc3RvcmVzVG9ycmVudEZpbHRlclN0b3JlMlsnZGVmYXVsdCddLmxpc3RlbihfY29uc3RhbnRzRXZlbnRUeXBlczJbJ2RlZmF1bHQnXS5VSV9UT1JSRU5UU19TT1JUX0NIQU5HRSwgdGhpcy5vblNvcnRDaGFuZ2UpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2NvbXBvbmVudFdpbGxVbm1vdW50JyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgICBfc3RvcmVzVG9ycmVudEZpbHRlclN0b3JlMlsnZGVmYXVsdCddLnVubGlzdGVuKF9jb25zdGFudHNFdmVudFR5cGVzMlsnZGVmYXVsdCddLlVJX1RPUlJFTlRTX1NPUlRfQ0hBTkdFLCB0aGlzLm9uU29ydENoYW5nZSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnaGFuZGxlQWRkVG9ycmVudHMnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBoYW5kbGVBZGRUb3JyZW50cygpIHtcbiAgICAgIF9hY3Rpb25zVUlBY3Rpb25zMlsnZGVmYXVsdCddLmRpc3BsYXlNb2RhbCgnYWRkLXRvcnJlbnRzJyk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnaGFuZGxlUmVtb3ZlVG9ycmVudENvbmZpcm0nLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBoYW5kbGVSZW1vdmVUb3JyZW50Q29uZmlybSh0b3JyZW50cykge1xuICAgICAgX2FjdGlvbnNUb3JyZW50QWN0aW9uczJbJ2RlZmF1bHQnXS5kZWxldGVUb3JyZW50cyh0b3JyZW50cyk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnaGFuZGxlUmVtb3ZlVG9ycmVudHMnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBoYW5kbGVSZW1vdmVUb3JyZW50cygpIHtcbiAgICAgIHZhciBzZWxlY3RlZFRvcnJlbnRzID0gX3N0b3Jlc1RvcnJlbnRTdG9yZTJbJ2RlZmF1bHQnXS5nZXRTZWxlY3RlZFRvcnJlbnRzKCkgfHwgW107XG4gICAgICB2YXIgc2VsZWN0ZWRUb3JyZW50Q291bnQgPSBzZWxlY3RlZFRvcnJlbnRzLmxlbmd0aDtcblxuICAgICAgdmFyIGFjdGlvbnMgPSBbe1xuICAgICAgICBjbGlja0hhbmRsZXI6IHRoaXMuaGFuZGxlUmVtb3ZlVG9ycmVudERlY2xpbmUsXG4gICAgICAgIGNvbnRlbnQ6ICdObycsXG4gICAgICAgIHRyaWdnZXJEaXNtaXNzOiB0cnVlLFxuICAgICAgICB0eXBlOiAnc2Vjb25kYXJ5J1xuICAgICAgfSwge1xuICAgICAgICBjbGlja0hhbmRsZXI6IHRoaXMuaGFuZGxlUmVtb3ZlVG9ycmVudENvbmZpcm0uYmluZCh0aGlzLCBzZWxlY3RlZFRvcnJlbnRzKSxcbiAgICAgICAgY29udGVudDogJ1llcycsXG4gICAgICAgIHRyaWdnZXJEaXNtaXNzOiB0cnVlLFxuICAgICAgICB0eXBlOiAncHJpbWFyeSdcbiAgICAgIH1dO1xuICAgICAgdmFyIHRvcnJlbnRUZXh0ID0gX3NoYXJlZFV0aWxTdHJpbmdVdGlsMlsnZGVmYXVsdCddLnBsdXJhbGl6ZSgndG9ycmVudCcsIHNlbGVjdGVkVG9ycmVudENvdW50KTtcbiAgICAgIHZhciBjb250ZW50ID0gJ1lvdSBhcmUgYWJvdXQgdG8gcmVtb3ZlICcgKyBzZWxlY3RlZFRvcnJlbnRDb3VudCArICcgJyArIHRvcnJlbnRUZXh0ICsgJy4nO1xuXG4gICAgICBpZiAoc2VsZWN0ZWRUb3JyZW50Q291bnQgPT09IDApIHtcbiAgICAgICAgYWN0aW9ucyA9IFt7XG4gICAgICAgICAgY2xpY2tIYW5kbGVyOiBudWxsLFxuICAgICAgICAgIGNvbnRlbnQ6ICdPSycsXG4gICAgICAgICAgdHJpZ2dlckRpc21pc3M6IHRydWUsXG4gICAgICAgICAgdHlwZTogJ3ByaW1hcnknXG4gICAgICAgIH1dO1xuICAgICAgICBjb250ZW50ID0gJ1lvdSBoYXZlblxcJ3Qgc2VsZWN0ZWQgYW55IHRvcnJlbnRzLic7XG4gICAgICB9XG5cbiAgICAgIF9hY3Rpb25zVUlBY3Rpb25zMlsnZGVmYXVsdCddLmRpc3BsYXlNb2RhbCh7XG4gICAgICAgIGFjdGlvbnM6IGFjdGlvbnMsXG4gICAgICAgIGNvbnRlbnQ6IGNvbnRlbnQsXG4gICAgICAgIGhlYWRpbmc6ICdBcmUgeW91IHN1cmU/JyxcbiAgICAgICAgdHlwZTogJ2NvbmZpcm0nXG4gICAgICB9KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdoYW5kbGVTb3J0Q2hhbmdlJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gaGFuZGxlU29ydENoYW5nZShzb3J0QnkpIHtcbiAgICAgIF9hY3Rpb25zVUlBY3Rpb25zMlsnZGVmYXVsdCddLnNldFRvcnJlbnRzU29ydChzb3J0QnkpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2hhbmRsZVN0YXJ0JyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gaGFuZGxlU3RhcnQoKSB7XG4gICAgICBfYWN0aW9uc1RvcnJlbnRBY3Rpb25zMlsnZGVmYXVsdCddLnN0YXJ0VG9ycmVudHMoX3N0b3Jlc1RvcnJlbnRTdG9yZTJbJ2RlZmF1bHQnXS5nZXRTZWxlY3RlZFRvcnJlbnRzKCkpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2hhbmRsZVN0b3AnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBoYW5kbGVTdG9wKCkge1xuICAgICAgX2FjdGlvbnNUb3JyZW50QWN0aW9uczJbJ2RlZmF1bHQnXS5zdG9wVG9ycmVudHMoX3N0b3Jlc1RvcnJlbnRTdG9yZTJbJ2RlZmF1bHQnXS5nZXRTZWxlY3RlZFRvcnJlbnRzKCkpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ29uU29ydENoYW5nZScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG9uU29ydENoYW5nZSgpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICBzb3J0Qnk6IF9zdG9yZXNUb3JyZW50RmlsdGVyU3RvcmUyWydkZWZhdWx0J10uZ2V0VG9ycmVudHNTb3J0KClcbiAgICAgIH0pO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ3JlbmRlcicsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICAgIHJldHVybiBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChcbiAgICAgICAgJ25hdicsXG4gICAgICAgIHsgY2xhc3NOYW1lOiAnYWN0aW9uLWJhcicgfSxcbiAgICAgICAgX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgJ2RpdicsXG4gICAgICAgICAgeyBjbGFzc05hbWU6ICdhY3Rpb25zIGFjdGlvbi1iYXJfX2l0ZW0gYWN0aW9uLWJhcl9faXRlbS0tc29ydC10b3JyZW50cycgfSxcbiAgICAgICAgICBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChfU29ydERyb3Bkb3duMlsnZGVmYXVsdCddLCB7IG9uU29ydENoYW5nZTogdGhpcy5oYW5kbGVTb3J0Q2hhbmdlLFxuICAgICAgICAgICAgc2VsZWN0ZWRJdGVtOiB0aGlzLnN0YXRlLnNvcnRCeSB9KVxuICAgICAgICApLFxuICAgICAgICBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChcbiAgICAgICAgICAnZGl2JyxcbiAgICAgICAgICB7IGNsYXNzTmFtZTogJ2FjdGlvbnMgYWN0aW9uLWJhcl9faXRlbSBhY3Rpb24tYmFyX19pdGVtLS10b3JyZW50LW9wZXJhdGlvbnMnIH0sXG4gICAgICAgICAgX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgICAnZGl2JyxcbiAgICAgICAgICAgIHsgY2xhc3NOYW1lOiAnYWN0aW9uLWJhcl9fZ3JvdXAnIH0sXG4gICAgICAgICAgICBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChfQWN0aW9uMlsnZGVmYXVsdCddLCB7IGxhYmVsOiAnU3RhcnQgVG9ycmVudCcsIHNsdWc6ICdzdGFydC10b3JyZW50JywgaWNvbjogX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoX2ljb25zU3RhcnQyWydkZWZhdWx0J10sIG51bGwpLFxuICAgICAgICAgICAgICBjbGlja0hhbmRsZXI6IHRoaXMuaGFuZGxlU3RhcnQgfSksXG4gICAgICAgICAgICBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChfQWN0aW9uMlsnZGVmYXVsdCddLCB7IGxhYmVsOiAnU3RvcCBUb3JyZW50Jywgc2x1ZzogJ3N0b3AtdG9ycmVudCcsIGljb246IF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KF9pY29uc1N0b3AyWydkZWZhdWx0J10sIG51bGwpLFxuICAgICAgICAgICAgICBjbGlja0hhbmRsZXI6IHRoaXMuaGFuZGxlU3RvcCB9KSxcbiAgICAgICAgICAgIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KF9BY3Rpb24yWydkZWZhdWx0J10sIHsgbGFiZWw6ICdQYXVzZSBUb3JyZW50Jywgc2x1ZzogJ3BhdXNlLXRvcnJlbnQnLCBpY29uOiBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChfaWNvbnNQYXVzZTJbJ2RlZmF1bHQnXSwgbnVsbCksXG4gICAgICAgICAgICAgIGNsaWNrSGFuZGxlcjogdGhpcy5oYW5kbGVQYXVzZSB9KVxuICAgICAgICAgICksXG4gICAgICAgICAgX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgICAnZGl2JyxcbiAgICAgICAgICAgIHsgY2xhc3NOYW1lOiAnYWN0aW9uLWJhcl9fZ3JvdXAgYWN0aW9uLWJhcl9fZ3JvdXAtLWhhcy1kaXZpZGVyJyB9LFxuICAgICAgICAgICAgX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoX0FjdGlvbjJbJ2RlZmF1bHQnXSwgeyBsYWJlbDogJ0FkZCBUb3JyZW50Jywgc2x1ZzogJ2FkZC10b3JyZW50JywgaWNvbjogX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoX2ljb25zQWRkMlsnZGVmYXVsdCddLCBudWxsKSxcbiAgICAgICAgICAgICAgY2xpY2tIYW5kbGVyOiB0aGlzLmhhbmRsZUFkZFRvcnJlbnRzIH0pLFxuICAgICAgICAgICAgX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoX0FjdGlvbjJbJ2RlZmF1bHQnXSwgeyBsYWJlbDogJ1JlbW92ZSBUb3JyZW50Jywgc2x1ZzogJ3JlbW92ZS10b3JyZW50JywgaWNvbjogX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoX2ljb25zUmVtb3ZlMlsnZGVmYXVsdCddLCBudWxsKSxcbiAgICAgICAgICAgICAgY2xpY2tIYW5kbGVyOiB0aGlzLmhhbmRsZVJlbW92ZVRvcnJlbnRzIH0pXG4gICAgICAgICAgKVxuICAgICAgICApXG4gICAgICApO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBBY3Rpb25CYXI7XG59KShfcmVhY3QyWydkZWZhdWx0J10uQ29tcG9uZW50KTtcblxuZXhwb3J0c1snZGVmYXVsdCddID0gQWN0aW9uQmFyO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL2NsaWVudC9zb3VyY2Uvc2NyaXB0cy9jb21wb25lbnRzL3RvcnJlbnQtbGlzdC9BY3Rpb25CYXIuanNcbiAqKiBtb2R1bGUgaWQgPSAyNTVcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyJdLCJzb3VyY2VSb290IjoiIn0="); /***/ }, /* 256 */ @@ -1619,12 +1619,7 @@ eval("'use strict';\n\nObject.defineProperty(exports, '__esModule', {\n value: true\n});\n\nvar _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\nvar _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nfunction _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\nvar _react = __webpack_require__(1);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _BaseIcon2 = __webpack_require__(176);\n\nvar _BaseIcon3 = _interopRequireDefault(_BaseIcon2);\n\nvar Start = (function (_BaseIcon) {\n _inherits(Start, _BaseIcon);\n\n function Start() {\n _classCallCheck(this, Start);\n\n _get(Object.getPrototypeOf(Start.prototype), 'constructor', this).apply(this, arguments);\n }\n\n _createClass(Start, [{\n key: 'render',\n value: function render() {\n return _react2['default'].createElement(\n 'svg',\n { className: 'icon icon--start ' + this.props.className,\n xmlns: this.getXmlns(), viewBox: this.getViewBox() },\n _react2['default'].createElement('path', { d: 'M13.1 9.5L46.9 30 13.1 50.5v-41z' })\n );\n }\n }]);\n\n return Start;\n})(_BaseIcon3['default']);\n\nexports['default'] = Start;\nmodule.exports = exports['default'];//@ sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9jbGllbnQvc291cmNlL3NjcmlwdHMvY29tcG9uZW50cy9pY29ucy9TdGFydC5qcz8xZmE2Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztBQUVBO0FBQ0E7QUFDQSxDQUFDOztBQUVELGlDQUFpQywyQ0FBMkMsZ0JBQWdCLGtCQUFrQixPQUFPLDJCQUEyQix3REFBd0QsZ0NBQWdDLHVEQUF1RCwyREFBMkQsRUFBRSxFQUFFLHlEQUF5RCxxRUFBcUUsNkRBQTZELG9CQUFvQixHQUFHLEVBQUU7O0FBRWxqQix1Q0FBdUMsbUJBQW1CLDRCQUE0QixpREFBaUQsZ0JBQWdCLGtEQUFrRCw4REFBOEQsMEJBQTBCLDRDQUE0Qyx1QkFBdUIsa0JBQWtCLEVBQUUsT0FBTyxhQUFhLGdCQUFnQixnQkFBZ0IsZUFBZSwyQkFBMkIsb0JBQW9CLEVBQUUsRUFBRSw0QkFBNEIsbUJBQW1CLEVBQUUsT0FBTyx1QkFBdUIsNEJBQTRCLGtCQUFrQixFQUFFLDhCQUE4QixFQUFFLEVBQUU7O0FBRS9vQixzQ0FBc0MsdUNBQXVDLGtCQUFrQjs7QUFFL0YsaURBQWlELDBDQUEwQywwREFBMEQsRUFBRTs7QUFFdkosMENBQTBDLCtEQUErRCxxR0FBcUcsRUFBRSx5RUFBeUUsZUFBZSx5RUFBeUUsRUFBRSxFQUFFLHVIQUF1SDs7QUFFNWU7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCw4REFBOEQ7QUFDOUQsa0RBQWtELHdDQUF3QztBQUMxRjtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBLENBQUM7O0FBRUQ7QUFDQSIsImZpbGUiOiIyNjIuanMiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX2NyZWF0ZUNsYXNzID0gKGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmICgndmFsdWUnIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfSByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9OyB9KSgpO1xuXG52YXIgX2dldCA9IGZ1bmN0aW9uIGdldChfeCwgX3gyLCBfeDMpIHsgdmFyIF9hZ2FpbiA9IHRydWU7IF9mdW5jdGlvbjogd2hpbGUgKF9hZ2FpbikgeyB2YXIgb2JqZWN0ID0gX3gsIHByb3BlcnR5ID0gX3gyLCByZWNlaXZlciA9IF94MzsgX2FnYWluID0gZmFsc2U7IGlmIChvYmplY3QgPT09IG51bGwpIG9iamVjdCA9IEZ1bmN0aW9uLnByb3RvdHlwZTsgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgcHJvcGVydHkpOyBpZiAoZGVzYyA9PT0gdW5kZWZpbmVkKSB7IHZhciBwYXJlbnQgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Yob2JqZWN0KTsgaWYgKHBhcmVudCA9PT0gbnVsbCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9IGVsc2UgeyBfeCA9IHBhcmVudDsgX3gyID0gcHJvcGVydHk7IF94MyA9IHJlY2VpdmVyOyBfYWdhaW4gPSB0cnVlOyBkZXNjID0gcGFyZW50ID0gdW5kZWZpbmVkOyBjb250aW51ZSBfZnVuY3Rpb247IH0gfSBlbHNlIGlmICgndmFsdWUnIGluIGRlc2MpIHsgcmV0dXJuIGRlc2MudmFsdWU7IH0gZWxzZSB7IHZhciBnZXR0ZXIgPSBkZXNjLmdldDsgaWYgKGdldHRlciA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH0gcmV0dXJuIGdldHRlci5jYWxsKHJlY2VpdmVyKTsgfSB9IH07XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKCdDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24nKTsgfSB9XG5cbmZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09ICdmdW5jdGlvbicgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKCdTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90ICcgKyB0eXBlb2Ygc3VwZXJDbGFzcyk7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgZW51bWVyYWJsZTogZmFsc2UsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgaWYgKHN1cGVyQ2xhc3MpIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcykgOiBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzOyB9XG5cbnZhciBfcmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xuXG52YXIgX3JlYWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlYWN0KTtcblxudmFyIF9CYXNlSWNvbjIgPSByZXF1aXJlKCcuL0Jhc2VJY29uJyk7XG5cbnZhciBfQmFzZUljb24zID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfQmFzZUljb24yKTtcblxudmFyIFN0YXJ0ID0gKGZ1bmN0aW9uIChfQmFzZUljb24pIHtcbiAgX2luaGVyaXRzKFN0YXJ0LCBfQmFzZUljb24pO1xuXG4gIGZ1bmN0aW9uIFN0YXJ0KCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBTdGFydCk7XG5cbiAgICBfZ2V0KE9iamVjdC5nZXRQcm90b3R5cGVPZihTdGFydC5wcm90b3R5cGUpLCAnY29uc3RydWN0b3InLCB0aGlzKS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKFN0YXJ0LCBbe1xuICAgIGtleTogJ3JlbmRlcicsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICAgIHJldHVybiBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChcbiAgICAgICAgJ3N2ZycsXG4gICAgICAgIHsgY2xhc3NOYW1lOiAnaWNvbiBpY29uLS1zdGFydCAnICsgdGhpcy5wcm9wcy5jbGFzc05hbWUsXG4gICAgICAgICAgeG1sbnM6IHRoaXMuZ2V0WG1sbnMoKSwgdmlld0JveDogdGhpcy5nZXRWaWV3Qm94KCkgfSxcbiAgICAgICAgX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoJ3BhdGgnLCB7IGQ6ICdNMTMuMSA5LjVMNDYuOSAzMCAxMy4xIDUwLjV2LTQxeicgfSlcbiAgICAgICk7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFN0YXJ0O1xufSkoX0Jhc2VJY29uM1snZGVmYXVsdCddKTtcblxuZXhwb3J0c1snZGVmYXVsdCddID0gU3RhcnQ7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vY2xpZW50L3NvdXJjZS9zY3JpcHRzL2NvbXBvbmVudHMvaWNvbnMvU3RhcnQuanNcbiAqKiBtb2R1bGUgaWQgPSAyNjJcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyJdLCJzb3VyY2VSb290IjoiIn0="); /***/ }, -/* 263 */ -/***/ function(module, exports) { - - eval("'use strict';\n\nvar stringUtil = {\n capitalize: function capitalize(string) {\n return string.charAt(0).toUpperCase() + string.slice(1);\n },\n\n pluralize: function pluralize(string, count) {\n if (count !== 1) {\n if (string.charAt(string.length - 1) === 'y') {\n return string.substring(0, string.length - 1) + 'ies';\n } else {\n return string + 's';\n }\n }\n\n return string;\n }\n};\n\nmodule.exports = stringUtil;//@ sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi91dGlsL3N0cmluZ1V0aWwuanM/NGFmYyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEiLCJmaWxlIjoiMjYzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG52YXIgc3RyaW5nVXRpbCA9IHtcbiAgY2FwaXRhbGl6ZTogZnVuY3Rpb24gY2FwaXRhbGl6ZShzdHJpbmcpIHtcbiAgICByZXR1cm4gc3RyaW5nLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgc3RyaW5nLnNsaWNlKDEpO1xuICB9LFxuXG4gIHBsdXJhbGl6ZTogZnVuY3Rpb24gcGx1cmFsaXplKHN0cmluZywgY291bnQpIHtcbiAgICBpZiAoY291bnQgIT09IDEpIHtcbiAgICAgIGlmIChzdHJpbmcuY2hhckF0KHN0cmluZy5sZW5ndGggLSAxKSA9PT0gJ3knKSB7XG4gICAgICAgIHJldHVybiBzdHJpbmcuc3Vic3RyaW5nKDAsIHN0cmluZy5sZW5ndGggLSAxKSArICdpZXMnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHN0cmluZyArICdzJztcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gc3RyaW5nO1xuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHN0cmluZ1V0aWw7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL3V0aWwvc3RyaW5nVXRpbC5qc1xuICoqIG1vZHVsZSBpZCA9IDI2M1xuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIl0sInNvdXJjZVJvb3QiOiIifQ=="); - -/***/ }, +/* 263 */, /* 264 */ /***/ function(module, exports, __webpack_require__) { @@ -1648,5 +1643,11 @@ eval("'use strict';\n\nObject.defineProperty(exports, '__esModule', {\n value: true\n});\n\nvar _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\nvar _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nfunction _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\nvar _react = __webpack_require__(1);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _BaseIcon2 = __webpack_require__(176);\n\nvar _BaseIcon3 = _interopRequireDefault(_BaseIcon2);\n\nvar DotsMini = (function (_BaseIcon) {\n _inherits(DotsMini, _BaseIcon);\n\n function DotsMini() {\n _classCallCheck(this, DotsMini);\n\n _get(Object.getPrototypeOf(DotsMini.prototype), 'constructor', this).apply(this, arguments);\n }\n\n _createClass(DotsMini, [{\n key: 'render',\n value: function render() {\n return _react2['default'].createElement(\n 'svg',\n { className: 'icon icon--dots-mini ' + this.props.className,\n xmlns: this.getXmlns(), viewBox: this.getViewBox() },\n _react2['default'].createElement('circle', { cx: '0.9', cy: '4', r: '0.9' }),\n _react2['default'].createElement('circle', { cx: '4', cy: '4', r: '0.9' }),\n _react2['default'].createElement('circle', { cx: '7.1', cy: '4', r: '0.9' })\n );\n }\n }]);\n\n return DotsMini;\n})(_BaseIcon3['default']);\n\nexports['default'] = DotsMini;\nmodule.exports = exports['default'];//@ sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9jbGllbnQvc291cmNlL3NjcmlwdHMvY29tcG9uZW50cy9pY29ucy9Eb3RzTWluaS5qcz83NGM3Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztBQUVBO0FBQ0E7QUFDQSxDQUFDOztBQUVELGlDQUFpQywyQ0FBMkMsZ0JBQWdCLGtCQUFrQixPQUFPLDJCQUEyQix3REFBd0QsZ0NBQWdDLHVEQUF1RCwyREFBMkQsRUFBRSxFQUFFLHlEQUF5RCxxRUFBcUUsNkRBQTZELG9CQUFvQixHQUFHLEVBQUU7O0FBRWxqQix1Q0FBdUMsbUJBQW1CLDRCQUE0QixpREFBaUQsZ0JBQWdCLGtEQUFrRCw4REFBOEQsMEJBQTBCLDRDQUE0Qyx1QkFBdUIsa0JBQWtCLEVBQUUsT0FBTyxhQUFhLGdCQUFnQixnQkFBZ0IsZUFBZSwyQkFBMkIsb0JBQW9CLEVBQUUsRUFBRSw0QkFBNEIsbUJBQW1CLEVBQUUsT0FBTyx1QkFBdUIsNEJBQTRCLGtCQUFrQixFQUFFLDhCQUE4QixFQUFFLEVBQUU7O0FBRS9vQixzQ0FBc0MsdUNBQXVDLGtCQUFrQjs7QUFFL0YsaURBQWlELDBDQUEwQywwREFBMEQsRUFBRTs7QUFFdkosMENBQTBDLCtEQUErRCxxR0FBcUcsRUFBRSx5RUFBeUUsZUFBZSx5RUFBeUUsRUFBRSxFQUFFLHVIQUF1SDs7QUFFNWU7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCw4REFBOEQ7QUFDOUQsb0RBQW9ELCtCQUErQjtBQUNuRixvREFBb0QsNkJBQTZCO0FBQ2pGLG9EQUFvRCwrQkFBK0I7QUFDbkY7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQSxDQUFDOztBQUVEO0FBQ0EiLCJmaWxlIjoiMjY3LmpzIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9jcmVhdGVDbGFzcyA9IChmdW5jdGlvbiAoKSB7IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoJ3ZhbHVlJyBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH0gcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfTsgfSkoKTtcblxudmFyIF9nZXQgPSBmdW5jdGlvbiBnZXQoX3gsIF94MiwgX3gzKSB7IHZhciBfYWdhaW4gPSB0cnVlOyBfZnVuY3Rpb246IHdoaWxlIChfYWdhaW4pIHsgdmFyIG9iamVjdCA9IF94LCBwcm9wZXJ0eSA9IF94MiwgcmVjZWl2ZXIgPSBfeDM7IF9hZ2FpbiA9IGZhbHNlOyBpZiAob2JqZWN0ID09PSBudWxsKSBvYmplY3QgPSBGdW5jdGlvbi5wcm90b3R5cGU7IHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHByb3BlcnR5KTsgaWYgKGRlc2MgPT09IHVuZGVmaW5lZCkgeyB2YXIgcGFyZW50ID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKG9iamVjdCk7IGlmIChwYXJlbnQgPT09IG51bGwpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfSBlbHNlIHsgX3ggPSBwYXJlbnQ7IF94MiA9IHByb3BlcnR5OyBfeDMgPSByZWNlaXZlcjsgX2FnYWluID0gdHJ1ZTsgZGVzYyA9IHBhcmVudCA9IHVuZGVmaW5lZDsgY29udGludWUgX2Z1bmN0aW9uOyB9IH0gZWxzZSBpZiAoJ3ZhbHVlJyBpbiBkZXNjKSB7IHJldHVybiBkZXNjLnZhbHVlOyB9IGVsc2UgeyB2YXIgZ2V0dGVyID0gZGVzYy5nZXQ7IGlmIChnZXR0ZXIgPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9IHJldHVybiBnZXR0ZXIuY2FsbChyZWNlaXZlcik7IH0gfSB9O1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAnZGVmYXVsdCc6IG9iaiB9OyB9XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcignQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uJyk7IH0gfVxuXG5mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSAnZnVuY3Rpb24nICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcignU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCAnICsgdHlwZW9mIHN1cGVyQ2xhc3MpOyB9IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwgeyBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogc3ViQ2xhc3MsIGVudW1lcmFibGU6IGZhbHNlLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0gfSk7IGlmIChzdXBlckNsYXNzKSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3Quc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIDogc3ViQ2xhc3MuX19wcm90b19fID0gc3VwZXJDbGFzczsgfVxuXG52YXIgX3JlYWN0ID0gcmVxdWlyZSgncmVhY3QnKTtcblxudmFyIF9yZWFjdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWFjdCk7XG5cbnZhciBfQmFzZUljb24yID0gcmVxdWlyZSgnLi9CYXNlSWNvbicpO1xuXG52YXIgX0Jhc2VJY29uMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX0Jhc2VJY29uMik7XG5cbnZhciBEb3RzTWluaSA9IChmdW5jdGlvbiAoX0Jhc2VJY29uKSB7XG4gIF9pbmhlcml0cyhEb3RzTWluaSwgX0Jhc2VJY29uKTtcblxuICBmdW5jdGlvbiBEb3RzTWluaSgpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgRG90c01pbmkpO1xuXG4gICAgX2dldChPYmplY3QuZ2V0UHJvdG90eXBlT2YoRG90c01pbmkucHJvdG90eXBlKSwgJ2NvbnN0cnVjdG9yJywgdGhpcykuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhEb3RzTWluaSwgW3tcbiAgICBrZXk6ICdyZW5kZXInLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICByZXR1cm4gX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICdzdmcnLFxuICAgICAgICB7IGNsYXNzTmFtZTogJ2ljb24gaWNvbi0tZG90cy1taW5pICcgKyB0aGlzLnByb3BzLmNsYXNzTmFtZSxcbiAgICAgICAgICB4bWxuczogdGhpcy5nZXRYbWxucygpLCB2aWV3Qm94OiB0aGlzLmdldFZpZXdCb3goKSB9LFxuICAgICAgICBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudCgnY2lyY2xlJywgeyBjeDogJzAuOScsIGN5OiAnNCcsIHI6ICcwLjknIH0pLFxuICAgICAgICBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudCgnY2lyY2xlJywgeyBjeDogJzQnLCBjeTogJzQnLCByOiAnMC45JyB9KSxcbiAgICAgICAgX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoJ2NpcmNsZScsIHsgY3g6ICc3LjEnLCBjeTogJzQnLCByOiAnMC45JyB9KVxuICAgICAgKTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gRG90c01pbmk7XG59KShfQmFzZUljb24zWydkZWZhdWx0J10pO1xuXG5leHBvcnRzWydkZWZhdWx0J10gPSBEb3RzTWluaTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9jbGllbnQvc291cmNlL3NjcmlwdHMvY29tcG9uZW50cy9pY29ucy9Eb3RzTWluaS5qc1xuICoqIG1vZHVsZSBpZCA9IDI2N1xuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIl0sInNvdXJjZVJvb3QiOiIifQ=="); +/***/ }, +/* 268 */ +/***/ function(module, exports) { + + eval("'use strict';\n\nvar stringUtil = {\n capitalize: function capitalize(string) {\n return string.charAt(0).toUpperCase() + string.slice(1);\n },\n\n pluralize: function pluralize(string, count) {\n if (count !== 1) {\n if (string.charAt(string.length - 1) === 'y') {\n return string.substring(0, string.length - 1) + 'ies';\n } else {\n return string + 's';\n }\n }\n\n return string;\n }\n};\n\nmodule.exports = stringUtil;//@ sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zaGFyZWQvdXRpbC9zdHJpbmdVdGlsLmpzPzMxMWYiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBIiwiZmlsZSI6IjI2OC5qcyIsInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxudmFyIHN0cmluZ1V0aWwgPSB7XG4gIGNhcGl0YWxpemU6IGZ1bmN0aW9uIGNhcGl0YWxpemUoc3RyaW5nKSB7XG4gICAgcmV0dXJuIHN0cmluZy5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHN0cmluZy5zbGljZSgxKTtcbiAgfSxcblxuICBwbHVyYWxpemU6IGZ1bmN0aW9uIHBsdXJhbGl6ZShzdHJpbmcsIGNvdW50KSB7XG4gICAgaWYgKGNvdW50ICE9PSAxKSB7XG4gICAgICBpZiAoc3RyaW5nLmNoYXJBdChzdHJpbmcubGVuZ3RoIC0gMSkgPT09ICd5Jykge1xuICAgICAgICByZXR1cm4gc3RyaW5nLnN1YnN0cmluZygwLCBzdHJpbmcubGVuZ3RoIC0gMSkgKyAnaWVzJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBzdHJpbmcgKyAncyc7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHN0cmluZztcbiAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBzdHJpbmdVdGlsO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9zaGFyZWQvdXRpbC9zdHJpbmdVdGlsLmpzXG4gKiogbW9kdWxlIGlkID0gMjY4XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iXSwic291cmNlUm9vdCI6IiJ9"); + /***/ } /******/ ]); \ No newline at end of file diff --git a/server/models/HistoryEra.js b/server/models/HistoryEra.js index 116be56a..33202618 100644 --- a/server/models/HistoryEra.js +++ b/server/models/HistoryEra.js @@ -3,7 +3,7 @@ let Datastore = require('nedb'); let config = require('../../config'); -let stringUtil = require('../../util/stringUtil'); +let stringUtil = require('../../shared/util/stringUtil'); const MAX_CLEANUP_INTERVAL = 1000 * 60 * 60; // 1 hour const MAX_NEXT_ERA_UPDATE_INTERVAL = 1000 * 60 * 60 * 12; // 12 hours diff --git a/server/models/Torrent.js b/server/models/Torrent.js index 734ca3d4..c6ba7ad6 100644 --- a/server/models/Torrent.js +++ b/server/models/Torrent.js @@ -2,7 +2,7 @@ let _ = require('lodash'); -let stringUtil = require('../../util/stringUtil'); +let stringUtil = require('../../shared/util/stringUtil'); const CALCULATED_DATA = [ 'eta', @@ -50,8 +50,9 @@ class Torrent { return; } - clientData = clientData || {}; opts = opts || {}; + + this._lastUpdated = opts.currentTime || Date.now(); this._torrentData = this.getCalculatedClientData(clientData, opts); } @@ -62,6 +63,10 @@ class Torrent { return Object.assign({}, this._torrentData); } + get status() { + return this._torrentData.status || []; + } + getCalculatedClientData(clientData, opts) { let keysToProcess = CALCULATED_DATA; let requestedData = REQUESTED_DATA; @@ -183,6 +188,12 @@ class Torrent { getCalculatedTotalSeeds(clientData) { return this.getPeerCount(clientData.totalSeeds); } + + updateData(clientData, opts) { + // TODO somehow communicate that only some props were updated + this._lastUpdated = opts.currentTime || Date.now(); + this._torrentData = this.getCalculatedClientData(clientData, opts); + } } module.exports = Torrent; diff --git a/server/models/TorrentCollection.js b/server/models/TorrentCollection.js new file mode 100644 index 00000000..5ee00cfd --- /dev/null +++ b/server/models/TorrentCollection.js @@ -0,0 +1,92 @@ +'use strict'; + +let _ = require('lodash'); + +let clientUtil = require('../util/clientUtil'); +let propsMap = require('../../shared/constants/propsMap'); +let stringUtil = require('../../shared/util/stringUtil'); +let Torrent = require('./Torrent'); + +class TorrentCollection { + constructor() { + this._removedHashes = []; + this._statusCount = {all: 0}; + this._torrents = {}; + this._torrentData = {}; + this._trackerCount = {}; + } + + get statusCount() { + return Object.assign({}, this._statusCount); + } + + get torrents() { + let currentTorrents = {}; + + Object.keys(this._torrents).forEach((hash) => { + currentTorrents[hash] = this._torrents[hash].data; + }); + + return currentTorrents; + } + + get trackerCount() { + return Object.assign({}, this._trackerCount); + } + + incrementStatusCount(statusData) { + statusData.forEach((status) => { + this._statusCount[propsMap.serverStatus[status]]++; + }); + } + + removeOutdatedTorrents(newHashes) { + let currentHashes = Object.keys(this._torrents); + let removedHashes = _.difference(currentHashes, newHashes); + + console.log(`removing ${removedHashes.length} hashes`); + + removedHashes.forEach((hash) => { + delete this._torrents[hash]; + }); + } + + resetStatusCount() { + Object.keys(propsMap.serverStatus).forEach((key) => { + this._statusCount[propsMap.serverStatus[key]] = 0; + }); + } + + updateTorrents(clientData) { + let currentTime = Date.now(); + let knownHashes = []; + let torrentData = clientUtil.mapClientProps( + clientUtil.defaults.torrentProperties, clientData + ); + + this.resetStatusCount(); + + // Create Torrent instances with additonal calculated properties. + torrentData.forEach((torrent, index) => { + let hash = torrent.hash; + knownHashes.push(hash); + + // If we already know about the torrent, then just update its data. Create + // new torrent otherwise. + if (this._torrents[hash]) { + this._torrents[hash].updateData(torrent, {currentTime: currentTime}); + } else { + this._torrents[hash] = new Torrent(torrent, {currentTime: currentTime}); + } + + // Update the status count with this torrent's status. + this.incrementStatusCount(this._torrents[hash].status); + }); + + this.removeOutdatedTorrents(knownHashes); + + this._statusCount.all = torrentData.length || 0; + } +} + +module.exports = TorrentCollection; diff --git a/server/models/client.js b/server/models/client.js index a4e9c516..5689642e 100644 --- a/server/models/client.js +++ b/server/models/client.js @@ -4,11 +4,13 @@ let rTorrent = require('./rtorrent'); let util = require('util'); let propsMap = require('../../shared/constants/propsMap'); -let clientUtil = require('./util/clientUtil'); -let formatUtil = require('./util/formatUtil'); +let clientUtil = require('../util/clientUtil'); +let formatUtil = require('../util/formatUtil'); let Torrent = require('./Torrent'); +let TorrentCollection = require('./TorrentCollection'); let _statusCount = {}; +let _torrentCollection = new TorrentCollection(); var client = { add: function(data, callback) { @@ -149,38 +151,9 @@ var client = { getTorrentList: function(callback) { rTorrent.get('d.multicall2', clientUtil.defaults.torrentPropertyMethods) .then(function(data) { - // Create torrent array of torrent attributes, each item in the array - // being an object with human-readable property values. - // TODO This should be refactored into something like: - // return new TorrentCollection(data); which would be a collection - // of Torrent instances. - var torrents = clientUtil.mapClientProps( - clientUtil.defaults.torrentProperties, - data - ); - - let statusMap = propsMap.serverStatus; - - Object.keys(statusMap).forEach(function (key) { - _statusCount[statusMap[key]] = 0; - }); - - // Create Torrent instance, with additonal deduced properties. - torrents = torrents.map(function(torrent, index) { - let torrentData = new Torrent(torrent).data; - - torrentData.status.forEach(function (status) { - if (statusMap[status] == null) { - console.log(status); - } - _statusCount[statusMap[status]] = _statusCount[statusMap[status]] + 1; - }); - return torrentData; - }); - - _statusCount.all = torrents.length || 0; - - callback(null, torrents); + _torrentCollection.updateTorrents(data); + _statusCount = _torrentCollection.statusCount; + callback(null, _torrentCollection.torrents); }, function(error) { callback(error, null) }); diff --git a/server/models/rtorrent.js b/server/models/rtorrent.js index 38a46e56..c3c88ba6 100644 --- a/server/models/rtorrent.js +++ b/server/models/rtorrent.js @@ -1,7 +1,7 @@ var Q = require('q'); var net = require('net'); -var Deserializer = require('./util/deserializer'); -var Serializer = require('./util/serializer'); +var Deserializer = require('../util/deserializer'); +var Serializer = require('../util/serializer'); var rtorrent = { initialized: false, diff --git a/server/models/util/clientUtil.js b/server/util/clientUtil.js similarity index 100% rename from server/models/util/clientUtil.js rename to server/util/clientUtil.js diff --git a/server/models/util/dateFormatter.js b/server/util/dateFormatter.js similarity index 100% rename from server/models/util/dateFormatter.js rename to server/util/dateFormatter.js diff --git a/server/models/util/deserializer.js b/server/util/deserializer.js similarity index 100% rename from server/models/util/deserializer.js rename to server/util/deserializer.js diff --git a/server/models/util/formatUtil.js b/server/util/formatUtil.js similarity index 100% rename from server/models/util/formatUtil.js rename to server/util/formatUtil.js diff --git a/server/models/util/minifyUtil.js b/server/util/minifyUtil.js similarity index 100% rename from server/models/util/minifyUtil.js rename to server/util/minifyUtil.js diff --git a/server/models/util/serializer.js b/server/util/serializer.js similarity index 100% rename from server/models/util/serializer.js rename to server/util/serializer.js diff --git a/util/stringUtil.js b/shared/util/stringUtil.js similarity index 100% rename from util/stringUtil.js rename to shared/util/stringUtil.js