From de9f2311eb2d74636ddb801f0b38469a508183c0 Mon Sep 17 00:00:00 2001 From: Kevin Chung Date: Fri, 11 Mar 2022 04:24:59 -0500 Subject: [PATCH] Add client side vaildation for checking if users upload files that are probably too large (#2067) * Add client side vaildation for checking if users upload files that are probably too large * Closes #1972 --- CTFd/forms/setup.py | 10 +++--- CTFd/themes/core/assets/js/pages/setup.js | 36 +++++++++++++++++++ CTFd/themes/core/static/js/pages/setup.dev.js | 2 +- CTFd/themes/core/static/js/pages/setup.min.js | 2 +- package.json | 1 + yarn.lock | 5 +++ 6 files changed, 50 insertions(+), 6 deletions(-) diff --git a/CTFd/forms/setup.py b/CTFd/forms/setup.py index 83cb7550..bdf2aa59 100644 --- a/CTFd/forms/setup.py +++ b/CTFd/forms/setup.py @@ -49,16 +49,18 @@ class SetupForm(BaseForm): ctf_logo = FileField( "Logo", - description="Logo to use for the website instead of a CTF name. Used as the home page button.", + description="Logo to use for the website instead of a CTF name. Used as the home page button. Optional.", + ) + ctf_banner = FileField( + "Banner", description="Banner to use for the homepage. Optional." ) - ctf_banner = FileField("Banner", description="Banner to use for the homepage.") ctf_small_icon = FileField( "Small Icon", - description="favicon used in user's browsers. Only PNGs accepted. Must be 32x32px.", + description="favicon used in user's browsers. Only PNGs accepted. Must be 32x32px. Optional.", ) ctf_theme = SelectField( "Theme", - description="CTFd Theme to use", + description="CTFd Theme to use. Can be changed later.", choices=list(zip(get_themes(), get_themes())), default=DEFAULT_THEME, validators=[InputRequired()], diff --git a/CTFd/themes/core/assets/js/pages/setup.js b/CTFd/themes/core/assets/js/pages/setup.js index d1d2be2a..0ae90549 100644 --- a/CTFd/themes/core/assets/js/pages/setup.js +++ b/CTFd/themes/core/assets/js/pages/setup.js @@ -99,6 +99,42 @@ $(() => { $("#config-color-picker").val(""); }); + $("#ctf_logo").on("change", function() { + if (this.files[0].size > 128000) { + if ( + !confirm( + "This image file is larger than 128KB which may result in increased load times. Are you sure you'd like to use this logo?" + ) + ) { + this.value = ""; + } + } + }); + + $("#ctf_banner").on("change", function() { + if (this.files[0].size > 512000) { + if ( + !confirm( + "This image file is larger than 512KB which may result in increased load times. Are you sure you'd like to use this icon?" + ) + ) { + this.value = ""; + } + } + }); + + $("#ctf_small_icon").on("change", function() { + if (this.files[0].size > 32000) { + if ( + !confirm( + "This image file is larger than 32KB which may result in increased load times. Are you sure you'd like to use this icon?" + ) + ) { + this.value = ""; + } + } + }); + window.addEventListener("storage", function(event) { if (event.key == "integrations" && event.newValue) { let integration = JSON.parse(event.newValue); diff --git a/CTFd/themes/core/static/js/pages/setup.dev.js b/CTFd/themes/core/static/js/pages/setup.dev.js index 045875b3..439de254 100644 --- a/CTFd/themes/core/static/js/pages/setup.dev.js +++ b/CTFd/themes/core/static/js/pages/setup.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\nvar _jquery = _interopRequireDefault(__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"));\n\nvar _dayjs = _interopRequireDefault(__webpack_require__(/*! dayjs */ \"./node_modules/dayjs/dayjs.min.js\"));\n\nvar _CTFd = _interopRequireDefault(__webpack_require__(/*! ../CTFd */ \"./CTFd/themes/core/assets/js/CTFd.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nfunction switchTab(event) {\n event.preventDefault(); // Handle tab validation\n\n var valid_tab = true;\n (0, _jquery[\"default\"])(event.target).closest(\"[role=tabpanel]\").find(\"input,textarea\").each(function (i, e) {\n var $e = (0, _jquery[\"default\"])(e);\n var status = e.checkValidity();\n\n if (status === false) {\n $e.removeClass(\"input-filled-valid\");\n $e.addClass(\"input-filled-invalid\");\n valid_tab = false;\n }\n });\n\n if (valid_tab == false) {\n return;\n }\n\n var href = (0, _jquery[\"default\"])(event.target).data(\"href\");\n (0, _jquery[\"default\"])(\".nav a[href=\\\"\".concat(href, \"\\\"]\")).tab(\"show\");\n}\n\nfunction processDateTime(datetime) {\n return function (_event) {\n var date_picker = (0, _jquery[\"default\"])(\"#\".concat(datetime, \"-date\"));\n var time_picker = (0, _jquery[\"default\"])(\"#\".concat(datetime, \"-time\"));\n var unix_time = (0, _dayjs[\"default\"])(\"\".concat(date_picker.val(), \" \").concat(time_picker.val()), \"YYYY-MM-DD HH:mm\").unix();\n\n if (isNaN(unix_time)) {\n (0, _jquery[\"default\"])(\"#\".concat(datetime, \"-preview\")).val(\"\");\n } else {\n (0, _jquery[\"default\"])(\"#\".concat(datetime, \"-preview\")).val(unix_time);\n }\n };\n}\n\nfunction mlcSetup(_event) {\n var params = {\n name: (0, _jquery[\"default\"])(\"#ctf_name\").val(),\n type: \"jeopardy\",\n description: (0, _jquery[\"default\"])(\"#ctf_description\").val(),\n user_mode: (0, _jquery[\"default\"])(\"#user_mode\").val(),\n event_url: window.location.origin + _CTFd[\"default\"].config.urlRoot,\n redirect_url: window.location.origin + _CTFd[\"default\"].config.urlRoot + \"/redirect\",\n integration_setup_url: window.location.origin + _CTFd[\"default\"].config.urlRoot + \"/setup/integrations\",\n start: (0, _jquery[\"default\"])(\"#start-preview\").val(),\n end: (0, _jquery[\"default\"])(\"#end-preview\").val(),\n platform: \"CTFd\",\n state: window.STATE\n };\n var ret = [];\n\n for (var p in params) {\n ret.push(encodeURIComponent(p) + \"=\" + encodeURIComponent(params[p]));\n }\n\n window.open(\"https://www.majorleaguecyber.org/events/new?\" + ret.join(\"&\"), \"_blank\");\n}\n\n(0, _jquery[\"default\"])(function () {\n (0, _jquery[\"default\"])(\".tab-next\").click(switchTab);\n (0, _jquery[\"default\"])(\"input\").on(\"keypress\", function (e) {\n // Hook Enter button\n if (e.keyCode == 13) {\n e.preventDefault();\n (0, _jquery[\"default\"])(e.target).closest(\".tab-pane\").find(\"button[data-href]\").click();\n }\n });\n (0, _jquery[\"default\"])(\"#integration-mlc\").click(mlcSetup);\n (0, _jquery[\"default\"])(\"#start-date,#start-time\").change(processDateTime(\"start\"));\n (0, _jquery[\"default\"])(\"#end-date,#end-time\").change(processDateTime(\"end\"));\n (0, _jquery[\"default\"])(\"#config-color-picker\").on(\"input\", function (_e) {\n (0, _jquery[\"default\"])(\"#config-color-input\").val((0, _jquery[\"default\"])(this).val());\n });\n (0, _jquery[\"default\"])(\"#config-color-reset\").click(function () {\n (0, _jquery[\"default\"])(\"#config-color-input\").val(\"\");\n (0, _jquery[\"default\"])(\"#config-color-picker\").val(\"\");\n });\n window.addEventListener(\"storage\", function (event) {\n if (event.key == \"integrations\" && event.newValue) {\n var integration = JSON.parse(event.newValue);\n\n if (integration[\"name\"] == \"mlc\") {\n (0, _jquery[\"default\"])(\"#integration-mlc\").text(\"Already Configured\").attr(\"disabled\", true);\n window.focus();\n localStorage.removeItem(\"integrations\");\n }\n }\n });\n (0, _jquery[\"default\"])(\"#setup-form\").submit(function (e) {\n if ((0, _jquery[\"default\"])(\"#newsletter-checkbox\").prop(\"checked\")) {\n var email = (0, _jquery[\"default\"])(e.target).find(\"input[name=email]\").val();\n\n _jquery[\"default\"].ajax({\n url: \"https://newsletters.ctfd.io/lists/ot889gr1sa0e1/subscribe/post-json?c=?\",\n data: {\n email: email,\n b_38e27f7d496889133d2214208_d7c3ed71f9: \"\"\n },\n dataType: \"jsonp\",\n contentType: \"application/json; charset=utf-8\"\n });\n }\n });\n});\n\n//# sourceURL=webpack:///./CTFd/themes/core/assets/js/pages/setup.js?"); +eval("\n\n__webpack_require__(/*! ./main */ \"./CTFd/themes/core/assets/js/pages/main.js\");\n\nvar _jquery = _interopRequireDefault(__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"));\n\nvar _dayjs = _interopRequireDefault(__webpack_require__(/*! dayjs */ \"./node_modules/dayjs/dayjs.min.js\"));\n\nvar _CTFd = _interopRequireDefault(__webpack_require__(/*! ../CTFd */ \"./CTFd/themes/core/assets/js/CTFd.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nfunction switchTab(event) {\n event.preventDefault(); // Handle tab validation\n\n var valid_tab = true;\n (0, _jquery[\"default\"])(event.target).closest(\"[role=tabpanel]\").find(\"input,textarea\").each(function (i, e) {\n var $e = (0, _jquery[\"default\"])(e);\n var status = e.checkValidity();\n\n if (status === false) {\n $e.removeClass(\"input-filled-valid\");\n $e.addClass(\"input-filled-invalid\");\n valid_tab = false;\n }\n });\n\n if (valid_tab == false) {\n return;\n }\n\n var href = (0, _jquery[\"default\"])(event.target).data(\"href\");\n (0, _jquery[\"default\"])(\".nav a[href=\\\"\".concat(href, \"\\\"]\")).tab(\"show\");\n}\n\nfunction processDateTime(datetime) {\n return function (_event) {\n var date_picker = (0, _jquery[\"default\"])(\"#\".concat(datetime, \"-date\"));\n var time_picker = (0, _jquery[\"default\"])(\"#\".concat(datetime, \"-time\"));\n var unix_time = (0, _dayjs[\"default\"])(\"\".concat(date_picker.val(), \" \").concat(time_picker.val()), \"YYYY-MM-DD HH:mm\").unix();\n\n if (isNaN(unix_time)) {\n (0, _jquery[\"default\"])(\"#\".concat(datetime, \"-preview\")).val(\"\");\n } else {\n (0, _jquery[\"default\"])(\"#\".concat(datetime, \"-preview\")).val(unix_time);\n }\n };\n}\n\nfunction mlcSetup(_event) {\n var params = {\n name: (0, _jquery[\"default\"])(\"#ctf_name\").val(),\n type: \"jeopardy\",\n description: (0, _jquery[\"default\"])(\"#ctf_description\").val(),\n user_mode: (0, _jquery[\"default\"])(\"#user_mode\").val(),\n event_url: window.location.origin + _CTFd[\"default\"].config.urlRoot,\n redirect_url: window.location.origin + _CTFd[\"default\"].config.urlRoot + \"/redirect\",\n integration_setup_url: window.location.origin + _CTFd[\"default\"].config.urlRoot + \"/setup/integrations\",\n start: (0, _jquery[\"default\"])(\"#start-preview\").val(),\n end: (0, _jquery[\"default\"])(\"#end-preview\").val(),\n platform: \"CTFd\",\n state: window.STATE\n };\n var ret = [];\n\n for (var p in params) {\n ret.push(encodeURIComponent(p) + \"=\" + encodeURIComponent(params[p]));\n }\n\n window.open(\"https://www.majorleaguecyber.org/events/new?\" + ret.join(\"&\"), \"_blank\");\n}\n\n(0, _jquery[\"default\"])(function () {\n (0, _jquery[\"default\"])(\".tab-next\").click(switchTab);\n (0, _jquery[\"default\"])(\"input\").on(\"keypress\", function (e) {\n // Hook Enter button\n if (e.keyCode == 13) {\n e.preventDefault();\n (0, _jquery[\"default\"])(e.target).closest(\".tab-pane\").find(\"button[data-href]\").click();\n }\n });\n (0, _jquery[\"default\"])(\"#integration-mlc\").click(mlcSetup);\n (0, _jquery[\"default\"])(\"#start-date,#start-time\").change(processDateTime(\"start\"));\n (0, _jquery[\"default\"])(\"#end-date,#end-time\").change(processDateTime(\"end\"));\n (0, _jquery[\"default\"])(\"#config-color-picker\").on(\"input\", function (_e) {\n (0, _jquery[\"default\"])(\"#config-color-input\").val((0, _jquery[\"default\"])(this).val());\n });\n (0, _jquery[\"default\"])(\"#config-color-reset\").click(function () {\n (0, _jquery[\"default\"])(\"#config-color-input\").val(\"\");\n (0, _jquery[\"default\"])(\"#config-color-picker\").val(\"\");\n });\n (0, _jquery[\"default\"])(\"#ctf_logo\").on(\"change\", function () {\n if (this.files[0].size > 128000) {\n if (!confirm(\"This image file is larger than 128KB which may result in increased load times. Are you sure you'd like to use this logo?\")) {\n this.value = \"\";\n }\n }\n });\n (0, _jquery[\"default\"])(\"#ctf_banner\").on(\"change\", function () {\n if (this.files[0].size > 512000) {\n if (!confirm(\"This image file is larger than 512KB which may result in increased load times. Are you sure you'd like to use this icon?\")) {\n this.value = \"\";\n }\n }\n });\n (0, _jquery[\"default\"])(\"#ctf_small_icon\").on(\"change\", function () {\n if (this.files[0].size > 32000) {\n if (!confirm(\"This image file is larger than 32KB which may result in increased load times. Are you sure you'd like to use this icon?\")) {\n this.value = \"\";\n }\n }\n });\n window.addEventListener(\"storage\", function (event) {\n if (event.key == \"integrations\" && event.newValue) {\n var integration = JSON.parse(event.newValue);\n\n if (integration[\"name\"] == \"mlc\") {\n (0, _jquery[\"default\"])(\"#integration-mlc\").text(\"Already Configured\").attr(\"disabled\", true);\n window.focus();\n localStorage.removeItem(\"integrations\");\n }\n }\n });\n (0, _jquery[\"default\"])(\"#setup-form\").submit(function (e) {\n if ((0, _jquery[\"default\"])(\"#newsletter-checkbox\").prop(\"checked\")) {\n var email = (0, _jquery[\"default\"])(e.target).find(\"input[name=email]\").val();\n\n _jquery[\"default\"].ajax({\n url: \"https://newsletters.ctfd.io/lists/ot889gr1sa0e1/subscribe/post-json?c=?\",\n data: {\n email: email,\n b_38e27f7d496889133d2214208_d7c3ed71f9: \"\"\n },\n dataType: \"jsonp\",\n contentType: \"application/json; charset=utf-8\"\n });\n }\n });\n});\n\n//# sourceURL=webpack:///./CTFd/themes/core/assets/js/pages/setup.js?"); /***/ }) diff --git a/CTFd/themes/core/static/js/pages/setup.min.js b/CTFd/themes/core/static/js/pages/setup.min.js index d19168db..c18a5991 100644 --- a/CTFd/themes/core/static/js/pages/setup.min.js +++ b/CTFd/themes/core/static/js/pages/setup.min.js @@ -1 +1 @@ -!function(d){function e(e){for(var t,i,o=e[0],n=e[1],a=e[2],r=0,s=[];r".concat(e.body,"

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

".concat(e.body,"

")):i.find(".modal-body").append((0,s.default)(e.body));var o=(0,s.default)(f),n=(0,s.default)(u);return i.find(".modal-footer").append(n),i.find(".modal-footer").append(o),i.find("pre code").each(function(e){a.default.highlightBlock(this)}),(0,s.default)("main").append(i),(0,s.default)(i).on("hidden.bs.modal",function(){(0,s.default)(this).modal("dispose")}),(0,s.default)(o).click(function(){e.success()}),i.modal("show"),i}function g(e){if(e.target){var t=(0,s.default)(e.target);return t.find(".progress-bar").css("width",e.width+"%"),t}var i=c.format(e.width),o=r.format(e.title),n=(0,s.default)(o);return n.find(".modal-body").append((0,s.default)(i)),(0,s.default)("main").append(n),n.modal("show")}function j(e){var t={success:p,error:n}[e.type].format(e.body);return(0,s.default)(t)}var y={ezAlert:m,ezToast:h,ezQuery:v,ezProgressBar:g,ezBadge:j};t.default=y},"./CTFd/themes/core/assets/js/fetch.js":function(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0,i("./node_modules/whatwg-fetch/fetch.js");var o,n=(o=i("./CTFd/themes/core/assets/js/config.js"))&&o.__esModule?o:{default:o};var a=window.fetch;t.default=function(e,t){return void 0===t&&(t={method:"GET",credentials:"same-origin",headers:{}}),e=n.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"]=n.default.csrfNonce,a(e,t)}},"./CTFd/themes/core/assets/js/pages/main.js":function(e,t,i){var o=m(i("./CTFd/themes/core/assets/js/CTFd.js")),n=m(i("./node_modules/jquery/dist/jquery.js")),a=m(i("./node_modules/dayjs/dayjs.min.js")),r=m(i("./node_modules/dayjs/plugin/advancedFormat.js")),s=m(i("./node_modules/nunjucks/browser/nunjucks.js")),d=i("./node_modules/howler/dist/howler.js"),c=m(i("./CTFd/themes/core/assets/js/events.js")),p=m(i("./CTFd/themes/core/assets/js/config.js")),l=m(i("./CTFd/themes/core/assets/js/styles.js")),u=m(i("./CTFd/themes/core/assets/js/times.js")),f=m(i("./CTFd/themes/core/assets/js/helpers.js"));function m(e){return e&&e.__esModule?e:{default:e}}a.default.extend(r.default),o.default.init(window.init),window.CTFd=o.default,window.helpers=f.default,window.$=n.default,window.dayjs=a.default,window.nunjucks=s.default,window.Howl=d.Howl,(0,n.default)(function(){(0,l.default)(),(0,u.default)(),(0,c.default)(p.default.urlRoot)})},"./CTFd/themes/core/assets/js/pages/setup.js":function(e,t,i){i("./CTFd/themes/core/assets/js/pages/main.js");var a=o(i("./node_modules/jquery/dist/jquery.js")),r=o(i("./node_modules/dayjs/dayjs.min.js")),n=o(i("./CTFd/themes/core/assets/js/CTFd.js"));function o(e){return e&&e.__esModule?e:{default:e}}function s(e){e.preventDefault();var t,o=!0;(0,a.default)(e.target).closest("[role=tabpanel]").find("input,textarea").each(function(e,t){var i=(0,a.default)(t);!1===t.checkValidity()&&(i.removeClass("input-filled-valid"),i.addClass("input-filled-invalid"),o=!1)}),0!=o&&(t=(0,a.default)(e.target).data("href"),(0,a.default)('.nav a[href="'.concat(t,'"]')).tab("show"))}function d(n){return function(e){var t=(0,a.default)("#".concat(n,"-date")),i=(0,a.default)("#".concat(n,"-time")),o=(0,r.default)("".concat(t.val()," ").concat(i.val()),"YYYY-MM-DD HH:mm").unix();isNaN(o)?(0,a.default)("#".concat(n,"-preview")).val(""):(0,a.default)("#".concat(n,"-preview")).val(o)}}function c(e){var t,i={name:(0,a.default)("#ctf_name").val(),type:"jeopardy",description:(0,a.default)("#ctf_description").val(),user_mode:(0,a.default)("#user_mode").val(),event_url:window.location.origin+n.default.config.urlRoot,redirect_url:window.location.origin+n.default.config.urlRoot+"/redirect",integration_setup_url:window.location.origin+n.default.config.urlRoot+"/setup/integrations",start:(0,a.default)("#start-preview").val(),end:(0,a.default)("#end-preview").val(),platform:"CTFd",state:window.STATE},o=[];for(t in i)o.push(encodeURIComponent(t)+"="+encodeURIComponent(i[t]));window.open("https://www.majorleaguecyber.org/events/new?"+o.join("&"),"_blank")}(0,a.default)(function(){(0,a.default)(".tab-next").click(s),(0,a.default)("input").on("keypress",function(e){13==e.keyCode&&(e.preventDefault(),(0,a.default)(e.target).closest(".tab-pane").find("button[data-href]").click())}),(0,a.default)("#integration-mlc").click(c),(0,a.default)("#start-date,#start-time").change(d("start")),(0,a.default)("#end-date,#end-time").change(d("end")),(0,a.default)("#config-color-picker").on("input",function(e){(0,a.default)("#config-color-input").val((0,a.default)(this).val())}),(0,a.default)("#config-color-reset").click(function(){(0,a.default)("#config-color-input").val(""),(0,a.default)("#config-color-picker").val("")}),window.addEventListener("storage",function(e){"integrations"==e.key&&e.newValue&&"mlc"==JSON.parse(e.newValue).name&&((0,a.default)("#integration-mlc").text("Already Configured").attr("disabled",!0),window.focus(),localStorage.removeItem("integrations"))}),(0,a.default)("#setup-form").submit(function(e){var t;(0,a.default)("#newsletter-checkbox").prop("checked")&&(t=(0,a.default)(e.target).find("input[name=email]").val(),a.default.ajax({url:"https://newsletters.ctfd.io/lists/ot889gr1sa0e1/subscribe/post-json?c=?",data:{email:t,b_38e27f7d496889133d2214208_d7c3ed71f9:""},dataType:"jsonp",contentType:"application/json; charset=utf-8"}))})})},"./CTFd/themes/core/assets/js/patch.js":function(e,t,i){var o,s=(o=i("./node_modules/q/q.js"))&&o.__esModule?o:{default:o},n=i("./CTFd/themes/core/assets/js/api.js");function r(t,e){var i,o=Object.keys(t);return Object.getOwnPropertySymbols&&(i=Object.getOwnPropertySymbols(t),e&&(i=i.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),o.push.apply(o,i)),o}function a(n){for(var e=1;e").text(e).html()},t.cumulativeSum=function(e){for(var t=e.concat(),i=0;i'),(0,r.default)("th.sort-col").click(function(){var n,e=(0,r.default)(this).parents("table").eq(0),t=e.find("tr:gt(0)").toArray().sort((n=(0,r.default)(this).index(),function(e,t){var i=a(e,n),o=a(t,n);return r.default.isNumeric(i)&&r.default.isNumeric(o)?i-o:i.toString().localeCompare(o)}));this.asc=!this.asc,this.asc||(t=t.reverse());for(var i=0;i".concat(e.body,"

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

".concat(e.body,"

")):i.find(".modal-body").append((0,s.default)(e.body));var o=(0,s.default)(f),n=(0,s.default)(u);return i.find(".modal-footer").append(n),i.find(".modal-footer").append(o),i.find("pre code").each(function(e){a.default.highlightBlock(this)}),(0,s.default)("main").append(i),(0,s.default)(i).on("hidden.bs.modal",function(){(0,s.default)(this).modal("dispose")}),(0,s.default)(o).click(function(){e.success()}),i.modal("show"),i}function v(e){if(e.target){var t=(0,s.default)(e.target);return t.find(".progress-bar").css("width",e.width+"%"),t}var i=c.format(e.width),o=r.format(e.title),n=(0,s.default)(o);return n.find(".modal-body").append((0,s.default)(i)),(0,s.default)("main").append(n),n.modal("show")}function j(e){var t={success:p,error:n}[e.type].format(e.body);return(0,s.default)(t)}var y={ezAlert:m,ezToast:h,ezQuery:g,ezProgressBar:v,ezBadge:j};t.default=y},"./CTFd/themes/core/assets/js/fetch.js":function(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0,i("./node_modules/whatwg-fetch/fetch.js");var o,n=(o=i("./CTFd/themes/core/assets/js/config.js"))&&o.__esModule?o:{default:o};var a=window.fetch;t.default=function(e,t){return void 0===t&&(t={method:"GET",credentials:"same-origin",headers:{}}),e=n.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"]=n.default.csrfNonce,a(e,t)}},"./CTFd/themes/core/assets/js/pages/main.js":function(e,t,i){var o=m(i("./CTFd/themes/core/assets/js/CTFd.js")),n=m(i("./node_modules/jquery/dist/jquery.js")),a=m(i("./node_modules/dayjs/dayjs.min.js")),r=m(i("./node_modules/dayjs/plugin/advancedFormat.js")),s=m(i("./node_modules/nunjucks/browser/nunjucks.js")),d=i("./node_modules/howler/dist/howler.js"),c=m(i("./CTFd/themes/core/assets/js/events.js")),p=m(i("./CTFd/themes/core/assets/js/config.js")),l=m(i("./CTFd/themes/core/assets/js/styles.js")),u=m(i("./CTFd/themes/core/assets/js/times.js")),f=m(i("./CTFd/themes/core/assets/js/helpers.js"));function m(e){return e&&e.__esModule?e:{default:e}}a.default.extend(r.default),o.default.init(window.init),window.CTFd=o.default,window.helpers=f.default,window.$=n.default,window.dayjs=a.default,window.nunjucks=s.default,window.Howl=d.Howl,(0,n.default)(function(){(0,l.default)(),(0,u.default)(),(0,c.default)(p.default.urlRoot)})},"./CTFd/themes/core/assets/js/pages/setup.js":function(e,t,i){i("./CTFd/themes/core/assets/js/pages/main.js");var a=o(i("./node_modules/jquery/dist/jquery.js")),r=o(i("./node_modules/dayjs/dayjs.min.js")),n=o(i("./CTFd/themes/core/assets/js/CTFd.js"));function o(e){return e&&e.__esModule?e:{default:e}}function s(e){e.preventDefault();var t,o=!0;(0,a.default)(e.target).closest("[role=tabpanel]").find("input,textarea").each(function(e,t){var i=(0,a.default)(t);!1===t.checkValidity()&&(i.removeClass("input-filled-valid"),i.addClass("input-filled-invalid"),o=!1)}),0!=o&&(t=(0,a.default)(e.target).data("href"),(0,a.default)('.nav a[href="'.concat(t,'"]')).tab("show"))}function d(n){return function(e){var t=(0,a.default)("#".concat(n,"-date")),i=(0,a.default)("#".concat(n,"-time")),o=(0,r.default)("".concat(t.val()," ").concat(i.val()),"YYYY-MM-DD HH:mm").unix();isNaN(o)?(0,a.default)("#".concat(n,"-preview")).val(""):(0,a.default)("#".concat(n,"-preview")).val(o)}}function c(e){var t,i={name:(0,a.default)("#ctf_name").val(),type:"jeopardy",description:(0,a.default)("#ctf_description").val(),user_mode:(0,a.default)("#user_mode").val(),event_url:window.location.origin+n.default.config.urlRoot,redirect_url:window.location.origin+n.default.config.urlRoot+"/redirect",integration_setup_url:window.location.origin+n.default.config.urlRoot+"/setup/integrations",start:(0,a.default)("#start-preview").val(),end:(0,a.default)("#end-preview").val(),platform:"CTFd",state:window.STATE},o=[];for(t in i)o.push(encodeURIComponent(t)+"="+encodeURIComponent(i[t]));window.open("https://www.majorleaguecyber.org/events/new?"+o.join("&"),"_blank")}(0,a.default)(function(){(0,a.default)(".tab-next").click(s),(0,a.default)("input").on("keypress",function(e){13==e.keyCode&&(e.preventDefault(),(0,a.default)(e.target).closest(".tab-pane").find("button[data-href]").click())}),(0,a.default)("#integration-mlc").click(c),(0,a.default)("#start-date,#start-time").change(d("start")),(0,a.default)("#end-date,#end-time").change(d("end")),(0,a.default)("#config-color-picker").on("input",function(e){(0,a.default)("#config-color-input").val((0,a.default)(this).val())}),(0,a.default)("#config-color-reset").click(function(){(0,a.default)("#config-color-input").val(""),(0,a.default)("#config-color-picker").val("")}),(0,a.default)("#ctf_logo").on("change",function(){128e3").text(e).html()},t.cumulativeSum=function(e){for(var t=e.concat(),i=0;i'),(0,r.default)("th.sort-col").click(function(){var n,e=(0,r.default)(this).parents("table").eq(0),t=e.find("tr:gt(0)").toArray().sort((n=(0,r.default)(this).index(),function(e,t){var i=a(e,n),o=a(t,n);return r.default.isNumeric(i)&&r.default.isNumeric(o)?i-o:i.toString().localeCompare(o)}));this.asc=!this.asc,this.asc||(t=t.reverse());for(var i=0;i