text: var defaultUrl = localStorageGetItem("api-url") || "https://ce.judge0.com";
  var apiUrl = "https://ce.judge0.com";
  //var apiUrl = defaultUrl;
  var pbUrl = "https://pb.judge0.com";
  var wait = localStorageGetItem("wait") || false;
  var check_timeout = 300;
  
  var blinkStatusLine = ((localStorageGetItem("blink") || "true") === "true");
  var editorMode = localStorageGetItem("editorMode") || "normal";
  var redirectStderrToStdout = ((localStorageGetItem("redirectStderrToStdout") || "false") === "true");
  var editorModeObject = null;
  
  var fontSize = 14;
  
  var MonacoVim;
  var MonacoEmacs;
  
  var layout;
  
  var sourceEditor;
  var stdinEditor;
  var stdoutEditor;
  var stderrEditor;
  var compileOutputEditor;
  var sandboxMessageEditor;
  
  var isEditorDirty = false;
  var currentLanguageId;
  
  var $selectLanguage;
  var $compilerOptions;
  var $commandLineArguments;
  var $insertTemplateBtn;
  var $saveBtn
  var $runBtn;
  var $navigationMessage;
  var $updates;
  var $statusLine;
  
  var timeStart;
  var timeEnd;
  
  var messagesData;
  
  var layoutConfig = {
      settings: {
          showPopoutIcon: false,
          reorderEnabled: true
      },
      dimensions: {
          borderWidth: 3,
          headerHeight: 22
      },
      content: [{
          type: "row",
          content: [{
              type: "component",
              componentName: "source",
              title: "SOURCE",
              isClosable: false,
              componentState: {
                  readOnly: false
              },
              width: 60
          }, {
              type: "column",
              content: [{
                  type: "stack",
                  content: [{
                      type: "component",
                      componentName: "stdin",
                      title: "STDIN",
                      isClosable: false,
                      componentState: {
                          readOnly: false
                      }
                  }]
              }, {
                  type: "stack",
                  content: [{
                          type: "component",
                          componentName: "stdout",
                          title: "STDOUT",
                          isClosable: false,
                          componentState: {
                              readOnly: true
                          }
                      }, {
                          type: "component",
                          componentName: "stderr",
                          title: "STDERR",
                          isClosable: false,
                          componentState: {
                              readOnly: true
                          }
                      }, {
                          type: "component",
                          componentName: "compile output",
                          title: "COMPILE OUTPUT",
                          isClosable: false,
                          componentState: {
                              readOnly: true
                          }
                      }, {
                          type: "component",
                          componentName: "sandbox message",
                          title: "SANDBOX MESSAGE",
                          isClosable: false,
                          componentState: {
                              readOnly: true
                          }
                      }]
              }]
          }]
      }]
  };
  
  function encode(str) {
      return btoa(unescape(encodeURIComponent(str || "")));
  }
  
  function decode(bytes) {
      var escaped = escape(atob(bytes || ""));
      try {
          return decodeURIComponent(escaped);
      } catch {
          return unescape(escaped);
      }
  }
  
  function localStorageSetItem(key, value) {
    try {
      localStorage.setItem(key, value);
    } catch (ignorable) {
    }
  }
  
  function localStorageGetItem(key) {
    try {
      return localStorage.getItem(key);
    } catch (ignorable) {
      return null;
    }
  }
  
  function showMessages() {
      var width = $updates.offset().left - parseFloat($updates.css("padding-left")) -
                  $navigationMessage.parent().offset().left - parseFloat($navigationMessage.parent().css("padding-left")) - 5;
  
      if (width < 200 || messagesData === undefined) {
          return;
      }
  
      var messages = messagesData["messages"];
  
      $navigationMessage.css("animation-duration", messagesData["duration"]);
      $navigationMessage.parent().width(width - 5);
  
      var combinedMessage = "";
      for (var i = 0; i < messages.length; ++i) {
          combinedMessage += `${messages[i]}`;
          if (i != messages.length - 1) {
              combinedMessage += "&nbsp".repeat(Math.min(200, messages[i].length));
          }
      }
  
      $navigationMessage.html(combinedMessage);
  }
  
  function loadMessages() {
      $.ajax({
          url: `https://minio.judge0.com/public/ide/messages.json?${Date.now()}`,
          type: "GET",
          headers: {
              "Accept": "application/json"
          },
          success: function (data, textStatus, jqXHR) {
              messagesData = data;
              showMessages();
          }
      });
  }
  
  function showError(title, content) {
      $("#site-modal #title").html(title);
      $("#site-modal .content").html(content);
      $("#site-modal").modal("show");
  }
  
  function handleError(jqXHR, textStatus, errorThrown) {
      showError(`${jqXHR.statusText} (${jqXHR.status})`, `<pre>${JSON.stringify(jqXHR, null, 4)}</pre>`);
  }
  
  function handleRunError(jqXHR, textStatus, errorThrown) {
      handleError(jqXHR, textStatus, errorThrown);
      $runBtn.removeClass("loading");
  }
  
  function handleResult(data) {
      timeEnd = performance.now();
      console.log("It took " + (timeEnd - timeStart) + " ms to get submission result.");
  
      var status = data.status;
      var stdout = decode(data.stdout);
      var stderr = decode(data.stderr);
      var compile_output = decode(data.compile_output);
      var sandbox_message = decode(data.message);
      var time = (data.time === null ? "-" : data.time + "s");
      var memory = (data.memory === null ? "-" : data.memory + "KB");
  
      $statusLine.html(`${status.description}, ${time}, ${memory}`);
  
      if (blinkStatusLine) {
          $statusLine.addClass("blink");
          setTimeout(function() {
              blinkStatusLine = false;
              localStorageSetItem("blink", "false");
              $statusLine.removeClass("blink");
          }, 3000);
      }
  
      stdoutEditor.setValue(stdout);
      stderrEditor.setValue(stderr);
      compileOutputEditor.setValue(compile_output);
      sandboxMessageEditor.setValue(sandbox_message);
  
      if (stdout !== "") {
          var dot = document.getElementById("stdout-dot");
          if (!dot.parentElement.classList.contains("lm_active")) {
              dot.hidden = false;
          }
      }
      if (stderr !== "") {
          var dot = document.getElementById("stderr-dot");
          if (!dot.parentElement.classList.contains("lm_active")) {
              dot.hidden = false;
          }
      }
      if (compile_output !== "") {
          var dot = document.getElementById("compile-output-dot");
          if (!dot.parentElement.classList.contains("lm_active")) {
              dot.hidden = false;
          }
      }
      if (sandbox_message !== "") {
          var dot = document.getElementById("sandbox-message-dot");
          if (!dot.parentElement.classList.contains("lm_active")) {
              dot.hidden = false;
          }
      }
  
      $runBtn.removeClass("loading");
  }
  
  function getIdFromURI() {
    var uri = location.search.substr(1).trim();
    return uri.split("&")[0];
  }
  
  
  function save() {
      var content = JSON.stringify({
          source_code: encode(sourceEditor.getValue()),
          language_id: $selectLanguage.val(),
          compiler_options: $compilerOptions.val(),
          command_line_arguments: $commandLineArguments.val(),
          stdin: encode(stdinEditor.getValue()),
          stdout: encode(stdoutEditor.getValue()),
          stderr: encode(stderrEditor.getValue()),
          compile_output: encode(compileOutputEditor.getValue()),
          sandbox_message: encode(sandboxMessageEditor.getValue()),
          status_line: encode($statusLine.html())
      });
      var filename = "judge0-ide.json";
      var data = {
          content: content,
          filename: filename
      };
  
      $.ajax({
          url: pbUrl,
          type: "POST",
          async: true,
          headers: {
              "Accept": "application/json"
          },
          data: data,
          success: function (data, textStatus, jqXHR) {
              if (getIdFromURI() != data["short"]) {
                  window.history.replaceState(null, null, location.origin + location.pathname + "?" + data["short"]);
              }
          },
          error: function (jqXHR, textStatus, errorThrown) {
              handleError(jqXHR, textStatus, errorThrown);
          }
      });
  }
  
  function downloadSource() {
      var value = parseInt($selectLanguage.val());
      download(sourceEditor.getValue(), fileNames[value], "text/plain");
  }
  
  function loadSavedSource() {
      snippet_id = getIdFromURI();
  
      if (snippet_id.length == 36) {
          $.ajax({
              url: apiUrl + "/submissions/" + snippet_id + "?fields=source_code,language_id,stdin,stdout,stderr,compile_output,message,time,memory,status,compiler_options,command_line_arguments&base64_encoded=true",
              type: "GET",
              success: function(data, textStatus, jqXHR) {
                  sourceEditor.setValue(decode(data["source_code"]));
                  $selectLanguage.dropdown("set selected", data["language_id"]);
                  $compilerOptions.val(data["compiler_options"]);
                  $commandLineArguments.val(data["command_line_arguments"]);
                  stdinEditor.setValue(decode(data["stdin"]));
                  stdoutEditor.setValue(decode(data["stdout"]));
                  stderrEditor.setValue(decode(data["stderr"]));
                  compileOutputEditor.setValue(decode(data["compile_output"]));
                  sandboxMessageEditor.setValue(decode(data["message"]));
                  var time = (data.time === null ? "-" : data.time + "s");
                  var memory = (data.memory === null ? "-" : data.memory + "KB");
                  $statusLine.html(`${data.status.description}, ${time}, ${memory}`);
                  changeEditorLanguage();
              },
              error: handleRunError
          });
      } else if (snippet_id.length == 4) {
          $.ajax({
              url: pbUrl + "/" + snippet_id + ".json",
              type: "GET",
              success: function (data, textStatus, jqXHR) {
                  sourceEditor.setValue(decode(data["source_code"]));
                  $selectLanguage.dropdown("set selected", data["language_id"]);
                  $compilerOptions.val(data["compiler_options"]);
                  $commandLineArguments.val(data["command_line_arguments"]);
                  stdinEditor.setValue(decode(data["stdin"]));
                  stdoutEditor.setValue(decode(data["stdout"]));
                  stderrEditor.setValue(decode(data["stderr"]));
                  compileOutputEditor.setValue(decode(data["compile_output"]));
                  sandboxMessageEditor.setValue(decode(data["sandbox_message"]));
                  $statusLine.html(decode(data["status_line"]));
                  changeEditorLanguage();
              },
              error: function (jqXHR, textStatus, errorThrown) {
                  showError("Not Found", "Code not found!");
                  window.history.replaceState(null, null, location.origin + location.pathname);
                  loadRandomLanguage();
              }
          });
      } else {
          loadRandomLanguage();
      }
  }
  
  function run() {
      if (sourceEditor.getValue().trim() === "") {
          showError("Error", "Source code can't be empty!");
          return;
      } else {
          $runBtn.addClass("loading");
      }
  
      document.getElementById("stdout-dot").hidden = true;
      document.getElementById("stderr-dot").hidden = true;
      document.getElementById("compile-output-dot").hidden = true;
      document.getElementById("sandbox-message-dot").hidden = true;
  
      stdoutEditor.setValue("");
      stderrEditor.setValue("");
      compileOutputEditor.setValue("");
      sandboxMessageEditor.setValue("");
  
      var sourceValue = encode(sourceEditor.getValue());
      var stdinValue = encode(stdinEditor.getValue());
      var languageId = resolveLanguageId($selectLanguage.val());
      var compilerOptions = $compilerOptions.val();
      var commandLineArguments = $commandLineArguments.val();
  
      if (parseInt(languageId) === 44) {
          sourceValue = sourceEditor.getValue();
      }
  
      var data = {
          source_code: sourceValue,
          language_id: languageId,
          stdin: stdinValue,
          compiler_options: compilerOptions,
          command_line_arguments: commandLineArguments,
          redirect_stderr_to_stdout: redirectStderrToStdout
      };
  
      var sendRequest = function(data) {
          timeStart = performance.now();
          $.ajax({
              url: apiUrl + `/submissions?base64_encoded=true&wait=${wait}`,
              type: "POST",
              async: true,
              contentType: "application/json",
              data: JSON.stringify(data),
              xhrFields: {
                  withCredentials: apiUrl.indexOf("/secure") != -1 ? true : false
              },
              success: function (data, textStatus, jqXHR) {
                  console.log(`Your submission token is: ${data.token}`);
                  if (wait == true) {
                      handleResult(data);
                  } else {
                      setTimeout(fetchSubmission.bind(null, data.token), check_timeout);
                  }
              },
              error: handleRunError
          });
      }
  
      var fetchAdditionalFiles = false;
      if (parseInt(languageId) === 82) {
          if (sqliteAdditionalFiles === "") {
              fetchAdditionalFiles = true;
              $.ajax({
                  url: `https://minio.judge0.com/public/ide/sqliteAdditionalFiles.base64.txt?${Date.now()}`,
                  type: "GET",
                  async: true,
                  contentType: "text/plain",
                  success: function (responseData, textStatus, jqXHR) {
                      sqliteAdditionalFiles = responseData;
                      data["additional_files"] = sqliteAdditionalFiles;
                      sendRequest(data);
                  },
                  error: handleRunError
              });
          }
          else {
              data["additional_files"] = sqliteAdditionalFiles;
          }
      }
  
      if (!fetchAdditionalFiles) {
          sendRequest(data);
      }
  }
  
  function fetchSubmission(submission_token) {
      $.ajax({
          url: apiUrl + "/submissions/" + submission_token + "?base64_encoded=true",
          type: "GET",
          async: true,
          success: function (data, textStatus, jqXHR) {
              if (data.status.id <= 2) { // In Queue or Processing
                  setTimeout(fetchSubmission.bind(null, submission_token), check_timeout);
                  return;
              }
              handleResult(data);
          },
          error: handleRunError
      });
  }
  
  function changeEditorLanguage() {
      monaco.editor.setModelLanguage(sourceEditor.getModel(), $selectLanguage.find(":selected").attr("mode"));
      currentLanguageId = parseInt($selectLanguage.val());
      $(".lm_title")[0].innerText = fileNames[currentLanguageId];
      apiUrl = resolveApiUrl($selectLanguage.val());
  
  }
  
  function insertTemplate() {
      currentLanguageId = parseInt($selectLanguage.val());
      sourceEditor.setValue(sources[currentLanguageId]);
      changeEditorLanguage();
  }
  
  function loadRandomLanguage() {
      var values = [];
      for (var i = 0; i < $selectLanguage[0].options.length; ++i) {
          values.push($selectLanguage[0].options[i].value);
      }
      // $selectLanguage.dropdown("set selected", values[Math.floor(Math.random() * $selectLanguage[0].length)]);
      $selectLanguage.dropdown("set selected", values[55]);
      apiUrl = resolveApiUrl($selectLanguage.val());
      insertTemplate();
  }
  
  function resizeEditor(layoutInfo) {
      if (editorMode != "normal") {
          var statusLineHeight = $("#editor-status-line").height();
          layoutInfo.height -= statusLineHeight;
          layoutInfo.contentHeight -= statusLineHeight;
      }
  }
  
  function disposeEditorModeObject() {
      try {
          editorModeObject.dispose();
          editorModeObject = null;
      } catch(ignorable) {
      }
  }
  
  function changeEditorMode() {
      disposeEditorModeObject();
  
      if (editorMode == "vim") {
          editorModeObject = MonacoVim.initVimMode(sourceEditor, $("#editor-status-line")[0]);
      } else if (editorMode == "emacs") {
          var statusNode = $("#editor-status-line")[0];
          editorModeObject = new MonacoEmacs.EmacsExtension(sourceEditor);
          editorModeObject.onDidMarkChange(function(e) {
            statusNode.textContent = e ? "Mark Set!" : "Mark Unset";
          });
          editorModeObject.onDidChangeKey(function(str) {
            statusNode.textContent = str;
          });
          editorModeObject.start();
      }
  }
  
  function resolveLanguageId(id) {
      id = parseInt(id);
      return languageIdTable[id] || id;
  }
  
  function resolveApiUrl(id) {
      id = parseInt(id);
      return languageApiUrlTable[id] || defaultUrl;
  }
  
  function editorsUpdateFontSize(fontSize) {
      sourceEditor.updateOptions({fontSize: fontSize});
      stdinEditor.updateOptions({fontSize: fontSize});
      stdoutEditor.updateOptions({fontSize: fontSize});
      stderrEditor.updateOptions({fontSize: fontSize});
      compileOutputEditor.updateOptions({fontSize: fontSize});
      sandboxMessageEditor.updateOptions({fontSize: fontSize});
  }
  
  function updateScreenElements() {
      var display = window.innerWidth <= 1200 ? "none" : "";
      $(".wide.screen.only").each(function(index) {
          $(this).css("display", display);
      });
  }
  
  $(window).resize(function() {
      layout.updateSize();
      updateScreenElements();
      showMessages();
  });
  
  $(document).ready(function () {
      updateScreenElements();
  
      console.log("Hey, Judge0 IDE is open-sourced: https://github.com/judge0/ide. Have fun!");
  
      $selectLanguage = $("#select-language");
      $selectLanguage.change(function (e) {
          if (!isEditorDirty) {
              insertTemplate();
          } else {
              changeEditorLanguage();
          }
      });
  
      $compilerOptions = $("#compiler-options");
      $commandLineArguments = $("#command-line-arguments");
      $commandLineArguments.attr("size", $commandLineArguments.attr("placeholder").length);
  
      $insertTemplateBtn = $("#insert-template-btn");
      $insertTemplateBtn.click(function (e) {
          if (isEditorDirty && confirm("Are you sure? Your current changes will be lost.")) {
              insertTemplate();
          }
      });
  
      $runBtn = $("#run-btn");
      $runBtn.click(function (e) {
          run();
      });
  
      $navigationMessage = $("#navigation-message span");
      $updates = $("#judge0-more");
  
      $(`input[name="editor-mode"][value="${editorMode}"]`).prop("checked", true);
      $("input[name=\"editor-mode\"]").on("change", function(e) {
          editorMode = e.target.value;
          localStorageSetItem("editorMode", editorMode);
  
          resizeEditor(sourceEditor.getLayoutInfo());
          changeEditorMode();
  
          sourceEditor.focus();
      });
  
      $("input[name=\"redirect-output\"]").prop("checked", redirectStderrToStdout)
      $("input[name=\"redirect-output\"]").on("change", function(e) {
          redirectStderrToStdout = e.target.checked;
          localStorageSetItem("redirectStderrToStdout", redirectStderrToStdout);
      });
  
      $statusLine = $("#status-line");
  
      $("body").keydown(function (e) {
          var keyCode = e.keyCode || e.which;
          if (keyCode == 120) { // F9
              e.preventDefault();
              run();
          } else if (keyCode == 119) { // F8
              e.preventDefault();
              var url = prompt("Enter URL of Judge0 API:", apiUrl);
              if (url != null) {
                  url = url.trim();
              }
              if (url != null && url != "") {
                  apiUrl = url;
                  localStorageSetItem("api-url", apiUrl);
              }
          } else if (keyCode == 118) { // F7
              e.preventDefault();
              wait = !wait;
              localStorageSetItem("wait", wait);
              alert(`Submission wait is ${wait ? "ON. Enjoy" : "OFF"}.`);
          } else if (event.ctrlKey && keyCode == 83) { // Ctrl+S
              e.preventDefault();
              save();
          } else if (event.ctrlKey && keyCode == 107) { // Ctrl++
              e.preventDefault();
              fontSize += 1;
              editorsUpdateFontSize(fontSize);
          } else if (event.ctrlKey && keyCode == 109) { // Ctrl+-
              e.preventDefault();
              fontSize -= 1;
              editorsUpdateFontSize(fontSize);
          }
      });
  
      $("select.dropdown").dropdown();
      $(".ui.dropdown").dropdown();
      $(".ui.dropdown.site-links").dropdown({action: "hide", on: "hover"});
      $(".ui.checkbox").checkbox();
      $(".message .close").on("click", function () {
          $(this).closest(".message").transition("fade");
      });
  
      loadMessages();
  
      require(["vs/editor/editor.main", "monaco-vim", "monaco-emacs"], function (ignorable, MVim, MEmacs) {
          layout = new GoldenLayout(layoutConfig, $("#site-content"));
  
          MonacoVim = MVim;
          MonacoEmacs = MEmacs;
  
          layout.registerComponent("source", function (container, state) {
              sourceEditor = monaco.editor.create(container.getElement()[0], {
                  automaticLayout: true,
                  theme: "vs-dark",
                  scrollBeyondLastLine: true,
                  readOnly: state.readOnly,
                  language: "cpp",
                  minimap: {
                      enabled: false
                  }
              });
  
              changeEditorMode();
  
              sourceEditor.getModel().onDidChangeContent(function (e) {
                  currentLanguageId = parseInt($selectLanguage.val());
                  isEditorDirty = sourceEditor.getValue() != sources[currentLanguageId];
              });
  
              sourceEditor.onDidLayoutChange(resizeEditor);
          });
  
          layout.registerComponent("stdin", function (container, state) {
              stdinEditor = monaco.editor.create(container.getElement()[0], {
                  automaticLayout: true,
                  theme: "vs-dark",
                  scrollBeyondLastLine: false,
                  readOnly: state.readOnly,
                  language: "plaintext",
                  minimap: {
                      enabled: false
                  }
              });
          });
  
          layout.registerComponent("stdout", function (container, state) {
              stdoutEditor = monaco.editor.create(container.getElement()[0], {
                  automaticLayout: true,
                  theme: "vs-dark",
                  scrollBeyondLastLine: false,
                  readOnly: state.readOnly,
                  language: "plaintext",
                  minimap: {
                      enabled: false
                  }
              });
  
              container.on("tab", function(tab) {
                  tab.element.append("<span id=\"stdout-dot\" class=\"dot\" hidden></span>");
                  tab.element.on("mousedown", function(e) {
                      e.target.closest(".lm_tab").children[3].hidden = true;
                  });
              });
          });
  
          layout.registerComponent("stderr", function (container, state) {
              stderrEditor = monaco.editor.create(container.getElement()[0], {
                  automaticLayout: true,
                  theme: "vs-dark",
                  scrollBeyondLastLine: false,
                  readOnly: state.readOnly,
                  language: "plaintext",
                  minimap: {
                      enabled: false
                  }
              });
  
              container.on("tab", function(tab) {
                  tab.element.append("<span id=\"stderr-dot\" class=\"dot\" hidden></span>");
                  tab.element.on("mousedown", function(e) {
                      e.target.closest(".lm_tab").children[3].hidden = true;
                  });
              });
          });
  
          layout.registerComponent("compile output", function (container, state) {
              compileOutputEditor = monaco.editor.create(container.getElement()[0], {
                  automaticLayout: true,
                  theme: "vs-dark",
                  scrollBeyondLastLine: false,
                  readOnly: state.readOnly,
                  language: "plaintext",
                  minimap: {
                      enabled: false
                  }
              });
  
              container.on("tab", function(tab) {
                  tab.element.append("<span id=\"compile-output-dot\" class=\"dot\" hidden></span>");
                  tab.element.on("mousedown", function(e) {
                      e.target.closest(".lm_tab").children[3].hidden = true;
                  });
              });
          });
  
          layout.registerComponent("sandbox message", function (container, state) {
              sandboxMessageEditor = monaco.editor.create(container.getElement()[0], {
                  automaticLayout: true,
                  theme: "vs-dark",
                  scrollBeyondLastLine: false,
                  readOnly: state.readOnly,
                  language: "plaintext",
                  minimap: {
                      enabled: false
                  }
              });
  
              container.on("tab", function(tab) {
                  tab.element.append("<span id=\"sandbox-message-dot\" class=\"dot\" hidden></span>");
                  tab.element.on("mousedown", function(e) {
                      e.target.closest(".lm_tab").children[3].hidden = true;
                  });
              });
          });
  
          layout.on("initialised", function () {
              $(".monaco-editor")[0].appendChild($("#editor-status-line")[0]);
              if (getIdFromURI()) {
                  loadSavedSource();
              } else {
                  loadRandomLanguage();
              }
              $("#site-navigation").css("border-bottom", "1px solid black");
              sourceEditor.focus();
              editorsUpdateFontSize(fontSize);
          });
  
          layout.init();
      });
  });
  
  // Template Sources
  var assemblySource = "\
  section	.text\n\
      global _start\n\
  \n\
  _start:\n\
  \n\
      xor	eax, eax\n\
      lea	edx, [rax+len]\n\
      mov	al, 1\n\
      mov	esi, msg\n\
      mov	edi, eax\n\
      syscall\n\
  \n\
      xor	edi, edi\n\
      lea	eax, [rdi+60]\n\
      syscall\n\
  \n\
  section	.rodata\n\
  \n\
  msg	db 'hello, world', 0xa\n\
  len	equ	$ - msg\n\
  ";
  
  var bashSource = "echo \"hello, world\"";
  
  var basicSource = "PRINT \"hello, world\"";
  
  var cSource = "\
  // Powered by Judge0\n\
  #include <stdio.h>\n\
  \n\
  int main(void) {\n\
      printf(\"Hello Judge0!\\n\");\n\
      return 0;\n\
  }\n\
  ";
  
  var csharpSource = "\
  public class Hello {\n\
      public static void Main() {\n\
          System.Console.WriteLine(\"hello, world\");\n\
      }\n\
  }\n\
  ";
  
  var cppSource = "\
  #include <iostream>\n\
  \n\
  int main() {\n\
      std::cout << \"hello, world\" << std::endl;\n\
      return 0;\n\
  }\n\
  ";
  
  var clojureSource = "(println \"hello, world\")\n";
  
  var cobolSource = "\
  IDENTIFICATION DIVISION.\n\
  PROGRAM-ID. MAIN.\n\
  PROCEDURE DIVISION.\n\
  DISPLAY \"hello, world\".\n\
  STOP RUN.\n\
  ";
  
  var lispSource = "(write-line \"hello, world\")";
  
  var dSource = "\
  import std.stdio;\n\
  \n\
  void main()\n\
  {\n\
      writeln(\"hello, world\");\n\
  }\n\
  ";
  
  var elixirSource = "IO.puts \"hello, world\"";
  
  var erlangSource = "\
  main(_) ->\n\
      io:fwrite(\"hello, world\\n\").\n\
  ";
  
  var executableSource = "\
  Judge0 IDE assumes that content of executable is Base64 encoded.\n\
  \n\
  This means that you should Base64 encode content of your binary,\n\
  paste it here and click \"Run\".\n\
  \n\
  Here is an example of compiled \"hello, world\" NASM program.\n\
  Content of compiled binary is Base64 encoded and used as source code.\n\
  \n\
  https://ide.judge0.com/?kS_f\n\
  ";
  
  var fsharpSource = "printfn \"hello, world\"\n";
  
  var fortranSource = "\
  program main\n\
      print *, \"hello, world\"\n\
  end\n\
  ";
  
  var goSource = "\
  package main\n\
  \n\
  import \"fmt\"\n\
  \n\
  func main() {\n\
      fmt.Println(\"hello, world\")\n\
  }\n\
  ";
  
  var groovySource = "println \"hello, world\"\n";
  
  var haskellSource = "main = putStrLn \"hello, world\"";
  
  var javaSource = "\
  public class Main {\n\
      public static void main(String[] args) {\n\
          System.out.println(\"hello, world\");\n\
      }\n\
  }\n\
  ";
  
  var javaScriptSource = "console.log(\"hello, world\");";
  
  var kotlinSource = "\
  fun main() {\n\
      println(\"hello, world\")\n\
  }\n\
  ";
  
  var luaSource = "print(\"hello, world\")";
  
  var objectiveCSource = "\
  #import <Foundation/Foundation.h>\n\
  \n\
  int main() {\n\
      @autoreleasepool {\n\
          char name[10];\n\
          scanf(\"%s\", name);\n\
          NSString *message = [NSString stringWithFormat:@\"hello, %s\\n\", name];\n\
          printf(\"%s\", message.UTF8String);\n\
      }\n\
      return 0;\n\
  }\n\
  ";
  
  var ocamlSource = "print_endline \"hello, world\"";
  
  var octaveSource = "printf(\"hello, world\\n\");";
  
  var pascalSource = "\
  program Hello;\n\
  begin\n\
      writeln ('hello, world')\n\
  end.\n\
  ";
  
  var perlSource = "\
  my $name = <STDIN>;\n\
  print \"hello, $name\";\n\
  ";
  
  var phpSource = "\
  <?php\n\
  print(\"hello, world\\n\");\n\
  ?>\n\
  ";
  
  var plainTextSource = "hello, world\n";
  
  var prologSource = "\
  :- initialization(main).\n\
  main :- write('hello, world\\n').\n\
  ";
  
  var pythonSource = "print(\"hello, world\")";
  
  var rSource = "cat(\"hello, world\\n\")";
  
  var rubySource = "puts \"hello, world\"";
  
  var rustSource = "\
  fn main() {\n\
      println!(\"hello, world\");\n\
  }\n\
  ";
  
  var scalaSource = "\
  object Main {\n\
      def main(args: Array[String]) = {\n\
          val name = scala.io.StdIn.readLine()\n\
          println(\"hello, \"+ name)\n\
      }\n\
  }\n\
  ";
  
  var sqliteSource = "\
  -- On Judge0 IDE your SQL script is run on chinook database (https://www.sqlitetutorial.net/sqlite-sample-database).\n\
  -- For more information about how to use SQL with Judge0 API please\n\
  -- watch this asciicast: https://asciinema.org/a/326975.\n\
  SELECT\n\
      Name, COUNT(*) AS num_albums\n\
  FROM artists JOIN albums\n\
  ON albums.ArtistID = artists.ArtistID\n\
  GROUP BY Name\n\
  ORDER BY num_albums DESC\n\
  LIMIT 4;\n\
  ";
  var sqliteAdditionalFiles = "";
  
  var swiftSource = "\
  import Foundation\n\
  let name = readLine()\n\
  print(\"hello, \\(name!)\")\n\
  ";
  
  var typescriptSource = "console.log(\"hello, world\");";
  
  var vbSource = "\
  Public Module Program\n\
     Public Sub Main()\n\
        Console.WriteLine(\"hello, world\")\n\
     End Sub\n\
  End Module\n\
  ";
  
  var c3Source = "\
  // On the Judge0 IDE, C3 is automatically\n\
  // updated every hour to the latest commit on master branch.\n\
  module main;\n\
  \n\
  extern func void printf(char *str, ...);\n\
  \n\
  func int main()\n\
  {\n\
      printf(\"hello, world\\n\");\n\
      return 0;\n\
  }\n\
  ";
  
  var javaTestSource = "\
  import static org.junit.jupiter.api.Assertions.assertEquals;\n\
  \n\
  import org.junit.jupiter.api.Test;\n\
  \n\
  class MainTest {\n\
      static class Calculator {\n\
          public int add(int x, int y) {\n\
              return x + y;\n\
          }\n\
      }\n\
  \n\
      private final Calculator calculator = new Calculator();\n\
  \n\
      @Test\n\
      void addition() {\n\
          assertEquals(2, calculator.add(1, 1));\n\
      }\n\
  }\n\
  ";
  
  var mpiccSource = "\
  // Try adding \"-n 5\" (without quotes) into command line arguments. \n\
  #include <mpi.h>\n\
  \n\
  #include <stdio.h>\n\
  \n\
  int main()\n\
  {\n\
      MPI_Init(NULL, NULL);\n\
  \n\
      int world_size;\n\
      MPI_Comm_size(MPI_COMM_WORLD, &world_size);\n\
  \n\
      int world_rank;\n\
      MPI_Comm_rank(MPI_COMM_WORLD, &world_rank);\n\
  \n\
      printf(\"Hello from processor with rank %d out of %d processors.\\n\", world_rank, world_size);\n\
  \n\
      MPI_Finalize();\n\
  \n\
      return 0;\n\
  }\n\
  ";
  
  var mpicxxSource = "\
  // Try adding \"-n 5\" (without quotes) into command line arguments. \n\
  #include <mpi.h>\n\
  \n\
  #include <iostream>\n\
  \n\
  int main()\n\
  {\n\
      MPI_Init(NULL, NULL);\n\
  \n\
      int world_size;\n\
      MPI_Comm_size(MPI_COMM_WORLD, &world_size);\n\
  \n\
      int world_rank;\n\
      MPI_Comm_rank(MPI_COMM_WORLD, &world_rank);\n\
  \n\
      std::cout << \"Hello from processor with rank \"\n\
                << world_rank << \" out of \" << world_size << \" processors.\\n\";\n\
  \n\
      MPI_Finalize();\n\
  \n\
      return 0;\n\
  }\n\
  ";
  
  var mpipySource = "\
  # Try adding \"-n 5\" (without quotes) into command line arguments. \n\
  from mpi4py import MPI\n\
  \n\
  comm = MPI.COMM_WORLD\n\
  world_size = comm.Get_size()\n\
  world_rank = comm.Get_rank()\n\
  \n\
  print(f\"Hello from processor with rank {world_rank} out of {world_size} processors\")\n\
  ";
  
  var nimSource = "\
  # On the Judge0 IDE, Nim is automatically\n\
  # updated every day to the latest stable version.\n\
  echo \"hello, world\"\n\
  ";
  
  var pythonForMlSource = "\
  import mlxtend\n\
  import numpy\n\
  import pandas\n\
  import scipy\n\
  import sklearn\n\
  \n\
  print(\"hello, world\")\n\
  ";
  
  var bosqueSource = "\
  // On the Judge0 IDE, Bosque (https://github.com/microsoft/BosqueLanguage)\n\
  // is automatically updated every hour to the latest commit on master branch.\n\
  \n\
  namespace NSMain;\n\
  \n\
  concept WithName {\n\
      invariant $name != \"\";\n\
  \n\
      field name: String;\n\
  }\n\
  \n\
  concept Greeting {\n\
      abstract method sayHello(): String;\n\
      \n\
      virtual method sayGoodbye(): String {\n\
          return \"goodbye\";\n\
      }\n\
  }\n\
  \n\
  entity GenericGreeting provides Greeting {\n\
      const instance: GenericGreeting = GenericGreeting@{};\n\
  \n\
      override method sayHello(): String {\n\
          return \"hello world\";\n\
      }\n\
  }\n\
  \n\
  entity NamedGreeting provides WithName, Greeting {\n\
      override method sayHello(): String {\n\
          return String::concat(\"hello\", \" \", this.name);\n\
      }\n\
  }\n\
  \n\
  entrypoint function main(arg?: String): String {\n\
      var val = arg ?| \"\";\n\
      if (val == \"1\") {\n\
          return GenericGreeting@{}.sayHello();\n\
      }\n\
      elif (val == \"2\") {\n\
          return GenericGreeting::instance.sayHello();\n\
      }\n\
      else {\n\
          return NamedGreeting@{name=\"bob\"}.sayHello();\n\
      }\n\
  }\n\
  ";
  
  var cppTestSource = "\
  #include <gtest/gtest.h>\n\
  \n\
  int add(int x, int y) {\n\
      return x + y;\n\
  }\n\
  \n\
  TEST(AdditionTest, NeutralElement) {\n\
      EXPECT_EQ(1, add(1, 0));\n\
      EXPECT_EQ(1, add(0, 1));\n\
      EXPECT_EQ(0, add(0, 0));\n\
  }\n\
  \n\
  TEST(AdditionTest, CommutativeProperty) {\n\
      EXPECT_EQ(add(2, 3), add(3, 2));\n\
  }\n\
  \n\
  int main(int argc, char **argv) {\n\
      ::testing::InitGoogleTest(&argc, argv);\n\
      return RUN_ALL_TESTS();\n\
  }\n\
  ";
  
  var csharpTestSource ="\
  using NUnit.Framework;\n\
  \n\
  public class Calculator\n\
  {\n\
      public int add(int a, int b)\n\
      {\n\
          return a + b;\n\
      }\n\
  }\n\
  \n\
  [TestFixture]\n\
  public class Tests\n\
  {\n\
      private Calculator calculator;\n\
  \n\
      [SetUp]\n\
      protected void SetUp()\n\
      {\n\
          calculator = new Calculator();\n\
      }\n\
  \n\
      [Test]\n\
      public void NeutralElement()\n\
      {\n\
          Assert.AreEqual(1, calculator.add(1, 0));\n\
          Assert.AreEqual(1, calculator.add(0, 1));\n\
          Assert.AreEqual(0, calculator.add(0, 0));\n\
      }\n\
  \n\
      [Test]\n\
      public void CommutativeProperty()\n\
      {\n\
          Assert.AreEqual(calculator.add(2, 3), calculator.add(3, 2));\n\
      }\n\
  }\n\
  ";
  
  var sources = {
      45: assemblySource,
      46: bashSource,
      47: basicSource,
      48: cSource,
      49: cSource,
      50: cSource,
      51: csharpSource,
      52: cppSource,
      53: cppSource,
      54: cppSource,
      55: lispSource,
      56: dSource,
      57: elixirSource,
      58: erlangSource,
      44: executableSource,
      59: fortranSource,
      60: goSource,
      61: haskellSource,
      62: javaSource,
      63: javaScriptSource,
      64: luaSource,
      65: ocamlSource,
      66: octaveSource,
      67: pascalSource,
      68: phpSource,
      43: plainTextSource,
      69: prologSource,
      70: pythonSource,
      71: pythonSource,
      72: rubySource,
      73: rustSource,
      74: typescriptSource,
      75: cSource,
      76: cppSource,
      77: cobolSource,
      78: kotlinSource,
      79: objectiveCSource,
      80: rSource,
      81: scalaSource,
      82: sqliteSource,
      83: swiftSource,
      84: vbSource,
      85: perlSource,
      86: clojureSource,
      87: fsharpSource,
      88: groovySource,
      1001: cSource,
      1002: cppSource,
      1003: c3Source,
      1004: javaSource,
      1005: javaTestSource,
      1006: mpiccSource,
      1007: mpicxxSource,
      1008: mpipySource,
      1009: nimSource,
      1010: pythonForMlSource,
      1011: bosqueSource,
      1012: cppTestSource,
      1013: cSource,
      1014: cppSource,
      1015: cppTestSource,
      1021: csharpSource,
      1022: csharpSource,
      1023: csharpTestSource,
      1024: fsharpSource
  };
  
  var fileNames = {
      45: "main.asm",
      46: "script.sh",
      47: "main.bas",
      48: "main.c",
      49: "main.c",
      50: "main.c",
      51: "Main.cs",
      52: "main.cpp",
      53: "main.cpp",
      54: "main.cpp",
      55: "script.lisp",
      56: "main.d",
      57: "script.exs",
      58: "main.erl",
      44: "a.out",
      59: "main.f90",
      60: "main.go",
      61: "main.hs",
      62: "Main.java",
      63: "script.js",
      64: "script.lua",
      65: "main.ml",
      66: "script.m",
      67: "main.pas",
      68: "script.php",
      43: "text.txt",
      69: "main.pro",
      70: "script.py",
      71: "script.py",
      72: "script.rb",
      73: "main.rs",
      74: "script.ts",
      75: "main.c",
      76: "main.cpp",
      77: "main.cob",
      78: "Main.kt",
      79: "main.m",
      80: "script.r",
      81: "Main.scala",
      82: "script.sql",
      83: "Main.swift",
      84: "Main.vb",
      85: "script.pl",
      86: "main.clj",
      87: "script.fsx",
      88: "script.groovy",
      1001: "main.c",
      1002: "main.cpp",
      1003: "main.c3",
      1004: "Main.java",
      1005: "MainTest.java",
      1006: "main.c",
      1007: "main.cpp",
      1008: "script.py",
      1009: "main.nim",
      1010: "script.py",
      1011: "main.bsq",
      1012: "main.cpp",
      1013: "main.c",
      1014: "main.cpp",
      1015: "main.cpp",
      1021: "Main.cs",
      1022: "Main.cs",
      1023: "Test.cs",
      1024: "script.fsx"
  };
  
  var languageIdTable = {
      1001: 1,
      1002: 2,
      1003: 3,
      1004: 4,
      1005: 5,
      1006: 6,
      1007: 7,
      1008: 8,
      1009: 9,
      1010: 10,
      1011: 11,
      1012: 12,
      1013: 13,
      1014: 14,
      1015: 15,
      1021: 21,
      1022: 22,
      1023: 23,
      1024: 24
  }
  
  var extraApiUrl = "https://extra-ce.judge0.com";
  var languageApiUrlTable = {
      1001: extraApiUrl,
      1002: extraApiUrl,
      1003: extraApiUrl,
      1004: extraApiUrl,
      1005: extraApiUrl,
      1006: extraApiUrl,
      1007: extraApiUrl,
      1008: extraApiUrl,
      1009: extraApiUrl,
      1010: extraApiUrl,
      1011: extraApiUrl,
      1012: extraApiUrl,
      1013: extraApiUrl,
      1014: extraApiUrl,
      1015: extraApiUrl,
      1021: extraApiUrl,
      1022: extraApiUrl,
      1023: extraApiUrl,
      1024: extraApiUrl
  }
  