From 24dc5cb86c12017ac7241bd280d2a3cc95452955 Mon Sep 17 00:00:00 2001 From: Kevin Chung Date: Fri, 11 Sep 2020 21:12:28 -0400 Subject: [PATCH] Add fix for trying to increment solves when solves are hidden --- .../themes/core/assets/js/pages/challenges.js | 25 ++++++++++++------- .../core/static/js/pages/challenges.dev.js | 2 +- .../core/static/js/pages/challenges.min.js | 2 +- 3 files changed, 18 insertions(+), 11 deletions(-) diff --git a/CTFd/themes/core/assets/js/pages/challenges.js b/CTFd/themes/core/assets/js/pages/challenges.js index 1eeeed1b..9656182c 100644 --- a/CTFd/themes/core/assets/js/pages/challenges.js +++ b/CTFd/themes/core/assets/js/pages/challenges.js @@ -168,15 +168,22 @@ function renderSubmissionResponse(response) { ); result_notification.slideDown(); - $(".challenge-solves").text( - parseInt( - $(".challenge-solves") - .text() - .split(" ")[0] - ) + - 1 + - " Solves" - ); + if ( + $(".challenge-solves") + .text() + .trim() + ) { + // Only try to increment solves if the text isn't hidden + $(".challenge-solves").text( + parseInt( + $(".challenge-solves") + .text() + .split(" ")[0] + ) + + 1 + + " Solves" + ); + } answer_input.val(""); answer_input.removeClass("wrong"); diff --git a/CTFd/themes/core/static/js/pages/challenges.dev.js b/CTFd/themes/core/static/js/pages/challenges.dev.js index 9cd98257..06548970 100644 --- a/CTFd/themes/core/static/js/pages/challenges.dev.js +++ b/CTFd/themes/core/static/js/pages/challenges.dev.js @@ -162,7 +162,7 @@ /***/ (function(module, exports, __webpack_require__) { ; -eval("\n\n__webpack_require__(/*! ./main */ \"./CTFd/themes/core/assets/js/pages/main.js\");\n\n__webpack_require__(/*! bootstrap/js/dist/tab */ \"./node_modules/bootstrap/js/dist/tab.js\");\n\nvar _ezq = __webpack_require__(/*! ../ezq */ \"./CTFd/themes/core/assets/js/ezq.js\");\n\nvar _utils = __webpack_require__(/*! ../utils */ \"./CTFd/themes/core/assets/js/utils.js\");\n\nvar _moment = _interopRequireDefault(__webpack_require__(/*! moment */ \"./node_modules/moment/moment.js\"));\n\nvar _jquery = _interopRequireDefault(__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"));\n\nvar _CTFd = _interopRequireDefault(__webpack_require__(/*! ../CTFd */ \"./CTFd/themes/core/assets/js/CTFd.js\"));\n\nvar _config = _interopRequireDefault(__webpack_require__(/*! ../config */ \"./CTFd/themes/core/assets/js/config.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar api_func = {\n teams: function teams(x) {\n return _CTFd.default.api.get_team_solves({\n teamId: x\n });\n },\n users: function users(x) {\n return _CTFd.default.api.get_user_solves({\n userId: x\n });\n }\n};\n_CTFd.default._internal.challenge = {};\nvar challenges = [];\nvar solves = [];\n\nvar loadChal = function loadChal(id) {\n var chal = _jquery.default.grep(challenges, function (chal) {\n return chal.id == id;\n })[0];\n\n if (chal.type === \"hidden\") {\n (0, _ezq.ezAlert)({\n title: \"Challenge Hidden!\",\n body: \"You haven't unlocked this challenge yet!\",\n button: \"Got it!\"\n });\n return;\n }\n\n displayChal(chal);\n};\n\nvar loadChalByName = function loadChalByName(name) {\n var idx = name.lastIndexOf(\"-\");\n var pieces = [name.slice(0, idx), name.slice(idx + 1)];\n var id = pieces[1];\n\n var chal = _jquery.default.grep(challenges, function (chal) {\n return chal.id == id;\n })[0];\n\n displayChal(chal);\n};\n\nvar displayChal = function displayChal(chal) {\n return Promise.all([_CTFd.default.api.get_challenge({\n challengeId: chal.id\n }), _jquery.default.getScript(_config.default.urlRoot + chal.script), _jquery.default.get(_config.default.urlRoot + chal.template)]).then(function (responses) {\n var challenge = _CTFd.default._internal.challenge;\n (0, _jquery.default)(\"#challenge-window\").empty(); // Inject challenge data into the plugin\n\n challenge.data = responses[0].data; // Call preRender function in plugin\n\n challenge.preRender(); // Build HTML from the Jinja response in API\n\n (0, _jquery.default)(\"#challenge-window\").append(responses[0].data.view);\n (0, _jquery.default)(\"#challenge-window #challenge-input\").addClass(\"form-control\");\n (0, _jquery.default)(\"#challenge-window #challenge-submit\").addClass(\"btn btn-md btn-outline-secondary float-right\");\n var modal = (0, _jquery.default)(\"#challenge-window\").find(\".modal-dialog\");\n\n if (window.init.theme_settings && window.init.theme_settings.challenge_window_size) {\n switch (window.init.theme_settings.challenge_window_size) {\n case \"sm\":\n modal.addClass(\"modal-sm\");\n break;\n\n case \"lg\":\n modal.addClass(\"modal-lg\");\n break;\n\n case \"xl\":\n modal.addClass(\"modal-xl\");\n break;\n\n default:\n break;\n }\n }\n\n (0, _jquery.default)(\".challenge-solves\").click(function (_event) {\n getSolves((0, _jquery.default)(\"#challenge-id\").val());\n });\n (0, _jquery.default)(\".nav-tabs a\").click(function (event) {\n event.preventDefault();\n (0, _jquery.default)(this).tab(\"show\");\n }); // Handle modal toggling\n\n (0, _jquery.default)(\"#challenge-window\").on(\"hide.bs.modal\", function (_event) {\n (0, _jquery.default)(\"#challenge-input\").removeClass(\"wrong\");\n (0, _jquery.default)(\"#challenge-input\").removeClass(\"correct\");\n (0, _jquery.default)(\"#incorrect-key\").slideUp();\n (0, _jquery.default)(\"#correct-key\").slideUp();\n (0, _jquery.default)(\"#already-solved\").slideUp();\n (0, _jquery.default)(\"#too-fast\").slideUp();\n });\n (0, _jquery.default)(\".load-hint\").on(\"click\", function (_event) {\n loadHint((0, _jquery.default)(this).data(\"hint-id\"));\n });\n (0, _jquery.default)(\"#challenge-submit\").click(function (event) {\n event.preventDefault();\n (0, _jquery.default)(\"#challenge-submit\").addClass(\"disabled-button\");\n (0, _jquery.default)(\"#challenge-submit\").prop(\"disabled\", true);\n\n _CTFd.default._internal.challenge.submit().then(renderSubmissionResponse).then(loadChals).then(markSolves);\n });\n (0, _jquery.default)(\"#challenge-input\").keyup(function (event) {\n if (event.keyCode == 13) {\n (0, _jquery.default)(\"#challenge-submit\").click();\n }\n });\n challenge.postRender();\n window.location.replace(window.location.href.split(\"#\")[0] + \"#\".concat(chal.name, \"-\").concat(chal.id));\n (0, _jquery.default)(\"#challenge-window\").modal();\n });\n};\n\nfunction renderSubmissionResponse(response) {\n var result = response.data;\n var result_message = (0, _jquery.default)(\"#result-message\");\n var result_notification = (0, _jquery.default)(\"#result-notification\");\n var answer_input = (0, _jquery.default)(\"#challenge-input\");\n result_notification.removeClass();\n result_message.text(result.message);\n\n if (result.status === \"authentication_required\") {\n window.location = _CTFd.default.config.urlRoot + \"/login?next=\" + _CTFd.default.config.urlRoot + window.location.pathname + window.location.hash;\n return;\n } else if (result.status === \"incorrect\") {\n // Incorrect key\n result_notification.addClass(\"alert alert-danger alert-dismissable text-center\");\n result_notification.slideDown();\n answer_input.removeClass(\"correct\");\n answer_input.addClass(\"wrong\");\n setTimeout(function () {\n answer_input.removeClass(\"wrong\");\n }, 3000);\n } else if (result.status === \"correct\") {\n // Challenge Solved\n result_notification.addClass(\"alert alert-success alert-dismissable text-center\");\n result_notification.slideDown();\n (0, _jquery.default)(\".challenge-solves\").text(parseInt((0, _jquery.default)(\".challenge-solves\").text().split(\" \")[0]) + 1 + \" Solves\");\n answer_input.val(\"\");\n answer_input.removeClass(\"wrong\");\n answer_input.addClass(\"correct\");\n } else if (result.status === \"already_solved\") {\n // Challenge already solved\n result_notification.addClass(\"alert alert-info alert-dismissable text-center\");\n result_notification.slideDown();\n answer_input.addClass(\"correct\");\n } else if (result.status === \"paused\") {\n // CTF is paused\n result_notification.addClass(\"alert alert-warning alert-dismissable text-center\");\n result_notification.slideDown();\n } else if (result.status === \"ratelimited\") {\n // Keys per minute too high\n result_notification.addClass(\"alert alert-warning alert-dismissable text-center\");\n result_notification.slideDown();\n answer_input.addClass(\"too-fast\");\n setTimeout(function () {\n answer_input.removeClass(\"too-fast\");\n }, 3000);\n }\n\n setTimeout(function () {\n (0, _jquery.default)(\".alert\").slideUp();\n (0, _jquery.default)(\"#challenge-submit\").removeClass(\"disabled-button\");\n (0, _jquery.default)(\"#challenge-submit\").prop(\"disabled\", false);\n }, 3000);\n}\n\nfunction markSolves() {\n return api_func[_CTFd.default.config.userMode](\"me\").then(function (response) {\n var solves = response.data;\n\n for (var i = solves.length - 1; i >= 0; i--) {\n var btn = (0, _jquery.default)('button[value=\"' + solves[i].challenge_id + '\"]');\n btn.addClass(\"solved-challenge\");\n btn.prepend(\"\");\n }\n });\n}\n\nfunction loadUserSolves() {\n if (_CTFd.default.user.id == 0) {\n return Promise.resolve();\n }\n\n return api_func[_CTFd.default.config.userMode](\"me\").then(function (response) {\n var solves = response.data;\n\n for (var i = solves.length - 1; i >= 0; i--) {\n var chal_id = solves[i].challenge_id;\n solves.push(chal_id);\n }\n });\n}\n\nfunction getSolves(id) {\n return _CTFd.default.api.get_challenge_solves({\n challengeId: id\n }).then(function (response) {\n var data = response.data;\n (0, _jquery.default)(\".challenge-solves\").text(parseInt(data.length) + \" Solves\");\n var box = (0, _jquery.default)(\"#challenge-solves-names\");\n box.empty();\n\n for (var i = 0; i < data.length; i++) {\n var _id = data[i].account_id;\n var name = data[i].name;\n var date = (0, _moment.default)(data[i].date).local().fromNow();\n var account_url = data[i].account_url;\n box.append('{2}{3}'.format(account_url, _id, (0, _utils.htmlEntities)(name), date));\n }\n });\n}\n\nfunction loadChals() {\n return _CTFd.default.api.get_challenge_list().then(function (response) {\n var categories = [];\n var $challenges_board = (0, _jquery.default)(\"#challenges-board\");\n challenges = response.data;\n $challenges_board.empty();\n\n for (var i = challenges.length - 1; i >= 0; i--) {\n challenges[i].solves = 0;\n\n if (_jquery.default.inArray(challenges[i].category, categories) == -1) {\n var category = challenges[i].category;\n categories.push(category);\n var categoryid = category.replace(/ /g, \"-\").hashCode();\n var categoryrow = (0, _jquery.default)(\"\" + '
'.format(categoryid) + '
' + \"
\" + '
' + '
' + \"
\" + \"
\");\n categoryrow.find(\".category-header\").append((0, _jquery.default)(\"

\" + category + \"

\"));\n $challenges_board.append(categoryrow);\n }\n }\n\n for (var _i = 0; _i <= challenges.length - 1; _i++) {\n var chalinfo = challenges[_i];\n var chalid = chalinfo.name.replace(/ /g, \"-\").hashCode();\n var catid = chalinfo.category.replace(/ /g, \"-\").hashCode();\n var chalwrap = (0, _jquery.default)(\"
\".format(chalid));\n var chalbutton = void 0;\n\n if (solves.indexOf(chalinfo.id) == -1) {\n chalbutton = (0, _jquery.default)(\"\".format(chalinfo.id));\n } else {\n chalbutton = (0, _jquery.default)(\"\".format(chalinfo.id));\n }\n\n var chalheader = (0, _jquery.default)(\"

{0}

\".format(chalinfo.name));\n var chalscore = (0, _jquery.default)(\"{0}\".format(chalinfo.value));\n\n for (var j = 0; j < chalinfo.tags.length; j++) {\n var tag = \"tag-\" + chalinfo.tags[j].value.replace(/ /g, \"-\");\n chalwrap.addClass(tag);\n }\n\n chalbutton.append(chalheader);\n chalbutton.append(chalscore);\n chalwrap.append(chalbutton);\n (0, _jquery.default)(\"#\" + catid + \"-row\").find(\".category-challenges > .challenges-row\").append(chalwrap);\n }\n\n (0, _jquery.default)(\".challenge-button\").click(function (_event) {\n loadChal(this.value);\n getSolves(this.value);\n });\n });\n}\n\nfunction update() {\n return loadUserSolves() // Load the user's solved challenge ids\n .then(loadChals) // Load the full list of challenges\n .then(markSolves);\n}\n\n(0, _jquery.default)(function () {\n update().then(function () {\n if (window.location.hash.length > 0) {\n loadChalByName(decodeURIComponent(window.location.hash.substring(1)));\n }\n });\n (0, _jquery.default)(\"#challenge-input\").keyup(function (event) {\n if (event.keyCode == 13) {\n (0, _jquery.default)(\"#challenge-submit\").click();\n }\n });\n (0, _jquery.default)(\".nav-tabs a\").click(function (event) {\n event.preventDefault();\n (0, _jquery.default)(this).tab(\"show\");\n });\n (0, _jquery.default)(\"#challenge-window\").on(\"hidden.bs.modal\", function (_event) {\n (0, _jquery.default)(\".nav-tabs a:first\").tab(\"show\");\n history.replaceState(\"\", window.document.title, window.location.pathname);\n });\n (0, _jquery.default)(\".challenge-solves\").click(function (_event) {\n getSolves((0, _jquery.default)(\"#challenge-id\").val());\n });\n (0, _jquery.default)(\"#challenge-window\").on(\"hide.bs.modal\", function (_event) {\n (0, _jquery.default)(\"#challenge-input\").removeClass(\"wrong\");\n (0, _jquery.default)(\"#challenge-input\").removeClass(\"correct\");\n (0, _jquery.default)(\"#incorrect-key\").slideUp();\n (0, _jquery.default)(\"#correct-key\").slideUp();\n (0, _jquery.default)(\"#already-solved\").slideUp();\n (0, _jquery.default)(\"#too-fast\").slideUp();\n });\n});\nsetInterval(update, 300000); // Update every 5 minutes.\n\nvar displayHint = function displayHint(data) {\n (0, _ezq.ezAlert)({\n title: \"Hint\",\n body: data.html,\n button: \"Got it!\"\n });\n};\n\nvar displayUnlock = function displayUnlock(id) {\n (0, _ezq.ezQuery)({\n title: \"Unlock Hint?\",\n body: \"Are you sure you want to open this hint?\",\n success: function success() {\n var params = {\n target: id,\n type: \"hints\"\n };\n\n _CTFd.default.api.post_unlock_list({}, params).then(function (response) {\n if (response.success) {\n _CTFd.default.api.get_hint({\n hintId: id\n }).then(function (response) {\n displayHint(response.data);\n });\n\n return;\n }\n\n (0, _ezq.ezAlert)({\n title: \"Error\",\n body: response.errors.score,\n button: \"Got it!\"\n });\n });\n }\n });\n};\n\nvar loadHint = function loadHint(id) {\n _CTFd.default.api.get_hint({\n hintId: id\n }).then(function (response) {\n if (response.data.content) {\n displayHint(response.data);\n return;\n }\n\n displayUnlock(id);\n });\n};\n\n//# sourceURL=webpack:///./CTFd/themes/core/assets/js/pages/challenges.js?"); +eval("\n\n__webpack_require__(/*! ./main */ \"./CTFd/themes/core/assets/js/pages/main.js\");\n\n__webpack_require__(/*! bootstrap/js/dist/tab */ \"./node_modules/bootstrap/js/dist/tab.js\");\n\nvar _ezq = __webpack_require__(/*! ../ezq */ \"./CTFd/themes/core/assets/js/ezq.js\");\n\nvar _utils = __webpack_require__(/*! ../utils */ \"./CTFd/themes/core/assets/js/utils.js\");\n\nvar _moment = _interopRequireDefault(__webpack_require__(/*! moment */ \"./node_modules/moment/moment.js\"));\n\nvar _jquery = _interopRequireDefault(__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"));\n\nvar _CTFd = _interopRequireDefault(__webpack_require__(/*! ../CTFd */ \"./CTFd/themes/core/assets/js/CTFd.js\"));\n\nvar _config = _interopRequireDefault(__webpack_require__(/*! ../config */ \"./CTFd/themes/core/assets/js/config.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar api_func = {\n teams: function teams(x) {\n return _CTFd.default.api.get_team_solves({\n teamId: x\n });\n },\n users: function users(x) {\n return _CTFd.default.api.get_user_solves({\n userId: x\n });\n }\n};\n_CTFd.default._internal.challenge = {};\nvar challenges = [];\nvar solves = [];\n\nvar loadChal = function loadChal(id) {\n var chal = _jquery.default.grep(challenges, function (chal) {\n return chal.id == id;\n })[0];\n\n if (chal.type === \"hidden\") {\n (0, _ezq.ezAlert)({\n title: \"Challenge Hidden!\",\n body: \"You haven't unlocked this challenge yet!\",\n button: \"Got it!\"\n });\n return;\n }\n\n displayChal(chal);\n};\n\nvar loadChalByName = function loadChalByName(name) {\n var idx = name.lastIndexOf(\"-\");\n var pieces = [name.slice(0, idx), name.slice(idx + 1)];\n var id = pieces[1];\n\n var chal = _jquery.default.grep(challenges, function (chal) {\n return chal.id == id;\n })[0];\n\n displayChal(chal);\n};\n\nvar displayChal = function displayChal(chal) {\n return Promise.all([_CTFd.default.api.get_challenge({\n challengeId: chal.id\n }), _jquery.default.getScript(_config.default.urlRoot + chal.script), _jquery.default.get(_config.default.urlRoot + chal.template)]).then(function (responses) {\n var challenge = _CTFd.default._internal.challenge;\n (0, _jquery.default)(\"#challenge-window\").empty(); // Inject challenge data into the plugin\n\n challenge.data = responses[0].data; // Call preRender function in plugin\n\n challenge.preRender(); // Build HTML from the Jinja response in API\n\n (0, _jquery.default)(\"#challenge-window\").append(responses[0].data.view);\n (0, _jquery.default)(\"#challenge-window #challenge-input\").addClass(\"form-control\");\n (0, _jquery.default)(\"#challenge-window #challenge-submit\").addClass(\"btn btn-md btn-outline-secondary float-right\");\n var modal = (0, _jquery.default)(\"#challenge-window\").find(\".modal-dialog\");\n\n if (window.init.theme_settings && window.init.theme_settings.challenge_window_size) {\n switch (window.init.theme_settings.challenge_window_size) {\n case \"sm\":\n modal.addClass(\"modal-sm\");\n break;\n\n case \"lg\":\n modal.addClass(\"modal-lg\");\n break;\n\n case \"xl\":\n modal.addClass(\"modal-xl\");\n break;\n\n default:\n break;\n }\n }\n\n (0, _jquery.default)(\".challenge-solves\").click(function (_event) {\n getSolves((0, _jquery.default)(\"#challenge-id\").val());\n });\n (0, _jquery.default)(\".nav-tabs a\").click(function (event) {\n event.preventDefault();\n (0, _jquery.default)(this).tab(\"show\");\n }); // Handle modal toggling\n\n (0, _jquery.default)(\"#challenge-window\").on(\"hide.bs.modal\", function (_event) {\n (0, _jquery.default)(\"#challenge-input\").removeClass(\"wrong\");\n (0, _jquery.default)(\"#challenge-input\").removeClass(\"correct\");\n (0, _jquery.default)(\"#incorrect-key\").slideUp();\n (0, _jquery.default)(\"#correct-key\").slideUp();\n (0, _jquery.default)(\"#already-solved\").slideUp();\n (0, _jquery.default)(\"#too-fast\").slideUp();\n });\n (0, _jquery.default)(\".load-hint\").on(\"click\", function (_event) {\n loadHint((0, _jquery.default)(this).data(\"hint-id\"));\n });\n (0, _jquery.default)(\"#challenge-submit\").click(function (event) {\n event.preventDefault();\n (0, _jquery.default)(\"#challenge-submit\").addClass(\"disabled-button\");\n (0, _jquery.default)(\"#challenge-submit\").prop(\"disabled\", true);\n\n _CTFd.default._internal.challenge.submit().then(renderSubmissionResponse).then(loadChals).then(markSolves);\n });\n (0, _jquery.default)(\"#challenge-input\").keyup(function (event) {\n if (event.keyCode == 13) {\n (0, _jquery.default)(\"#challenge-submit\").click();\n }\n });\n challenge.postRender();\n window.location.replace(window.location.href.split(\"#\")[0] + \"#\".concat(chal.name, \"-\").concat(chal.id));\n (0, _jquery.default)(\"#challenge-window\").modal();\n });\n};\n\nfunction renderSubmissionResponse(response) {\n var result = response.data;\n var result_message = (0, _jquery.default)(\"#result-message\");\n var result_notification = (0, _jquery.default)(\"#result-notification\");\n var answer_input = (0, _jquery.default)(\"#challenge-input\");\n result_notification.removeClass();\n result_message.text(result.message);\n\n if (result.status === \"authentication_required\") {\n window.location = _CTFd.default.config.urlRoot + \"/login?next=\" + _CTFd.default.config.urlRoot + window.location.pathname + window.location.hash;\n return;\n } else if (result.status === \"incorrect\") {\n // Incorrect key\n result_notification.addClass(\"alert alert-danger alert-dismissable text-center\");\n result_notification.slideDown();\n answer_input.removeClass(\"correct\");\n answer_input.addClass(\"wrong\");\n setTimeout(function () {\n answer_input.removeClass(\"wrong\");\n }, 3000);\n } else if (result.status === \"correct\") {\n // Challenge Solved\n result_notification.addClass(\"alert alert-success alert-dismissable text-center\");\n result_notification.slideDown();\n\n if ((0, _jquery.default)(\".challenge-solves\").text().trim()) {\n // Only try to increment solves if the text isn't hidden\n (0, _jquery.default)(\".challenge-solves\").text(parseInt((0, _jquery.default)(\".challenge-solves\").text().split(\" \")[0]) + 1 + \" Solves\");\n }\n\n answer_input.val(\"\");\n answer_input.removeClass(\"wrong\");\n answer_input.addClass(\"correct\");\n } else if (result.status === \"already_solved\") {\n // Challenge already solved\n result_notification.addClass(\"alert alert-info alert-dismissable text-center\");\n result_notification.slideDown();\n answer_input.addClass(\"correct\");\n } else if (result.status === \"paused\") {\n // CTF is paused\n result_notification.addClass(\"alert alert-warning alert-dismissable text-center\");\n result_notification.slideDown();\n } else if (result.status === \"ratelimited\") {\n // Keys per minute too high\n result_notification.addClass(\"alert alert-warning alert-dismissable text-center\");\n result_notification.slideDown();\n answer_input.addClass(\"too-fast\");\n setTimeout(function () {\n answer_input.removeClass(\"too-fast\");\n }, 3000);\n }\n\n setTimeout(function () {\n (0, _jquery.default)(\".alert\").slideUp();\n (0, _jquery.default)(\"#challenge-submit\").removeClass(\"disabled-button\");\n (0, _jquery.default)(\"#challenge-submit\").prop(\"disabled\", false);\n }, 3000);\n}\n\nfunction markSolves() {\n return api_func[_CTFd.default.config.userMode](\"me\").then(function (response) {\n var solves = response.data;\n\n for (var i = solves.length - 1; i >= 0; i--) {\n var btn = (0, _jquery.default)('button[value=\"' + solves[i].challenge_id + '\"]');\n btn.addClass(\"solved-challenge\");\n btn.prepend(\"\");\n }\n });\n}\n\nfunction loadUserSolves() {\n if (_CTFd.default.user.id == 0) {\n return Promise.resolve();\n }\n\n return api_func[_CTFd.default.config.userMode](\"me\").then(function (response) {\n var solves = response.data;\n\n for (var i = solves.length - 1; i >= 0; i--) {\n var chal_id = solves[i].challenge_id;\n solves.push(chal_id);\n }\n });\n}\n\nfunction getSolves(id) {\n return _CTFd.default.api.get_challenge_solves({\n challengeId: id\n }).then(function (response) {\n var data = response.data;\n (0, _jquery.default)(\".challenge-solves\").text(parseInt(data.length) + \" Solves\");\n var box = (0, _jquery.default)(\"#challenge-solves-names\");\n box.empty();\n\n for (var i = 0; i < data.length; i++) {\n var _id = data[i].account_id;\n var name = data[i].name;\n var date = (0, _moment.default)(data[i].date).local().fromNow();\n var account_url = data[i].account_url;\n box.append('
{2}{3}'.format(account_url, _id, (0, _utils.htmlEntities)(name), date));\n }\n });\n}\n\nfunction loadChals() {\n return _CTFd.default.api.get_challenge_list().then(function (response) {\n var categories = [];\n var $challenges_board = (0, _jquery.default)(\"#challenges-board\");\n challenges = response.data;\n $challenges_board.empty();\n\n for (var i = challenges.length - 1; i >= 0; i--) {\n challenges[i].solves = 0;\n\n if (_jquery.default.inArray(challenges[i].category, categories) == -1) {\n var category = challenges[i].category;\n categories.push(category);\n var categoryid = category.replace(/ /g, \"-\").hashCode();\n var categoryrow = (0, _jquery.default)(\"\" + '
'.format(categoryid) + '
' + \"
\" + '
' + '
' + \"
\" + \"
\");\n categoryrow.find(\".category-header\").append((0, _jquery.default)(\"

\" + category + \"

\"));\n $challenges_board.append(categoryrow);\n }\n }\n\n for (var _i = 0; _i <= challenges.length - 1; _i++) {\n var chalinfo = challenges[_i];\n var chalid = chalinfo.name.replace(/ /g, \"-\").hashCode();\n var catid = chalinfo.category.replace(/ /g, \"-\").hashCode();\n var chalwrap = (0, _jquery.default)(\"
\".format(chalid));\n var chalbutton = void 0;\n\n if (solves.indexOf(chalinfo.id) == -1) {\n chalbutton = (0, _jquery.default)(\"\".format(chalinfo.id));\n } else {\n chalbutton = (0, _jquery.default)(\"\".format(chalinfo.id));\n }\n\n var chalheader = (0, _jquery.default)(\"

{0}

\".format(chalinfo.name));\n var chalscore = (0, _jquery.default)(\"{0}\".format(chalinfo.value));\n\n for (var j = 0; j < chalinfo.tags.length; j++) {\n var tag = \"tag-\" + chalinfo.tags[j].value.replace(/ /g, \"-\");\n chalwrap.addClass(tag);\n }\n\n chalbutton.append(chalheader);\n chalbutton.append(chalscore);\n chalwrap.append(chalbutton);\n (0, _jquery.default)(\"#\" + catid + \"-row\").find(\".category-challenges > .challenges-row\").append(chalwrap);\n }\n\n (0, _jquery.default)(\".challenge-button\").click(function (_event) {\n loadChal(this.value);\n getSolves(this.value);\n });\n });\n}\n\nfunction update() {\n return loadUserSolves() // Load the user's solved challenge ids\n .then(loadChals) // Load the full list of challenges\n .then(markSolves);\n}\n\n(0, _jquery.default)(function () {\n update().then(function () {\n if (window.location.hash.length > 0) {\n loadChalByName(decodeURIComponent(window.location.hash.substring(1)));\n }\n });\n (0, _jquery.default)(\"#challenge-input\").keyup(function (event) {\n if (event.keyCode == 13) {\n (0, _jquery.default)(\"#challenge-submit\").click();\n }\n });\n (0, _jquery.default)(\".nav-tabs a\").click(function (event) {\n event.preventDefault();\n (0, _jquery.default)(this).tab(\"show\");\n });\n (0, _jquery.default)(\"#challenge-window\").on(\"hidden.bs.modal\", function (_event) {\n (0, _jquery.default)(\".nav-tabs a:first\").tab(\"show\");\n history.replaceState(\"\", window.document.title, window.location.pathname);\n });\n (0, _jquery.default)(\".challenge-solves\").click(function (_event) {\n getSolves((0, _jquery.default)(\"#challenge-id\").val());\n });\n (0, _jquery.default)(\"#challenge-window\").on(\"hide.bs.modal\", function (_event) {\n (0, _jquery.default)(\"#challenge-input\").removeClass(\"wrong\");\n (0, _jquery.default)(\"#challenge-input\").removeClass(\"correct\");\n (0, _jquery.default)(\"#incorrect-key\").slideUp();\n (0, _jquery.default)(\"#correct-key\").slideUp();\n (0, _jquery.default)(\"#already-solved\").slideUp();\n (0, _jquery.default)(\"#too-fast\").slideUp();\n });\n});\nsetInterval(update, 300000); // Update every 5 minutes.\n\nvar displayHint = function displayHint(data) {\n (0, _ezq.ezAlert)({\n title: \"Hint\",\n body: data.html,\n button: \"Got it!\"\n });\n};\n\nvar displayUnlock = function displayUnlock(id) {\n (0, _ezq.ezQuery)({\n title: \"Unlock Hint?\",\n body: \"Are you sure you want to open this hint?\",\n success: function success() {\n var params = {\n target: id,\n type: \"hints\"\n };\n\n _CTFd.default.api.post_unlock_list({}, params).then(function (response) {\n if (response.success) {\n _CTFd.default.api.get_hint({\n hintId: id\n }).then(function (response) {\n displayHint(response.data);\n });\n\n return;\n }\n\n (0, _ezq.ezAlert)({\n title: \"Error\",\n body: response.errors.score,\n button: \"Got it!\"\n });\n });\n }\n });\n};\n\nvar loadHint = function loadHint(id) {\n _CTFd.default.api.get_hint({\n hintId: id\n }).then(function (response) {\n if (response.data.content) {\n displayHint(response.data);\n return;\n }\n\n displayUnlock(id);\n });\n};\n\n//# sourceURL=webpack:///./CTFd/themes/core/assets/js/pages/challenges.js?"); /***/ }) diff --git a/CTFd/themes/core/static/js/pages/challenges.min.js b/CTFd/themes/core/static/js/pages/challenges.min.js index 4b1f09fe..21b2f8d2 100644 --- a/CTFd/themes/core/static/js/pages/challenges.min.js +++ b/CTFd/themes/core/static/js/pages/challenges.min.js @@ -1 +1 @@ -!function(r){function e(e){for(var t,o,n=e[0],s=e[1],a=e[2],i=0,l=[];i".concat(e.body,"

")):o.find(".modal-body").append((0,l.default)(e.body));var n=(0,l.default)(c.format(e.button));return e.success&&(0,l.default)(n).click(function(){e.success()}),e.large&&o.find(".modal-dialog").addClass("modal-lg"),o.find(".modal-footer").append(n),(0,l.default)("main").append(o),o.modal("show"),(0,l.default)(o).on("hidden.bs.modal",function(){(0,l.default)(this).modal("dispose")}),o}function f(e){(0,l.default)("#ezq--notifications-toast-container").length||(0,l.default)("body").append((0,l.default)("
").attr({id:"ezq--notifications-toast-container"}).css({position:"fixed",bottom:"0",right:"0","min-width":"20%"}));var t=r.format(e.title,e.body),o=(0,l.default)(t);if(e.onclose&&(0,l.default)(o).find("button[data-dismiss=toast]").click(function(){e.onclose()}),e.onclick){var n=(0,l.default)(o).find(".toast-body");n.addClass("cursor-pointer"),n.click(function(){e.onclick()})}var s=!1!==e.autohide,a=!1!==e.animation,i=e.delay||1e4;return(0,l.default)("#ezq--notifications-toast-container").prepend(o),o.toast({autohide:s,delay:i,animation:a}),o.toast("show"),o}function j(e){var t=a.format(e.title),o=(0,l.default)(t);"string"==typeof e.body?o.find(".modal-body").append("

".concat(e.body,"

")):o.find(".modal-body").append((0,l.default)(e.body));var n=(0,l.default)(m),s=(0,l.default)(u);return o.find(".modal-footer").append(s),o.find(".modal-footer").append(n),(0,l.default)("main").append(o),(0,l.default)(o).on("hidden.bs.modal",function(){(0,l.default)(this).modal("dispose")}),(0,l.default)(n).click(function(){e.success()}),o.modal("show"),o}function h(e){if(e.target){var t=(0,l.default)(e.target);return t.find(".progress-bar").css("width",e.width+"%"),t}var o=i.format(e.width),n=a.format(e.title),s=(0,l.default)(n);return s.find(".modal-body").append((0,l.default)(o)),(0,l.default)("main").append(s),s.modal("show")}function _(e){var t={success:d,error:s}[e.type].format(e.body);return(0,l.default)(t)}var g={ezAlert:p,ezToast:f,ezQuery:j,ezProgressBar:h,ezBadge:_};t.default=g},"./CTFd/themes/core/assets/js/fetch.js":function(e,t,o){Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0,o("./node_modules/whatwg-fetch/fetch.js");var n,s=(n=o("./CTFd/themes/core/assets/js/config.js"))&&n.__esModule?n:{default:n};var a=window.fetch;t.default=function(e,t){return void 0===t&&(t={method:"GET",credentials:"same-origin",headers:{}}),e=s.default.urlRoot+e,void 0===t.headers&&(t.headers={}),t.credentials="same-origin",t.headers.Accept="application/json",t.headers["Content-Type"]="application/json",t.headers["CSRF-Token"]=s.default.csrfNonce,a(e,t)}},"./CTFd/themes/core/assets/js/pages/challenges.js":function(e,t,o){o("./CTFd/themes/core/assets/js/pages/main.js"),o("./node_modules/bootstrap/js/dist/tab.js");var n=o("./CTFd/themes/core/assets/js/ezq.js"),r=o("./CTFd/themes/core/assets/js/utils.js"),d=i(o("./node_modules/moment/moment.js")),_=i(o("./node_modules/jquery/dist/jquery.js")),a=i(o("./CTFd/themes/core/assets/js/CTFd.js")),s=i(o("./CTFd/themes/core/assets/js/config.js"));function i(e){return e&&e.__esModule?e:{default:e}}var l={teams:function(e){return a.default.api.get_team_solves({teamId:e})},users:function(e){return a.default.api.get_user_solves({userId:e})}};a.default._internal.challenge={};var g=[],v=[],y=function(t){var e=_.default.grep(g,function(e){return e.id==t})[0];"hidden"!==e.type?c(e):(0,n.ezAlert)({title:"Challenge Hidden!",body:"You haven't unlocked this challenge yet!",button:"Got it!"})},c=function(n){return Promise.all([a.default.api.get_challenge({challengeId:n.id}),_.default.getScript(s.default.urlRoot+n.script),_.default.get(s.default.urlRoot+n.template)]).then(function(e){var t=a.default._internal.challenge;(0,_.default)("#challenge-window").empty(),t.data=e[0].data,t.preRender(),(0,_.default)("#challenge-window").append(e[0].data.view),(0,_.default)("#challenge-window #challenge-input").addClass("form-control"),(0,_.default)("#challenge-window #challenge-submit").addClass("btn btn-md btn-outline-secondary float-right");var o=(0,_.default)("#challenge-window").find(".modal-dialog");if(window.init.theme_settings&&window.init.theme_settings.challenge_window_size)switch(window.init.theme_settings.challenge_window_size){case"sm":o.addClass("modal-sm");break;case"lg":o.addClass("modal-lg");break;case"xl":o.addClass("modal-xl")}(0,_.default)(".challenge-solves").click(function(e){b((0,_.default)("#challenge-id").val())}),(0,_.default)(".nav-tabs a").click(function(e){e.preventDefault(),(0,_.default)(this).tab("show")}),(0,_.default)("#challenge-window").on("hide.bs.modal",function(e){(0,_.default)("#challenge-input").removeClass("wrong"),(0,_.default)("#challenge-input").removeClass("correct"),(0,_.default)("#incorrect-key").slideUp(),(0,_.default)("#correct-key").slideUp(),(0,_.default)("#already-solved").slideUp(),(0,_.default)("#too-fast").slideUp()}),(0,_.default)(".load-hint").on("click",function(e){h((0,_.default)(this).data("hint-id"))}),(0,_.default)("#challenge-submit").click(function(e){e.preventDefault(),(0,_.default)("#challenge-submit").addClass("disabled-button"),(0,_.default)("#challenge-submit").prop("disabled",!0),a.default._internal.challenge.submit().then(u).then(p).then(m)}),(0,_.default)("#challenge-input").keyup(function(e){13==e.keyCode&&(0,_.default)("#challenge-submit").click()}),t.postRender(),window.location.replace(window.location.href.split("#")[0]+"#".concat(n.name,"-").concat(n.id)),(0,_.default)("#challenge-window").modal()})};function u(e){var t=e.data,o=(0,_.default)("#result-message"),n=(0,_.default)("#result-notification"),s=(0,_.default)("#challenge-input");n.removeClass(),o.text(t.message),"authentication_required"!==t.status?("incorrect"===t.status?(n.addClass("alert alert-danger alert-dismissable text-center"),n.slideDown(),s.removeClass("correct"),s.addClass("wrong"),setTimeout(function(){s.removeClass("wrong")},3e3)):"correct"===t.status?(n.addClass("alert alert-success alert-dismissable text-center"),n.slideDown(),(0,_.default)(".challenge-solves").text(parseInt((0,_.default)(".challenge-solves").text().split(" ")[0])+1+" Solves"),s.val(""),s.removeClass("wrong"),s.addClass("correct")):"already_solved"===t.status?(n.addClass("alert alert-info alert-dismissable text-center"),n.slideDown(),s.addClass("correct")):"paused"===t.status?(n.addClass("alert alert-warning alert-dismissable text-center"),n.slideDown()):"ratelimited"===t.status&&(n.addClass("alert alert-warning alert-dismissable text-center"),n.slideDown(),s.addClass("too-fast"),setTimeout(function(){s.removeClass("too-fast")},3e3)),setTimeout(function(){(0,_.default)(".alert").slideUp(),(0,_.default)("#challenge-submit").removeClass("disabled-button"),(0,_.default)("#challenge-submit").prop("disabled",!1)},3e3)):window.location=a.default.config.urlRoot+"/login?next="+a.default.config.urlRoot+window.location.pathname+window.location.hash}function m(){return l[a.default.config.userMode]("me").then(function(e){for(var t=e.data,o=t.length-1;0<=o;o--){var n=(0,_.default)('button[value="'+t[o].challenge_id+'"]');n.addClass("solved-challenge"),n.prepend("")}})}function b(e){return a.default.api.get_challenge_solves({challengeId:e}).then(function(e){var t=e.data;(0,_.default)(".challenge-solves").text(parseInt(t.length)+" Solves");var o=(0,_.default)("#challenge-solves-names");o.empty();for(var n=0;n
{2}{3}'.format(l,s,(0,r.htmlEntities)(a),i))}})}function p(){return a.default.api.get_challenge_list().then(function(e){var t=[],o=(0,_.default)("#challenges-board");g=e.data,o.empty();for(var n=g.length-1;0<=n;n--)if(g[n].solves=0,-1==_.default.inArray(g[n].category,t)){var s=g[n].category;t.push(s);var a=s.replace(/ /g,"-").hashCode(),i=(0,_.default)('
'.format(a)+'
');i.find(".category-header").append((0,_.default)("

"+s+"

")),o.append(i)}for(var l=0;l<=g.length-1;l++){var r=g[l],d=r.name.replace(/ /g,"-").hashCode(),c=r.category.replace(/ /g,"-").hashCode(),u=(0,_.default)("
".format(d)),m=void 0;m=-1==v.indexOf(r.id)?(0,_.default)("".format(r.id)):(0,_.default)("".format(r.id));for(var p=(0,_.default)("

{0}

".format(r.name)),f=(0,_.default)("{0}".format(r.value)),j=0;j .challenges-row").append(u)}(0,_.default)(".challenge-button").click(function(e){y(this.value),b(this.value)})})}function f(){return(0==a.default.user.id?Promise.resolve():l[a.default.config.userMode]("me").then(function(e){for(var t=e.data,o=t.length-1;0<=o;o--){var n=t[o].challenge_id;t.push(n)}})).then(p).then(m)}(0,_.default)(function(){f().then(function(){0>4*s&255).toString(16)).substr(-2)}return n},t.htmlEntities=function(e){return(0,i.default)("
").text(e).html()},t.cumulativeSum=function(e){for(var t=e.concat(),o=0;o'),(0,i.default)("th.sort-col").click(function(){var e=(0,i.default)(this).parents("table").eq(0),t=e.find("tr:gt(0)").toArray().sort(function(s){return function(e,t){var o=a(e,s),n=a(t,s);return i.default.isNumeric(o)&&i.default.isNumeric(n)?o-n:o.toString().localeCompare(n)}}((0,i.default)(this).index()));this.asc=!this.asc,this.asc||(t=t.reverse());for(var o=0;o".concat(e.body,"

")):o.find(".modal-body").append((0,l.default)(e.body));var n=(0,l.default)(c.format(e.button));return e.success&&(0,l.default)(n).click(function(){e.success()}),e.large&&o.find(".modal-dialog").addClass("modal-lg"),o.find(".modal-footer").append(n),(0,l.default)("main").append(o),o.modal("show"),(0,l.default)(o).on("hidden.bs.modal",function(){(0,l.default)(this).modal("dispose")}),o}function f(e){(0,l.default)("#ezq--notifications-toast-container").length||(0,l.default)("body").append((0,l.default)("
").attr({id:"ezq--notifications-toast-container"}).css({position:"fixed",bottom:"0",right:"0","min-width":"20%"}));var t=r.format(e.title,e.body),o=(0,l.default)(t);if(e.onclose&&(0,l.default)(o).find("button[data-dismiss=toast]").click(function(){e.onclose()}),e.onclick){var n=(0,l.default)(o).find(".toast-body");n.addClass("cursor-pointer"),n.click(function(){e.onclick()})}var s=!1!==e.autohide,a=!1!==e.animation,i=e.delay||1e4;return(0,l.default)("#ezq--notifications-toast-container").prepend(o),o.toast({autohide:s,delay:i,animation:a}),o.toast("show"),o}function j(e){var t=a.format(e.title),o=(0,l.default)(t);"string"==typeof e.body?o.find(".modal-body").append("

".concat(e.body,"

")):o.find(".modal-body").append((0,l.default)(e.body));var n=(0,l.default)(m),s=(0,l.default)(u);return o.find(".modal-footer").append(s),o.find(".modal-footer").append(n),(0,l.default)("main").append(o),(0,l.default)(o).on("hidden.bs.modal",function(){(0,l.default)(this).modal("dispose")}),(0,l.default)(n).click(function(){e.success()}),o.modal("show"),o}function h(e){if(e.target){var t=(0,l.default)(e.target);return t.find(".progress-bar").css("width",e.width+"%"),t}var o=i.format(e.width),n=a.format(e.title),s=(0,l.default)(n);return s.find(".modal-body").append((0,l.default)(o)),(0,l.default)("main").append(s),s.modal("show")}function _(e){var t={success:d,error:s}[e.type].format(e.body);return(0,l.default)(t)}var g={ezAlert:p,ezToast:f,ezQuery:j,ezProgressBar:h,ezBadge:_};t.default=g},"./CTFd/themes/core/assets/js/fetch.js":function(e,t,o){Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0,o("./node_modules/whatwg-fetch/fetch.js");var n,s=(n=o("./CTFd/themes/core/assets/js/config.js"))&&n.__esModule?n:{default:n};var a=window.fetch;t.default=function(e,t){return void 0===t&&(t={method:"GET",credentials:"same-origin",headers:{}}),e=s.default.urlRoot+e,void 0===t.headers&&(t.headers={}),t.credentials="same-origin",t.headers.Accept="application/json",t.headers["Content-Type"]="application/json",t.headers["CSRF-Token"]=s.default.csrfNonce,a(e,t)}},"./CTFd/themes/core/assets/js/pages/challenges.js":function(e,t,o){o("./CTFd/themes/core/assets/js/pages/main.js"),o("./node_modules/bootstrap/js/dist/tab.js");var n=o("./CTFd/themes/core/assets/js/ezq.js"),r=o("./CTFd/themes/core/assets/js/utils.js"),d=i(o("./node_modules/moment/moment.js")),_=i(o("./node_modules/jquery/dist/jquery.js")),a=i(o("./CTFd/themes/core/assets/js/CTFd.js")),s=i(o("./CTFd/themes/core/assets/js/config.js"));function i(e){return e&&e.__esModule?e:{default:e}}var l={teams:function(e){return a.default.api.get_team_solves({teamId:e})},users:function(e){return a.default.api.get_user_solves({userId:e})}};a.default._internal.challenge={};var g=[],v=[],y=function(t){var e=_.default.grep(g,function(e){return e.id==t})[0];"hidden"!==e.type?c(e):(0,n.ezAlert)({title:"Challenge Hidden!",body:"You haven't unlocked this challenge yet!",button:"Got it!"})},c=function(n){return Promise.all([a.default.api.get_challenge({challengeId:n.id}),_.default.getScript(s.default.urlRoot+n.script),_.default.get(s.default.urlRoot+n.template)]).then(function(e){var t=a.default._internal.challenge;(0,_.default)("#challenge-window").empty(),t.data=e[0].data,t.preRender(),(0,_.default)("#challenge-window").append(e[0].data.view),(0,_.default)("#challenge-window #challenge-input").addClass("form-control"),(0,_.default)("#challenge-window #challenge-submit").addClass("btn btn-md btn-outline-secondary float-right");var o=(0,_.default)("#challenge-window").find(".modal-dialog");if(window.init.theme_settings&&window.init.theme_settings.challenge_window_size)switch(window.init.theme_settings.challenge_window_size){case"sm":o.addClass("modal-sm");break;case"lg":o.addClass("modal-lg");break;case"xl":o.addClass("modal-xl")}(0,_.default)(".challenge-solves").click(function(e){b((0,_.default)("#challenge-id").val())}),(0,_.default)(".nav-tabs a").click(function(e){e.preventDefault(),(0,_.default)(this).tab("show")}),(0,_.default)("#challenge-window").on("hide.bs.modal",function(e){(0,_.default)("#challenge-input").removeClass("wrong"),(0,_.default)("#challenge-input").removeClass("correct"),(0,_.default)("#incorrect-key").slideUp(),(0,_.default)("#correct-key").slideUp(),(0,_.default)("#already-solved").slideUp(),(0,_.default)("#too-fast").slideUp()}),(0,_.default)(".load-hint").on("click",function(e){h((0,_.default)(this).data("hint-id"))}),(0,_.default)("#challenge-submit").click(function(e){e.preventDefault(),(0,_.default)("#challenge-submit").addClass("disabled-button"),(0,_.default)("#challenge-submit").prop("disabled",!0),a.default._internal.challenge.submit().then(u).then(p).then(m)}),(0,_.default)("#challenge-input").keyup(function(e){13==e.keyCode&&(0,_.default)("#challenge-submit").click()}),t.postRender(),window.location.replace(window.location.href.split("#")[0]+"#".concat(n.name,"-").concat(n.id)),(0,_.default)("#challenge-window").modal()})};function u(e){var t=e.data,o=(0,_.default)("#result-message"),n=(0,_.default)("#result-notification"),s=(0,_.default)("#challenge-input");n.removeClass(),o.text(t.message),"authentication_required"!==t.status?("incorrect"===t.status?(n.addClass("alert alert-danger alert-dismissable text-center"),n.slideDown(),s.removeClass("correct"),s.addClass("wrong"),setTimeout(function(){s.removeClass("wrong")},3e3)):"correct"===t.status?(n.addClass("alert alert-success alert-dismissable text-center"),n.slideDown(),(0,_.default)(".challenge-solves").text().trim()&&(0,_.default)(".challenge-solves").text(parseInt((0,_.default)(".challenge-solves").text().split(" ")[0])+1+" Solves"),s.val(""),s.removeClass("wrong"),s.addClass("correct")):"already_solved"===t.status?(n.addClass("alert alert-info alert-dismissable text-center"),n.slideDown(),s.addClass("correct")):"paused"===t.status?(n.addClass("alert alert-warning alert-dismissable text-center"),n.slideDown()):"ratelimited"===t.status&&(n.addClass("alert alert-warning alert-dismissable text-center"),n.slideDown(),s.addClass("too-fast"),setTimeout(function(){s.removeClass("too-fast")},3e3)),setTimeout(function(){(0,_.default)(".alert").slideUp(),(0,_.default)("#challenge-submit").removeClass("disabled-button"),(0,_.default)("#challenge-submit").prop("disabled",!1)},3e3)):window.location=a.default.config.urlRoot+"/login?next="+a.default.config.urlRoot+window.location.pathname+window.location.hash}function m(){return l[a.default.config.userMode]("me").then(function(e){for(var t=e.data,o=t.length-1;0<=o;o--){var n=(0,_.default)('button[value="'+t[o].challenge_id+'"]');n.addClass("solved-challenge"),n.prepend("")}})}function b(e){return a.default.api.get_challenge_solves({challengeId:e}).then(function(e){var t=e.data;(0,_.default)(".challenge-solves").text(parseInt(t.length)+" Solves");var o=(0,_.default)("#challenge-solves-names");o.empty();for(var n=0;n
{2}{3}'.format(l,s,(0,r.htmlEntities)(a),i))}})}function p(){return a.default.api.get_challenge_list().then(function(e){var t=[],o=(0,_.default)("#challenges-board");g=e.data,o.empty();for(var n=g.length-1;0<=n;n--)if(g[n].solves=0,-1==_.default.inArray(g[n].category,t)){var s=g[n].category;t.push(s);var a=s.replace(/ /g,"-").hashCode(),i=(0,_.default)('
'.format(a)+'
');i.find(".category-header").append((0,_.default)("

"+s+"

")),o.append(i)}for(var l=0;l<=g.length-1;l++){var r=g[l],d=r.name.replace(/ /g,"-").hashCode(),c=r.category.replace(/ /g,"-").hashCode(),u=(0,_.default)("
".format(d)),m=void 0;m=-1==v.indexOf(r.id)?(0,_.default)("".format(r.id)):(0,_.default)("".format(r.id));for(var p=(0,_.default)("

{0}

".format(r.name)),f=(0,_.default)("{0}".format(r.value)),j=0;j .challenges-row").append(u)}(0,_.default)(".challenge-button").click(function(e){y(this.value),b(this.value)})})}function f(){return(0==a.default.user.id?Promise.resolve():l[a.default.config.userMode]("me").then(function(e){for(var t=e.data,o=t.length-1;0<=o;o--){var n=t[o].challenge_id;t.push(n)}})).then(p).then(m)}(0,_.default)(function(){f().then(function(){0>4*s&255).toString(16)).substr(-2)}return n},t.htmlEntities=function(e){return(0,i.default)("
").text(e).html()},t.cumulativeSum=function(e){for(var t=e.concat(),o=0;o'),(0,i.default)("th.sort-col").click(function(){var e=(0,i.default)(this).parents("table").eq(0),t=e.find("tr:gt(0)").toArray().sort(function(s){return function(e,t){var o=a(e,s),n=a(t,s);return i.default.isNumeric(o)&&i.default.isNumeric(n)?o-n:o.toString().localeCompare(n)}}((0,i.default)(this).index()));this.asc=!this.asc,this.asc||(t=t.reverse());for(var o=0;o