From 577eef1f46e4999284cacd72d59e35f6b66245c3 Mon Sep 17 00:00:00 2001 From: David Winn Date: Mon, 19 Feb 2018 14:47:25 +0000 Subject: [PATCH 01/21] Remove migrated V1 Assignment. --- classes/v1migration/v1migration.php | 94 +++++---------- jquery/turnitintooltwo_extra.js | 46 +------- jquery/turnitintooltwo_extra.min.js | 4 +- lib.php | 6 +- settings_extras.php | 40 +------ .../classes/v1migration/v1migration_test.php | 111 ++++++------------ tests/unit/generator/lib.php | 5 +- tests/unit/lib_test.php | 18 +-- 8 files changed, 87 insertions(+), 237 deletions(-) diff --git a/classes/v1migration/v1migration.php b/classes/v1migration/v1migration.php index cfe8098b..bee0b8de 100644 --- a/classes/v1migration/v1migration.php +++ b/classes/v1migration/v1migration.php @@ -214,7 +214,7 @@ public function migrate() { $oldersubmission = $DB->get_record('turnitintooltwo_submissions', array('submission_hash' => $v1partsubmission->submission_hash)); if ($oldersubmission) { $v1partsubmission->id = $oldersubmission->id; - $turnitintooltwosubmissionid = $DB->update_record("turnitintooltwo_submissions", $v1partsubmission); + $DB->update_record("turnitintooltwo_submissions", $v1partsubmission); } } } @@ -229,9 +229,9 @@ public function migrate() { // Update gradebook for submissions. $gradeupdates = $this->migrate_gradebook($turnitintooltwoid); - // Only change the titles if we have updated the grades. + // Once grades have been updated we can run the post migration task. if ($gradeupdates == "migrated") { - $this->update_titles_post_migration($turnitintooltwoid); + $this->post_migration($turnitintooltwoid); } // Link the v2 id to the v1 id in the session. @@ -442,33 +442,14 @@ public static function migrate_gradebook($turnitintooltwoid, $workflow = "site") * Update module titles after migration has completed. * @param int $v2assignmentid V2 Module id */ - public function update_titles_post_migration($v2assignmentid) { - global $CFG, $DB; - - // Remove the migration in progress text. - $this->v1assignment->name = str_replace(" (" . get_string('migrationinprogress', 'turnitintooltwo') . "...)", "", $this->v1assignment->name); - - // Update the assignment title with new status. - $updatetitle = new stdClass(); - $updatetitle->id = $this->v1assignment->id; - $updatetitle->name = $this->v1assignment->name . ' ('. get_string('migrated', 'turnitintooltwo') . ')'; - - $DB->update_record('turnitintool', $updatetitle); - - // Temporarily set the assignment to visible so that the cron can rebuild the course cache for this assignment, - set_coursemodule_visible($this->cm->id, 1); - rebuild_course_cache($this->cm->id); - set_coursemodule_visible($this->cm->id, 0); - - // Update the V1 assignment title in the gradebook. - @include_once($CFG->dirroot."/lib/gradelib.php"); - $params = array(); - $params['itemname'] = $updatetitle->name; - grade_update('mod/turnitintool', $this->courseid, 'mod', 'turnitintool', $this->v1assignment->id, 0, NULL, $params); - + public function post_migration($v2assignmentid) { // Update the V2 assignment title in the gradebook. + $params = array(); $params['itemname'] = $this->v1assignment->name; grade_update('mod/turnitintooltwo', $this->courseid, 'mod', 'turnitintooltwo', $v2assignmentid, 0, NULL, $params); + + // Delete the V1 assignment. + $this->turnitintooltwo_delete_assignment($this->v1assignment->id); } /** @@ -505,13 +486,11 @@ private function log_success_migration_event($turnitintooltwoid, $course_id, $v1 public static function turnitintooltwo_getassignments() { global $DB; - $config = get_config('turnitintooltwo'); - $return = array(); $idisplaystart = optional_param('iDisplayStart', 0, PARAM_INT); $idisplaylength = optional_param('iDisplayLength', 10, PARAM_INT); $secho = optional_param('sEcho', 1, PARAM_INT); - $displaycolumns = array('', 'id', 'name', 'migrated'); + $displaycolumns = array('id', 'name'); $queryparams = array(); // Add sort to query. $isortcol[0] = optional_param('iSortCol_0', null, PARAM_INT); @@ -560,25 +539,14 @@ public static function turnitintooltwo_getassignments() { } $query = "SELECT id, name, migrated FROM {turnitintool}".$querywhere.$queryorder; $assignments = $DB->get_records_sql($query, $queryparams, $idisplaystart, $idisplaylength); + $totalassignments = count($DB->get_records_sql($query, $queryparams)); $return["aaData"] = array(); foreach ($assignments as $assignment) { - if ($assignment->migrated == 1) { - $checkbox = html_writer::checkbox('assignmentids[]', $assignment->id, false, '', array("class" => "browser_checkbox")); - $sronly = html_writer::tag('span', get_string('yes', 'turnitintooltwo'), array('class' => 'sr-only')); - $assignment->migrated = html_writer::tag('span', $sronly, array('class' => 'fa fa-check')); - - $assignmenttitle = format_string($assignment->name); - - } else { - $checkbox = ""; - $sronly = html_writer::tag('span', get_string('no', 'turnitintooltwo'), array('class' => 'sr-only')); - $assignment->migrated = html_writer::tag('span', $sronly, array('class' => 'fa fa-times')); + $assignmentlink = new moodle_url('/mod/turnitintool/view.php', array('a' => $assignment->id, 'id' => '0')); + $assignmenttitle = html_writer::link($assignmentlink, format_string($assignment->name), array('target' => '_blank' )); - $assignmentlink = new moodle_url('/mod/turnitintool/view.php', array('a' => $assignment->id, 'id' => '0')); - $assignmenttitle = html_writer::link($assignmentlink, format_string($assignment->name), array('target' => '_blank' )); - } - $return["aaData"][] = array($checkbox, $assignment->id, $assignmenttitle, $assignment->migrated); + $return["aaData"][] = array($assignment->id, $assignmenttitle); } $return["sEcho"] = $secho; $return["iTotalRecords"] = count($assignments); @@ -587,31 +555,28 @@ public static function turnitintooltwo_getassignments() { } /** - * Delete a list of assignments. + * Delete an assignment. * - * @param array $assignmentids The assignment IDs to delete. + * @param int $assignmentid The assignment ID to delete. */ - public static function turnitintooltwo_delete_assignments($assignmentids) { + public static function turnitintooltwo_delete_assignment($assignmentid) { global $CFG, $DB; require_once($CFG->dirroot . "/mod/turnitintool/lib.php"); - foreach ($assignmentids as $assignmentid) { - $cm = get_coursemodule_from_instance('turnitintool', $assignmentid); + $cm = get_coursemodule_from_instance('turnitintool', $assignmentid); - // We have found that backups aren't reliable on MSSQL so rather than use Moodle's - // function which uses the recycle tool and the backup procedure. We handle the deletion directly. - if ($CFG->dbtype == 'mssql' || $CFG->dbtype == 'sqlsrv') { - turnitintool_delete_instance($assignmentid); + // We have found that backups aren't reliable on MSSQL so rather than use Moodle's + // function which uses the recycle tool and the backup procedure. We handle the deletion directly. + if ($CFG->dbtype == 'mssql' || $CFG->dbtype == 'sqlsrv') { + turnitintool_delete_instance($assignmentid); - // Delete course module. - $DB->delete_records('course_modules', array('id' => $cm->id)); + // Delete course module. + $DB->delete_records('course_modules', array('id' => $cm->id)); - rebuild_course_cache($cm->course); - } else { - course_delete_module($cm->id); - } - + rebuild_course_cache($cm->course); + } else { + course_delete_module($cm->id); } } @@ -642,7 +607,7 @@ public static function check_account_ids() { * @param $enablesetting - whether the settings form should be enabled. */ public static function output_settings_form($enablesetting = true) { - global $CFG, $DB, $PAGE; + global $CFG, $DB; $output = ""; require_once($CFG->dirroot.'/mod/turnitintooltwo/turnitintooltwo_form.class.php'); @@ -679,11 +644,6 @@ public static function output_settings_form($enablesetting = true) { $customdata["elements"] = $elements; $customdata["disable_form_change_checker"] = true; $customdata["show_cancel"] = false; - - // Strings for javascript confirm deletion. - $PAGE->requires->string_for_js('confirmv1deletetitle', 'turnitintooltwo'); - $PAGE->requires->string_for_js('confirmv1deletetext', 'turnitintooltwo'); - $PAGE->requires->string_for_js('confirmv1deletewarning', 'turnitintooltwo'); $migrationform = new turnitintooltwo_form($CFG->wwwroot.'/mod/turnitintooltwo/settings_extras.php?cmd=v1migration', $customdata); diff --git a/jquery/turnitintooltwo_extra.js b/jquery/turnitintooltwo_extra.js index 81da5805..238ee0f1 100644 --- a/jquery/turnitintooltwo_extra.js +++ b/jquery/turnitintooltwo_extra.js @@ -56,60 +56,20 @@ jQuery(document).ready(function($) { } }); - // Disable the submit button if Turnitin v1 and v2 account ids are different in Migration Tool. - if ( $('#sametiiaccount').data('sametiiaccount') == "0" ) { - $('select[name="enablemigrationtool"]').attr('disabled', 'disabled'); - $('select[name="enablemigrationtool"]').closest('form').find('input[name="submitbutton"]').attr('disabled', 'disabled'); - } - - // Disable the delete button in migration tab if there are no results selected and re-enable if there are. - $('input[name="selectallcb"]').closest('form').find('input[name="submitbutton"]').attr('disabled', 'disabled'); - $(document).on('click', '#migrationTable input[name="selectallcb"], #migrationTable .browser_checkbox', function() { - if ($('#migrationTable .browser_checkbox:checked').length > 0) { - $('#migrationTable .browser_checkbox').closest('form').find('input[name="submitbutton"]').removeAttr('disabled'); - } else { - $('#migrationTable .browser_checkbox').closest('form').find('input[name="submitbutton"]').attr('disabled', 'disabled'); - } - }); - - // Ask administrator for confirmation if user clicks to delete selected V1 assignments. - var submitbutton = $('#migrationTable').closest('form').find('input[name="submitbutton"]'); - submitbutton.click(function(ev) { - ev.preventDefault(); - - // Construct confirm message to administrator. - var message = M.str.turnitintooltwo.confirmv1deletetitle+'\n\n'; - message += M.util.get_string('confirmv1deletetext', 'turnitintooltwo', $('#migrationTable .browser_checkbox:checked').length)+'\n\n'; - message += M.str.turnitintooltwo.confirmv1deletewarning; - - if (confirm(message)) { - $('#migrationTable').closest('form').submit(); - } - - }); - // Configure the migration datatable in the plugin settings area. $('#migrationTable').dataTable({ "bDestroy": true, "bProcessing": true, "bServerSide": true, "oLanguage": dataTablesLangMigration, - "aaSorting": [[ 2, "asc" ]], + "aaSorting": [[ 1, "asc" ]], "aLengthMenu": [[10, 25, 50, 100, -1], [10, 25, 50, 100, "All"]], "sAjaxSource": "ajax.php?action=get_assignments", "sDom": '<"top"lf>rt<"bottom"irp><"clear">', "aoColumns": [ - {"bSortable": false, "bSearchable": false, - "fnCreatedCell": function (nTd, sData, oData, iRow, iCol) { - $(nTd).addClass('centered_cell'); - }}, {"bSortable": true, "sClass": "centered_cell", "bSearchable": false}, - {"bSortable": true, "bSearchable": true}, - {"bSortable": true, "sClass": "centered_cell", "bSearchable": false} - ], - "fnDrawCallback": function () { - $('input[name="selectallcb"]').attr('checked', false); - } + {"bSortable": true, "bSearchable": true} + ] }); $('#migrationTable_filter input').attr("placeholder", 'Search'); diff --git a/jquery/turnitintooltwo_extra.min.js b/jquery/turnitintooltwo_extra.min.js index af35564f..311a1a4b 100644 --- a/jquery/turnitintooltwo_extra.min.js +++ b/jquery/turnitintooltwo_extra.min.js @@ -1,2 +1,2 @@ -jQuery(document).ready(function($){function initialiseEditEndDate(){$("a.edit_course_end_link").colorbox({inline:!0,width:"60%",top:"100px",background:"#fff",height:"260px",opacity:"0.7",className:"edit_end_date_form",onLoad:function(){lightBoxCloseButton()},onComplete:function(){var current_date=$("#"+$(this).attr("id")+" span").attr("id");current_date=current_date.split("_"),$("#id_new_course_end_date_day").val(current_date[1]),$("#id_new_course_end_date_month").val(current_date[2]),$("#id_new_course_end_date_year").val(current_date[3]);var idStr=$(this).attr("id").split("_"),tii_course_id=idStr[2];$('input[name="tii_course_id"]').val(tii_course_id),$('input[name="tii_course_title"]').val($("a#course_"+tii_course_id).html()),$("#cboxLoadedContent .edit_course_end_date_form").show(),$("#dateselector-calendar-panel").css("z-index","9999"),$("#id_save_end_date").click(function(){$.ajax({dataType:"json",type:"POST",url:"ajax.php",data:{action:"edit_course_end_date",tii_course_id:tii_course_id,tii_course_title:$("a#course_"+tii_course_id).html(),sesskey:M.cfg.sesskey,end_date_d:$("#id_new_course_end_date_day").val(),end_date_m:$("#id_new_course_end_date_month").val(),end_date_y:$("#id_new_course_end_date_year").val()},success:function(data){if(eval(data),"success"==data.status)parent.$.fn.colorbox.close(),$("#course_date_"+tii_course_id+" span").html(data.end_date);else{var current_msg=$("#edit_end_date_desc").html;$("#edit_end_date_desc").html(current_msg+" "+data.msg)}}})})},onCleanup:function(){$(".edit_course_end_date_form").hide(),$("#tii_close_bar").remove()}})}function lightBoxCloseButton(){$("body").append('
'+M.str.turnitintooltwo.closebutton+"
")}function initialiseCourseRecreation(){var e=$(window).width(),t="80%";e<1e3&&(t="860px");var a=$(window).width(),s="80%";a<700&&(s="600px"),$("a.course_recreate").colorbox({iframe:!0,width:t,height:s,top:"100px",className:"migration",opacity:"0.7",onLoad:function(){lightBoxCloseButton()},onCleanup:function(){$("#tii_close_bar").remove()}}),$(".browser_checkbox").click(function(){$(".browser_checkbox:checked").length>0?$(".create_checkboxes").slideDown():$(".create_checkboxes").slideUp()})}function initialiseCourseBrowserButtons(e){$("#id_create_course").click(function(){$.ajax({dataType:"html",type:"POST",url:"ajax.php",data:{action:"create_course",tii_course_id:$("#tii_course_id").html(),tii_course_name:encodeURIComponent($("#tii_course_name").html()),course_name:encodeURIComponent($("#id_coursename").val()),course_category:$("#id_coursecategory").val(),sesskey:M.cfg.sesskey},success:function(t){var a=jQuery.parseJSON(t);hideCourseCreationOptions(a,e)}})}),$("#id_update_course").click(function(){$.ajax({dataType:"html",type:"POST",url:"ajax.php",data:{action:"link_course",tii_course_id:$("#tii_course_id").html(),tii_course_name:$("#tii_course_name").html(),course_to_link:$("#id_coursetolink").val(),sesskey:M.cfg.sesskey},success:function(t){var a=jQuery.parseJSON(t);hideCourseCreationOptions(a,e)}})})}function hideCourseCreationOptions(e,t){if(0!=e){$("#course_id").html(e.courseid);var a='input[name="check_'+$("#tii_course_id").html()+'"]';parent.$(a).hide();var s="#tick_"+$("#tii_course_id").html();parent.$(s).show(),$('fieldset[id$="create_course_fieldset"]').parent().slideToggle(),$('fieldset[id$="update_course_fieldset"]').parent().slideToggle(),$("#or_container").hide(),$("#existing_course_title_span").html(e.coursename),$(".existing_course_title_h3").removeClass("hidden_class"),$(".assignmentids_check").length>0&&($(".assignmentids_check").removeAttr("disabled"),$("#id_assignmentname").removeAttr("disabled"),$("#id_create_assignment").removeAttr("disabled")),$(".assignmentids_check").change(function(){$(".assignmentids_check").filter(":checked").length>=5?$(".assignmentids_check").not(":checked").attr("disabled","disabled"):$(".assignmentids_check").removeAttr("disabled")}),initialiseCreateAssignmentButton(t)}}function initialiseCreateAssignmentButton(e){$("#id_create_assignment").unbind("click"),$("#id_create_assignment").click(function(){var t="";$(".assignmentids_check:checked").each(function(e){t+=$(this).val()+","}),","==t.charAt(t.length-1)&&t.substring(0,t.length-1),$("#id_create_assignment").attr("disabled","disabled"),$.ajax({dataType:"html",type:"POST",url:"ajax.php",data:{action:"create_assignment",course_id:$("#course_id").html(),assignment_name:$("#id_assignmentname").val(),parts:t,sesskey:M.cfg.sesskey},success:function(t){e.fnReloadAjax(),e.fnStandingRedraw(),$("#id_assignmentname").removeAttr("disabled"),$("#id_create_assignment").removeAttr("disabled"),$(".assignmentids_check").removeAttr("disabled")}})})}$(".submissionsDataTable thead tr, #courseBrowserTable thead tr").toggleClass("header");var dataTablesLang={nointegration:M.str.turnitintooltwo.nointegration,sProcessing:M.str.turnitintooltwo.sprocessing,sZeroRecords:M.str.turnitintooltwo.szerorecords,sInfo:M.str.turnitintooltwo.sinfo,sSearch:M.str.turnitintooltwo.ssearch,sLengthMenu:M.str.turnitintooltwo.slengthmenu,sInfoEmpty:M.str.turnitintooltwo.semptytable,oPaginate:{sNext:M.str.turnitintooltwo.snext,sPrevious:M.str.turnitintooltwo.sprevious}},dataTablesLangMigration={nointegration:M.str.turnitintooltwo.nointegration,sProcessing:M.str.turnitintooltwo.sprocessing,sZeroRecords:M.str.turnitintooltwo.szerorecords,sInfo:M.str.turnitintooltwo.sinfo,sSearch:"",sLengthMenu:M.str.turnitintooltwo.slengthmigrationmenu,sInfoEmpty:M.str.turnitintooltwo.semptytable,oPaginate:{sNext:M.str.turnitintooltwo.snext,sPrevious:M.str.turnitintooltwo.sprevious}};$("#unlinkUserTable").dataTable({bDestroy:!0,bProcessing:!0,bServerSide:!0,oLanguage:dataTablesLang,aaSorting:[[2,"asc"]],aLengthMenu:[[10,25,50,100,-1],[10,25,50,100,"All"]],sAjaxSource:"ajax.php?action=get_users",aoColumns:[{bSortable:!1,fnCreatedCell:function(e,t,a,s,i){$(e).addClass("centered_cell")}},null,{aDataSort:[2,3]},{aDataSort:[3,2]},null],fnDrawCallback:function(){$('input[name="selectallcb"]').attr("checked",!1)}}),"0"==$("#sametiiaccount").data("sametiiaccount")&&($('select[name="enablemigrationtool"]').attr("disabled","disabled"),$('select[name="enablemigrationtool"]').closest("form").find('input[name="submitbutton"]').attr("disabled","disabled")),$('input[name="selectallcb"]').closest("form").find('input[name="submitbutton"]').attr("disabled","disabled"),$(document).on("click",'#migrationTable input[name="selectallcb"], #migrationTable .browser_checkbox',function(){$("#migrationTable .browser_checkbox:checked").length>0?$("#migrationTable .browser_checkbox").closest("form").find('input[name="submitbutton"]').removeAttr("disabled"):$("#migrationTable .browser_checkbox").closest("form").find('input[name="submitbutton"]').attr("disabled","disabled")});var submitbutton=$("#migrationTable").closest("form").find('input[name="submitbutton"]');submitbutton.click(function(e){e.preventDefault();var t=M.str.turnitintooltwo.confirmv1deletetitle+"\n\n";t+=M.util.get_string("confirmv1deletetext","turnitintooltwo",$("#migrationTable .browser_checkbox:checked").length)+"\n\n",t+=M.str.turnitintooltwo.confirmv1deletewarning,confirm(t)&&$("#migrationTable").closest("form").submit()}),$("#migrationTable").dataTable({bDestroy:!0,bProcessing:!0,bServerSide:!0,oLanguage:dataTablesLangMigration,aaSorting:[[2,"asc"]],aLengthMenu:[[10,25,50,100,-1],[10,25,50,100,"All"]],sAjaxSource:"ajax.php?action=get_assignments",sDom:'<"top"lf>rt<"bottom"irp><"clear">',aoColumns:[{bSortable:!1,bSearchable:!1,fnCreatedCell:function(e,t,a,s,i){$(e).addClass("centered_cell")}},{bSortable:!0,sClass:"centered_cell",bSearchable:!1},{bSortable:!0,bSearchable:!0},{bSortable:!0,sClass:"centered_cell",bSearchable:!1}],fnDrawCallback:function(){$('input[name="selectallcb"]').attr("checked",!1)}}),$("#migrationTable_filter input").attr("placeholder","Search"),$("#filesTable").dataTable({bDestroy:!0,bProcessing:!0,bServerSide:!0,oLanguage:dataTablesLang,sAjaxSource:"ajax.php?action=get_files",aoColumns:[null,null,null,{sClass:"filename c0",sWidth:"40%"},null,{sClass:"fullname c1",sWidth:"35%"},null,{sClass:"created c2",sWidth:"22%"},{sClass:"remove c3",sWidth:"3%"}],aoColumnDefs:[{bSearchable:!0,bVisible:!1,aTargets:[0]},{bSearchable:!0,bVisible:!1,aTargets:[1]},{bSearchable:!0,bVisible:!1,aTargets:[2]},{bSearchable:!0,bVisible:!0,aTargets:[3]},{bSearchable:!0,bVisible:!1,aTargets:[4]},{bSearchable:!0,bVisible:!0,aTargets:[5]},{bSearchable:!0,bVisible:!1,aTargets:[6]},{bSearchable:!0,bVisible:!0,aTargets:[7]},{bSearchable:!0,bVisible:!0,aTargets:[8]}],fnDrawCallback:function(e){if(0!=e.aiDisplay.length)for(var t=$("#filesTable tbody tr"),a=t[0].getElementsByTagName("td").length,s="",i=0;iip'}),$.datepicker.regional[""].dateFormat="d M yy",$.datepicker.setDefaults($.datepicker.regional[""]);var courseBrowserTable=$("#courseBrowserTable").dataTable({bProcessing:!0,oLanguage:dataTablesLang,aaSorting:[[6,"asc"]],sAjaxSource:"ajax.php",aoColumnDefs:[{bSearchable:!1,bSortable:!1,sWidth:"5%",bVisible:!0,aTargets:[0],fnCreatedCell:function(e){$(e).addClass("center")}},{bSearchable:!0,bVisible:!0,sWidth:"45%",iDataSort:6,aTargets:[1]},{bSearchable:!0,bVisible:!0,sWidth:"10%",aTargets:[2]},{bSearchable:!0,bVisible:!0,sWidth:"20%",iDataSort:7,aTargets:[3],fnCreatedCell:function(e){$(e).addClass("right")}},{bSearchable:!1,bVisible:!0,sWidth:"10%",aTargets:[4],fnCreatedCell:function(e){$(e).addClass("right")}},{bSearchable:!0,bVisible:!0,sWidth:"10%",aTargets:[5],fnCreatedCell:function(e){$(e).addClass("center")}},{bSearchable:!0,bVisible:!1,aTargets:[6]},{bSearchable:!0,bVisible:!1,aTargets:[7]}],fnServerData:function(e,t,a){$.ajax({dataType:"json",type:"POST",url:e,data:{action:"search_classes",course_title:$("#search_course_title").val(),course_integration:$("#search_course_integration").val(),course_end_date:$("#search_course_end_date").val(),sesskey:M.cfg.sesskey},success:function(e){a(e)}})},bStateSave:!0,fnStateSave:function(e,t){try{localStorage.setItem(uid+"DataTables",JSON.stringify(t))}catch(a){}},fnStateLoad:function(e){try{return JSON.parse(localStorage.getItem(uid+"DataTables"))}catch(t){}},fnDrawCallback:function(){$('input[name="selectallcb"]').attr("checked",!1),initialiseCourseRecreation(),initialiseEditEndDate(),$("#search_courses_button").removeAttr("disabled")}});$("#search_courses_button").click(function(){return $(this).attr("disabled","disabled"),courseBrowserTable.fnReloadAjax(),courseBrowserTable.fnStandingRedraw(),!1}),$("#search_course_end_date").datepicker();var oTable=$("#assignmentBrowserTable").dataTable({bProcessing:!0,oLanguage:dataTablesLang,sAjaxSource:"ajax.php",fnServerData:function(sSource,aoData,fnCallback){$("#id_create_course").attr("disabled","disabled"),$("#id_update_course").attr("disabled","disabled"),$("#assignmentBrowserTable").length>0&&$(".side-pre-only #page-content #region-main").css({"margin-left":"0px"}),$("#id_assignmentname").attr("disabled","disabled"),$("#id_create_assignment").attr("disabled","disabled"),$.ajax({dataType:"json",type:"POST",url:sSource,data:{action:"get_assignments",tii_course_id:$("#tii_course_id").html(),sesskey:M.cfg.sesskey},success:function(result){eval(result),initialiseCourseBrowserButtons(oTable),fnCallback(result),"0"!=$("#course_id").html()&&result.number_of_assignments>0?($("#id_assignmentname").removeAttr("disabled"),$("#id_create_assignment").removeAttr("disabled"),$(".assignmentids_check").removeAttr("disabled"),initialiseCreateAssignmentButton(oTable)):($("#id_assignmentname").attr("disabled","disabled"),$("#id_create_assignment").attr("disabled","disabled"),$(".assignmentids_check").attr("disabled","disabled")),$("#id_create_course").removeAttr("disabled"),$("#id_update_course").removeAttr("disabled")}})},aoColumnDefs:[{bSearchable:!1,bVisible:!0,aTargets:[0]},{bSearchable:!0,bVisible:!0,aTargets:[1],fnCreatedCell:function(e){$(e).addClass("nowrap")}},{bSearchable:!0,bVisible:!0,aTargets:[2]},{bSearchable:!0,bVisible:!0,aTargets:[3]}]});if($("#create_classes_button").colorbox({iframe:!0,width:"60%",top:"200px",height:"124px",opacity:"0.7",className:"course_creation",href:function(){var e=$(".create_course_category").val(),t=$(".create_assignment_checkbox").is(":checked")?"1":"0",a="";$(".browser_checkbox:checked").each(function(e){a+="&class_id"+e+"="+$(this).val(),e++});var s=window.location.href,i=s.replace("cmd=courses","cmd=multiple_class_recreation");return i+"&view_context=box&category="+e+"&assignments="+t+a+"&sesskey="+M.cfg.sesskey},onCleanup:function(){window.location=window.location}}),$("#class_ids").length>0){$(".side-pre-only #page-content #region-main").css({"margin-left":"0px"}),$(".has-region-side-pre #page-content #region-main").css({width:"100%","margin-top":"-30px"});var class_ids=$("#class_ids").html();$.ajax({dataType:"html",type:"POST",url:"ajax.php",data:{action:"create_courses",class_ids:class_ids,course_category:$("#course_category").html(),create_assignments:$("#create_assignments").html(),sesskey:M.cfg.sesskey},success:function(e){$("#course_creation_status").html(e)}})}}); -//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInR1cm5pdGludG9vbHR3b19leHRyYS5qcyJdLCJuYW1lcyI6WyJqUXVlcnkiLCJkb2N1bWVudCIsInJlYWR5IiwiJCIsImluaXRpYWxpc2VFZGl0RW5kRGF0ZSIsImNvbG9yYm94IiwiaW5saW5lIiwid2lkdGgiLCJ0b3AiLCJiYWNrZ3JvdW5kIiwiaGVpZ2h0Iiwib3BhY2l0eSIsImNsYXNzTmFtZSIsIm9uTG9hZCIsImxpZ2h0Qm94Q2xvc2VCdXR0b24iLCJvbkNvbXBsZXRlIiwiY3VycmVudF9kYXRlIiwidGhpcyIsImF0dHIiLCJzcGxpdCIsInZhbCIsImlkU3RyIiwidGlpX2NvdXJzZV9pZCIsImh0bWwiLCJzaG93IiwiY3NzIiwiY2xpY2siLCJhamF4IiwiZGF0YVR5cGUiLCJ0eXBlIiwidXJsIiwiZGF0YSIsImFjdGlvbiIsInRpaV9jb3Vyc2VfdGl0bGUiLCJzZXNza2V5IiwiTSIsImNmZyIsImVuZF9kYXRlX2QiLCJlbmRfZGF0ZV9tIiwiZW5kX2RhdGVfeSIsInN1Y2Nlc3MiLCJldmFsIiwic3RhdHVzIiwicGFyZW50IiwiZm4iLCJjbG9zZSIsImVuZF9kYXRlIiwiY3VycmVudF9tc2ciLCJtc2ciLCJvbkNsZWFudXAiLCJoaWRlIiwicmVtb3ZlIiwiYXBwZW5kIiwic3RyIiwidHVybml0aW50b29sdHdvIiwiY2xvc2VidXR0b24iLCJpbml0aWFsaXNlQ291cnNlUmVjcmVhdGlvbiIsIndpbmRvd1dpZHRoIiwid2luZG93IiwiY29sb3JCb3hXaWR0aCIsIndpbmRvd0hlaWdodCIsImNvbG9yQm94SGVpZ2h0IiwiaWZyYW1lIiwibGVuZ3RoIiwic2xpZGVEb3duIiwic2xpZGVVcCIsImluaXRpYWxpc2VDb3Vyc2VCcm93c2VyQnV0dG9ucyIsIm9UYWJsZSIsInRpaV9jb3Vyc2VfbmFtZSIsImVuY29kZVVSSUNvbXBvbmVudCIsImNvdXJzZV9uYW1lIiwiY291cnNlX2NhdGVnb3J5Iiwib2JqIiwicGFyc2VKU09OIiwiaGlkZUNvdXJzZUNyZWF0aW9uT3B0aW9ucyIsImNvdXJzZV90b19saW5rIiwiY291cnNlaWQiLCJjYl9lbGVtZW50IiwidGlja19lbGVtZW50Iiwic2xpZGVUb2dnbGUiLCJjb3Vyc2VuYW1lIiwicmVtb3ZlQ2xhc3MiLCJyZW1vdmVBdHRyIiwiY2hhbmdlIiwiZmlsdGVyIiwibm90IiwiaW5pdGlhbGlzZUNyZWF0ZUFzc2lnbm1lbnRCdXR0b24iLCJ1bmJpbmQiLCJwYXJ0cyIsImVhY2giLCJpIiwiY2hhckF0Iiwic3Vic3RyaW5nIiwiY291cnNlX2lkIiwiYXNzaWdubWVudF9uYW1lIiwiZm5SZWxvYWRBamF4IiwiZm5TdGFuZGluZ1JlZHJhdyIsInRvZ2dsZUNsYXNzIiwiZGF0YVRhYmxlc0xhbmciLCJub2ludGVncmF0aW9uIiwic1Byb2Nlc3NpbmciLCJzcHJvY2Vzc2luZyIsInNaZXJvUmVjb3JkcyIsInN6ZXJvcmVjb3JkcyIsInNJbmZvIiwic2luZm8iLCJzU2VhcmNoIiwic3NlYXJjaCIsInNMZW5ndGhNZW51Iiwic2xlbmd0aG1lbnUiLCJzSW5mb0VtcHR5Iiwic2VtcHR5dGFibGUiLCJvUGFnaW5hdGUiLCJzTmV4dCIsInNuZXh0Iiwic1ByZXZpb3VzIiwic3ByZXZpb3VzIiwiZGF0YVRhYmxlc0xhbmdNaWdyYXRpb24iLCJzbGVuZ3RobWlncmF0aW9ubWVudSIsImRhdGFUYWJsZSIsImJEZXN0cm95IiwiYlByb2Nlc3NpbmciLCJiU2VydmVyU2lkZSIsIm9MYW5ndWFnZSIsImFhU29ydGluZyIsImFMZW5ndGhNZW51Iiwic0FqYXhTb3VyY2UiLCJhb0NvbHVtbnMiLCJiU29ydGFibGUiLCJmbkNyZWF0ZWRDZWxsIiwiblRkIiwic0RhdGEiLCJvRGF0YSIsImlSb3ciLCJpQ29sIiwiYWRkQ2xhc3MiLCJhRGF0YVNvcnQiLCJmbkRyYXdDYWxsYmFjayIsImNsb3Nlc3QiLCJmaW5kIiwib24iLCJzdWJtaXRidXR0b24iLCJldiIsInByZXZlbnREZWZhdWx0IiwibWVzc2FnZSIsImNvbmZpcm12MWRlbGV0ZXRpdGxlIiwidXRpbCIsImdldF9zdHJpbmciLCJjb25maXJtdjFkZWxldGV3YXJuaW5nIiwiY29uZmlybSIsInN1Ym1pdCIsInNEb20iLCJiU2VhcmNoYWJsZSIsInNDbGFzcyIsInNXaWR0aCIsImFvQ29sdW1uRGVmcyIsImJWaXNpYmxlIiwiYVRhcmdldHMiLCJvU2V0dGluZ3MiLCJhaURpc3BsYXkiLCJuVHJzIiwiaUNvbHNwYW4iLCJnZXRFbGVtZW50c0J5VGFnTmFtZSIsInNMYXN0R3JvdXAiLCJzR3JvdXAiLCJfaURpc3BsYXlTdGFydCIsImFvRGF0YSIsIl9hRGF0YSIsIm5Hcm91cCIsImNyZWF0ZUVsZW1lbnQiLCJuQ2VsbCIsImNvbFNwYW4iLCJpbm5lckhUTUwiLCJhcHBlbmRDaGlsZCIsInBhcmVudE5vZGUiLCJpbnNlcnRCZWZvcmUiLCJhYVNvcnRpbmdGaXhlZCIsImRhdGVwaWNrZXIiLCJyZWdpb25hbCIsImRhdGVGb3JtYXQiLCJzZXREZWZhdWx0cyIsImNvdXJzZUJyb3dzZXJUYWJsZSIsImlEYXRhU29ydCIsImZuU2VydmVyRGF0YSIsInNTb3VyY2UiLCJmbkNhbGxiYWNrIiwiY291cnNlX3RpdGxlIiwiY291cnNlX2ludGVncmF0aW9uIiwiY291cnNlX2VuZF9kYXRlIiwicmVzdWx0IiwiYlN0YXRlU2F2ZSIsImZuU3RhdGVTYXZlIiwibG9jYWxTdG9yYWdlIiwic2V0SXRlbSIsInVpZCIsIkpTT04iLCJzdHJpbmdpZnkiLCJlIiwiZm5TdGF0ZUxvYWQiLCJwYXJzZSIsImdldEl0ZW0iLCJtYXJnaW4tbGVmdCIsIm51bWJlcl9vZl9hc3NpZ25tZW50cyIsImhyZWYiLCJjYXRlZ29yeSIsImFzc2lnbm1lbnRzIiwiaXMiLCJjbGFzc19pZHMiLCJwYWdldXJsIiwibG9jYXRpb24iLCJyZXBsYWNlIiwibWFyZ2luLXRvcCIsImNyZWF0ZV9hc3NpZ25tZW50cyJdLCJtYXBwaW5ncyI6IkFBQUFBLE9BQU9DLFVBQVVDLE1BQU0sU0FBU0MsR0FrVzVCLFFBQVNDLHlCQUNMRCxFQUFFLDBCQUEwQkUsVUFDeEJDLFFBQU8sRUFBTUMsTUFBTSxNQUFPQyxJQUFLLFFBQVNDLFdBQVksT0FBUUMsT0FBTyxRQUFTQyxRQUFTLE1BQU9DLFVBQVcscUJBQ3ZHQyxPQUFRLFdBQ0pDLHVCQUVKQyxXQUFhLFdBSVQsR0FBSUMsY0FBZWIsRUFBRSxJQUFNQSxFQUFFYyxNQUFNQyxLQUFLLE1BQVEsU0FBU0EsS0FBSyxLQUM5REYsY0FBZUEsYUFBYUcsTUFBTSxLQUNsQ2hCLEVBQUUsK0JBQStCaUIsSUFBSUosYUFBYSxJQUNsRGIsRUFBRSxpQ0FBaUNpQixJQUFJSixhQUFhLElBQ3BEYixFQUFFLGdDQUFnQ2lCLElBQUlKLGFBQWEsR0FFbkQsSUFBSUssT0FBUWxCLEVBQUVjLE1BQU1DLEtBQUssTUFBTUMsTUFBTSxLQUNqQ0csY0FBZ0JELE1BQU0sRUFDMUJsQixHQUFFLCtCQUErQmlCLElBQUlFLGVBQ3JDbkIsRUFBRSxrQ0FBa0NpQixJQUFJakIsRUFBRSxZQUFjbUIsZUFBZUMsUUFDdkVwQixFQUFFLGlEQUFpRHFCLE9BQ25EckIsRUFBRSxnQ0FBZ0NzQixJQUFJLFVBQVcsUUFFakR0QixFQUFFLHFCQUFxQnVCLE1BQU0sV0FDekJ2QixFQUFFd0IsTUFDRUMsU0FBWSxPQUNaQyxLQUFRLE9BQ1JDLElBQU8sV0FDUEMsTUFBU0MsT0FBUSx1QkFBd0JWLGNBQWVBLGNBQ3BEVyxpQkFBa0I5QixFQUFFLFlBQWNtQixlQUFlQyxPQUFRVyxRQUFTQyxFQUFFQyxJQUFJRixRQUN4RUcsV0FBWWxDLEVBQUUsK0JBQStCaUIsTUFDN0NrQixXQUFZbkMsRUFBRSxpQ0FBaUNpQixNQUMvQ21CLFdBQVlwQyxFQUFFLGdDQUFnQ2lCLE9BRWxEb0IsUUFBUyxTQUFTVCxNQUVkLEdBREFVLEtBQUtWLE1BQ2MsV0FBZkEsS0FBS1csT0FDTEMsT0FBT3hDLEVBQUV5QyxHQUFHdkMsU0FBU3dDLFFBQ3JCMUMsRUFBRSxnQkFBa0JtQixjQUFnQixTQUFTQyxLQUFLUSxLQUFLZSxjQUNwRCxDQUNILEdBQUlDLGFBQWM1QyxFQUFFLHVCQUF1Qm9CLElBQzNDcEIsR0FBRSx1QkFBdUJvQixLQUFLd0IsWUFBYyxJQUFNaEIsS0FBS2lCLFlBTTNFQyxVQUFXLFdBQ1A5QyxFQUFFLDhCQUE4QitDLE9BQ2hDL0MsRUFBRSxrQkFBa0JnRCxZQUtoQyxRQUFTckMsdUJBQ0xYLEVBQUUsUUFBUWlELE9BQU8sbUZBQXFGakIsRUFBRWtCLElBQUlDLGdCQUFnQkMsWUFBYyxjQU05SSxRQUFTQyw4QkFFTCxHQUFJQyxHQUFjdEQsRUFBRXVELFFBQVFuRCxRQUN4Qm9ELEVBQWdCLEtBQ2hCRixHQUFjLE1BQ2RFLEVBQWdCLFFBR3BCLElBQUlDLEdBQWV6RCxFQUFFdUQsUUFBUW5ELFFBQ3pCc0QsRUFBaUIsS0FDakJELEdBQWUsTUFDZkMsRUFBaUIsU0FHckIxRCxFQUFFLHFCQUFxQkUsVUFDbkJ5RCxRQUFPLEVBQU12RCxNQUFNb0QsRUFBZWpELE9BQU9tRCxFQUFnQnJELElBQUssUUFBU0ksVUFBVyxZQUFhRCxRQUFTLE1BQ3hHRSxPQUFRLFdBQ0pDLHVCQUVKbUMsVUFBVSxXQUNOOUMsRUFBRSxrQkFBa0JnRCxZQUk1QmhELEVBQUUscUJBQXFCdUIsTUFBTSxXQUNyQnZCLEVBQUUsNkJBQTZCNEQsT0FBUyxFQUN4QzVELEVBQUUsc0JBQXNCNkQsWUFFeEI3RCxFQUFFLHNCQUFzQjhELFlBTXBDLFFBQVNDLGdDQUErQkMsR0FDcENoRSxFQUFFLHFCQUFxQnVCLE1BQU0sV0FDekJ2QixFQUFFd0IsTUFDRUMsU0FBWSxPQUNaQyxLQUFRLE9BQ1JDLElBQU8sV0FDUEMsTUFBU0MsT0FBUSxnQkFBaUJWLGNBQWVuQixFQUFFLGtCQUFrQm9CLE9BQ2pFNkMsZ0JBQWlCQyxtQkFBbUJsRSxFQUFFLG9CQUFvQm9CLFFBQzFEK0MsWUFBYUQsbUJBQW1CbEUsRUFBRSxrQkFBa0JpQixPQUNwRG1ELGdCQUFpQnBFLEVBQUUsc0JBQXNCaUIsTUFBT2MsUUFBU0MsRUFBRUMsSUFBSUYsU0FDbkVNLFFBQVMsU0FBU1QsR0FDZCxHQUFJeUMsR0FBTXhFLE9BQU95RSxVQUFVMUMsRUFDM0IyQywyQkFBMEJGLEVBQUtMLFFBSzNDaEUsRUFBRSxxQkFBcUJ1QixNQUFNLFdBQ3pCdkIsRUFBRXdCLE1BQ0VDLFNBQVksT0FDWkMsS0FBUSxPQUNSQyxJQUFPLFdBQ1BDLE1BQVNDLE9BQVEsY0FBZVYsY0FBZW5CLEVBQUUsa0JBQWtCb0IsT0FDL0Q2QyxnQkFBaUJqRSxFQUFFLG9CQUFvQm9CLE9BQVFvRCxlQUFnQnhFLEVBQUUsb0JBQW9CaUIsTUFDckZjLFFBQVNDLEVBQUVDLElBQUlGLFNBQ25CTSxRQUFTLFNBQVNULEdBQ2QsR0FBSXlDLEdBQU14RSxPQUFPeUUsVUFBVTFDLEVBQzNCMkMsMkJBQTBCRixFQUFLTCxRQVEvQyxRQUFTTywyQkFBMEJGLEVBQUtMLEdBQ3BDLEdBQVcsR0FBUEssRUFBVSxDQUNWckUsRUFBRSxjQUFjb0IsS0FBS2lELEVBQUlJLFNBRXpCLElBQUlDLEdBQWEscUJBQXVCMUUsRUFBRSxrQkFBa0JvQixPQUFTLElBQ3JFb0IsUUFBT3hDLEVBQUUwRSxHQUFZM0IsTUFDckIsSUFBSTRCLEdBQWUsU0FBVzNFLEVBQUUsa0JBQWtCb0IsTUFDbERvQixRQUFPeEMsRUFBRTJFLEdBQWN0RCxPQUV2QnJCLEVBQUUsMENBQTBDd0MsU0FBU29DLGNBQ3JENUUsRUFBRSwwQ0FBMEN3QyxTQUFTb0MsY0FFckQ1RSxFQUFFLGlCQUFpQitDLE9BRW5CL0MsRUFBRSwrQkFBK0JvQixLQUFLaUQsRUFBSVEsWUFDMUM3RSxFQUFFLDZCQUE2QjhFLFlBQVksZ0JBRXZDOUUsRUFBRSx3QkFBd0I0RCxPQUFTLElBQ25DNUQsRUFBRSx3QkFBd0IrRSxXQUFXLFlBQ3JDL0UsRUFBRSxzQkFBc0IrRSxXQUFXLFlBQ25DL0UsRUFBRSx5QkFBeUIrRSxXQUFXLGFBRzFDL0UsRUFBRSx3QkFBd0JnRixPQUFPLFdBQ3pCaEYsRUFBRSx3QkFBd0JpRixPQUFPLFlBQVlyQixRQUFVLEVBQ3ZENUQsRUFBRSx3QkFBd0JrRixJQUFJLFlBQVluRSxLQUFLLFdBQVksWUFFM0RmLEVBQUUsd0JBQXdCK0UsV0FBVyxjQUk3Q0ksaUNBQWlDbkIsSUFLekMsUUFBU21CLGtDQUFpQ25CLEdBQ3RDaEUsRUFBRSx5QkFBeUJvRixPQUFPLFNBQ2xDcEYsRUFBRSx5QkFBeUJ1QixNQUFNLFdBRTdCLEdBQUk4RCxHQUFRLEVBQ1pyRixHQUFFLGdDQUFnQ3NGLEtBQUssU0FBU0MsR0FDNUNGLEdBQVNyRixFQUFFYyxNQUFNRyxNQUFRLE1BRVMsS0FBbENvRSxFQUFNRyxPQUFPSCxFQUFNekIsT0FBUyxJQUM1QnlCLEVBQU1JLFVBQVUsRUFBR0osRUFBTXpCLE9BQVMsR0FHdEM1RCxFQUFFLHlCQUF5QmUsS0FBSyxXQUFZLFlBRTVDZixFQUFFd0IsTUFDRUMsU0FBWSxPQUNaQyxLQUFRLE9BQ1JDLElBQU8sV0FDUEMsTUFBU0MsT0FBUSxvQkFBcUI2RCxVQUFXMUYsRUFBRSxjQUFjb0IsT0FDN0R1RSxnQkFBaUIzRixFQUFFLHNCQUFzQmlCLE1BQU9vRSxNQUFPQSxFQUFPdEQsUUFBU0MsRUFBRUMsSUFBSUYsU0FDakZNLFFBQVMsU0FBU1QsR0FDZG9DLEVBQU80QixlQUNQNUIsRUFBTzZCLG1CQUNQN0YsRUFBRSxzQkFBc0IrRSxXQUFXLFlBQ25DL0UsRUFBRSx5QkFBeUIrRSxXQUFXLFlBQ3RDL0UsRUFBRSx3QkFBd0IrRSxXQUFXLGlCQS9oQnJEL0UsRUFBRSxnRUFBZ0U4RixZQUFZLFNBRzlFLElBQUlDLGlCQUNBQyxjQUFpQmhFLEVBQUVrQixJQUFJQyxnQkFBZ0I2QyxjQUN2Q0MsWUFBZWpFLEVBQUVrQixJQUFJQyxnQkFBZ0IrQyxZQUNyQ0MsYUFBZ0JuRSxFQUFFa0IsSUFBSUMsZ0JBQWdCaUQsYUFDdENDLE1BQVNyRSxFQUFFa0IsSUFBSUMsZ0JBQWdCbUQsTUFDL0JDLFFBQVd2RSxFQUFFa0IsSUFBSUMsZ0JBQWdCcUQsUUFDakNDLFlBQWV6RSxFQUFFa0IsSUFBSUMsZ0JBQWdCdUQsWUFDckNDLFdBQWMzRSxFQUFFa0IsSUFBSUMsZ0JBQWdCeUQsWUFDcENDLFdBQ0lDLE1BQVM5RSxFQUFFa0IsSUFBSUMsZ0JBQWdCNEQsTUFDL0JDLFVBQWFoRixFQUFFa0IsSUFBSUMsZ0JBQWdCOEQsWUFLdkNDLHlCQUNBbEIsY0FBaUJoRSxFQUFFa0IsSUFBSUMsZ0JBQWdCNkMsY0FDdkNDLFlBQWVqRSxFQUFFa0IsSUFBSUMsZ0JBQWdCK0MsWUFDckNDLGFBQWdCbkUsRUFBRWtCLElBQUlDLGdCQUFnQmlELGFBQ3RDQyxNQUFTckUsRUFBRWtCLElBQUlDLGdCQUFnQm1ELE1BQy9CQyxRQUFXLEdBQ1hFLFlBQWV6RSxFQUFFa0IsSUFBSUMsZ0JBQWdCZ0UscUJBQ3JDUixXQUFjM0UsRUFBRWtCLElBQUlDLGdCQUFnQnlELFlBQ3BDQyxXQUNJQyxNQUFTOUUsRUFBRWtCLElBQUlDLGdCQUFnQjRELE1BQy9CQyxVQUFhaEYsRUFBRWtCLElBQUlDLGdCQUFnQjhELFdBSzNDakgsR0FBRSxvQkFBb0JvSCxXQUNsQkMsVUFBWSxFQUNaQyxhQUFlLEVBQ2ZDLGFBQWUsRUFDZkMsVUFBYXpCLGVBQ2IwQixZQUFnQixFQUFHLFFBQ25CQyxjQUFpQixHQUFJLEdBQUksR0FBSSxTQUFXLEdBQUksR0FBSSxHQUFJLElBQUssUUFDekRDLFlBQWUsNEJBQ2ZDLFlBQ2lCQyxXQUFhLEVBQ1ZDLGNBQWlCLFNBQVVDLEVBQUtDLEVBQU9DLEVBQU9DLEVBQU1DLEdBQ2hEbkksRUFBRStILEdBQUtLLFNBQVMsbUJBRXhCLE1BQ0NDLFdBQWUsRUFBRyxLQUNsQkEsV0FBZSxFQUFHLElBQ25CLE1BRWhCQyxlQUFrQixXQUNkdEksRUFBRSw2QkFBNkJlLEtBQUssV0FBVyxNQUtILEtBQS9DZixFQUFFLG1CQUFtQjRCLEtBQUssb0JBQzNCNUIsRUFBRSxzQ0FBc0NlLEtBQUssV0FBWSxZQUN6RGYsRUFBRSxzQ0FBc0N1SSxRQUFRLFFBQVFDLEtBQUssOEJBQThCekgsS0FBSyxXQUFZLGFBSWhIZixFQUFFLDZCQUE2QnVJLFFBQVEsUUFBUUMsS0FBSyw4QkFBOEJ6SCxLQUFLLFdBQVksWUFDbkdmLEVBQUVGLFVBQVUySSxHQUFHLFFBQVMsK0VBQWdGLFdBQ2hHekksRUFBRSw2Q0FBNkM0RCxPQUFTLEVBQ3hENUQsRUFBRSxxQ0FBcUN1SSxRQUFRLFFBQVFDLEtBQUssOEJBQThCekQsV0FBVyxZQUVyRy9FLEVBQUUscUNBQXFDdUksUUFBUSxRQUFRQyxLQUFLLDhCQUE4QnpILEtBQUssV0FBWSxhQUtuSCxJQUFJMkgsY0FBZTFJLEVBQUUsbUJBQW1CdUksUUFBUSxRQUFRQyxLQUFLLDZCQUM3REUsY0FBYW5ILE1BQU0sU0FBU29ILEdBQ3hCQSxFQUFHQyxnQkFHSCxJQUFJQyxHQUFVN0csRUFBRWtCLElBQUlDLGdCQUFnQjJGLHFCQUFxQixNQUN6REQsSUFBVzdHLEVBQUUrRyxLQUFLQyxXQUFXLHNCQUF1QixrQkFBbUJoSixFQUFFLDZDQUE2QzRELFFBQVEsT0FDOUhpRixHQUFXN0csRUFBRWtCLElBQUlDLGdCQUFnQjhGLHVCQUU3QkMsUUFBUUwsSUFDUjdJLEVBQUUsbUJBQW1CdUksUUFBUSxRQUFRWSxXQU03Q25KLEVBQUUsbUJBQW1Cb0gsV0FDakJDLFVBQVksRUFDWkMsYUFBZSxFQUNmQyxhQUFlLEVBQ2ZDLFVBQWFOLHdCQUNiTyxZQUFnQixFQUFHLFFBQ25CQyxjQUFpQixHQUFJLEdBQUksR0FBSSxTQUFXLEdBQUksR0FBSSxHQUFJLElBQUssUUFDekRDLFlBQWUsa0NBQ2Z5QixLQUFRLG9DQUNSeEIsWUFDaUJDLFdBQWEsRUFBT3dCLGFBQWUsRUFDaEN2QixjQUFpQixTQUFVQyxFQUFLQyxFQUFPQyxFQUFPQyxFQUFNQyxHQUNoRG5JLEVBQUUrSCxHQUFLSyxTQUFTLG9CQUV2QlAsV0FBYSxFQUFNeUIsT0FBVSxnQkFBaUJELGFBQWUsSUFDN0R4QixXQUFhLEVBQU13QixhQUFlLElBQ2xDeEIsV0FBYSxFQUFNeUIsT0FBVSxnQkFBaUJELGFBQWUsSUFFOUVmLGVBQWtCLFdBQ2R0SSxFQUFFLDZCQUE2QmUsS0FBSyxXQUFXLE1BR3ZEZixFQUFFLGdDQUFnQ2UsS0FBSyxjQUFlLFVBR3REZixFQUFFLGVBQWVvSCxXQUNiQyxVQUFZLEVBQ1pDLGFBQWUsRUFDZkMsYUFBZSxFQUNmQyxVQUFhekIsZUFDYjRCLFlBQWUsNEJBQ2ZDLFdBQ1ksS0FDQSxLQUNBLE1BQ0MwQixPQUFVLGNBQWVDLE9BQVUsT0FDcEMsTUFDQ0QsT0FBVSxjQUFlQyxPQUFVLE9BQ3BDLE1BQ0NELE9BQVUsYUFBY0MsT0FBVSxRQUNsQ0QsT0FBVSxZQUFhQyxPQUFVLE9BRTlDQyxlQUNhSCxhQUFlLEVBQU1JLFVBQVksRUFBT0MsVUFBYyxLQUN0REwsYUFBZSxFQUFNSSxVQUFZLEVBQU9DLFVBQWMsS0FDdERMLGFBQWUsRUFBTUksVUFBWSxFQUFPQyxVQUFjLEtBQ3RETCxhQUFlLEVBQU1JLFVBQVksRUFBTUMsVUFBYyxLQUNyREwsYUFBZSxFQUFNSSxVQUFZLEVBQU9DLFVBQWMsS0FDdERMLGFBQWUsRUFBTUksVUFBWSxFQUFNQyxVQUFjLEtBQ3JETCxhQUFlLEVBQU1JLFVBQVksRUFBT0MsVUFBYyxLQUN0REwsYUFBZSxFQUFNSSxVQUFZLEVBQU1DLFVBQWMsS0FDckRMLGFBQWUsRUFBTUksVUFBWSxFQUFNQyxVQUFjLEtBRWxFcEIsZUFBa0IsU0FBV3FCLEdBQ3pCLEdBQW1DLEdBQTlCQSxFQUFVQyxVQUFVaEcsT0FRekIsSUFBSyxHQUhEaUcsR0FBTzdKLEVBQUUsd0JBQ1Q4SixFQUFXRCxFQUFLLEdBQUdFLHFCQUFxQixNQUFNbkcsT0FDOUNvRyxFQUFhLEdBQ1J6RSxFQUFJLEVBQUdBLEVBQUlzRSxFQUFLakcsT0FBUTJCLElBQUssQ0FDbEMsR0FDSTBFLElBRGdCTixFQUFVTyxlQUFpQjNFLEVBQ2xDb0UsRUFBVVEsT0FBUVIsRUFBVUMsVUFBVXJFLElBQUs2RSxPQUFPLEdBQy9ELElBQUtILEdBQVVELEVBQ2YsQ0FDSSxHQUFJSyxHQUFTdkssU0FBU3dLLGNBQWUsTUFDakNDLEVBQVF6SyxTQUFTd0ssY0FBZSxLQUNwQ0MsR0FBTUMsUUFBVVYsRUFDaEJTLEVBQU05SixVQUFZLFFBQ2xCOEosRUFBTUUsVUFBWVIsRUFDbEJJLEVBQU9LLFlBQWFILEdBQ3BCVixFQUFLdEUsR0FBR29GLFdBQVdDLGFBQWNQLEVBQVFSLEVBQUt0RSxJQUM5Q3lFLEVBQWFDLEtBSXpCWSxpQkFBcUIsRUFBRyxRQUN4QnBELFlBQWdCLEVBQUcsUUFDbkIyQixLQUFRLHlCQUdacEosRUFBRThLLFdBQVdDLFNBQVMsSUFBSUMsV0FBYSxTQUN2Q2hMLEVBQUU4SyxXQUFXRyxZQUFZakwsRUFBRThLLFdBQVdDLFNBQVMsSUFHL0MsSUFBSUcsb0JBQXFCbEwsRUFBRSx1QkFBdUJvSCxXQUM5Q0UsYUFBZSxFQUNmRSxVQUFhekIsZUFDYjBCLFlBQWdCLEVBQUcsUUFDbkJFLFlBQWUsV0FDZjZCLGVBQ2FILGFBQWUsRUFBT3hCLFdBQWEsRUFBTzBCLE9BQVUsS0FBTUUsVUFBWSxFQUFNQyxVQUFjLEdBQ3ZGNUIsY0FBaUIsU0FBVUMsR0FDdkIvSCxFQUFFK0gsR0FBS0ssU0FBUyxhQUV2QmlCLGFBQWUsRUFBTUksVUFBWSxFQUFNRixPQUFVLE1BQU80QixVQUFhLEVBQUd6QixVQUFjLEtBQ3RGTCxhQUFlLEVBQU1JLFVBQVksRUFBTUYsT0FBVSxNQUFPRyxVQUFjLEtBQ3RFTCxhQUFlLEVBQU1JLFVBQVksRUFBTUYsT0FBVSxNQUFPNEIsVUFBYSxFQUFHekIsVUFBYyxHQUNuRjVCLGNBQWlCLFNBQVVDLEdBQ3ZCL0gsRUFBRStILEdBQUtLLFNBQVMsWUFFdkJpQixhQUFlLEVBQU9JLFVBQVksRUFBTUYsT0FBVSxNQUFPRyxVQUFjLEdBQ3BFNUIsY0FBaUIsU0FBVUMsR0FDdkIvSCxFQUFFK0gsR0FBS0ssU0FBUyxZQUV2QmlCLGFBQWUsRUFBTUksVUFBWSxFQUFNRixPQUFVLE1BQU9HLFVBQWMsR0FDbkU1QixjQUFpQixTQUFVQyxHQUN2Qi9ILEVBQUUrSCxHQUFLSyxTQUFTLGFBRXZCaUIsYUFBZSxFQUFNSSxVQUFZLEVBQU9DLFVBQWMsS0FDdERMLGFBQWUsRUFBTUksVUFBWSxFQUFPQyxVQUFjLEtBRW5FMEIsYUFBZ0IsU0FBV0MsRUFBU2xCLEVBQVFtQixHQUN4Q3RMLEVBQUV3QixNQUNFQyxTQUFZLE9BQ1pDLEtBQVEsT0FDUkMsSUFBTzBKLEVBQ1B6SixNQUFTQyxPQUFRLGlCQUFrQjBKLGFBQWN2TCxFQUFFLHdCQUF3QmlCLE1BQ3ZFdUssbUJBQW9CeEwsRUFBRSw4QkFBOEJpQixNQUNwRHdLLGdCQUFpQnpMLEVBQUUsMkJBQTJCaUIsTUFBT2MsUUFBU0MsRUFBRUMsSUFBSUYsU0FDeEVNLFFBQVcsU0FBU3FKLEdBQ2hCSixFQUFXSSxPQUl2QkMsWUFBYyxFQUNkQyxZQUFlLFNBQVVqQyxFQUFXMUIsR0FDaEMsSUFDSTRELGFBQWFDLFFBQVNDLElBQU0sYUFBY0MsS0FBS0MsVUFBVWhFLElBQzNELE1BQVFpRSxNQUdkQyxZQUFlLFNBQVV4QyxHQUNyQixJQUNJLE1BQU9xQyxNQUFLSSxNQUFPUCxhQUFhUSxRQUFRTixJQUFNLGVBQ2hELE1BQVFHLE1BR2Q1RCxlQUFrQixXQUNkdEksRUFBRSw2QkFBNkJlLEtBQUssV0FBVyxHQUMvQ3NDLDZCQUNBcEQsd0JBQ0FELEVBQUUsMEJBQTBCK0UsV0FBVyxjQUkvQy9FLEdBQUUsMEJBQTBCdUIsTUFBTSxXQUk5QixNQUhBdkIsR0FBRWMsTUFBTUMsS0FBSyxXQUFZLFlBQ3pCbUssbUJBQW1CdEYsZUFDbkJzRixtQkFBbUJyRixvQkFDWixJQUdYN0YsRUFBRSwyQkFBMkI4SyxZQUc3QixJQUFJOUcsUUFBU2hFLEVBQUUsMkJBQTJCb0gsV0FDdENFLGFBQWUsRUFDZkUsVUFBYXpCLGVBQ2I0QixZQUFlLFdBQ2Z5RCxhQUFnQixTQUFXQyxRQUFTbEIsT0FBUW1CLFlBR3hDdEwsRUFBRSxxQkFBcUJlLEtBQUssV0FBVyxZQUN2Q2YsRUFBRSxxQkFBcUJlLEtBQUssV0FBVyxZQUduQ2YsRUFBRSwyQkFBMkI0RCxPQUFTLEdBQ3RDNUQsRUFBRSw2Q0FBNkNzQixLQUFLZ0wsY0FBZ0IsUUFFeEV0TSxFQUFFLHNCQUFzQmUsS0FBSyxXQUFZLFlBQ3pDZixFQUFFLHlCQUF5QmUsS0FBSyxXQUFZLFlBQzVDZixFQUFFd0IsTUFDRUMsU0FBWSxPQUNaQyxLQUFRLE9BQ1JDLElBQU8wSixRQUNQekosTUFBU0MsT0FBUSxrQkFBbUJWLGNBQWVuQixFQUFFLGtCQUFrQm9CLE9BQVFXLFFBQVNDLEVBQUVDLElBQUlGLFNBQzlGTSxRQUFXLFNBQVNxSixRQUNoQnBKLEtBQUtvSixRQUNMM0gsK0JBQStCQyxRQUMvQnNILFdBQVdJLFFBRW1CLEtBQTFCMUwsRUFBRSxjQUFjb0IsUUFBaUJzSyxPQUFPYSxzQkFBd0IsR0FDaEV2TSxFQUFFLHNCQUFzQitFLFdBQVcsWUFDbkMvRSxFQUFFLHlCQUF5QitFLFdBQVcsWUFDdEMvRSxFQUFFLHdCQUF3QitFLFdBQVcsWUFDckNJLGlDQUFpQ25CLFVBRWpDaEUsRUFBRSxzQkFBc0JlLEtBQUssV0FBWSxZQUN6Q2YsRUFBRSx5QkFBeUJlLEtBQUssV0FBWSxZQUM1Q2YsRUFBRSx3QkFBd0JlLEtBQUssV0FBWSxhQUkvQ2YsRUFBRSxxQkFBcUIrRSxXQUFXLFlBQ2xDL0UsRUFBRSxxQkFBcUIrRSxXQUFXLGdCQUk5Q3lFLGVBQ0tILGFBQWUsRUFBT0ksVUFBWSxFQUFNQyxVQUFjLEtBQ3RETCxhQUFlLEVBQU1JLFVBQVksRUFBTUMsVUFBYyxHQUNsRDVCLGNBQWlCLFNBQVVDLEdBQ3ZCL0gsRUFBRStILEdBQUtLLFNBQVMsYUFFdkJpQixhQUFlLEVBQU1JLFVBQVksRUFBTUMsVUFBYyxLQUNyREwsYUFBZSxFQUFNSSxVQUFZLEVBQU1DLFVBQWMsTUE0QjlELElBdkJBMUosRUFBRSwwQkFBMEJFLFVBQ3hCeUQsUUFBTyxFQUFNdkQsTUFBTSxNQUFPQyxJQUFLLFFBQVNFLE9BQU8sUUFBU0MsUUFBUyxNQUFPQyxVQUFXLGtCQUNuRitMLEtBQU0sV0FDRSxHQUFJQyxHQUFXek0sRUFBRSwyQkFBMkJpQixNQUN4Q3lMLEVBQWUxTSxFQUFFLCtCQUErQjJNLEdBQUcsWUFBZSxJQUFNLElBRXhFQyxFQUFZLEVBRWhCNU0sR0FBRSw2QkFBNkJzRixLQUFLLFNBQVNDLEdBQ3pDcUgsR0FBYSxZQUFjckgsRUFBSSxJQUFNdkYsRUFBRWMsTUFBTUcsTUFDN0NzRSxLQUdKLElBQUlzSCxHQUFVdEosT0FBT3VKLFNBQVNOLEtBQzFCN0ssRUFBTWtMLEVBQVFFLFFBQVEsY0FBZSxnQ0FFekMsT0FBT3BMLEdBQU0sOEJBQWdDOEssRUFBVyxnQkFBa0JDLEVBQWNFLEVBQVksWUFBYzVLLEVBQUVDLElBQUlGLFNBRWhJZSxVQUFXLFdBQ1BTLE9BQU91SixTQUFXdkosT0FBT3VKLFlBSTdCOU0sRUFBRSxjQUFjNEQsT0FBUyxFQUFHLENBRzVCNUQsRUFBRSw2Q0FBNkNzQixLQUMzQ2dMLGNBQWdCLFFBR3BCdE0sRUFBRSxtREFBbURzQixLQUNqRGxCLE1BQVMsT0FDVDRNLGFBQWMsU0FHbEIsSUFBSUosV0FBWTVNLEVBQUUsY0FBY29CLE1BRWhDcEIsR0FBRXdCLE1BQ0VDLFNBQVksT0FDWkMsS0FBUSxPQUNSQyxJQUFPLFdBQ1BDLE1BQVNDLE9BQVEsaUJBQWtCK0ssVUFBV0EsVUFBV3hJLGdCQUFpQnBFLEVBQUUsb0JBQW9Cb0IsT0FDNUY2TCxtQkFBb0JqTixFQUFFLHVCQUF1Qm9CLE9BQVFXLFFBQVNDLEVBQUVDLElBQUlGLFNBQ3hFTSxRQUFTLFNBQVNULEdBQ2Q1QixFQUFFLDJCQUEyQm9CLEtBQUtRIiwiZmlsZSI6InR1cm5pdGludG9vbHR3b19leHRyYS5taW4uanMiLCJzb3VyY2VzQ29udGVudCI6WyJqUXVlcnkoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uKCQpIHtcbiAgICAvLyBBZGQgc3R5bGUgdG8gaGVhZGVyIHJvdy5cbiAgICAkKCcuc3VibWlzc2lvbnNEYXRhVGFibGUgdGhlYWQgdHIsICNjb3Vyc2VCcm93c2VyVGFibGUgdGhlYWQgdHInKS50b2dnbGVDbGFzcyhcImhlYWRlclwiKTtcblxuICAgIC8vIENvbmZpZ3VyZSBkYXRhdGFibGVzIGxhbmd1YWdlIHNldHRpbmdzLlxuICAgIHZhciBkYXRhVGFibGVzTGFuZyA9IHtcbiAgICAgICAgXCJub2ludGVncmF0aW9uXCI6IE0uc3RyLnR1cm5pdGludG9vbHR3by5ub2ludGVncmF0aW9uLFxuICAgICAgICBcInNQcm9jZXNzaW5nXCI6IE0uc3RyLnR1cm5pdGludG9vbHR3by5zcHJvY2Vzc2luZyxcbiAgICAgICAgXCJzWmVyb1JlY29yZHNcIjogTS5zdHIudHVybml0aW50b29sdHdvLnN6ZXJvcmVjb3JkcyxcbiAgICAgICAgXCJzSW5mb1wiOiBNLnN0ci50dXJuaXRpbnRvb2x0d28uc2luZm8sXG4gICAgICAgIFwic1NlYXJjaFwiOiBNLnN0ci50dXJuaXRpbnRvb2x0d28uc3NlYXJjaCxcbiAgICAgICAgXCJzTGVuZ3RoTWVudVwiOiBNLnN0ci50dXJuaXRpbnRvb2x0d28uc2xlbmd0aG1lbnUsXG4gICAgICAgIFwic0luZm9FbXB0eVwiOiBNLnN0ci50dXJuaXRpbnRvb2x0d28uc2VtcHR5dGFibGUsXG4gICAgICAgIFwib1BhZ2luYXRlXCI6IHtcbiAgICAgICAgICAgIFwic05leHRcIjogTS5zdHIudHVybml0aW50b29sdHdvLnNuZXh0LFxuICAgICAgICAgICAgXCJzUHJldmlvdXNcIjogTS5zdHIudHVybml0aW50b29sdHdvLnNwcmV2aW91c1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIC8vIENvbmZpZ3VyZSBkYXRhdGFibGVzIGxhbmd1YWdlIHNldHRpbmdzIGZvciBtaWdyYXRpb24gdG9vbC5cbiAgICB2YXIgZGF0YVRhYmxlc0xhbmdNaWdyYXRpb24gPSB7XG4gICAgICAgIFwibm9pbnRlZ3JhdGlvblwiOiBNLnN0ci50dXJuaXRpbnRvb2x0d28ubm9pbnRlZ3JhdGlvbixcbiAgICAgICAgXCJzUHJvY2Vzc2luZ1wiOiBNLnN0ci50dXJuaXRpbnRvb2x0d28uc3Byb2Nlc3NpbmcsXG4gICAgICAgIFwic1plcm9SZWNvcmRzXCI6IE0uc3RyLnR1cm5pdGludG9vbHR3by5zemVyb3JlY29yZHMsXG4gICAgICAgIFwic0luZm9cIjogTS5zdHIudHVybml0aW50b29sdHdvLnNpbmZvLFxuICAgICAgICBcInNTZWFyY2hcIjogJycsXG4gICAgICAgIFwic0xlbmd0aE1lbnVcIjogTS5zdHIudHVybml0aW50b29sdHdvLnNsZW5ndGhtaWdyYXRpb25tZW51LFxuICAgICAgICBcInNJbmZvRW1wdHlcIjogTS5zdHIudHVybml0aW50b29sdHdvLnNlbXB0eXRhYmxlLFxuICAgICAgICBcIm9QYWdpbmF0ZVwiOiB7XG4gICAgICAgICAgICBcInNOZXh0XCI6IE0uc3RyLnR1cm5pdGludG9vbHR3by5zbmV4dCxcbiAgICAgICAgICAgIFwic1ByZXZpb3VzXCI6IE0uc3RyLnR1cm5pdGludG9vbHR3by5zcHJldmlvdXNcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBDb25maWd1cmUgdGhlIHVubGluayBhbmQgcmVsaW5rIHVzZXJzIGRhdGF0YWJsZSBpbiB0aGUgcGx1Z2luIHNldHRpbmdzIGFyZWEuXG4gICAgJCgnI3VubGlua1VzZXJUYWJsZScpLmRhdGFUYWJsZSh7XG4gICAgICAgIFwiYkRlc3Ryb3lcIjogdHJ1ZSxcbiAgICAgICAgXCJiUHJvY2Vzc2luZ1wiOiB0cnVlLFxuICAgICAgICBcImJTZXJ2ZXJTaWRlXCI6IHRydWUsXG4gICAgICAgIFwib0xhbmd1YWdlXCI6IGRhdGFUYWJsZXNMYW5nLFxuICAgICAgICBcImFhU29ydGluZ1wiOiBbWyAyLCBcImFzY1wiIF1dLFxuICAgICAgICBcImFMZW5ndGhNZW51XCI6IFtbMTAsIDI1LCA1MCwgMTAwLCAtMV0sIFsxMCwgMjUsIDUwLCAxMDAsIFwiQWxsXCJdXSxcbiAgICAgICAgXCJzQWpheFNvdXJjZVwiOiBcImFqYXgucGhwP2FjdGlvbj1nZXRfdXNlcnNcIixcbiAgICAgICAgXCJhb0NvbHVtbnNcIjogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1wiYlNvcnRhYmxlXCI6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZm5DcmVhdGVkQ2VsbFwiOiBmdW5jdGlvbiAoblRkLCBzRGF0YSwgb0RhdGEsIGlSb3csIGlDb2wpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChuVGQpLmFkZENsYXNzKCdjZW50ZXJlZF9jZWxsJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfX0sXG4gICAgICAgICAgICAgICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAge1wiYURhdGFTb3J0XCI6IFsgMiwgMyBdfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcImFEYXRhU29ydFwiOiBbIDMsIDIgXX0sXG4gICAgICAgICAgICAgICAgICAgICAgICBudWxsXG4gICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICBcImZuRHJhd0NhbGxiYWNrXCI6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICQoJ2lucHV0W25hbWU9XCJzZWxlY3RhbGxjYlwiXScpLmF0dHIoJ2NoZWNrZWQnLCBmYWxzZSk7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIERpc2FibGUgdGhlIHN1Ym1pdCBidXR0b24gaWYgVHVybml0aW4gdjEgYW5kIHYyIGFjY291bnQgaWRzIGFyZSBkaWZmZXJlbnQgaW4gTWlncmF0aW9uIFRvb2wuXG4gICAgaWYgKCAkKCcjc2FtZXRpaWFjY291bnQnKS5kYXRhKCdzYW1ldGlpYWNjb3VudCcpID09IFwiMFwiICkge1xuICAgICAgICAkKCdzZWxlY3RbbmFtZT1cImVuYWJsZW1pZ3JhdGlvbnRvb2xcIl0nKS5hdHRyKCdkaXNhYmxlZCcsICdkaXNhYmxlZCcpO1xuICAgICAgICAkKCdzZWxlY3RbbmFtZT1cImVuYWJsZW1pZ3JhdGlvbnRvb2xcIl0nKS5jbG9zZXN0KCdmb3JtJykuZmluZCgnaW5wdXRbbmFtZT1cInN1Ym1pdGJ1dHRvblwiXScpLmF0dHIoJ2Rpc2FibGVkJywgJ2Rpc2FibGVkJyk7XG4gICAgfVxuXG4gICAgLy8gRGlzYWJsZSB0aGUgZGVsZXRlIGJ1dHRvbiBpbiBtaWdyYXRpb24gdGFiIGlmIHRoZXJlIGFyZSBubyByZXN1bHRzIHNlbGVjdGVkIGFuZCByZS1lbmFibGUgaWYgdGhlcmUgYXJlLlxuICAgICQoJ2lucHV0W25hbWU9XCJzZWxlY3RhbGxjYlwiXScpLmNsb3Nlc3QoJ2Zvcm0nKS5maW5kKCdpbnB1dFtuYW1lPVwic3VibWl0YnV0dG9uXCJdJykuYXR0cignZGlzYWJsZWQnLCAnZGlzYWJsZWQnKTtcbiAgICAkKGRvY3VtZW50KS5vbignY2xpY2snLCAnI21pZ3JhdGlvblRhYmxlIGlucHV0W25hbWU9XCJzZWxlY3RhbGxjYlwiXSwgI21pZ3JhdGlvblRhYmxlIC5icm93c2VyX2NoZWNrYm94JywgZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmICgkKCcjbWlncmF0aW9uVGFibGUgLmJyb3dzZXJfY2hlY2tib3g6Y2hlY2tlZCcpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICQoJyNtaWdyYXRpb25UYWJsZSAuYnJvd3Nlcl9jaGVja2JveCcpLmNsb3Nlc3QoJ2Zvcm0nKS5maW5kKCdpbnB1dFtuYW1lPVwic3VibWl0YnV0dG9uXCJdJykucmVtb3ZlQXR0cignZGlzYWJsZWQnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICQoJyNtaWdyYXRpb25UYWJsZSAuYnJvd3Nlcl9jaGVja2JveCcpLmNsb3Nlc3QoJ2Zvcm0nKS5maW5kKCdpbnB1dFtuYW1lPVwic3VibWl0YnV0dG9uXCJdJykuYXR0cignZGlzYWJsZWQnLCAnZGlzYWJsZWQnKTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gQXNrIGFkbWluaXN0cmF0b3IgZm9yIGNvbmZpcm1hdGlvbiBpZiB1c2VyIGNsaWNrcyB0byBkZWxldGUgc2VsZWN0ZWQgVjEgYXNzaWdubWVudHMuXG4gICAgdmFyIHN1Ym1pdGJ1dHRvbiA9ICQoJyNtaWdyYXRpb25UYWJsZScpLmNsb3Nlc3QoJ2Zvcm0nKS5maW5kKCdpbnB1dFtuYW1lPVwic3VibWl0YnV0dG9uXCJdJyk7XG4gICAgc3VibWl0YnV0dG9uLmNsaWNrKGZ1bmN0aW9uKGV2KSB7XG4gICAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgLy8gQ29uc3RydWN0IGNvbmZpcm0gbWVzc2FnZSB0byBhZG1pbmlzdHJhdG9yLlxuICAgICAgICB2YXIgbWVzc2FnZSA9IE0uc3RyLnR1cm5pdGludG9vbHR3by5jb25maXJtdjFkZWxldGV0aXRsZSsnXFxuXFxuJztcbiAgICAgICAgbWVzc2FnZSArPSBNLnV0aWwuZ2V0X3N0cmluZygnY29uZmlybXYxZGVsZXRldGV4dCcsICd0dXJuaXRpbnRvb2x0d28nLCAkKCcjbWlncmF0aW9uVGFibGUgLmJyb3dzZXJfY2hlY2tib3g6Y2hlY2tlZCcpLmxlbmd0aCkrJ1xcblxcbic7XG4gICAgICAgIG1lc3NhZ2UgKz0gTS5zdHIudHVybml0aW50b29sdHdvLmNvbmZpcm12MWRlbGV0ZXdhcm5pbmc7XG5cbiAgICAgICAgaWYgKGNvbmZpcm0obWVzc2FnZSkpIHtcbiAgICAgICAgICAgICQoJyNtaWdyYXRpb25UYWJsZScpLmNsb3Nlc3QoJ2Zvcm0nKS5zdWJtaXQoKTtcbiAgICAgICAgfVxuXG4gICAgfSk7XG5cbiAgICAvLyBDb25maWd1cmUgdGhlIG1pZ3JhdGlvbiBkYXRhdGFibGUgaW4gdGhlIHBsdWdpbiBzZXR0aW5ncyBhcmVhLlxuICAgICQoJyNtaWdyYXRpb25UYWJsZScpLmRhdGFUYWJsZSh7XG4gICAgICAgIFwiYkRlc3Ryb3lcIjogdHJ1ZSxcbiAgICAgICAgXCJiUHJvY2Vzc2luZ1wiOiB0cnVlLFxuICAgICAgICBcImJTZXJ2ZXJTaWRlXCI6IHRydWUsXG4gICAgICAgIFwib0xhbmd1YWdlXCI6IGRhdGFUYWJsZXNMYW5nTWlncmF0aW9uLFxuICAgICAgICBcImFhU29ydGluZ1wiOiBbWyAyLCBcImFzY1wiIF1dLFxuICAgICAgICBcImFMZW5ndGhNZW51XCI6IFtbMTAsIDI1LCA1MCwgMTAwLCAtMV0sIFsxMCwgMjUsIDUwLCAxMDAsIFwiQWxsXCJdXSxcbiAgICAgICAgXCJzQWpheFNvdXJjZVwiOiBcImFqYXgucGhwP2FjdGlvbj1nZXRfYXNzaWdubWVudHNcIixcbiAgICAgICAgXCJzRG9tXCI6ICc8XCJ0b3BcImxmPnJ0PFwiYm90dG9tXCJpcnA+PFwiY2xlYXJcIj4nLFxuICAgICAgICBcImFvQ29sdW1uc1wiOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XCJiU29ydGFibGVcIjogZmFsc2UsIFwiYlNlYXJjaGFibGVcIjogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJmbkNyZWF0ZWRDZWxsXCI6IGZ1bmN0aW9uIChuVGQsIHNEYXRhLCBvRGF0YSwgaVJvdywgaUNvbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKG5UZCkuYWRkQ2xhc3MoJ2NlbnRlcmVkX2NlbGwnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcImJTb3J0YWJsZVwiOiB0cnVlLCBcInNDbGFzc1wiOiBcImNlbnRlcmVkX2NlbGxcIiwgXCJiU2VhcmNoYWJsZVwiOiBmYWxzZX0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XCJiU29ydGFibGVcIjogdHJ1ZSwgXCJiU2VhcmNoYWJsZVwiOiB0cnVlfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcImJTb3J0YWJsZVwiOiB0cnVlLCBcInNDbGFzc1wiOiBcImNlbnRlcmVkX2NlbGxcIiwgXCJiU2VhcmNoYWJsZVwiOiBmYWxzZX1cbiAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgIFwiZm5EcmF3Q2FsbGJhY2tcIjogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgJCgnaW5wdXRbbmFtZT1cInNlbGVjdGFsbGNiXCJdJykuYXR0cignY2hlY2tlZCcsIGZhbHNlKTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgICQoJyNtaWdyYXRpb25UYWJsZV9maWx0ZXIgaW5wdXQnKS5hdHRyKFwicGxhY2Vob2xkZXJcIiwgJ1NlYXJjaCcpO1xuXG4gICAgLy8gQ29uZmlndXJlIHRoZSBmaWxlcyBkYXRhdGFibGUgaW4gdGhlIHBsdWdpbiBzZXR0aW5ncyBhcmVhLCBncm91cCB0aGUgZmlsZXMgYnkgYXNzaWdubWVudC5cbiAgICAkKCcjZmlsZXNUYWJsZScpLmRhdGFUYWJsZSgge1xuICAgICAgICBcImJEZXN0cm95XCI6IHRydWUsXG4gICAgICAgIFwiYlByb2Nlc3NpbmdcIjogdHJ1ZSxcbiAgICAgICAgXCJiU2VydmVyU2lkZVwiOiB0cnVlLFxuICAgICAgICBcIm9MYW5ndWFnZVwiOiBkYXRhVGFibGVzTGFuZyxcbiAgICAgICAgXCJzQWpheFNvdXJjZVwiOiBcImFqYXgucGhwP2FjdGlvbj1nZXRfZmlsZXNcIixcbiAgICAgICAgXCJhb0NvbHVtbnNcIjogW1xuICAgICAgICAgICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgICAgICAgICB7XCJzQ2xhc3NcIjogXCJmaWxlbmFtZSBjMFwiLCBcInNXaWR0aFwiOiBcIjQwJVwifSxcbiAgICAgICAgICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgICAgICAgICAge1wic0NsYXNzXCI6IFwiZnVsbG5hbWUgYzFcIiwgXCJzV2lkdGhcIjogXCIzNSVcIn0sXG4gICAgICAgICAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICAgICAgICAgIHtcInNDbGFzc1wiOiBcImNyZWF0ZWQgYzJcIiwgXCJzV2lkdGhcIjogXCIyMiVcIn0sXG4gICAgICAgICAgICAgICAgICAgIHtcInNDbGFzc1wiOiBcInJlbW92ZSBjM1wiLCBcInNXaWR0aFwiOiBcIjMlXCJ9XG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgXCJhb0NvbHVtbkRlZnNcIjogW1xuICAgICAgICAgICAgICAgICAgICB7XCJiU2VhcmNoYWJsZVwiOiB0cnVlLCBcImJWaXNpYmxlXCI6IGZhbHNlLCBcImFUYXJnZXRzXCI6IFsgMCBdfSxcbiAgICAgICAgICAgICAgICAgICAge1wiYlNlYXJjaGFibGVcIjogdHJ1ZSwgXCJiVmlzaWJsZVwiOiBmYWxzZSwgXCJhVGFyZ2V0c1wiOiBbIDEgXX0sXG4gICAgICAgICAgICAgICAgICAgIHtcImJTZWFyY2hhYmxlXCI6IHRydWUsIFwiYlZpc2libGVcIjogZmFsc2UsIFwiYVRhcmdldHNcIjogWyAyIF19LFxuICAgICAgICAgICAgICAgICAgICB7XCJiU2VhcmNoYWJsZVwiOiB0cnVlLCBcImJWaXNpYmxlXCI6IHRydWUsIFwiYVRhcmdldHNcIjogWyAzIF19LFxuICAgICAgICAgICAgICAgICAgICB7XCJiU2VhcmNoYWJsZVwiOiB0cnVlLCBcImJWaXNpYmxlXCI6IGZhbHNlLCBcImFUYXJnZXRzXCI6IFsgNCBdfSxcbiAgICAgICAgICAgICAgICAgICAge1wiYlNlYXJjaGFibGVcIjogdHJ1ZSwgXCJiVmlzaWJsZVwiOiB0cnVlLCBcImFUYXJnZXRzXCI6IFsgNSBdfSxcbiAgICAgICAgICAgICAgICAgICAge1wiYlNlYXJjaGFibGVcIjogdHJ1ZSwgXCJiVmlzaWJsZVwiOiBmYWxzZSwgXCJhVGFyZ2V0c1wiOiBbIDYgXX0sXG4gICAgICAgICAgICAgICAgICAgIHtcImJTZWFyY2hhYmxlXCI6IHRydWUsIFwiYlZpc2libGVcIjogdHJ1ZSwgXCJhVGFyZ2V0c1wiOiBbIDcgXX0sXG4gICAgICAgICAgICAgICAgICAgIHtcImJTZWFyY2hhYmxlXCI6IHRydWUsIFwiYlZpc2libGVcIjogdHJ1ZSwgXCJhVGFyZ2V0c1wiOiBbIDggXX1cbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICBcImZuRHJhd0NhbGxiYWNrXCI6IGZ1bmN0aW9uICggb1NldHRpbmdzICkge1xuICAgICAgICAgICAgaWYgKCBvU2V0dGluZ3MuYWlEaXNwbGF5Lmxlbmd0aCA9PSAwIClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBuVHJzID0gJCgnI2ZpbGVzVGFibGUgdGJvZHkgdHInKTtcbiAgICAgICAgICAgIHZhciBpQ29sc3BhbiA9IG5UcnNbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3RkJykubGVuZ3RoO1xuICAgICAgICAgICAgdmFyIHNMYXN0R3JvdXAgPSBcIlwiO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuVHJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIGlEaXNwbGF5SW5kZXggPSBvU2V0dGluZ3MuX2lEaXNwbGF5U3RhcnQgKyBpO1xuICAgICAgICAgICAgICAgIHZhciBzR3JvdXAgPSBvU2V0dGluZ3MuYW9EYXRhWyBvU2V0dGluZ3MuYWlEaXNwbGF5W2ldIF0uX2FEYXRhWzBdO1xuICAgICAgICAgICAgICAgIGlmICggc0dyb3VwICE9IHNMYXN0R3JvdXAgKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG5Hcm91cCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICd0cicgKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG5DZWxsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggJ3RkJyApO1xuICAgICAgICAgICAgICAgICAgICBuQ2VsbC5jb2xTcGFuID0gaUNvbHNwYW47XG4gICAgICAgICAgICAgICAgICAgIG5DZWxsLmNsYXNzTmFtZSA9IFwiZ3JvdXBcIjtcbiAgICAgICAgICAgICAgICAgICAgbkNlbGwuaW5uZXJIVE1MID0gc0dyb3VwO1xuICAgICAgICAgICAgICAgICAgICBuR3JvdXAuYXBwZW5kQ2hpbGQoIG5DZWxsICk7XG4gICAgICAgICAgICAgICAgICAgIG5UcnNbaV0ucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoIG5Hcm91cCwgblRyc1tpXSApO1xuICAgICAgICAgICAgICAgICAgICBzTGFzdEdyb3VwID0gc0dyb3VwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJhYVNvcnRpbmdGaXhlZFwiOiBbWyAwLCAnYXNjJyBdXSxcbiAgICAgICAgXCJhYVNvcnRpbmdcIjogW1sgMSwgJ2FzYycgXV0sXG4gICAgICAgIFwic0RvbVwiOiAnbGZyPFwiZ2l2ZUhlaWdodFwidD5pcCdcbiAgICB9KTtcblxuICAgICQuZGF0ZXBpY2tlci5yZWdpb25hbFtcIlwiXS5kYXRlRm9ybWF0ID0gJ2QgTSB5eSc7XG4gICAgJC5kYXRlcGlja2VyLnNldERlZmF1bHRzKCQuZGF0ZXBpY2tlci5yZWdpb25hbFsnJ10pO1xuXG4gICAgLy8gQ29uZmlndXJlIHRoZSBjb3Vyc2UgYnJvd3NlciBkYXRhIHRhYmxlIGFuZCBzaG93IGNsYXNzZXMgZnJvbSBUdXJuaXRpbiBhY29jdW50LlxuICAgIHZhciBjb3Vyc2VCcm93c2VyVGFibGUgPSAkKCcjY291cnNlQnJvd3NlclRhYmxlJykuZGF0YVRhYmxlKHtcbiAgICAgICAgXCJiUHJvY2Vzc2luZ1wiOiB0cnVlLFxuICAgICAgICBcIm9MYW5ndWFnZVwiOiBkYXRhVGFibGVzTGFuZyxcbiAgICAgICAgXCJhYVNvcnRpbmdcIjogW1sgNiwgJ2FzYyddXSxcbiAgICAgICAgXCJzQWpheFNvdXJjZVwiOiBcImFqYXgucGhwXCIsXG4gICAgICAgIFwiYW9Db2x1bW5EZWZzXCI6IFtcbiAgICAgICAgICAgICAgICAgICAge1wiYlNlYXJjaGFibGVcIjogZmFsc2UsIFwiYlNvcnRhYmxlXCI6IGZhbHNlLCBcInNXaWR0aFwiOiBcIjUlXCIsIFwiYlZpc2libGVcIjogdHJ1ZSwgXCJhVGFyZ2V0c1wiOiBbIDAgXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiZm5DcmVhdGVkQ2VsbFwiOiBmdW5jdGlvbiAoblRkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJChuVGQpLmFkZENsYXNzKCdjZW50ZXInKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH19LFxuICAgICAgICAgICAgICAgICAgICB7XCJiU2VhcmNoYWJsZVwiOiB0cnVlLCBcImJWaXNpYmxlXCI6IHRydWUsIFwic1dpZHRoXCI6IFwiNDUlXCIsIFwiaURhdGFTb3J0XCI6IDYsIFwiYVRhcmdldHNcIjogWyAxIF19LFxuICAgICAgICAgICAgICAgICAgICB7XCJiU2VhcmNoYWJsZVwiOiB0cnVlLCBcImJWaXNpYmxlXCI6IHRydWUsIFwic1dpZHRoXCI6IFwiMTAlXCIsIFwiYVRhcmdldHNcIjogWyAyIF19LFxuICAgICAgICAgICAgICAgICAgICB7XCJiU2VhcmNoYWJsZVwiOiB0cnVlLCBcImJWaXNpYmxlXCI6IHRydWUsIFwic1dpZHRoXCI6IFwiMjAlXCIsIFwiaURhdGFTb3J0XCI6IDcsIFwiYVRhcmdldHNcIjogWyAzIF0sXG4gICAgICAgICAgICAgICAgICAgICAgICBcImZuQ3JlYXRlZENlbGxcIjogZnVuY3Rpb24gKG5UZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoblRkKS5hZGRDbGFzcygncmlnaHQnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH19LFxuICAgICAgICAgICAgICAgICAgICB7XCJiU2VhcmNoYWJsZVwiOiBmYWxzZSwgXCJiVmlzaWJsZVwiOiB0cnVlLCBcInNXaWR0aFwiOiBcIjEwJVwiLCBcImFUYXJnZXRzXCI6IFsgNCBdLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJmbkNyZWF0ZWRDZWxsXCI6IGZ1bmN0aW9uIChuVGQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKG5UZCkuYWRkQ2xhc3MoJ3JpZ2h0Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9fSxcbiAgICAgICAgICAgICAgICAgICAge1wiYlNlYXJjaGFibGVcIjogdHJ1ZSwgXCJiVmlzaWJsZVwiOiB0cnVlLCBcInNXaWR0aFwiOiBcIjEwJVwiLCBcImFUYXJnZXRzXCI6IFsgNSBdLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJmbkNyZWF0ZWRDZWxsXCI6IGZ1bmN0aW9uIChuVGQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKG5UZCkuYWRkQ2xhc3MoJ2NlbnRlcicpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfX0sXG4gICAgICAgICAgICAgICAgICAgIHtcImJTZWFyY2hhYmxlXCI6IHRydWUsIFwiYlZpc2libGVcIjogZmFsc2UsIFwiYVRhcmdldHNcIjogWyA2IF19LFxuICAgICAgICAgICAgICAgICAgICB7XCJiU2VhcmNoYWJsZVwiOiB0cnVlLCBcImJWaXNpYmxlXCI6IGZhbHNlLCBcImFUYXJnZXRzXCI6IFsgNyBdfVxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgIFwiZm5TZXJ2ZXJEYXRhXCI6IGZ1bmN0aW9uICggc1NvdXJjZSwgYW9EYXRhLCBmbkNhbGxiYWNrICkge1xuICAgICAgICAgICAgJC5hamF4KHtcbiAgICAgICAgICAgICAgICBcImRhdGFUeXBlXCI6ICdqc29uJyxcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJQT1NUXCIsXG4gICAgICAgICAgICAgICAgXCJ1cmxcIjogc1NvdXJjZSxcbiAgICAgICAgICAgICAgICBcImRhdGFcIjoge2FjdGlvbjogXCJzZWFyY2hfY2xhc3Nlc1wiLCBjb3Vyc2VfdGl0bGU6ICQoJyNzZWFyY2hfY291cnNlX3RpdGxlJykudmFsKCksXG4gICAgICAgICAgICAgICAgICAgIGNvdXJzZV9pbnRlZ3JhdGlvbjogJCgnI3NlYXJjaF9jb3Vyc2VfaW50ZWdyYXRpb24nKS52YWwoKSxcbiAgICAgICAgICAgICAgICAgICAgY291cnNlX2VuZF9kYXRlOiAkKCcjc2VhcmNoX2NvdXJzZV9lbmRfZGF0ZScpLnZhbCgpLCBzZXNza2V5OiBNLmNmZy5zZXNza2V5fSxcbiAgICAgICAgICAgICAgICBcInN1Y2Nlc3NcIjogZnVuY3Rpb24ocmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgICAgIGZuQ2FsbGJhY2socmVzdWx0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgXCJiU3RhdGVTYXZlXCI6IHRydWUsXG4gICAgICAgIFwiZm5TdGF0ZVNhdmVcIjogZnVuY3Rpb24gKG9TZXR0aW5ncywgb0RhdGEpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oIHVpZCArICdEYXRhVGFibGVzJywgSlNPTi5zdHJpbmdpZnkob0RhdGEpICk7XG4gICAgICAgICAgICB9IGNhdGNoICggZSApIHtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJmblN0YXRlTG9hZFwiOiBmdW5jdGlvbiAob1NldHRpbmdzKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKCBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSh1aWQgKyAnRGF0YVRhYmxlcycpICk7XG4gICAgICAgICAgICB9IGNhdGNoICggZSApIHtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJmbkRyYXdDYWxsYmFja1wiOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAkKCdpbnB1dFtuYW1lPVwic2VsZWN0YWxsY2JcIl0nKS5hdHRyKCdjaGVja2VkJywgZmFsc2UpO1xuICAgICAgICAgICAgaW5pdGlhbGlzZUNvdXJzZVJlY3JlYXRpb24oKTtcbiAgICAgICAgICAgIGluaXRpYWxpc2VFZGl0RW5kRGF0ZSgpO1xuICAgICAgICAgICAgJChcIiNzZWFyY2hfY291cnNlc19idXR0b25cIikucmVtb3ZlQXR0cignZGlzYWJsZWQnKTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgJChcIiNzZWFyY2hfY291cnNlc19idXR0b25cIikuY2xpY2soZnVuY3Rpb24gKCkge1xuICAgICAgICAkKHRoaXMpLmF0dHIoJ2Rpc2FibGVkJywgJ2Rpc2FibGVkJyk7XG4gICAgICAgIGNvdXJzZUJyb3dzZXJUYWJsZS5mblJlbG9hZEFqYXgoKTtcbiAgICAgICAgY291cnNlQnJvd3NlclRhYmxlLmZuU3RhbmRpbmdSZWRyYXcoKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0pO1xuXG4gICAgJCgnI3NlYXJjaF9jb3Vyc2VfZW5kX2RhdGUnKS5kYXRlcGlja2VyKCk7XG5cbiAgICAvLyBJbml0aWFsaXNlIGFzc2lnbm1lbnQgYnJvd3NlciB0YWJsZS5cbiAgICB2YXIgb1RhYmxlID0gJCgnI2Fzc2lnbm1lbnRCcm93c2VyVGFibGUnKS5kYXRhVGFibGUoe1xuICAgICAgICBcImJQcm9jZXNzaW5nXCI6IHRydWUsXG4gICAgICAgIFwib0xhbmd1YWdlXCI6IGRhdGFUYWJsZXNMYW5nLFxuICAgICAgICBcInNBamF4U291cmNlXCI6IFwiYWpheC5waHBcIixcbiAgICAgICAgXCJmblNlcnZlckRhdGFcIjogZnVuY3Rpb24gKCBzU291cmNlLCBhb0RhdGEsIGZuQ2FsbGJhY2sgKSB7XG5cbiAgICAgICAgICAgIC8vIERpc2FibGUgY291cnNlIGJ1dHRvbnMuXG4gICAgICAgICAgICAkKCcjaWRfY3JlYXRlX2NvdXJzZScpLmF0dHIoJ2Rpc2FibGVkJywnZGlzYWJsZWQnKTtcbiAgICAgICAgICAgICQoJyNpZF91cGRhdGVfY291cnNlJykuYXR0cignZGlzYWJsZWQnLCdkaXNhYmxlZCcpO1xuXG4gICAgICAgICAgICAvLyBNb3ZlIGJveCB3aXRoaW4gZm9ybS5cbiAgICAgICAgICAgIGlmICgkKFwiI2Fzc2lnbm1lbnRCcm93c2VyVGFibGVcIikubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICQoXCIuc2lkZS1wcmUtb25seSAjcGFnZS1jb250ZW50ICNyZWdpb24tbWFpblwiKS5jc3MoeydtYXJnaW4tbGVmdCcgOiAnMHB4J30pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgJChcIiNpZF9hc3NpZ25tZW50bmFtZVwiKS5hdHRyKCdkaXNhYmxlZCcsICdkaXNhYmxlZCcpO1xuICAgICAgICAgICAgJChcIiNpZF9jcmVhdGVfYXNzaWdubWVudFwiKS5hdHRyKCdkaXNhYmxlZCcsICdkaXNhYmxlZCcpO1xuICAgICAgICAgICAgJC5hamF4KHtcbiAgICAgICAgICAgICAgICBcImRhdGFUeXBlXCI6ICdqc29uJyxcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJQT1NUXCIsXG4gICAgICAgICAgICAgICAgXCJ1cmxcIjogc1NvdXJjZSxcbiAgICAgICAgICAgICAgICBcImRhdGFcIjoge2FjdGlvbjogXCJnZXRfYXNzaWdubWVudHNcIiwgdGlpX2NvdXJzZV9pZDogJChcIiN0aWlfY291cnNlX2lkXCIpLmh0bWwoKSwgc2Vzc2tleTogTS5jZmcuc2Vzc2tleX0sXG4gICAgICAgICAgICAgICAgXCJzdWNjZXNzXCI6IGZ1bmN0aW9uKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgICAgICBldmFsKHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgICAgIGluaXRpYWxpc2VDb3Vyc2VCcm93c2VyQnV0dG9ucyhvVGFibGUpO1xuICAgICAgICAgICAgICAgICAgICBmbkNhbGxiYWNrKHJlc3VsdCk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCQoXCIjY291cnNlX2lkXCIpLmh0bWwoKSAhPSBcIjBcIiAmJiByZXN1bHQubnVtYmVyX29mX2Fzc2lnbm1lbnRzID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgJChcIiNpZF9hc3NpZ25tZW50bmFtZVwiKS5yZW1vdmVBdHRyKCdkaXNhYmxlZCcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgJChcIiNpZF9jcmVhdGVfYXNzaWdubWVudFwiKS5yZW1vdmVBdHRyKCdkaXNhYmxlZCcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgJChcIi5hc3NpZ25tZW50aWRzX2NoZWNrXCIpLnJlbW92ZUF0dHIoJ2Rpc2FibGVkJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsaXNlQ3JlYXRlQXNzaWdubWVudEJ1dHRvbihvVGFibGUpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgJChcIiNpZF9hc3NpZ25tZW50bmFtZVwiKS5hdHRyKCdkaXNhYmxlZCcsICdkaXNhYmxlZCcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgJChcIiNpZF9jcmVhdGVfYXNzaWdubWVudFwiKS5hdHRyKCdkaXNhYmxlZCcsICdkaXNhYmxlZCcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgJChcIi5hc3NpZ25tZW50aWRzX2NoZWNrXCIpLmF0dHIoJ2Rpc2FibGVkJywgJ2Rpc2FibGVkJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBFbmFibGUgY291cnNlIGJ1dHRvbnMuXG4gICAgICAgICAgICAgICAgICAgICQoJyNpZF9jcmVhdGVfY291cnNlJykucmVtb3ZlQXR0cignZGlzYWJsZWQnKTtcbiAgICAgICAgICAgICAgICAgICAgJCgnI2lkX3VwZGF0ZV9jb3Vyc2UnKS5yZW1vdmVBdHRyKCdkaXNhYmxlZCcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBcImFvQ29sdW1uRGVmc1wiOiBbXG4gICAgICAgICAgICB7XCJiU2VhcmNoYWJsZVwiOiBmYWxzZSwgXCJiVmlzaWJsZVwiOiB0cnVlLCBcImFUYXJnZXRzXCI6IFsgMCBdfSxcbiAgICAgICAgICAgIHtcImJTZWFyY2hhYmxlXCI6IHRydWUsIFwiYlZpc2libGVcIjogdHJ1ZSwgXCJhVGFyZ2V0c1wiOiBbIDEgXSxcbiAgICAgICAgICAgICAgICBcImZuQ3JlYXRlZENlbGxcIjogZnVuY3Rpb24gKG5UZCkge1xuICAgICAgICAgICAgICAgICAgICAkKG5UZCkuYWRkQ2xhc3MoJ25vd3JhcCcpO1xuICAgICAgICAgICAgICAgIH19LFxuICAgICAgICAgICAge1wiYlNlYXJjaGFibGVcIjogdHJ1ZSwgXCJiVmlzaWJsZVwiOiB0cnVlLCBcImFUYXJnZXRzXCI6IFsgMiBdfSxcbiAgICAgICAgICAgIHtcImJTZWFyY2hhYmxlXCI6IHRydWUsIFwiYlZpc2libGVcIjogdHJ1ZSwgXCJhVGFyZ2V0c1wiOiBbIDMgXX1cbiAgICAgICAgXVxuICAgIH0pO1xuXG4gICAgLy8gT3BlbiBhbiBpZnJhbWUgbGlnaHQgYm94IHdoaWNoIGFsbG93cyB0aGUgY3JlYXRpb24gb2YgY2xhc3Nlcy5cbiAgICAkKCcjY3JlYXRlX2NsYXNzZXNfYnV0dG9uJykuY29sb3Jib3goe1xuICAgICAgICBpZnJhbWU6dHJ1ZSwgd2lkdGg6JzYwJScsIHRvcDogJzIwMHB4JywgaGVpZ2h0OicxMjRweCcsIG9wYWNpdHk6IFwiMC43XCIsIGNsYXNzTmFtZTogXCJjb3Vyc2VfY3JlYXRpb25cIixcbiAgICAgICAgaHJlZjogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgdmFyIGNhdGVnb3J5ID0gJCgnLmNyZWF0ZV9jb3Vyc2VfY2F0ZWdvcnknKS52YWwoKTtcbiAgICAgICAgICAgICAgICB2YXIgYXNzaWdubWVudHMgPSAoJCgnLmNyZWF0ZV9hc3NpZ25tZW50X2NoZWNrYm94JykuaXMoJzpjaGVja2VkJykpID8gXCIxXCIgOiBcIjBcIjtcblxuICAgICAgICAgICAgICAgIHZhciBjbGFzc19pZHMgPSBcIlwiO1xuICAgICAgICAgICAgICAgIHZhciBpID0gMDtcbiAgICAgICAgICAgICAgICAkKCcuYnJvd3Nlcl9jaGVja2JveDpjaGVja2VkJykuZWFjaChmdW5jdGlvbihpKXtcbiAgICAgICAgICAgICAgICAgICAgY2xhc3NfaWRzICs9IFwiJmNsYXNzX2lkXCIgKyBpICsgXCI9XCIgKyAkKHRoaXMpLnZhbCgpO1xuICAgICAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICB2YXIgcGFnZXVybCA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmO1xuICAgICAgICAgICAgICAgIHZhciB1cmwgPSBwYWdldXJsLnJlcGxhY2UoXCJjbWQ9Y291cnNlc1wiLCBcImNtZD1tdWx0aXBsZV9jbGFzc19yZWNyZWF0aW9uXCIpO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHVybCArIFwiJnZpZXdfY29udGV4dD1ib3gmY2F0ZWdvcnk9XCIgKyBjYXRlZ29yeSArIFwiJmFzc2lnbm1lbnRzPVwiICsgYXNzaWdubWVudHMgKyBjbGFzc19pZHMgKyBcIiZzZXNza2V5PVwiICsgTS5jZmcuc2Vzc2tleTtcbiAgICAgICAgfSxcbiAgICAgICAgb25DbGVhbnVwOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbiA9IHdpbmRvdy5sb2NhdGlvbjtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKCQoJyNjbGFzc19pZHMnKS5sZW5ndGggPiAwKSB7XG5cbiAgICAgICAgLy8gTW92ZSBib3ggd2l0aGluIGZyYW1lLlxuICAgICAgICAkKFwiLnNpZGUtcHJlLW9ubHkgI3BhZ2UtY29udGVudCAjcmVnaW9uLW1haW5cIikuY3NzKHtcbiAgICAgICAgICAgICdtYXJnaW4tbGVmdCcgOiAnMHB4J1xuICAgICAgICB9KTtcblxuICAgICAgICAkKFwiLmhhcy1yZWdpb24tc2lkZS1wcmUgI3BhZ2UtY29udGVudCAjcmVnaW9uLW1haW5cIikuY3NzKHtcbiAgICAgICAgICAgICd3aWR0aCc6ICcxMDAlJyxcbiAgICAgICAgICAgICdtYXJnaW4tdG9wJzogJy0zMHB4J1xuICAgICAgICB9KTtcblxuICAgICAgICB2YXIgY2xhc3NfaWRzID0gJCgnI2NsYXNzX2lkcycpLmh0bWwoKTtcblxuICAgICAgICAkLmFqYXgoe1xuICAgICAgICAgICAgXCJkYXRhVHlwZVwiOiAnaHRtbCcsXG4gICAgICAgICAgICBcInR5cGVcIjogXCJQT1NUXCIsXG4gICAgICAgICAgICBcInVybFwiOiBcImFqYXgucGhwXCIsXG4gICAgICAgICAgICBcImRhdGFcIjoge2FjdGlvbjogXCJjcmVhdGVfY291cnNlc1wiLCBjbGFzc19pZHM6IGNsYXNzX2lkcywgY291cnNlX2NhdGVnb3J5OiAkKFwiI2NvdXJzZV9jYXRlZ29yeVwiKS5odG1sKCksXG4gICAgICAgICAgICAgICAgY3JlYXRlX2Fzc2lnbm1lbnRzOiAkKFwiI2NyZWF0ZV9hc3NpZ25tZW50c1wiKS5odG1sKCksIHNlc3NrZXk6IE0uY2ZnLnNlc3NrZXl9LFxuICAgICAgICAgICAgc3VjY2VzczogZnVuY3Rpb24oZGF0YSkge1xuICAgICAgICAgICAgICAgICQoJyNjb3Vyc2VfY3JlYXRpb25fc3RhdHVzJykuaHRtbChkYXRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gU2hvdyBsaWdodCBib3ggdG8gY2hhbmdlIHRoZSBlbmQgZGF0ZSBvZiBhIGNvdXJzZS5cbiAgICBmdW5jdGlvbiBpbml0aWFsaXNlRWRpdEVuZERhdGUoKSB7XG4gICAgICAgICQoXCJhLmVkaXRfY291cnNlX2VuZF9saW5rXCIpLmNvbG9yYm94KHtcbiAgICAgICAgICAgIGlubGluZTp0cnVlLCB3aWR0aDpcIjYwJVwiLCB0b3A6IFwiMTAwcHhcIiwgYmFja2dyb3VuZDogXCIjZmZmXCIsIGhlaWdodDpcIjI2MHB4XCIsIG9wYWNpdHk6IFwiMC43XCIsIGNsYXNzTmFtZTogXCJlZGl0X2VuZF9kYXRlX2Zvcm1cIixcbiAgICAgICAgICAgIG9uTG9hZDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgbGlnaHRCb3hDbG9zZUJ1dHRvbigpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG9uQ29tcGxldGUgOiBmdW5jdGlvbigpIHtcblxuICAgICAgICAgICAgICAgIC8vIEdldCBjdXJyZW50IGRhdGUgZnJvbSB0aGUgc3BhbiBpZCB3aXRoaW4gdGhlIGxpbmsgYW5kIHNldFxuICAgICAgICAgICAgICAgIC8vIHRoZSBkYXRlIG9mIHRoZSBkYXRlcGlja2VyIGluIHRoZSBsaWdodGJveCB0byB0aGF0LlxuICAgICAgICAgICAgICAgIHZhciBjdXJyZW50X2RhdGUgPSAkKCcjJyArICQodGhpcykuYXR0cihcImlkXCIpICsgJyBzcGFuJykuYXR0cihcImlkXCIpO1xuICAgICAgICAgICAgICAgIGN1cnJlbnRfZGF0ZSA9IGN1cnJlbnRfZGF0ZS5zcGxpdChcIl9cIik7XG4gICAgICAgICAgICAgICAgJCgnI2lkX25ld19jb3Vyc2VfZW5kX2RhdGVfZGF5JykudmFsKGN1cnJlbnRfZGF0ZVsxXSk7XG4gICAgICAgICAgICAgICAgJCgnI2lkX25ld19jb3Vyc2VfZW5kX2RhdGVfbW9udGgnKS52YWwoY3VycmVudF9kYXRlWzJdKTtcbiAgICAgICAgICAgICAgICAkKCcjaWRfbmV3X2NvdXJzZV9lbmRfZGF0ZV95ZWFyJykudmFsKGN1cnJlbnRfZGF0ZVszXSk7XG5cbiAgICAgICAgICAgICAgICB2YXIgaWRTdHIgPSAkKHRoaXMpLmF0dHIoXCJpZFwiKS5zcGxpdChcIl9cIik7XG4gICAgICAgICAgICAgICAgdmFyIHRpaV9jb3Vyc2VfaWQgPSBpZFN0clsyXTtcbiAgICAgICAgICAgICAgICAkKCdpbnB1dFtuYW1lPVwidGlpX2NvdXJzZV9pZFwiXScpLnZhbCh0aWlfY291cnNlX2lkKTtcbiAgICAgICAgICAgICAgICAkKCdpbnB1dFtuYW1lPVwidGlpX2NvdXJzZV90aXRsZVwiXScpLnZhbCgkKCdhI2NvdXJzZV8nICsgdGlpX2NvdXJzZV9pZCkuaHRtbCgpKTtcbiAgICAgICAgICAgICAgICAkKCcjY2JveExvYWRlZENvbnRlbnQgLmVkaXRfY291cnNlX2VuZF9kYXRlX2Zvcm0nKS5zaG93KCk7XG4gICAgICAgICAgICAgICAgJCgnI2RhdGVzZWxlY3Rvci1jYWxlbmRhci1wYW5lbCcpLmNzcygnei1pbmRleCcsICc5OTk5Jyk7XG5cbiAgICAgICAgICAgICAgICAkKCcjaWRfc2F2ZV9lbmRfZGF0ZScpLmNsaWNrKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAkLmFqYXgoe1xuICAgICAgICAgICAgICAgICAgICAgICAgXCJkYXRhVHlwZVwiOiAnanNvbicsXG4gICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJQT1NUXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcInVybFwiOiBcImFqYXgucGhwXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcImRhdGFcIjoge2FjdGlvbjogXCJlZGl0X2NvdXJzZV9lbmRfZGF0ZVwiLCB0aWlfY291cnNlX2lkOiB0aWlfY291cnNlX2lkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpaV9jb3Vyc2VfdGl0bGU6ICQoJ2EjY291cnNlXycgKyB0aWlfY291cnNlX2lkKS5odG1sKCksIHNlc3NrZXk6IE0uY2ZnLnNlc3NrZXksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kX2RhdGVfZDogJCgnI2lkX25ld19jb3Vyc2VfZW5kX2RhdGVfZGF5JykudmFsKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kX2RhdGVfbTogJCgnI2lkX25ld19jb3Vyc2VfZW5kX2RhdGVfbW9udGgnKS52YWwoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRfZGF0ZV95OiAkKCcjaWRfbmV3X2NvdXJzZV9lbmRfZGF0ZV95ZWFyJykudmFsKClcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbihkYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZhbChkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS5zdGF0dXMgPT0gXCJzdWNjZXNzXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50LiQuZm4uY29sb3Jib3guY2xvc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnI2NvdXJzZV9kYXRlXycgKyB0aWlfY291cnNlX2lkICsgJyBzcGFuJykuaHRtbChkYXRhLmVuZF9kYXRlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY3VycmVudF9tc2cgPSAkKCcjZWRpdF9lbmRfZGF0ZV9kZXNjJykuaHRtbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnI2VkaXRfZW5kX2RhdGVfZGVzYycpLmh0bWwoY3VycmVudF9tc2cgKyBcIiBcIiArIGRhdGEubXNnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG9uQ2xlYW51cDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgJCgnLmVkaXRfY291cnNlX2VuZF9kYXRlX2Zvcm0nKS5oaWRlKCk7XG4gICAgICAgICAgICAgICAgJCgnI3RpaV9jbG9zZV9iYXInKS5yZW1vdmUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGlnaHRCb3hDbG9zZUJ1dHRvbigpIHtcbiAgICAgICAgJCgnYm9keScpLmFwcGVuZCgnPGRpdiBpZD1cInRpaV9jbG9zZV9iYXJcIj48YSBocmVmPVwiI1wiIG9uY2xpY2s9XCIkLmNvbG9yYm94LmNsb3NlKCk7IHJldHVybiBmYWxzZTtcIj4nICsgTS5zdHIudHVybml0aW50b29sdHdvLmNsb3NlYnV0dG9uICsgJzwvYT48L2Rpdj4nKTtcbiAgICB9XG5cbiAgICAvLyBTaG93IGxpZ2h0IGJveCB3aXRoIGEgZm9ybSB0byBlaXRoZXIgY3JlYXRlIGEgbmV3IGNvdXJzZSBvciBsaW5rIGFuIHVubGlua2VkIE1vb2RsZSBjb3Vyc2VcbiAgICAvLyB0byB0aGUgY2xpY2tlZCBUdXJuaXRpbiBjbGFzcywgdGhlbiBzdWJzZXF1ZW50bHkgY3JlYXRlIGEgTW9vZGxlIGFzc2lnbm1lbnQgdXNpbmcgdGhlIHNlbGVjdGVkXG4gICAgLy8gZXhpc3RpbmcgYXNzaWdubWVudHMgb24gVHVybml0aW4gYXMgcGFydHMuXG4gICAgZnVuY3Rpb24gaW5pdGlhbGlzZUNvdXJzZVJlY3JlYXRpb24oKSB7XG5cbiAgICAgICAgdmFyIHdpbmRvd1dpZHRoID0gJCh3aW5kb3cpLndpZHRoKCk7XG4gICAgICAgIHZhciBjb2xvckJveFdpZHRoID0gXCI4MCVcIjtcbiAgICAgICAgaWYgKHdpbmRvd1dpZHRoIDwgMTAwMCkge1xuICAgICAgICAgICAgY29sb3JCb3hXaWR0aCA9IFwiODYwcHhcIjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciB3aW5kb3dIZWlnaHQgPSAkKHdpbmRvdykud2lkdGgoKTtcbiAgICAgICAgdmFyIGNvbG9yQm94SGVpZ2h0ID0gXCI4MCVcIjtcbiAgICAgICAgaWYgKHdpbmRvd0hlaWdodCA8IDcwMCkge1xuICAgICAgICAgICAgY29sb3JCb3hIZWlnaHQgPSBcIjYwMHB4XCI7XG4gICAgICAgIH1cblxuICAgICAgICAkKFwiYS5jb3Vyc2VfcmVjcmVhdGVcIikuY29sb3Jib3goe1xuICAgICAgICAgICAgaWZyYW1lOnRydWUsIHdpZHRoOmNvbG9yQm94V2lkdGgsIGhlaWdodDpjb2xvckJveEhlaWdodCwgdG9wOiAnMTAwcHgnLCBjbGFzc05hbWU6IFwibWlncmF0aW9uXCIsIG9wYWNpdHk6IFwiMC43XCIsXG4gICAgICAgICAgICBvbkxvYWQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIGxpZ2h0Qm94Q2xvc2VCdXR0b24oKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvbkNsZWFudXA6ZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgJCgnI3RpaV9jbG9zZV9iYXInKS5yZW1vdmUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgJCgnLmJyb3dzZXJfY2hlY2tib3gnKS5jbGljayhmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGlmICgkKCcuYnJvd3Nlcl9jaGVja2JveDpjaGVja2VkJykubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICQoJy5jcmVhdGVfY2hlY2tib3hlcycpLnNsaWRlRG93bigpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAkKCcuY3JlYXRlX2NoZWNrYm94ZXMnKS5zbGlkZVVwKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIE1ha2UgdGhlIGJ1dHRvbnMgb24gdGhlIGNvdXJzZSBjcmVhdGlvbi9saW5rIGZvcm1zIGNsaWNrYWJsZSBhbmQgY29uZmlndXJlIHRoZSByZWxldmFudCB0cmlnZ2VyZWQgZXZlbnQuXG4gICAgZnVuY3Rpb24gaW5pdGlhbGlzZUNvdXJzZUJyb3dzZXJCdXR0b25zKG9UYWJsZSkge1xuICAgICAgICAkKCcjaWRfY3JlYXRlX2NvdXJzZScpLmNsaWNrKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgJC5hamF4KHtcbiAgICAgICAgICAgICAgICBcImRhdGFUeXBlXCI6ICdodG1sJyxcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJQT1NUXCIsXG4gICAgICAgICAgICAgICAgXCJ1cmxcIjogXCJhamF4LnBocFwiLFxuICAgICAgICAgICAgICAgIFwiZGF0YVwiOiB7YWN0aW9uOiBcImNyZWF0ZV9jb3Vyc2VcIiwgdGlpX2NvdXJzZV9pZDogJChcIiN0aWlfY291cnNlX2lkXCIpLmh0bWwoKSxcbiAgICAgICAgICAgICAgICAgICAgdGlpX2NvdXJzZV9uYW1lOiBlbmNvZGVVUklDb21wb25lbnQoJChcIiN0aWlfY291cnNlX25hbWVcIikuaHRtbCgpKSxcbiAgICAgICAgICAgICAgICAgICAgY291cnNlX25hbWU6IGVuY29kZVVSSUNvbXBvbmVudCgkKFwiI2lkX2NvdXJzZW5hbWVcIikudmFsKCkpLFxuICAgICAgICAgICAgICAgICAgICBjb3Vyc2VfY2F0ZWdvcnk6ICQoXCIjaWRfY291cnNlY2F0ZWdvcnlcIikudmFsKCksIHNlc3NrZXk6IE0uY2ZnLnNlc3NrZXl9LFxuICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uKGRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG9iaiA9IGpRdWVyeS5wYXJzZUpTT04oZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgIGhpZGVDb3Vyc2VDcmVhdGlvbk9wdGlvbnMob2JqLCBvVGFibGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICAkKCcjaWRfdXBkYXRlX2NvdXJzZScpLmNsaWNrKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgJC5hamF4KHtcbiAgICAgICAgICAgICAgICBcImRhdGFUeXBlXCI6ICdodG1sJyxcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJQT1NUXCIsXG4gICAgICAgICAgICAgICAgXCJ1cmxcIjogXCJhamF4LnBocFwiLFxuICAgICAgICAgICAgICAgIFwiZGF0YVwiOiB7YWN0aW9uOiBcImxpbmtfY291cnNlXCIsIHRpaV9jb3Vyc2VfaWQ6ICQoXCIjdGlpX2NvdXJzZV9pZFwiKS5odG1sKCksXG4gICAgICAgICAgICAgICAgICAgIHRpaV9jb3Vyc2VfbmFtZTogJChcIiN0aWlfY291cnNlX25hbWVcIikuaHRtbCgpLCBjb3Vyc2VfdG9fbGluazogJChcIiNpZF9jb3Vyc2V0b2xpbmtcIikudmFsKCksXG4gICAgICAgICAgICAgICAgICAgIHNlc3NrZXk6IE0uY2ZnLnNlc3NrZXl9LFxuICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uKGRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG9iaiA9IGpRdWVyeS5wYXJzZUpTT04oZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgIGhpZGVDb3Vyc2VDcmVhdGlvbk9wdGlvbnMob2JqLCBvVGFibGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBIaWRlIHRoZSBjb3Vyc2UgY3JlYXRpb24vbGlua2luZyBmb3JtIG9uY2UgdGhlIHNlbGVjdGVkIFR1cm5pdGluXG4gICAgLy8gY291cnNlIGhhcyBiZWVuIGNyZWF0ZWQvbGlua2VkIGxvY2FsbHkgYW5kIGluaXRpYWxpc2UgdGhlIGNyZWF0ZSBhc3NpZ25tZW50IGJ1dHRvbi5cbiAgICBmdW5jdGlvbiBoaWRlQ291cnNlQ3JlYXRpb25PcHRpb25zKG9iaiwgb1RhYmxlKSB7XG4gICAgICAgIGlmIChvYmogIT0gMCkge1xuICAgICAgICAgICAgJChcIiNjb3Vyc2VfaWRcIikuaHRtbChvYmouY291cnNlaWQpO1xuXG4gICAgICAgICAgICB2YXIgY2JfZWxlbWVudCA9ICdpbnB1dFtuYW1lPVwiY2hlY2tfJyArICQoJyN0aWlfY291cnNlX2lkJykuaHRtbCgpICsgJ1wiXSc7XG4gICAgICAgICAgICBwYXJlbnQuJChjYl9lbGVtZW50KS5oaWRlKCk7XG4gICAgICAgICAgICB2YXIgdGlja19lbGVtZW50ID0gJyN0aWNrXycgKyAkKCcjdGlpX2NvdXJzZV9pZCcpLmh0bWwoKTtcbiAgICAgICAgICAgIHBhcmVudC4kKHRpY2tfZWxlbWVudCkuc2hvdygpO1xuXG4gICAgICAgICAgICAkKCdmaWVsZHNldFtpZCQ9XCJjcmVhdGVfY291cnNlX2ZpZWxkc2V0XCJdJykucGFyZW50KCkuc2xpZGVUb2dnbGUoKTtcbiAgICAgICAgICAgICQoJ2ZpZWxkc2V0W2lkJD1cInVwZGF0ZV9jb3Vyc2VfZmllbGRzZXRcIl0nKS5wYXJlbnQoKS5zbGlkZVRvZ2dsZSgpO1xuXG4gICAgICAgICAgICAkKFwiI29yX2NvbnRhaW5lclwiKS5oaWRlKCk7XG5cbiAgICAgICAgICAgICQoJyNleGlzdGluZ19jb3Vyc2VfdGl0bGVfc3BhbicpLmh0bWwob2JqLmNvdXJzZW5hbWUpO1xuICAgICAgICAgICAgJCgnLmV4aXN0aW5nX2NvdXJzZV90aXRsZV9oMycpLnJlbW92ZUNsYXNzKCdoaWRkZW5fY2xhc3MnKTtcblxuICAgICAgICAgICAgaWYgKCQoJy5hc3NpZ25tZW50aWRzX2NoZWNrJykubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICQoXCIuYXNzaWdubWVudGlkc19jaGVja1wiKS5yZW1vdmVBdHRyKCdkaXNhYmxlZCcpO1xuICAgICAgICAgICAgICAgICQoXCIjaWRfYXNzaWdubWVudG5hbWVcIikucmVtb3ZlQXR0cignZGlzYWJsZWQnKTtcbiAgICAgICAgICAgICAgICAkKFwiI2lkX2NyZWF0ZV9hc3NpZ25tZW50XCIpLnJlbW92ZUF0dHIoJ2Rpc2FibGVkJyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICQoJy5hc3NpZ25tZW50aWRzX2NoZWNrJykuY2hhbmdlKGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICAgICAgaWYgKCQoJy5hc3NpZ25tZW50aWRzX2NoZWNrJykuZmlsdGVyKCc6Y2hlY2tlZCcpLmxlbmd0aCA+PSA1KSB7XG4gICAgICAgICAgICAgICAgICAgICQoXCIuYXNzaWdubWVudGlkc19jaGVja1wiKS5ub3QoJzpjaGVja2VkJykuYXR0cignZGlzYWJsZWQnLCAnZGlzYWJsZWQnKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAkKFwiLmFzc2lnbm1lbnRpZHNfY2hlY2tcIikucmVtb3ZlQXR0cignZGlzYWJsZWQnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaW5pdGlhbGlzZUNyZWF0ZUFzc2lnbm1lbnRCdXR0b24ob1RhYmxlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIEJpbmQgdGhlIGV2ZW50IHRvIGNyZWF0ZSBhbiBhc3NpZ25tZW50IGZyb20gdGhlIHNlbGVjdGVkIHBhcnRzLlxuICAgIGZ1bmN0aW9uIGluaXRpYWxpc2VDcmVhdGVBc3NpZ25tZW50QnV0dG9uKG9UYWJsZSkge1xuICAgICAgICAkKCcjaWRfY3JlYXRlX2Fzc2lnbm1lbnQnKS51bmJpbmQoXCJjbGlja1wiKTtcbiAgICAgICAgJCgnI2lkX2NyZWF0ZV9hc3NpZ25tZW50JykuY2xpY2soZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgICAgIHZhciBwYXJ0cyA9IFwiXCI7XG4gICAgICAgICAgICAkKCcuYXNzaWdubWVudGlkc19jaGVjazpjaGVja2VkJykuZWFjaChmdW5jdGlvbihpKXtcbiAgICAgICAgICAgICAgICBwYXJ0cyArPSAkKHRoaXMpLnZhbCgpICsgXCIsXCI7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChwYXJ0cy5jaGFyQXQocGFydHMubGVuZ3RoIC0gMSkgPT0gJywnKSB7XG4gICAgICAgICAgICAgICAgcGFydHMuc3Vic3RyaW5nKDAsIHBhcnRzLmxlbmd0aCAtIDEpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAkKFwiI2lkX2NyZWF0ZV9hc3NpZ25tZW50XCIpLmF0dHIoJ2Rpc2FibGVkJywgJ2Rpc2FibGVkJyk7XG5cbiAgICAgICAgICAgICQuYWpheCh7XG4gICAgICAgICAgICAgICAgXCJkYXRhVHlwZVwiOiAnaHRtbCcsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiUE9TVFwiLFxuICAgICAgICAgICAgICAgIFwidXJsXCI6IFwiYWpheC5waHBcIixcbiAgICAgICAgICAgICAgICBcImRhdGFcIjoge2FjdGlvbjogXCJjcmVhdGVfYXNzaWdubWVudFwiLCBjb3Vyc2VfaWQ6ICQoXCIjY291cnNlX2lkXCIpLmh0bWwoKSxcbiAgICAgICAgICAgICAgICAgICAgYXNzaWdubWVudF9uYW1lOiAkKFwiI2lkX2Fzc2lnbm1lbnRuYW1lXCIpLnZhbCgpLCBwYXJ0czogcGFydHMsIHNlc3NrZXk6IE0uY2ZnLnNlc3NrZXl9LFxuICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uKGRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgb1RhYmxlLmZuUmVsb2FkQWpheCgpO1xuICAgICAgICAgICAgICAgICAgICBvVGFibGUuZm5TdGFuZGluZ1JlZHJhdygpO1xuICAgICAgICAgICAgICAgICAgICAkKFwiI2lkX2Fzc2lnbm1lbnRuYW1lXCIpLnJlbW92ZUF0dHIoJ2Rpc2FibGVkJyk7XG4gICAgICAgICAgICAgICAgICAgICQoXCIjaWRfY3JlYXRlX2Fzc2lnbm1lbnRcIikucmVtb3ZlQXR0cignZGlzYWJsZWQnKTtcbiAgICAgICAgICAgICAgICAgICAgJChcIi5hc3NpZ25tZW50aWRzX2NoZWNrXCIpLnJlbW92ZUF0dHIoJ2Rpc2FibGVkJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbn0pOyJdfQ== +jQuery(document).ready(function($){function initialiseEditEndDate(){$("a.edit_course_end_link").colorbox({inline:!0,width:"60%",top:"100px",background:"#fff",height:"260px",opacity:"0.7",className:"edit_end_date_form",onLoad:function(){lightBoxCloseButton()},onComplete:function(){var current_date=$("#"+$(this).attr("id")+" span").attr("id");current_date=current_date.split("_"),$("#id_new_course_end_date_day").val(current_date[1]),$("#id_new_course_end_date_month").val(current_date[2]),$("#id_new_course_end_date_year").val(current_date[3]);var idStr=$(this).attr("id").split("_"),tii_course_id=idStr[2];$('input[name="tii_course_id"]').val(tii_course_id),$('input[name="tii_course_title"]').val($("a#course_"+tii_course_id).html()),$("#cboxLoadedContent .edit_course_end_date_form").show(),$("#dateselector-calendar-panel").css("z-index","9999"),$("#id_save_end_date").click(function(){$.ajax({dataType:"json",type:"POST",url:"ajax.php",data:{action:"edit_course_end_date",tii_course_id:tii_course_id,tii_course_title:$("a#course_"+tii_course_id).html(),sesskey:M.cfg.sesskey,end_date_d:$("#id_new_course_end_date_day").val(),end_date_m:$("#id_new_course_end_date_month").val(),end_date_y:$("#id_new_course_end_date_year").val()},success:function(data){if(eval(data),"success"==data.status)parent.$.fn.colorbox.close(),$("#course_date_"+tii_course_id+" span").html(data.end_date);else{var current_msg=$("#edit_end_date_desc").html;$("#edit_end_date_desc").html(current_msg+" "+data.msg)}}})})},onCleanup:function(){$(".edit_course_end_date_form").hide(),$("#tii_close_bar").remove()}})}function lightBoxCloseButton(){$("body").append('")}function initialiseCourseRecreation(){var e=$(window).width(),t="80%";e<1e3&&(t="860px");var a=$(window).width(),s="80%";a<700&&(s="600px"),$("a.course_recreate").colorbox({iframe:!0,width:t,height:s,top:"100px",className:"migration",opacity:"0.7",onLoad:function(){lightBoxCloseButton()},onCleanup:function(){$("#tii_close_bar").remove()}}),$(".browser_checkbox").click(function(){$(".browser_checkbox:checked").length>0?$(".create_checkboxes").slideDown():$(".create_checkboxes").slideUp()})}function initialiseCourseBrowserButtons(e){$("#id_create_course").click(function(){$.ajax({dataType:"html",type:"POST",url:"ajax.php",data:{action:"create_course",tii_course_id:$("#tii_course_id").html(),tii_course_name:encodeURIComponent($("#tii_course_name").html()),course_name:encodeURIComponent($("#id_coursename").val()),course_category:$("#id_coursecategory").val(),sesskey:M.cfg.sesskey},success:function(t){var a=jQuery.parseJSON(t);hideCourseCreationOptions(a,e)}})}),$("#id_update_course").click(function(){$.ajax({dataType:"html",type:"POST",url:"ajax.php",data:{action:"link_course",tii_course_id:$("#tii_course_id").html(),tii_course_name:$("#tii_course_name").html(),course_to_link:$("#id_coursetolink").val(),sesskey:M.cfg.sesskey},success:function(t){var a=jQuery.parseJSON(t);hideCourseCreationOptions(a,e)}})})}function hideCourseCreationOptions(e,t){if(0!=e){$("#course_id").html(e.courseid);var a='input[name="check_'+$("#tii_course_id").html()+'"]';parent.$(a).hide();var s="#tick_"+$("#tii_course_id").html();parent.$(s).show(),$('fieldset[id$="create_course_fieldset"]').parent().slideToggle(),$('fieldset[id$="update_course_fieldset"]').parent().slideToggle(),$("#or_container").hide(),$("#existing_course_title_span").html(e.coursename),$(".existing_course_title_h3").removeClass("hidden_class"),$(".assignmentids_check").length>0&&($(".assignmentids_check").removeAttr("disabled"),$("#id_assignmentname").removeAttr("disabled"),$("#id_create_assignment").removeAttr("disabled")),$(".assignmentids_check").change(function(){$(".assignmentids_check").filter(":checked").length>=5?$(".assignmentids_check").not(":checked").attr("disabled","disabled"):$(".assignmentids_check").removeAttr("disabled")}),initialiseCreateAssignmentButton(t)}}function initialiseCreateAssignmentButton(e){$("#id_create_assignment").unbind("click"),$("#id_create_assignment").click(function(){var t="";$(".assignmentids_check:checked").each(function(e){t+=$(this).val()+","}),","==t.charAt(t.length-1)&&t.substring(0,t.length-1),$("#id_create_assignment").attr("disabled","disabled"),$.ajax({dataType:"html",type:"POST",url:"ajax.php",data:{action:"create_assignment",course_id:$("#course_id").html(),assignment_name:$("#id_assignmentname").val(),parts:t,sesskey:M.cfg.sesskey},success:function(t){e.fnReloadAjax(),e.fnStandingRedraw(),$("#id_assignmentname").removeAttr("disabled"),$("#id_create_assignment").removeAttr("disabled"),$(".assignmentids_check").removeAttr("disabled")}})})}$(".submissionsDataTable thead tr, #courseBrowserTable thead tr").toggleClass("header");var dataTablesLang={nointegration:M.str.turnitintooltwo.nointegration,sProcessing:M.str.turnitintooltwo.sprocessing,sZeroRecords:M.str.turnitintooltwo.szerorecords,sInfo:M.str.turnitintooltwo.sinfo,sSearch:M.str.turnitintooltwo.ssearch,sLengthMenu:M.str.turnitintooltwo.slengthmenu,sInfoEmpty:M.str.turnitintooltwo.semptytable,oPaginate:{sNext:M.str.turnitintooltwo.snext,sPrevious:M.str.turnitintooltwo.sprevious}},dataTablesLangMigration={nointegration:M.str.turnitintooltwo.nointegration,sProcessing:M.str.turnitintooltwo.sprocessing,sZeroRecords:M.str.turnitintooltwo.szerorecords,sInfo:M.str.turnitintooltwo.sinfo,sSearch:"",sLengthMenu:M.str.turnitintooltwo.slengthmigrationmenu,sInfoEmpty:M.str.turnitintooltwo.semptytable,oPaginate:{sNext:M.str.turnitintooltwo.snext,sPrevious:M.str.turnitintooltwo.sprevious}};$("#unlinkUserTable").dataTable({bDestroy:!0,bProcessing:!0,bServerSide:!0,oLanguage:dataTablesLang,aaSorting:[[2,"asc"]],aLengthMenu:[[10,25,50,100,-1],[10,25,50,100,"All"]],sAjaxSource:"ajax.php?action=get_users",aoColumns:[{bSortable:!1,fnCreatedCell:function(e,t,a,s,i){$(e).addClass("centered_cell")}},null,{aDataSort:[2,3]},{aDataSort:[3,2]},null],fnDrawCallback:function(){$('input[name="selectallcb"]').attr("checked",!1)}}),$("#migrationTable").dataTable({bDestroy:!0,bProcessing:!0,bServerSide:!0,oLanguage:dataTablesLangMigration,aaSorting:[[1,"asc"]],aLengthMenu:[[10,25,50,100,-1],[10,25,50,100,"All"]],sAjaxSource:"ajax.php?action=get_assignments",sDom:'<"top"lf>rt<"bottom"irp><"clear">',aoColumns:[{bSortable:!0,sClass:"centered_cell",bSearchable:!1},{bSortable:!0,bSearchable:!0}]}),$("#migrationTable_filter input").attr("placeholder","Search"),$("#filesTable").dataTable({bDestroy:!0,bProcessing:!0,bServerSide:!0,oLanguage:dataTablesLang,sAjaxSource:"ajax.php?action=get_files",aoColumns:[null,null,null,{sClass:"filename c0",sWidth:"40%"},null,{sClass:"fullname c1",sWidth:"35%"},null,{sClass:"created c2",sWidth:"22%"},{sClass:"remove c3",sWidth:"3%"}],aoColumnDefs:[{bSearchable:!0,bVisible:!1,aTargets:[0]},{bSearchable:!0,bVisible:!1,aTargets:[1]},{bSearchable:!0,bVisible:!1,aTargets:[2]},{bSearchable:!0,bVisible:!0,aTargets:[3]},{bSearchable:!0,bVisible:!1,aTargets:[4]},{bSearchable:!0,bVisible:!0,aTargets:[5]},{bSearchable:!0,bVisible:!1,aTargets:[6]},{bSearchable:!0,bVisible:!0,aTargets:[7]},{bSearchable:!0,bVisible:!0,aTargets:[8]}],fnDrawCallback:function(e){if(0!=e.aiDisplay.length)for(var t=$("#filesTable tbody tr"),a=t[0].getElementsByTagName("td").length,s="",i=0;iip'}),$.datepicker.regional[""].dateFormat="d M yy",$.datepicker.setDefaults($.datepicker.regional[""]);var courseBrowserTable=$("#courseBrowserTable").dataTable({bProcessing:!0,oLanguage:dataTablesLang,aaSorting:[[6,"asc"]],sAjaxSource:"ajax.php",aoColumnDefs:[{bSearchable:!1,bSortable:!1,sWidth:"5%",bVisible:!0,aTargets:[0],fnCreatedCell:function(e){$(e).addClass("center")}},{bSearchable:!0,bVisible:!0,sWidth:"45%",iDataSort:6,aTargets:[1]},{bSearchable:!0,bVisible:!0,sWidth:"10%",aTargets:[2]},{bSearchable:!0,bVisible:!0,sWidth:"20%",iDataSort:7,aTargets:[3],fnCreatedCell:function(e){$(e).addClass("right")}},{bSearchable:!1,bVisible:!0,sWidth:"10%",aTargets:[4],fnCreatedCell:function(e){$(e).addClass("right")}},{bSearchable:!0,bVisible:!0,sWidth:"10%",aTargets:[5],fnCreatedCell:function(e){$(e).addClass("center")}},{bSearchable:!0,bVisible:!1,aTargets:[6]},{bSearchable:!0,bVisible:!1,aTargets:[7]}],fnServerData:function(e,t,a){$.ajax({dataType:"json",type:"POST",url:e,data:{action:"search_classes",course_title:$("#search_course_title").val(),course_integration:$("#search_course_integration").val(),course_end_date:$("#search_course_end_date").val(),sesskey:M.cfg.sesskey},success:function(e){a(e)}})},bStateSave:!0,fnStateSave:function(e,t){try{localStorage.setItem(uid+"DataTables",JSON.stringify(t))}catch(a){}},fnStateLoad:function(e){try{return JSON.parse(localStorage.getItem(uid+"DataTables"))}catch(t){}},fnDrawCallback:function(){$('input[name="selectallcb"]').attr("checked",!1),initialiseCourseRecreation(),initialiseEditEndDate(),$("#search_courses_button").removeAttr("disabled")}});$("#search_courses_button").click(function(){return $(this).attr("disabled","disabled"),courseBrowserTable.fnReloadAjax(),courseBrowserTable.fnStandingRedraw(),!1}),$("#search_course_end_date").datepicker();var oTable=$("#assignmentBrowserTable").dataTable({bProcessing:!0,oLanguage:dataTablesLang,sAjaxSource:"ajax.php",fnServerData:function(sSource,aoData,fnCallback){$("#id_create_course").attr("disabled","disabled"),$("#id_update_course").attr("disabled","disabled"),$("#assignmentBrowserTable").length>0&&$(".side-pre-only #page-content #region-main").css({"margin-left":"0px"}),$("#id_assignmentname").attr("disabled","disabled"),$("#id_create_assignment").attr("disabled","disabled"),$.ajax({dataType:"json",type:"POST",url:sSource,data:{action:"get_assignments",tii_course_id:$("#tii_course_id").html(),sesskey:M.cfg.sesskey},success:function(result){eval(result),initialiseCourseBrowserButtons(oTable),fnCallback(result),"0"!=$("#course_id").html()&&result.number_of_assignments>0?($("#id_assignmentname").removeAttr("disabled"),$("#id_create_assignment").removeAttr("disabled"),$(".assignmentids_check").removeAttr("disabled"),initialiseCreateAssignmentButton(oTable)):($("#id_assignmentname").attr("disabled","disabled"),$("#id_create_assignment").attr("disabled","disabled"),$(".assignmentids_check").attr("disabled","disabled")),$("#id_create_course").removeAttr("disabled"),$("#id_update_course").removeAttr("disabled")}})},aoColumnDefs:[{bSearchable:!1,bVisible:!0,aTargets:[0]},{bSearchable:!0,bVisible:!0,aTargets:[1],fnCreatedCell:function(e){$(e).addClass("nowrap")}},{bSearchable:!0,bVisible:!0,aTargets:[2]},{bSearchable:!0,bVisible:!0,aTargets:[3]}]});if($("#create_classes_button").colorbox({iframe:!0,width:"60%",top:"200px",height:"124px",opacity:"0.7",className:"course_creation",href:function(){var e=$(".create_course_category").val(),t=$(".create_assignment_checkbox").is(":checked")?"1":"0",a="";$(".browser_checkbox:checked").each(function(e){a+="&class_id"+e+"="+$(this).val(),e++});var s=window.location.href,i=s.replace("cmd=courses","cmd=multiple_class_recreation");return i+"&view_context=box&category="+e+"&assignments="+t+a+"&sesskey="+M.cfg.sesskey},onCleanup:function(){window.location=window.location}}),$("#class_ids").length>0){$(".side-pre-only #page-content #region-main").css({"margin-left":"0px"}),$(".has-region-side-pre #page-content #region-main").css({width:"100%","margin-top":"-30px"});var class_ids=$("#class_ids").html();$.ajax({dataType:"html",type:"POST",url:"ajax.php",data:{action:"create_courses",class_ids:class_ids,course_category:$("#course_category").html(),create_assignments:$("#create_assignments").html(),sesskey:M.cfg.sesskey},success:function(e){$("#course_creation_status").html(e)}})}}); +//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInR1cm5pdGludG9vbHR3b19leHRyYS5qcyJdLCJuYW1lcyI6WyJqUXVlcnkiLCJkb2N1bWVudCIsInJlYWR5IiwiJCIsImluaXRpYWxpc2VFZGl0RW5kRGF0ZSIsImNvbG9yYm94IiwiaW5saW5lIiwid2lkdGgiLCJ0b3AiLCJiYWNrZ3JvdW5kIiwiaGVpZ2h0Iiwib3BhY2l0eSIsImNsYXNzTmFtZSIsIm9uTG9hZCIsImxpZ2h0Qm94Q2xvc2VCdXR0b24iLCJvbkNvbXBsZXRlIiwiY3VycmVudF9kYXRlIiwidGhpcyIsImF0dHIiLCJzcGxpdCIsInZhbCIsImlkU3RyIiwidGlpX2NvdXJzZV9pZCIsImh0bWwiLCJzaG93IiwiY3NzIiwiY2xpY2siLCJhamF4IiwiZGF0YVR5cGUiLCJ0eXBlIiwidXJsIiwiZGF0YSIsImFjdGlvbiIsInRpaV9jb3Vyc2VfdGl0bGUiLCJzZXNza2V5IiwiTSIsImNmZyIsImVuZF9kYXRlX2QiLCJlbmRfZGF0ZV9tIiwiZW5kX2RhdGVfeSIsInN1Y2Nlc3MiLCJldmFsIiwic3RhdHVzIiwicGFyZW50IiwiZm4iLCJjbG9zZSIsImVuZF9kYXRlIiwiY3VycmVudF9tc2ciLCJtc2ciLCJvbkNsZWFudXAiLCJoaWRlIiwicmVtb3ZlIiwiYXBwZW5kIiwic3RyIiwidHVybml0aW50b29sdHdvIiwiY2xvc2VidXR0b24iLCJpbml0aWFsaXNlQ291cnNlUmVjcmVhdGlvbiIsIndpbmRvd1dpZHRoIiwid2luZG93IiwiY29sb3JCb3hXaWR0aCIsIndpbmRvd0hlaWdodCIsImNvbG9yQm94SGVpZ2h0IiwiaWZyYW1lIiwibGVuZ3RoIiwic2xpZGVEb3duIiwic2xpZGVVcCIsImluaXRpYWxpc2VDb3Vyc2VCcm93c2VyQnV0dG9ucyIsIm9UYWJsZSIsInRpaV9jb3Vyc2VfbmFtZSIsImVuY29kZVVSSUNvbXBvbmVudCIsImNvdXJzZV9uYW1lIiwiY291cnNlX2NhdGVnb3J5Iiwib2JqIiwicGFyc2VKU09OIiwiaGlkZUNvdXJzZUNyZWF0aW9uT3B0aW9ucyIsImNvdXJzZV90b19saW5rIiwiY291cnNlaWQiLCJjYl9lbGVtZW50IiwidGlja19lbGVtZW50Iiwic2xpZGVUb2dnbGUiLCJjb3Vyc2VuYW1lIiwicmVtb3ZlQ2xhc3MiLCJyZW1vdmVBdHRyIiwiY2hhbmdlIiwiZmlsdGVyIiwibm90IiwiaW5pdGlhbGlzZUNyZWF0ZUFzc2lnbm1lbnRCdXR0b24iLCJ1bmJpbmQiLCJwYXJ0cyIsImVhY2giLCJpIiwiY2hhckF0Iiwic3Vic3RyaW5nIiwiY291cnNlX2lkIiwiYXNzaWdubWVudF9uYW1lIiwiZm5SZWxvYWRBamF4IiwiZm5TdGFuZGluZ1JlZHJhdyIsInRvZ2dsZUNsYXNzIiwiZGF0YVRhYmxlc0xhbmciLCJub2ludGVncmF0aW9uIiwic1Byb2Nlc3NpbmciLCJzcHJvY2Vzc2luZyIsInNaZXJvUmVjb3JkcyIsInN6ZXJvcmVjb3JkcyIsInNJbmZvIiwic2luZm8iLCJzU2VhcmNoIiwic3NlYXJjaCIsInNMZW5ndGhNZW51Iiwic2xlbmd0aG1lbnUiLCJzSW5mb0VtcHR5Iiwic2VtcHR5dGFibGUiLCJvUGFnaW5hdGUiLCJzTmV4dCIsInNuZXh0Iiwic1ByZXZpb3VzIiwic3ByZXZpb3VzIiwiZGF0YVRhYmxlc0xhbmdNaWdyYXRpb24iLCJzbGVuZ3RobWlncmF0aW9ubWVudSIsImRhdGFUYWJsZSIsImJEZXN0cm95IiwiYlByb2Nlc3NpbmciLCJiU2VydmVyU2lkZSIsIm9MYW5ndWFnZSIsImFhU29ydGluZyIsImFMZW5ndGhNZW51Iiwic0FqYXhTb3VyY2UiLCJhb0NvbHVtbnMiLCJiU29ydGFibGUiLCJmbkNyZWF0ZWRDZWxsIiwiblRkIiwic0RhdGEiLCJvRGF0YSIsImlSb3ciLCJpQ29sIiwiYWRkQ2xhc3MiLCJhRGF0YVNvcnQiLCJmbkRyYXdDYWxsYmFjayIsInNEb20iLCJzQ2xhc3MiLCJiU2VhcmNoYWJsZSIsInNXaWR0aCIsImFvQ29sdW1uRGVmcyIsImJWaXNpYmxlIiwiYVRhcmdldHMiLCJvU2V0dGluZ3MiLCJhaURpc3BsYXkiLCJuVHJzIiwiaUNvbHNwYW4iLCJnZXRFbGVtZW50c0J5VGFnTmFtZSIsInNMYXN0R3JvdXAiLCJzR3JvdXAiLCJfaURpc3BsYXlTdGFydCIsImFvRGF0YSIsIl9hRGF0YSIsIm5Hcm91cCIsImNyZWF0ZUVsZW1lbnQiLCJuQ2VsbCIsImNvbFNwYW4iLCJpbm5lckhUTUwiLCJhcHBlbmRDaGlsZCIsInBhcmVudE5vZGUiLCJpbnNlcnRCZWZvcmUiLCJhYVNvcnRpbmdGaXhlZCIsImRhdGVwaWNrZXIiLCJyZWdpb25hbCIsImRhdGVGb3JtYXQiLCJzZXREZWZhdWx0cyIsImNvdXJzZUJyb3dzZXJUYWJsZSIsImlEYXRhU29ydCIsImZuU2VydmVyRGF0YSIsInNTb3VyY2UiLCJmbkNhbGxiYWNrIiwiY291cnNlX3RpdGxlIiwiY291cnNlX2ludGVncmF0aW9uIiwiY291cnNlX2VuZF9kYXRlIiwicmVzdWx0IiwiYlN0YXRlU2F2ZSIsImZuU3RhdGVTYXZlIiwibG9jYWxTdG9yYWdlIiwic2V0SXRlbSIsInVpZCIsIkpTT04iLCJzdHJpbmdpZnkiLCJlIiwiZm5TdGF0ZUxvYWQiLCJwYXJzZSIsImdldEl0ZW0iLCJtYXJnaW4tbGVmdCIsIm51bWJlcl9vZl9hc3NpZ25tZW50cyIsImhyZWYiLCJjYXRlZ29yeSIsImFzc2lnbm1lbnRzIiwiaXMiLCJjbGFzc19pZHMiLCJwYWdldXJsIiwibG9jYXRpb24iLCJyZXBsYWNlIiwibWFyZ2luLXRvcCIsImNyZWF0ZV9hc3NpZ25tZW50cyJdLCJtYXBwaW5ncyI6IkFBQUFBLE9BQU9DLFVBQVVDLE1BQU0sU0FBU0MsR0EwVDVCLFFBQVNDLHlCQUNMRCxFQUFFLDBCQUEwQkUsVUFDeEJDLFFBQU8sRUFBTUMsTUFBTSxNQUFPQyxJQUFLLFFBQVNDLFdBQVksT0FBUUMsT0FBTyxRQUFTQyxRQUFTLE1BQU9DLFVBQVcscUJBQ3ZHQyxPQUFRLFdBQ0pDLHVCQUVKQyxXQUFhLFdBSVQsR0FBSUMsY0FBZWIsRUFBRSxJQUFNQSxFQUFFYyxNQUFNQyxLQUFL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QUV6QyxPQUFPdkssR0FBTSw4QkFBZ0NpSyxFQUFXLGdCQUFrQkMsRUFBY0UsRUFBWSxZQUFjL0osRUFBRUMsSUFBSUYsU0FFaEllLFVBQVcsV0FDUFMsT0FBTzBJLFNBQVcxSSxPQUFPMEksWUFJN0JqTSxFQUFFLGNBQWM0RCxPQUFTLEVBQUcsQ0FHNUI1RCxFQUFFLDZDQUE2Q3NCLEtBQzNDbUssY0FBZ0IsUUFHcEJ6TCxFQUFFLG1EQUFtRHNCLEtBQ2pEbEIsTUFBUyxPQUNUK0wsYUFBYyxTQUdsQixJQUFJSixXQUFZL0wsRUFBRSxjQUFjb0IsTUFFaENwQixHQUFFd0IsTUFDRUMsU0FBWSxPQUNaQyxLQUFRLE9BQ1JDLElBQU8sV0FDUEMsTUFBU0MsT0FBUSxpQkFBa0JrSyxVQUFXQSxVQUFXM0gsZ0JBQWlCcEUsRUFBRSxvQkFBb0JvQixPQUM1RmdMLG1CQUFvQnBNLEVBQUUsdUJBQXVCb0IsT0FBUVcsUUFBU0MsRUFBRUMsSUFBSUYsU0FDeEVNLFFBQVMsU0FBU1QsR0FDZDVCLEVBQUUsMkJBQTJCb0IsS0FBS1EiLCJmaWxlIjoidHVybml0aW50b29sdHdvX2V4dHJhLm1pbi5qcyIsInNvdXJjZXNDb250ZW50IjpbImpRdWVyeShkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24oJCkge1xuICAgIC8vIEFkZCBzdHlsZSB0byBoZWFkZXIgcm93LlxuICAgICQoJy5zdWJtaXNzaW9uc0RhdGFUYWJsZSB0aGVhZCB0ciwgI2NvdXJzZUJyb3dzZXJUYWJsZSB0aGVhZCB0cicpLnRvZ2dsZUNsYXNzKFwiaGVhZGVyXCIpO1xuXG4gICAgLy8gQ29uZmlndXJlIGRhdGF0YWJsZXMgbGFuZ3VhZ2Ugc2V0dGluZ3MuXG4gICAgdmFyIGRhdGFUYWJsZXNMYW5nID0ge1xuICAgICAgICBcIm5vaW50ZWdyYXRpb25cIjogTS5zdHIudHVybml0aW50b29sdHdvLm5vaW50ZWdyYXRpb24sXG4gICAgICAgIFwic1Byb2Nlc3NpbmdcIjogTS5zdHIudHVybml0aW50b29sdHdvLnNwcm9jZXNzaW5nLFxuICAgICAgICBcInNaZXJvUmVjb3Jkc1wiOiBNLnN0ci50dXJuaXRpbnRvb2x0d28uc3plcm9yZWNvcmRzLFxuICAgICAgICBcInNJbmZvXCI6IE0uc3RyLnR1cm5pdGludG9vbHR3by5zaW5mbyxcbiAgICAgICAgXCJzU2VhcmNoXCI6IE0uc3RyLnR1cm5pdGludG9vbHR3by5zc2VhcmNoLFxuICAgICAgICBcInNMZW5ndGhNZW51XCI6IE0uc3RyLnR1cm5pdGludG9vbHR3by5zbGVuZ3RobWVudSxcbiAgICAgICAgXCJzSW5mb0VtcHR5XCI6IE0uc3RyLnR1cm5pdGludG9vbHR3by5zZW1wdHl0YWJsZSxcbiAgICAgICAgXCJvUGFnaW5hdGVcIjoge1xuICAgICAgICAgICAgXCJzTmV4dFwiOiBNLnN0ci50dXJuaXRpbnRvb2x0d28uc25leHQsXG4gICAgICAgICAgICBcInNQcmV2aW91c1wiOiBNLnN0ci50dXJuaXRpbnRvb2x0d28uc3ByZXZpb3VzXG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gQ29uZmlndXJlIGRhdGF0YWJsZXMgbGFuZ3VhZ2Ugc2V0dGluZ3MgZm9yIG1pZ3JhdGlvbiB0b29sLlxuICAgIHZhciBkYXRhVGFibGVzTGFuZ01pZ3JhdGlvbiA9IHtcbiAgICAgICAgXCJub2ludGVncmF0aW9uXCI6IE0uc3RyLnR1cm5pdGludG9vbHR3by5ub2ludGVncmF0aW9uLFxuICAgICAgICBcInNQcm9jZXNzaW5nXCI6IE0uc3RyLnR1cm5pdGludG9vbHR3by5zcHJvY2Vzc2luZyxcbiAgICAgICAgXCJzWmVyb1JlY29yZHNcIjogTS5zdHIudHVybml0aW50b29sdHdvLnN6ZXJvcmVjb3JkcyxcbiAgICAgICAgXCJzSW5mb1wiOiBNLnN0ci50dXJuaXRpbnRvb2x0d28uc2luZm8sXG4gICAgICAgIFwic1NlYXJjaFwiOiAnJyxcbiAgICAgICAgXCJzTGVuZ3RoTWVudVwiOiBNLnN0ci50dXJuaXRpbnRvb2x0d28uc2xlbmd0aG1pZ3JhdGlvbm1lbnUsXG4gICAgICAgIFwic0luZm9FbXB0eVwiOiBNLnN0ci50dXJuaXRpbnRvb2x0d28uc2VtcHR5dGFibGUsXG4gICAgICAgIFwib1BhZ2luYXRlXCI6IHtcbiAgICAgICAgICAgIFwic05leHRcIjogTS5zdHIudHVybml0aW50b29sdHdvLnNuZXh0LFxuICAgICAgICAgICAgXCJzUHJldmlvdXNcIjogTS5zdHIudHVybml0aW50b29sdHdvLnNwcmV2aW91c1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIC8vIENvbmZpZ3VyZSB0aGUgdW5saW5rIGFuZCByZWxpbmsgdXNlcnMgZGF0YXRhYmxlIGluIHRoZSBwbHVnaW4gc2V0dGluZ3MgYXJlYS5cbiAgICAkKCcjdW5saW5rVXNlclRhYmxlJykuZGF0YVRhYmxlKHtcbiAgICAgICAgXCJiRGVzdHJveVwiOiB0cnVlLFxuICAgICAgICBcImJQcm9jZXNzaW5nXCI6IHRydWUsXG4gICAgICAgIFwiYlNlcnZlclNpZGVcIjogdHJ1ZSxcbiAgICAgICAgXCJvTGFuZ3VhZ2VcIjogZGF0YVRhYmxlc0xhbmcsXG4gICAgICAgIFwiYWFTb3J0aW5nXCI6IFtbIDIsIFwiYXNjXCIgXV0sXG4gICAgICAgIFwiYUxlbmd0aE1lbnVcIjogW1sxMCwgMjUsIDUwLCAxMDAsIC0xXSwgWzEwLCAyNSwgNTAsIDEwMCwgXCJBbGxcIl1dLFxuICAgICAgICBcInNBamF4U291cmNlXCI6IFwiYWpheC5waHA/YWN0aW9uPWdldF91c2Vyc1wiLFxuICAgICAgICBcImFvQ29sdW1uc1wiOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XCJiU29ydGFibGVcIjogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJmbkNyZWF0ZWRDZWxsXCI6IGZ1bmN0aW9uIChuVGQsIHNEYXRhLCBvRGF0YSwgaVJvdywgaUNvbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKG5UZCkuYWRkQ2xhc3MoJ2NlbnRlcmVkX2NlbGwnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICB7XCJhRGF0YVNvcnRcIjogWyAyLCAzIF19LFxuICAgICAgICAgICAgICAgICAgICAgICAge1wiYURhdGFTb3J0XCI6IFsgMywgMiBdfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG51bGxcbiAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgIFwiZm5EcmF3Q2FsbGJhY2tcIjogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgJCgnaW5wdXRbbmFtZT1cInNlbGVjdGFsbGNiXCJdJykuYXR0cignY2hlY2tlZCcsIGZhbHNlKTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gQ29uZmlndXJlIHRoZSBtaWdyYXRpb24gZGF0YXRhYmxlIGluIHRoZSBwbHVnaW4gc2V0dGluZ3MgYXJlYS5cbiAgICAkKCcjbWlncmF0aW9uVGFibGUnKS5kYXRhVGFibGUoe1xuICAgICAgICBcImJEZXN0cm95XCI6IHRydWUsXG4gICAgICAgIFwiYlByb2Nlc3NpbmdcIjogdHJ1ZSxcbiAgICAgICAgXCJiU2VydmVyU2lkZVwiOiB0cnVlLFxuICAgICAgICBcIm9MYW5ndWFnZVwiOiBkYXRhVGFibGVzTGFuZ01pZ3JhdGlvbixcbiAgICAgICAgXCJhYVNvcnRpbmdcIjogW1sgMSwgXCJhc2NcIiBdXSxcbiAgICAgICAgXCJhTGVuZ3RoTWVudVwiOiBbWzEwLCAyNSwgNTAsIDEwMCwgLTFdLCBbMTAsIDI1LCA1MCwgMTAwLCBcIkFsbFwiXV0sXG4gICAgICAgIFwic0FqYXhTb3VyY2VcIjogXCJhamF4LnBocD9hY3Rpb249Z2V0X2Fzc2lnbm1lbnRzXCIsXG4gICAgICAgIFwic0RvbVwiOiAnPFwidG9wXCJsZj5ydDxcImJvdHRvbVwiaXJwPjxcImNsZWFyXCI+JyxcbiAgICAgICAgXCJhb0NvbHVtbnNcIjogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1wiYlNvcnRhYmxlXCI6IHRydWUsIFwic0NsYXNzXCI6IFwiY2VudGVyZWRfY2VsbFwiLCBcImJTZWFyY2hhYmxlXCI6IGZhbHNlfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcImJTb3J0YWJsZVwiOiB0cnVlLCBcImJTZWFyY2hhYmxlXCI6IHRydWV9XG4gICAgICAgICAgICAgICAgICAgICBdXG4gICAgfSk7XG4gICAgJCgnI21pZ3JhdGlvblRhYmxlX2ZpbHRlciBpbnB1dCcpLmF0dHIoXCJwbGFjZWhvbGRlclwiLCAnU2VhcmNoJyk7XG5cbiAgICAvLyBDb25maWd1cmUgdGhlIGZpbGVzIGRhdGF0YWJsZSBpbiB0aGUgcGx1Z2luIHNldHRpbmdzIGFyZWEsIGdyb3VwIHRoZSBmaWxlcyBieSBhc3NpZ25tZW50LlxuICAgICQoJyNmaWxlc1RhYmxlJykuZGF0YVRhYmxlKCB7XG4gICAgICAgIFwiYkRlc3Ryb3lcIjogdHJ1ZSxcbiAgICAgICAgXCJiUHJvY2Vzc2luZ1wiOiB0cnVlLFxuICAgICAgICBcImJTZXJ2ZXJTaWRlXCI6IHRydWUsXG4gICAgICAgIFwib0xhbmd1YWdlXCI6IGRhdGFUYWJsZXNMYW5nLFxuICAgICAgICBcInNBamF4U291cmNlXCI6IFwiYWpheC5waHA/YWN0aW9uPWdldF9maWxlc1wiLFxuICAgICAgICBcImFvQ29sdW1uc1wiOiBbXG4gICAgICAgICAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICAgICAgICAgIHtcInNDbGFzc1wiOiBcImZpbGVuYW1lIGMwXCIsIFwic1dpZHRoXCI6IFwiNDAlXCJ9LFxuICAgICAgICAgICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgICAgICAgICB7XCJzQ2xhc3NcIjogXCJmdWxsbmFtZSBjMVwiLCBcInNXaWR0aFwiOiBcIjM1JVwifSxcbiAgICAgICAgICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgICAgICAgICAge1wic0NsYXNzXCI6IFwiY3JlYXRlZCBjMlwiLCBcInNXaWR0aFwiOiBcIjIyJVwifSxcbiAgICAgICAgICAgICAgICAgICAge1wic0NsYXNzXCI6IFwicmVtb3ZlIGMzXCIsIFwic1dpZHRoXCI6IFwiMyVcIn1cbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICBcImFvQ29sdW1uRGVmc1wiOiBbXG4gICAgICAgICAgICAgICAgICAgIHtcImJTZWFyY2hhYmxlXCI6IHRydWUsIFwiYlZpc2libGVcIjogZmFsc2UsIFwiYVRhcmdldHNcIjogWyAwIF19LFxuICAgICAgICAgICAgICAgICAgICB7XCJiU2VhcmNoYWJsZVwiOiB0cnVlLCBcImJWaXNpYmxlXCI6IGZhbHNlLCBcImFUYXJnZXRzXCI6IFsgMSBdfSxcbiAgICAgICAgICAgICAgICAgICAge1wiYlNlYXJjaGFibGVcIjogdHJ1ZSwgXCJiVmlzaWJsZVwiOiBmYWxzZSwgXCJhVGFyZ2V0c1wiOiBbIDIgXX0sXG4gICAgICAgICAgICAgICAgICAgIHtcImJTZWFyY2hhYmxlXCI6IHRydWUsIFwiYlZpc2libGVcIjogdHJ1ZSwgXCJhVGFyZ2V0c1wiOiBbIDMgXX0sXG4gICAgICAgICAgICAgICAgICAgIHtcImJTZWFyY2hhYmxlXCI6IHRydWUsIFwiYlZpc2libGVcIjogZmFsc2UsIFwiYVRhcmdldHNcIjogWyA0IF19LFxuICAgICAgICAgICAgICAgICAgICB7XCJiU2VhcmNoYWJsZVwiOiB0cnVlLCBcImJWaXNpYmxlXCI6IHRydWUsIFwiYVRhcmdldHNcIjogWyA1IF19LFxuICAgICAgICAgICAgICAgICAgICB7XCJiU2VhcmNoYWJsZVwiOiB0cnVlLCBcImJWaXNpYmxlXCI6IGZhbHNlLCBcImFUYXJnZXRzXCI6IFsgNiBdfSxcbiAgICAgICAgICAgICAgICAgICAge1wiYlNlYXJjaGFibGVcIjogdHJ1ZSwgXCJiVmlzaWJsZVwiOiB0cnVlLCBcImFUYXJnZXRzXCI6IFsgNyBdfSxcbiAgICAgICAgICAgICAgICAgICAge1wiYlNlYXJjaGFibGVcIjogdHJ1ZSwgXCJiVmlzaWJsZVwiOiB0cnVlLCBcImFUYXJnZXRzXCI6IFsgOCBdfVxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgIFwiZm5EcmF3Q2FsbGJhY2tcIjogZnVuY3Rpb24gKCBvU2V0dGluZ3MgKSB7XG4gICAgICAgICAgICBpZiAoIG9TZXR0aW5ncy5haURpc3BsYXkubGVuZ3RoID09IDAgKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIG5UcnMgPSAkKCcjZmlsZXNUYWJsZSB0Ym9keSB0cicpO1xuICAgICAgICAgICAgdmFyIGlDb2xzcGFuID0gblRyc1swXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgndGQnKS5sZW5ndGg7XG4gICAgICAgICAgICB2YXIgc0xhc3RHcm91cCA9IFwiXCI7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5UcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgaURpc3BsYXlJbmRleCA9IG9TZXR0aW5ncy5faURpc3BsYXlTdGFydCArIGk7XG4gICAgICAgICAgICAgICAgdmFyIHNHcm91cCA9IG9TZXR0aW5ncy5hb0RhdGFbIG9TZXR0aW5ncy5haURpc3BsYXlbaV0gXS5fYURhdGFbMF07XG4gICAgICAgICAgICAgICAgaWYgKCBzR3JvdXAgIT0gc0xhc3RHcm91cCApXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB2YXIgbkdyb3VwID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggJ3RyJyApO1xuICAgICAgICAgICAgICAgICAgICB2YXIgbkNlbGwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAndGQnICk7XG4gICAgICAgICAgICAgICAgICAgIG5DZWxsLmNvbFNwYW4gPSBpQ29sc3BhbjtcbiAgICAgICAgICAgICAgICAgICAgbkNlbGwuY2xhc3NOYW1lID0gXCJncm91cFwiO1xuICAgICAgICAgICAgICAgICAgICBuQ2VsbC5pbm5lckhUTUwgPSBzR3JvdXA7XG4gICAgICAgICAgICAgICAgICAgIG5Hcm91cC5hcHBlbmRDaGlsZCggbkNlbGwgKTtcbiAgICAgICAgICAgICAgICAgICAgblRyc1tpXS5wYXJlbnROb2RlLmluc2VydEJlZm9yZSggbkdyb3VwLCBuVHJzW2ldICk7XG4gICAgICAgICAgICAgICAgICAgIHNMYXN0R3JvdXAgPSBzR3JvdXA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBcImFhU29ydGluZ0ZpeGVkXCI6IFtbIDAsICdhc2MnIF1dLFxuICAgICAgICBcImFhU29ydGluZ1wiOiBbWyAxLCAnYXNjJyBdXSxcbiAgICAgICAgXCJzRG9tXCI6ICdsZnI8XCJnaXZlSGVpZ2h0XCJ0PmlwJ1xuICAgIH0pO1xuXG4gICAgJC5kYXRlcGlja2VyLnJlZ2lvbmFsW1wiXCJdLmRhdGVGb3JtYXQgPSAnZCBNIHl5JztcbiAgICAkLmRhdGVwaWNrZXIuc2V0RGVmYXVsdHMoJC5kYXRlcGlja2VyLnJlZ2lvbmFsWycnXSk7XG5cbiAgICAvLyBDb25maWd1cmUgdGhlIGNvdXJzZSBicm93c2VyIGRhdGEgdGFibGUgYW5kIHNob3cgY2xhc3NlcyBmcm9tIFR1cm5pdGluIGFjb2N1bnQuXG4gICAgdmFyIGNvdXJzZUJyb3dzZXJUYWJsZSA9ICQoJyNjb3Vyc2VCcm93c2VyVGFibGUnKS5kYXRhVGFibGUoe1xuICAgICAgICBcImJQcm9jZXNzaW5nXCI6IHRydWUsXG4gICAgICAgIFwib0xhbmd1YWdlXCI6IGRhdGFUYWJsZXNMYW5nLFxuICAgICAgICBcImFhU29ydGluZ1wiOiBbWyA2LCAnYXNjJ11dLFxuICAgICAgICBcInNBamF4U291cmNlXCI6IFwiYWpheC5waHBcIixcbiAgICAgICAgXCJhb0NvbHVtbkRlZnNcIjogW1xuICAgICAgICAgICAgICAgICAgICB7XCJiU2VhcmNoYWJsZVwiOiBmYWxzZSwgXCJiU29ydGFibGVcIjogZmFsc2UsIFwic1dpZHRoXCI6IFwiNSVcIiwgXCJiVmlzaWJsZVwiOiB0cnVlLCBcImFUYXJnZXRzXCI6IFsgMCBdLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJmbkNyZWF0ZWRDZWxsXCI6IGZ1bmN0aW9uIChuVGQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKG5UZCkuYWRkQ2xhc3MoJ2NlbnRlcicpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfX0sXG4gICAgICAgICAgICAgICAgICAgIHtcImJTZWFyY2hhYmxlXCI6IHRydWUsIFwiYlZpc2libGVcIjogdHJ1ZSwgXCJzV2lkdGhcIjogXCI0NSVcIiwgXCJpRGF0YVNvcnRcIjogNiwgXCJhVGFyZ2V0c1wiOiBbIDEgXX0sXG4gICAgICAgICAgICAgICAgICAgIHtcImJTZWFyY2hhYmxlXCI6IHRydWUsIFwiYlZpc2libGVcIjogdHJ1ZSwgXCJzV2lkdGhcIjogXCIxMCVcIiwgXCJhVGFyZ2V0c1wiOiBbIDIgXX0sXG4gICAgICAgICAgICAgICAgICAgIHtcImJTZWFyY2hhYmxlXCI6IHRydWUsIFwiYlZpc2libGVcIjogdHJ1ZSwgXCJzV2lkdGhcIjogXCIyMCVcIiwgXCJpRGF0YVNvcnRcIjogNywgXCJhVGFyZ2V0c1wiOiBbIDMgXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiZm5DcmVhdGVkQ2VsbFwiOiBmdW5jdGlvbiAoblRkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJChuVGQpLmFkZENsYXNzKCdyaWdodCcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfX0sXG4gICAgICAgICAgICAgICAgICAgIHtcImJTZWFyY2hhYmxlXCI6IGZhbHNlLCBcImJWaXNpYmxlXCI6IHRydWUsIFwic1dpZHRoXCI6IFwiMTAlXCIsIFwiYVRhcmdldHNcIjogWyA0IF0sXG4gICAgICAgICAgICAgICAgICAgICAgICBcImZuQ3JlYXRlZENlbGxcIjogZnVuY3Rpb24gKG5UZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoblRkKS5hZGRDbGFzcygncmlnaHQnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH19LFxuICAgICAgICAgICAgICAgICAgICB7XCJiU2VhcmNoYWJsZVwiOiB0cnVlLCBcImJWaXNpYmxlXCI6IHRydWUsIFwic1dpZHRoXCI6IFwiMTAlXCIsIFwiYVRhcmdldHNcIjogWyA1IF0sXG4gICAgICAgICAgICAgICAgICAgICAgICBcImZuQ3JlYXRlZENlbGxcIjogZnVuY3Rpb24gKG5UZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoblRkKS5hZGRDbGFzcygnY2VudGVyJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9fSxcbiAgICAgICAgICAgICAgICAgICAge1wiYlNlYXJjaGFibGVcIjogdHJ1ZSwgXCJiVmlzaWJsZVwiOiBmYWxzZSwgXCJhVGFyZ2V0c1wiOiBbIDYgXX0sXG4gICAgICAgICAgICAgICAgICAgIHtcImJTZWFyY2hhYmxlXCI6IHRydWUsIFwiYlZpc2libGVcIjogZmFsc2UsIFwiYVRhcmdldHNcIjogWyA3IF19XG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgXCJmblNlcnZlckRhdGFcIjogZnVuY3Rpb24gKCBzU291cmNlLCBhb0RhdGEsIGZuQ2FsbGJhY2sgKSB7XG4gICAgICAgICAgICAkLmFqYXgoe1xuICAgICAgICAgICAgICAgIFwiZGF0YVR5cGVcIjogJ2pzb24nLFxuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIlBPU1RcIixcbiAgICAgICAgICAgICAgICBcInVybFwiOiBzU291cmNlLFxuICAgICAgICAgICAgICAgIFwiZGF0YVwiOiB7YWN0aW9uOiBcInNlYXJjaF9jbGFzc2VzXCIsIGNvdXJzZV90aXRsZTogJCgnI3NlYXJjaF9jb3Vyc2VfdGl0bGUnKS52YWwoKSxcbiAgICAgICAgICAgICAgICAgICAgY291cnNlX2ludGVncmF0aW9uOiAkKCcjc2VhcmNoX2NvdXJzZV9pbnRlZ3JhdGlvbicpLnZhbCgpLFxuICAgICAgICAgICAgICAgICAgICBjb3Vyc2VfZW5kX2RhdGU6ICQoJyNzZWFyY2hfY291cnNlX2VuZF9kYXRlJykudmFsKCksIHNlc3NrZXk6IE0uY2ZnLnNlc3NrZXl9LFxuICAgICAgICAgICAgICAgIFwic3VjY2Vzc1wiOiBmdW5jdGlvbihyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgZm5DYWxsYmFjayhyZXN1bHQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBcImJTdGF0ZVNhdmVcIjogdHJ1ZSxcbiAgICAgICAgXCJmblN0YXRlU2F2ZVwiOiBmdW5jdGlvbiAob1NldHRpbmdzLCBvRGF0YSkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSggdWlkICsgJ0RhdGFUYWJsZXMnLCBKU09OLnN0cmluZ2lmeShvRGF0YSkgKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKCBlICkge1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBcImZuU3RhdGVMb2FkXCI6IGZ1bmN0aW9uIChvU2V0dGluZ3MpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoIGxvY2FsU3RvcmFnZS5nZXRJdGVtKHVpZCArICdEYXRhVGFibGVzJykgKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKCBlICkge1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBcImZuRHJhd0NhbGxiYWNrXCI6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICQoJ2lucHV0W25hbWU9XCJzZWxlY3RhbGxjYlwiXScpLmF0dHIoJ2NoZWNrZWQnLCBmYWxzZSk7XG4gICAgICAgICAgICBpbml0aWFsaXNlQ291cnNlUmVjcmVhdGlvbigpO1xuICAgICAgICAgICAgaW5pdGlhbGlzZUVkaXRFbmREYXRlKCk7XG4gICAgICAgICAgICAkKFwiI3NlYXJjaF9jb3Vyc2VzX2J1dHRvblwiKS5yZW1vdmVBdHRyKCdkaXNhYmxlZCcpO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICAkKFwiI3NlYXJjaF9jb3Vyc2VzX2J1dHRvblwiKS5jbGljayhmdW5jdGlvbiAoKSB7XG4gICAgICAgICQodGhpcykuYXR0cignZGlzYWJsZWQnLCAnZGlzYWJsZWQnKTtcbiAgICAgICAgY291cnNlQnJvd3NlclRhYmxlLmZuUmVsb2FkQWpheCgpO1xuICAgICAgICBjb3Vyc2VCcm93c2VyVGFibGUuZm5TdGFuZGluZ1JlZHJhdygpO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSk7XG5cbiAgICAkKCcjc2VhcmNoX2NvdXJzZV9lbmRfZGF0ZScpLmRhdGVwaWNrZXIoKTtcblxuICAgIC8vIEluaXRpYWxpc2UgYXNzaWdubWVudCBicm93c2VyIHRhYmxlLlxuICAgIHZhciBvVGFibGUgPSAkKCcjYXNzaWdubWVudEJyb3dzZXJUYWJsZScpLmRhdGFUYWJsZSh7XG4gICAgICAgIFwiYlByb2Nlc3NpbmdcIjogdHJ1ZSxcbiAgICAgICAgXCJvTGFuZ3VhZ2VcIjogZGF0YVRhYmxlc0xhbmcsXG4gICAgICAgIFwic0FqYXhTb3VyY2VcIjogXCJhamF4LnBocFwiLFxuICAgICAgICBcImZuU2VydmVyRGF0YVwiOiBmdW5jdGlvbiAoIHNTb3VyY2UsIGFvRGF0YSwgZm5DYWxsYmFjayApIHtcblxuICAgICAgICAgICAgLy8gRGlzYWJsZSBjb3Vyc2UgYnV0dG9ucy5cbiAgICAgICAgICAgICQoJyNpZF9jcmVhdGVfY291cnNlJykuYXR0cignZGlzYWJsZWQnLCdkaXNhYmxlZCcpO1xuICAgICAgICAgICAgJCgnI2lkX3VwZGF0ZV9jb3Vyc2UnKS5hdHRyKCdkaXNhYmxlZCcsJ2Rpc2FibGVkJyk7XG5cbiAgICAgICAgICAgIC8vIE1vdmUgYm94IHdpdGhpbiBmb3JtLlxuICAgICAgICAgICAgaWYgKCQoXCIjYXNzaWdubWVudEJyb3dzZXJUYWJsZVwiKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgJChcIi5zaWRlLXByZS1vbmx5ICNwYWdlLWNvbnRlbnQgI3JlZ2lvbi1tYWluXCIpLmNzcyh7J21hcmdpbi1sZWZ0JyA6ICcwcHgnfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAkKFwiI2lkX2Fzc2lnbm1lbnRuYW1lXCIpLmF0dHIoJ2Rpc2FibGVkJywgJ2Rpc2FibGVkJyk7XG4gICAgICAgICAgICAkKFwiI2lkX2NyZWF0ZV9hc3NpZ25tZW50XCIpLmF0dHIoJ2Rpc2FibGVkJywgJ2Rpc2FibGVkJyk7XG4gICAgICAgICAgICAkLmFqYXgoe1xuICAgICAgICAgICAgICAgIFwiZGF0YVR5cGVcIjogJ2pzb24nLFxuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIlBPU1RcIixcbiAgICAgICAgICAgICAgICBcInVybFwiOiBzU291cmNlLFxuICAgICAgICAgICAgICAgIFwiZGF0YVwiOiB7YWN0aW9uOiBcImdldF9hc3NpZ25tZW50c1wiLCB0aWlfY291cnNlX2lkOiAkKFwiI3RpaV9jb3Vyc2VfaWRcIikuaHRtbCgpLCBzZXNza2V5OiBNLmNmZy5zZXNza2V5fSxcbiAgICAgICAgICAgICAgICBcInN1Y2Nlc3NcIjogZnVuY3Rpb24ocmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgICAgIGV2YWwocmVzdWx0KTtcbiAgICAgICAgICAgICAgICAgICAgaW5pdGlhbGlzZUNvdXJzZUJyb3dzZXJCdXR0b25zKG9UYWJsZSk7XG4gICAgICAgICAgICAgICAgICAgIGZuQ2FsbGJhY2socmVzdWx0KTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoJChcIiNjb3Vyc2VfaWRcIikuaHRtbCgpICE9IFwiMFwiICYmIHJlc3VsdC5udW1iZXJfb2ZfYXNzaWdubWVudHMgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAkKFwiI2lkX2Fzc2lnbm1lbnRuYW1lXCIpLnJlbW92ZUF0dHIoJ2Rpc2FibGVkJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAkKFwiI2lkX2NyZWF0ZV9hc3NpZ25tZW50XCIpLnJlbW92ZUF0dHIoJ2Rpc2FibGVkJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAkKFwiLmFzc2lnbm1lbnRpZHNfY2hlY2tcIikucmVtb3ZlQXR0cignZGlzYWJsZWQnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxpc2VDcmVhdGVBc3NpZ25tZW50QnV0dG9uKG9UYWJsZSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAkKFwiI2lkX2Fzc2lnbm1lbnRuYW1lXCIpLmF0dHIoJ2Rpc2FibGVkJywgJ2Rpc2FibGVkJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAkKFwiI2lkX2NyZWF0ZV9hc3NpZ25tZW50XCIpLmF0dHIoJ2Rpc2FibGVkJywgJ2Rpc2FibGVkJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAkKFwiLmFzc2lnbm1lbnRpZHNfY2hlY2tcIikuYXR0cignZGlzYWJsZWQnLCAnZGlzYWJsZWQnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIEVuYWJsZSBjb3Vyc2UgYnV0dG9ucy5cbiAgICAgICAgICAgICAgICAgICAgJCgnI2lkX2NyZWF0ZV9jb3Vyc2UnKS5yZW1vdmVBdHRyKCdkaXNhYmxlZCcpO1xuICAgICAgICAgICAgICAgICAgICAkKCcjaWRfdXBkYXRlX2NvdXJzZScpLnJlbW92ZUF0dHIoJ2Rpc2FibGVkJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIFwiYW9Db2x1bW5EZWZzXCI6IFtcbiAgICAgICAgICAgIHtcImJTZWFyY2hhYmxlXCI6IGZhbHNlLCBcImJWaXNpYmxlXCI6IHRydWUsIFwiYVRhcmdldHNcIjogWyAwIF19LFxuICAgICAgICAgICAge1wiYlNlYXJjaGFibGVcIjogdHJ1ZSwgXCJiVmlzaWJsZVwiOiB0cnVlLCBcImFUYXJnZXRzXCI6IFsgMSBdLFxuICAgICAgICAgICAgICAgIFwiZm5DcmVhdGVkQ2VsbFwiOiBmdW5jdGlvbiAoblRkKSB7XG4gICAgICAgICAgICAgICAgICAgICQoblRkKS5hZGRDbGFzcygnbm93cmFwJyk7XG4gICAgICAgICAgICAgICAgfX0sXG4gICAgICAgICAgICB7XCJiU2VhcmNoYWJsZVwiOiB0cnVlLCBcImJWaXNpYmxlXCI6IHRydWUsIFwiYVRhcmdldHNcIjogWyAyIF19LFxuICAgICAgICAgICAge1wiYlNlYXJjaGFibGVcIjogdHJ1ZSwgXCJiVmlzaWJsZVwiOiB0cnVlLCBcImFUYXJnZXRzXCI6IFsgMyBdfVxuICAgICAgICBdXG4gICAgfSk7XG5cbiAgICAvLyBPcGVuIGFuIGlmcmFtZSBsaWdodCBib3ggd2hpY2ggYWxsb3dzIHRoZSBjcmVhdGlvbiBvZiBjbGFzc2VzLlxuICAgICQoJyNjcmVhdGVfY2xhc3Nlc19idXR0b24nKS5jb2xvcmJveCh7XG4gICAgICAgIGlmcmFtZTp0cnVlLCB3aWR0aDonNjAlJywgdG9wOiAnMjAwcHgnLCBoZWlnaHQ6JzEyNHB4Jywgb3BhY2l0eTogXCIwLjdcIiwgY2xhc3NOYW1lOiBcImNvdXJzZV9jcmVhdGlvblwiLFxuICAgICAgICBocmVmOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICB2YXIgY2F0ZWdvcnkgPSAkKCcuY3JlYXRlX2NvdXJzZV9jYXRlZ29yeScpLnZhbCgpO1xuICAgICAgICAgICAgICAgIHZhciBhc3NpZ25tZW50cyA9ICgkKCcuY3JlYXRlX2Fzc2lnbm1lbnRfY2hlY2tib3gnKS5pcygnOmNoZWNrZWQnKSkgPyBcIjFcIiA6IFwiMFwiO1xuXG4gICAgICAgICAgICAgICAgdmFyIGNsYXNzX2lkcyA9IFwiXCI7XG4gICAgICAgICAgICAgICAgdmFyIGkgPSAwO1xuICAgICAgICAgICAgICAgICQoJy5icm93c2VyX2NoZWNrYm94OmNoZWNrZWQnKS5lYWNoKGZ1bmN0aW9uKGkpe1xuICAgICAgICAgICAgICAgICAgICBjbGFzc19pZHMgKz0gXCImY2xhc3NfaWRcIiArIGkgKyBcIj1cIiArICQodGhpcykudmFsKCk7XG4gICAgICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIHZhciBwYWdldXJsID0gd2luZG93LmxvY2F0aW9uLmhyZWY7XG4gICAgICAgICAgICAgICAgdmFyIHVybCA9IHBhZ2V1cmwucmVwbGFjZShcImNtZD1jb3Vyc2VzXCIsIFwiY21kPW11bHRpcGxlX2NsYXNzX3JlY3JlYXRpb25cIik7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gdXJsICsgXCImdmlld19jb250ZXh0PWJveCZjYXRlZ29yeT1cIiArIGNhdGVnb3J5ICsgXCImYXNzaWdubWVudHM9XCIgKyBhc3NpZ25tZW50cyArIGNsYXNzX2lkcyArIFwiJnNlc3NrZXk9XCIgKyBNLmNmZy5zZXNza2V5O1xuICAgICAgICB9LFxuICAgICAgICBvbkNsZWFudXA6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uID0gd2luZG93LmxvY2F0aW9uO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAoJCgnI2NsYXNzX2lkcycpLmxlbmd0aCA+IDApIHtcblxuICAgICAgICAvLyBNb3ZlIGJveCB3aXRoaW4gZnJhbWUuXG4gICAgICAgICQoXCIuc2lkZS1wcmUtb25seSAjcGFnZS1jb250ZW50ICNyZWdpb24tbWFpblwiKS5jc3Moe1xuICAgICAgICAgICAgJ21hcmdpbi1sZWZ0JyA6ICcwcHgnXG4gICAgICAgIH0pO1xuXG4gICAgICAgICQoXCIuaGFzLXJlZ2lvbi1zaWRlLXByZSAjcGFnZS1jb250ZW50ICNyZWdpb24tbWFpblwiKS5jc3Moe1xuICAgICAgICAgICAgJ3dpZHRoJzogJzEwMCUnLFxuICAgICAgICAgICAgJ21hcmdpbi10b3AnOiAnLTMwcHgnXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHZhciBjbGFzc19pZHMgPSAkKCcjY2xhc3NfaWRzJykuaHRtbCgpO1xuXG4gICAgICAgICQuYWpheCh7XG4gICAgICAgICAgICBcImRhdGFUeXBlXCI6ICdodG1sJyxcbiAgICAgICAgICAgIFwidHlwZVwiOiBcIlBPU1RcIixcbiAgICAgICAgICAgIFwidXJsXCI6IFwiYWpheC5waHBcIixcbiAgICAgICAgICAgIFwiZGF0YVwiOiB7YWN0aW9uOiBcImNyZWF0ZV9jb3Vyc2VzXCIsIGNsYXNzX2lkczogY2xhc3NfaWRzLCBjb3Vyc2VfY2F0ZWdvcnk6ICQoXCIjY291cnNlX2NhdGVnb3J5XCIpLmh0bWwoKSxcbiAgICAgICAgICAgICAgICBjcmVhdGVfYXNzaWdubWVudHM6ICQoXCIjY3JlYXRlX2Fzc2lnbm1lbnRzXCIpLmh0bWwoKSwgc2Vzc2tleTogTS5jZmcuc2Vzc2tleX0sXG4gICAgICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbihkYXRhKSB7XG4gICAgICAgICAgICAgICAgJCgnI2NvdXJzZV9jcmVhdGlvbl9zdGF0dXMnKS5odG1sKGRhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBTaG93IGxpZ2h0IGJveCB0byBjaGFuZ2UgdGhlIGVuZCBkYXRlIG9mIGEgY291cnNlLlxuICAgIGZ1bmN0aW9uIGluaXRpYWxpc2VFZGl0RW5kRGF0ZSgpIHtcbiAgICAgICAgJChcImEuZWRpdF9jb3Vyc2VfZW5kX2xpbmtcIikuY29sb3Jib3goe1xuICAgICAgICAgICAgaW5saW5lOnRydWUsIHdpZHRoOlwiNjAlXCIsIHRvcDogXCIxMDBweFwiLCBiYWNrZ3JvdW5kOiBcIiNmZmZcIiwgaGVpZ2h0OlwiMjYwcHhcIiwgb3BhY2l0eTogXCIwLjdcIiwgY2xhc3NOYW1lOiBcImVkaXRfZW5kX2RhdGVfZm9ybVwiLFxuICAgICAgICAgICAgb25Mb2FkOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICBsaWdodEJveENsb3NlQnV0dG9uKCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgb25Db21wbGV0ZSA6IGZ1bmN0aW9uKCkge1xuXG4gICAgICAgICAgICAgICAgLy8gR2V0IGN1cnJlbnQgZGF0ZSBmcm9tIHRoZSBzcGFuIGlkIHdpdGhpbiB0aGUgbGluayBhbmQgc2V0XG4gICAgICAgICAgICAgICAgLy8gdGhlIGRhdGUgb2YgdGhlIGRhdGVwaWNrZXIgaW4gdGhlIGxpZ2h0Ym94IHRvIHRoYXQuXG4gICAgICAgICAgICAgICAgdmFyIGN1cnJlbnRfZGF0ZSA9ICQoJyMnICsgJCh0aGlzKS5hdHRyKFwiaWRcIikgKyAnIHNwYW4nKS5hdHRyKFwiaWRcIik7XG4gICAgICAgICAgICAgICAgY3VycmVudF9kYXRlID0gY3VycmVudF9kYXRlLnNwbGl0KFwiX1wiKTtcbiAgICAgICAgICAgICAgICAkKCcjaWRfbmV3X2NvdXJzZV9lbmRfZGF0ZV9kYXknKS52YWwoY3VycmVudF9kYXRlWzFdKTtcbiAgICAgICAgICAgICAgICAkKCcjaWRfbmV3X2NvdXJzZV9lbmRfZGF0ZV9tb250aCcpLnZhbChjdXJyZW50X2RhdGVbMl0pO1xuICAgICAgICAgICAgICAgICQoJyNpZF9uZXdfY291cnNlX2VuZF9kYXRlX3llYXInKS52YWwoY3VycmVudF9kYXRlWzNdKTtcblxuICAgICAgICAgICAgICAgIHZhciBpZFN0ciA9ICQodGhpcykuYXR0cihcImlkXCIpLnNwbGl0KFwiX1wiKTtcbiAgICAgICAgICAgICAgICB2YXIgdGlpX2NvdXJzZV9pZCA9IGlkU3RyWzJdO1xuICAgICAgICAgICAgICAgICQoJ2lucHV0W25hbWU9XCJ0aWlfY291cnNlX2lkXCJdJykudmFsKHRpaV9jb3Vyc2VfaWQpO1xuICAgICAgICAgICAgICAgICQoJ2lucHV0W25hbWU9XCJ0aWlfY291cnNlX3RpdGxlXCJdJykudmFsKCQoJ2EjY291cnNlXycgKyB0aWlfY291cnNlX2lkKS5odG1sKCkpO1xuICAgICAgICAgICAgICAgICQoJyNjYm94TG9hZGVkQ29udGVudCAuZWRpdF9jb3Vyc2VfZW5kX2RhdGVfZm9ybScpLnNob3coKTtcbiAgICAgICAgICAgICAgICAkKCcjZGF0ZXNlbGVjdG9yLWNhbGVuZGFyLXBhbmVsJykuY3NzKCd6LWluZGV4JywgJzk5OTknKTtcblxuICAgICAgICAgICAgICAgICQoJyNpZF9zYXZlX2VuZF9kYXRlJykuY2xpY2soZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgICQuYWpheCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBcImRhdGFUeXBlXCI6ICdqc29uJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIlBPU1RcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwidXJsXCI6IFwiYWpheC5waHBcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiZGF0YVwiOiB7YWN0aW9uOiBcImVkaXRfY291cnNlX2VuZF9kYXRlXCIsIHRpaV9jb3Vyc2VfaWQ6IHRpaV9jb3Vyc2VfaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGlpX2NvdXJzZV90aXRsZTogJCgnYSNjb3Vyc2VfJyArIHRpaV9jb3Vyc2VfaWQpLmh0bWwoKSwgc2Vzc2tleTogTS5jZmcuc2Vzc2tleSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRfZGF0ZV9kOiAkKCcjaWRfbmV3X2NvdXJzZV9lbmRfZGF0ZV9kYXknKS52YWwoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRfZGF0ZV9tOiAkKCcjaWRfbmV3X2NvdXJzZV9lbmRfZGF0ZV9tb250aCcpLnZhbCgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZF9kYXRlX3k6ICQoJyNpZF9uZXdfY291cnNlX2VuZF9kYXRlX3llYXInKS52YWwoKVxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uKGRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmFsKGRhdGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhLnN0YXR1cyA9PSBcInN1Y2Nlc3NcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQuJC5mbi5jb2xvcmJveC5jbG9zZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCcjY291cnNlX2RhdGVfJyArIHRpaV9jb3Vyc2VfaWQgKyAnIHNwYW4nKS5odG1sKGRhdGEuZW5kX2RhdGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjdXJyZW50X21zZyA9ICQoJyNlZGl0X2VuZF9kYXRlX2Rlc2MnKS5odG1sO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCcjZWRpdF9lbmRfZGF0ZV9kZXNjJykuaHRtbChjdXJyZW50X21zZyArIFwiIFwiICsgZGF0YS5tc2cpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgb25DbGVhbnVwOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAkKCcuZWRpdF9jb3Vyc2VfZW5kX2RhdGVfZm9ybScpLmhpZGUoKTtcbiAgICAgICAgICAgICAgICAkKCcjdGlpX2Nsb3NlX2JhcicpLnJlbW92ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaWdodEJveENsb3NlQnV0dG9uKCkge1xuICAgICAgICAkKCdib2R5JykuYXBwZW5kKCc8ZGl2IGlkPVwidGlpX2Nsb3NlX2JhclwiPjxhIGhyZWY9XCIjXCIgb25jbGljaz1cIiQuY29sb3Jib3guY2xvc2UoKTsgcmV0dXJuIGZhbHNlO1wiPicgKyBNLnN0ci50dXJuaXRpbnRvb2x0d28uY2xvc2VidXR0b24gKyAnPC9hPjwvZGl2PicpO1xuICAgIH1cblxuICAgIC8vIFNob3cgbGlnaHQgYm94IHdpdGggYSBmb3JtIHRvIGVpdGhlciBjcmVhdGUgYSBuZXcgY291cnNlIG9yIGxpbmsgYW4gdW5saW5rZWQgTW9vZGxlIGNvdXJzZVxuICAgIC8vIHRvIHRoZSBjbGlja2VkIFR1cm5pdGluIGNsYXNzLCB0aGVuIHN1YnNlcXVlbnRseSBjcmVhdGUgYSBNb29kbGUgYXNzaWdubWVudCB1c2luZyB0aGUgc2VsZWN0ZWRcbiAgICAvLyBleGlzdGluZyBhc3NpZ25tZW50cyBvbiBUdXJuaXRpbiBhcyBwYXJ0cy5cbiAgICBmdW5jdGlvbiBpbml0aWFsaXNlQ291cnNlUmVjcmVhdGlvbigpIHtcblxuICAgICAgICB2YXIgd2luZG93V2lkdGggPSAkKHdpbmRvdykud2lkdGgoKTtcbiAgICAgICAgdmFyIGNvbG9yQm94V2lkdGggPSBcIjgwJVwiO1xuICAgICAgICBpZiAod2luZG93V2lkdGggPCAxMDAwKSB7XG4gICAgICAgICAgICBjb2xvckJveFdpZHRoID0gXCI4NjBweFwiO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHdpbmRvd0hlaWdodCA9ICQod2luZG93KS53aWR0aCgpO1xuICAgICAgICB2YXIgY29sb3JCb3hIZWlnaHQgPSBcIjgwJVwiO1xuICAgICAgICBpZiAod2luZG93SGVpZ2h0IDwgNzAwKSB7XG4gICAgICAgICAgICBjb2xvckJveEhlaWdodCA9IFwiNjAwcHhcIjtcbiAgICAgICAgfVxuXG4gICAgICAgICQoXCJhLmNvdXJzZV9yZWNyZWF0ZVwiKS5jb2xvcmJveCh7XG4gICAgICAgICAgICBpZnJhbWU6dHJ1ZSwgd2lkdGg6Y29sb3JCb3hXaWR0aCwgaGVpZ2h0OmNvbG9yQm94SGVpZ2h0LCB0b3A6ICcxMDBweCcsIGNsYXNzTmFtZTogXCJtaWdyYXRpb25cIiwgb3BhY2l0eTogXCIwLjdcIixcbiAgICAgICAgICAgIG9uTG9hZDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgbGlnaHRCb3hDbG9zZUJ1dHRvbigpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG9uQ2xlYW51cDpmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAkKCcjdGlpX2Nsb3NlX2JhcicpLnJlbW92ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAkKCcuYnJvd3Nlcl9jaGVja2JveCcpLmNsaWNrKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgaWYgKCQoJy5icm93c2VyX2NoZWNrYm94OmNoZWNrZWQnKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgJCgnLmNyZWF0ZV9jaGVja2JveGVzJykuc2xpZGVEb3duKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICQoJy5jcmVhdGVfY2hlY2tib3hlcycpLnNsaWRlVXAoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gTWFrZSB0aGUgYnV0dG9ucyBvbiB0aGUgY291cnNlIGNyZWF0aW9uL2xpbmsgZm9ybXMgY2xpY2thYmxlIGFuZCBjb25maWd1cmUgdGhlIHJlbGV2YW50IHRyaWdnZXJlZCBldmVudC5cbiAgICBmdW5jdGlvbiBpbml0aWFsaXNlQ291cnNlQnJvd3NlckJ1dHRvbnMob1RhYmxlKSB7XG4gICAgICAgICQoJyNpZF9jcmVhdGVfY291cnNlJykuY2xpY2soZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAkLmFqYXgoe1xuICAgICAgICAgICAgICAgIFwiZGF0YVR5cGVcIjogJ2h0bWwnLFxuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIlBPU1RcIixcbiAgICAgICAgICAgICAgICBcInVybFwiOiBcImFqYXgucGhwXCIsXG4gICAgICAgICAgICAgICAgXCJkYXRhXCI6IHthY3Rpb246IFwiY3JlYXRlX2NvdXJzZVwiLCB0aWlfY291cnNlX2lkOiAkKFwiI3RpaV9jb3Vyc2VfaWRcIikuaHRtbCgpLFxuICAgICAgICAgICAgICAgICAgICB0aWlfY291cnNlX25hbWU6IGVuY29kZVVSSUNvbXBvbmVudCgkKFwiI3RpaV9jb3Vyc2VfbmFtZVwiKS5odG1sKCkpLFxuICAgICAgICAgICAgICAgICAgICBjb3Vyc2VfbmFtZTogZW5jb2RlVVJJQ29tcG9uZW50KCQoXCIjaWRfY291cnNlbmFtZVwiKS52YWwoKSksXG4gICAgICAgICAgICAgICAgICAgIGNvdXJzZV9jYXRlZ29yeTogJChcIiNpZF9jb3Vyc2VjYXRlZ29yeVwiKS52YWwoKSwgc2Vzc2tleTogTS5jZmcuc2Vzc2tleX0sXG4gICAgICAgICAgICAgICAgc3VjY2VzczogZnVuY3Rpb24oZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgb2JqID0galF1ZXJ5LnBhcnNlSlNPTihkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgaGlkZUNvdXJzZUNyZWF0aW9uT3B0aW9ucyhvYmosIG9UYWJsZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgICQoJyNpZF91cGRhdGVfY291cnNlJykuY2xpY2soZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAkLmFqYXgoe1xuICAgICAgICAgICAgICAgIFwiZGF0YVR5cGVcIjogJ2h0bWwnLFxuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIlBPU1RcIixcbiAgICAgICAgICAgICAgICBcInVybFwiOiBcImFqYXgucGhwXCIsXG4gICAgICAgICAgICAgICAgXCJkYXRhXCI6IHthY3Rpb246IFwibGlua19jb3Vyc2VcIiwgdGlpX2NvdXJzZV9pZDogJChcIiN0aWlfY291cnNlX2lkXCIpLmh0bWwoKSxcbiAgICAgICAgICAgICAgICAgICAgdGlpX2NvdXJzZV9uYW1lOiAkKFwiI3RpaV9jb3Vyc2VfbmFtZVwiKS5odG1sKCksIGNvdXJzZV90b19saW5rOiAkKFwiI2lkX2NvdXJzZXRvbGlua1wiKS52YWwoKSxcbiAgICAgICAgICAgICAgICAgICAgc2Vzc2tleTogTS5jZmcuc2Vzc2tleX0sXG4gICAgICAgICAgICAgICAgc3VjY2VzczogZnVuY3Rpb24oZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgb2JqID0galF1ZXJ5LnBhcnNlSlNPTihkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgaGlkZUNvdXJzZUNyZWF0aW9uT3B0aW9ucyhvYmosIG9UYWJsZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIEhpZGUgdGhlIGNvdXJzZSBjcmVhdGlvbi9saW5raW5nIGZvcm0gb25jZSB0aGUgc2VsZWN0ZWQgVHVybml0aW5cbiAgICAvLyBjb3Vyc2UgaGFzIGJlZW4gY3JlYXRlZC9saW5rZWQgbG9jYWxseSBhbmQgaW5pdGlhbGlzZSB0aGUgY3JlYXRlIGFzc2lnbm1lbnQgYnV0dG9uLlxuICAgIGZ1bmN0aW9uIGhpZGVDb3Vyc2VDcmVhdGlvbk9wdGlvbnMob2JqLCBvVGFibGUpIHtcbiAgICAgICAgaWYgKG9iaiAhPSAwKSB7XG4gICAgICAgICAgICAkKFwiI2NvdXJzZV9pZFwiKS5odG1sKG9iai5jb3Vyc2VpZCk7XG5cbiAgICAgICAgICAgIHZhciBjYl9lbGVtZW50ID0gJ2lucHV0W25hbWU9XCJjaGVja18nICsgJCgnI3RpaV9jb3Vyc2VfaWQnKS5odG1sKCkgKyAnXCJdJztcbiAgICAgICAgICAgIHBhcmVudC4kKGNiX2VsZW1lbnQpLmhpZGUoKTtcbiAgICAgICAgICAgIHZhciB0aWNrX2VsZW1lbnQgPSAnI3RpY2tfJyArICQoJyN0aWlfY291cnNlX2lkJykuaHRtbCgpO1xuICAgICAgICAgICAgcGFyZW50LiQodGlja19lbGVtZW50KS5zaG93KCk7XG5cbiAgICAgICAgICAgICQoJ2ZpZWxkc2V0W2lkJD1cImNyZWF0ZV9jb3Vyc2VfZmllbGRzZXRcIl0nKS5wYXJlbnQoKS5zbGlkZVRvZ2dsZSgpO1xuICAgICAgICAgICAgJCgnZmllbGRzZXRbaWQkPVwidXBkYXRlX2NvdXJzZV9maWVsZHNldFwiXScpLnBhcmVudCgpLnNsaWRlVG9nZ2xlKCk7XG5cbiAgICAgICAgICAgICQoXCIjb3JfY29udGFpbmVyXCIpLmhpZGUoKTtcblxuICAgICAgICAgICAgJCgnI2V4aXN0aW5nX2NvdXJzZV90aXRsZV9zcGFuJykuaHRtbChvYmouY291cnNlbmFtZSk7XG4gICAgICAgICAgICAkKCcuZXhpc3RpbmdfY291cnNlX3RpdGxlX2gzJykucmVtb3ZlQ2xhc3MoJ2hpZGRlbl9jbGFzcycpO1xuXG4gICAgICAgICAgICBpZiAoJCgnLmFzc2lnbm1lbnRpZHNfY2hlY2snKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgJChcIi5hc3NpZ25tZW50aWRzX2NoZWNrXCIpLnJlbW92ZUF0dHIoJ2Rpc2FibGVkJyk7XG4gICAgICAgICAgICAgICAgJChcIiNpZF9hc3NpZ25tZW50bmFtZVwiKS5yZW1vdmVBdHRyKCdkaXNhYmxlZCcpO1xuICAgICAgICAgICAgICAgICQoXCIjaWRfY3JlYXRlX2Fzc2lnbm1lbnRcIikucmVtb3ZlQXR0cignZGlzYWJsZWQnKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgJCgnLmFzc2lnbm1lbnRpZHNfY2hlY2snKS5jaGFuZ2UoZnVuY3Rpb24oKXtcbiAgICAgICAgICAgICAgICBpZiAoJCgnLmFzc2lnbm1lbnRpZHNfY2hlY2snKS5maWx0ZXIoJzpjaGVja2VkJykubGVuZ3RoID49IDUpIHtcbiAgICAgICAgICAgICAgICAgICAgJChcIi5hc3NpZ25tZW50aWRzX2NoZWNrXCIpLm5vdCgnOmNoZWNrZWQnKS5hdHRyKCdkaXNhYmxlZCcsICdkaXNhYmxlZCcpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICQoXCIuYXNzaWdubWVudGlkc19jaGVja1wiKS5yZW1vdmVBdHRyKCdkaXNhYmxlZCcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpbml0aWFsaXNlQ3JlYXRlQXNzaWdubWVudEJ1dHRvbihvVGFibGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gQmluZCB0aGUgZXZlbnQgdG8gY3JlYXRlIGFuIGFzc2lnbm1lbnQgZnJvbSB0aGUgc2VsZWN0ZWQgcGFydHMuXG4gICAgZnVuY3Rpb24gaW5pdGlhbGlzZUNyZWF0ZUFzc2lnbm1lbnRCdXR0b24ob1RhYmxlKSB7XG4gICAgICAgICQoJyNpZF9jcmVhdGVfYXNzaWdubWVudCcpLnVuYmluZChcImNsaWNrXCIpO1xuICAgICAgICAkKCcjaWRfY3JlYXRlX2Fzc2lnbm1lbnQnKS5jbGljayhmdW5jdGlvbigpIHtcblxuICAgICAgICAgICAgdmFyIHBhcnRzID0gXCJcIjtcbiAgICAgICAgICAgICQoJy5hc3NpZ25tZW50aWRzX2NoZWNrOmNoZWNrZWQnKS5lYWNoKGZ1bmN0aW9uKGkpe1xuICAgICAgICAgICAgICAgIHBhcnRzICs9ICQodGhpcykudmFsKCkgKyBcIixcIjtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKHBhcnRzLmNoYXJBdChwYXJ0cy5sZW5ndGggLSAxKSA9PSAnLCcpIHtcbiAgICAgICAgICAgICAgICBwYXJ0cy5zdWJzdHJpbmcoMCwgcGFydHMubGVuZ3RoIC0gMSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICQoXCIjaWRfY3JlYXRlX2Fzc2lnbm1lbnRcIikuYXR0cignZGlzYWJsZWQnLCAnZGlzYWJsZWQnKTtcblxuICAgICAgICAgICAgJC5hamF4KHtcbiAgICAgICAgICAgICAgICBcImRhdGFUeXBlXCI6ICdodG1sJyxcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJQT1NUXCIsXG4gICAgICAgICAgICAgICAgXCJ1cmxcIjogXCJhamF4LnBocFwiLFxuICAgICAgICAgICAgICAgIFwiZGF0YVwiOiB7YWN0aW9uOiBcImNyZWF0ZV9hc3NpZ25tZW50XCIsIGNvdXJzZV9pZDogJChcIiNjb3Vyc2VfaWRcIikuaHRtbCgpLFxuICAgICAgICAgICAgICAgICAgICBhc3NpZ25tZW50X25hbWU6ICQoXCIjaWRfYXNzaWdubWVudG5hbWVcIikudmFsKCksIHBhcnRzOiBwYXJ0cywgc2Vzc2tleTogTS5jZmcuc2Vzc2tleX0sXG4gICAgICAgICAgICAgICAgc3VjY2VzczogZnVuY3Rpb24oZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICBvVGFibGUuZm5SZWxvYWRBamF4KCk7XG4gICAgICAgICAgICAgICAgICAgIG9UYWJsZS5mblN0YW5kaW5nUmVkcmF3KCk7XG4gICAgICAgICAgICAgICAgICAgICQoXCIjaWRfYXNzaWdubWVudG5hbWVcIikucmVtb3ZlQXR0cignZGlzYWJsZWQnKTtcbiAgICAgICAgICAgICAgICAgICAgJChcIiNpZF9jcmVhdGVfYXNzaWdubWVudFwiKS5yZW1vdmVBdHRyKCdkaXNhYmxlZCcpO1xuICAgICAgICAgICAgICAgICAgICAkKFwiLmFzc2lnbm1lbnRpZHNfY2hlY2tcIikucmVtb3ZlQXR0cignZGlzYWJsZWQnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxufSk7Il19 diff --git a/lib.php b/lib.php index 48762848..a991e0e5 100755 --- a/lib.php +++ b/lib.php @@ -697,6 +697,7 @@ function turnitintooltwo_cron_migrate_gradebook() { require_once(__DIR__.'/classes/v1migration/v1migration.php'); $sql = "migrate_gradebook = 1 GROUP BY turnitintooltwoid"; $assignments = $DB->get_records_select("turnitintooltwo_submissions", $sql, NULL, 'turnitintooltwoid', "turnitintooltwoid, count(turnitintooltwoid) AS numsubmissions"); + $numsubmissions = 0; foreach ($assignments as $assignment) { // We will break out unless the number of submissions migrated + to be migrated is MIGRATION_SUBMISSIONS_CUTOFF or less. @@ -709,7 +710,6 @@ function turnitintooltwo_cron_migrate_gradebook() { // If we have migrated, update the titles. if ($gradeupdates == "migrated") { - // Get the course ID. $courseid = $DB->get_field('turnitintooltwo', 'course', array('id' => $assignment->turnitintooltwoid)); @@ -724,9 +724,9 @@ function turnitintooltwo_cron_migrate_gradebook() { // Get the V1 assignment. $v1assignment = $DB->get_record('turnitintool', array("id" => $turnitintoolid)); - // Set assignment title back to old title for assignments where all grades have been migrated. + // Perform post-migration tasks. $v1migration = new v1migration($courseid, $v1assignment); - $v1migration->update_titles_post_migration($assignment->turnitintooltwoid); + $v1migration->post_migration($assignment->turnitintooltwoid); } } else { break; diff --git a/settings_extras.php b/settings_extras.php index ea4921f3..399b4306 100644 --- a/settings_extras.php +++ b/settings_extras.php @@ -481,59 +481,25 @@ $html .= html_writer::tag('hr', ''); $html .= html_writer::tag('h2', get_string('migration_status', 'turnitintooltwo'), array('class' => 'migrationheader')); - // Display our progress bar. - $html .= v1migration::output_progress_bar(); + $html .= html_writer::tag('p', get_string('migrationtoolprogress', 'turnitintooltwo')); $jsrequired = true; $assignmentids = (isset($_REQUEST['assignmentids'])) ? $_REQUEST["assignmentids"] : array(); $assignmentids = clean_param_array($assignmentids, PARAM_INT); - // Delete assignments if the form has been submitted. - if (isset($assignmentids) && count($assignmentids) > 0) { - v1migration::turnitintooltwo_delete_assignments($assignmentids); - - $urlparams = array('cmd' => 'v1migration', 'msg' => 'delete', 'type' => 'success'); - redirect(new moodle_url('/mod/turnitintooltwo/settings_extras.php', $urlparams)); - exit; - } - - // Show successful delete message if applicable. - if ($msg == 'delete') { - $close = html_writer::tag('button', '×', array('class' => 'close', 'data-dismiss' => 'alert')); - $alert = html_writer::tag('div', $close.get_string("v1assignmentsdeleted", 'turnitintooltwo'), - array('class' => 'alert alert-success', 'role' => 'alert')); - } - $table = new html_table(); $table->id = "migrationTable"; $rows = array(); // Do the table headers. $cells = array(); - $checkbox = html_writer::checkbox('selectallcb', 1, false, '', array('title' => get_string('migrationselectall', 'turnitintooltwo'))); - $cells[0] = new html_table_cell($checkbox); - $cells[0]->attributes['class'] = 'centered_cell centered_cb_cell'; $cells['assignmentid'] = new html_table_cell(get_string('assignmentid', 'turnitintooltwo')); $cells['title'] = new html_table_cell(get_string('migrationassignmenttitle', 'turnitintooltwo')); - $cells['migrationstatus'] = new html_table_cell(get_string('hasmigrated', 'turnitintooltwo')); - - // Set the header widths. Title can take up the remainder. - $cells[0]->attributes['width'] = "100px"; $cells['assignmentid']->attributes['width'] = "150px"; - $cells['migrationstatus']->attributes['width'] = "100px"; - - $table->head = $cells; - $elements2[] = array('html', html_writer::table($table)); - $customdata2["elements"] = $elements2; - $customdata2["show_cancel"] = false; - $customdata2["disable_form_change_checker"] = true; - $customdata2["submit_label"] = get_string('delete_selected', 'turnitintooltwo'); - - $optionsform = new turnitintooltwo_form($CFG->wwwroot.'/mod/turnitintooltwo/settings_extras.php?cmd=v1migration', $customdata2); - - $html .= html_writer::tag('div', $optionsform->display(), array('id' => 'migration-delete-selected')); + $table->head = $cells; + $html .= $OUTPUT->box(html_writer::table($table), ''); $output .= $alert . $html; diff --git a/tests/unit/classes/v1migration/v1migration_test.php b/tests/unit/classes/v1migration/v1migration_test.php index 7c98539c..9d6edc84 100755 --- a/tests/unit/classes/v1migration/v1migration_test.php +++ b/tests/unit/classes/v1migration/v1migration_test.php @@ -132,8 +132,9 @@ public function test_progress_bar() { * @param string $modname Module name (turnitintool or turnitintooltwo) * @param string $assignmentname The name of the assignment. * @param string The number of submissions to make. + * @param int $tiiassignid - Specify a Turnitin assignment ID - use when creating multiple assignments to differentiate them. */ - public function make_test_assignment($courseid, $modname, $assignmentname = "", $submissions = 1) { + public function make_test_assignment($courseid, $modname, $assignmentname = "", $submissions = 1, $tiiassignid = 0) { global $DB; if (!$this->v1installed()) { @@ -165,7 +166,7 @@ public function make_test_assignment($courseid, $modname, $assignmentname = "", $assignment->id = $DB->insert_record($modname, $assignment); // Create Assignment Part. - $parts = $this->make_test_parts($modname, $assignment->id, 1); + $parts = $this->make_test_parts($modname, $assignment->id, 1, $tiiassignid); $part = current($parts); // Create Assignment Submission. @@ -545,8 +546,6 @@ public function test_migrate_course() { Legacy field should be set to 1 on these tests. */ // Create our initial V2 course. - $v1iicourse = 9; - $course = new stdClass(); $course->courseid = 1; $course->ownerid = 1; @@ -654,9 +653,9 @@ public function test_migrate_gradebook() { } /** - * Test that the titles have been updated after migrating. + * Test that the post migration task works as expected. */ - public function test_update_titles_post_migration() { + public function test_post_migration() { global $DB; if (!$this->v1installed()) { @@ -681,10 +680,12 @@ public function test_update_titles_post_migration() { $v1assignment = $this->make_test_assignment($course->id, 'turnitintool', $v1assignmenttitle); $v1migration = new v1migration($course->id, $v1assignment); - // Test that the title gets updated after the migration. - $response = $v1migration->update_titles_post_migration(1); - $updatedassignment = $DB->get_record('turnitintool', array('id' => $v1assignment->id)); - $this->assertEquals("Test Assignment (Migrated)", $updatedassignment->name); + // Perform post-migration tasks - ie deletion of V1 assignment. + $v1migration->post_migration(1); + + // Check that the V1 assignment no longer exists. + $assignments = $DB->get_records('turnitintool', array('id' => $v1assignment->id)); + $this->assertEquals(0, count($assignments)); } /** @@ -701,7 +702,7 @@ public function test_turnitintooltwo_getassignments() { $_POST = array(); $_POST["sEcho"] = 1; - $_POST["iColumns"] = 4; + $_POST["iColumns"] = 2; $_POST["sColumns"] = ",,,"; $_POST["iDisplayStart"] = 0; $_POST["iDisplayLength"] = 10; @@ -709,25 +710,15 @@ public function test_turnitintooltwo_getassignments() { $_POST["sSearch_0"] = ""; $_POST["bRegex_0"] = "false"; $_POST["bSearchable_0"] = "true"; - $_POST["bSortable_0"] = "false"; + $_POST["bSortable_0"] = "true"; $_POST["mDataProp_1"] = 1; $_POST["sSearch_1"] = ""; $_POST["bRegex_1"] = "false"; $_POST["bSearchable_1"] = "true"; $_POST["bSortable_1"] = "true"; - $_POST["mDataProp_2"] = 2; - $_POST["sSearch_2"] = ""; - $_POST["bRegex_2"] = "false"; - $_POST["bSearchable_2"] = "true"; - $_POST["bSortable_2"] = "true"; - $_POST["mDataProp_3"] = 3; - $_POST["sSearch_3"] = ""; - $_POST["bRegex_3"] = "false"; - $_POST["bSearchable_3"] = "false"; - $_POST["bSortable_3"] = "true"; $_POST["sSearch"] = ""; $_POST["bRegex"] = "false"; - $_POST["iSortCol_0"] = 2; + $_POST["iSortCol_0"] = 1; $_POST["sSortDir_0"] = "asc"; $_POST["iSortingCols"] = 1; $_POST["_"] = 1494857276336; @@ -763,26 +754,15 @@ public function test_turnitintooltwo_getassignments() { $assignments = $DB->get_records('turnitintool', NULL, "name ASC", "id, name, migrated", $_POST["iDisplayStart"], $_POST["iDisplayLength"]); $outputrows = array(); foreach ($assignments as $key => $value) { - if ($value->migrated == 1) { - $checkbox = ''; - $sronly = html_writer::tag('span', get_string('yes', 'turnitintooltwo'), array('class' => 'sr-only')); - $migrationValue = html_writer::tag('span', $sronly, array('class' => 'fa fa-check')); + $assignmentlink = new moodle_url('/mod/turnitintool/view.php', array('a' => $value->id, 'id' => '0')); + $assignmenttitle = html_writer::link($assignmentlink, format_string($value->name), array('target' => '_blank' )); - $assignmenttitle = format_string($value->name); - } else { - $checkbox = ""; - $sronly = html_writer::tag('span', get_string('no', 'turnitintooltwo'), array('class' => 'sr-only')); - $migrationValue = html_writer::tag('span', $sronly, array('class' => 'fa fa-times')); - - $assignmentlink = new moodle_url('/mod/turnitintool/view.php', array('a' => $value->id, 'id' => '0')); - $assignmenttitle = html_writer::link($assignmentlink, format_string($value->name), array('target' => '_blank' )); - } - $outputrows[] = array($checkbox, $value->id, $assignmenttitle, $migrationValue); + $outputrows[] = array($value->id, $assignmenttitle); } $expectedoutput = array("aaData" => $outputrows, "sEcho" => $_POST["sEcho"], - "iTotalRecords" => $_POST["iDisplayLength"], - "iTotalDisplayRecords" => $numAssignments); + "iTotalRecords" => 10, + "iTotalDisplayRecords" => 20); $this->assertEquals($_POST["iDisplayLength"], count($assignments)); $response = v1migration::turnitintooltwo_getassignments(); @@ -794,29 +774,18 @@ public function test_turnitintooltwo_getassignments() { ORDER BY name asc"; $queryparams = array("search_term_2" => "%".$_POST["sSearch"]."%"); $assignments = $DB->get_records_sql($query, $queryparams, $_POST["iDisplayStart"], $_POST["iDisplayLength"]); - $totalassignments = count($DB->get_records_sql($query, $queryparams)); + $outputrows = array(); foreach ($assignments as $key => $value) { - if ($value->migrated == 1) { - $checkbox = ''; - $sronly = html_writer::tag('span', get_string('yes', 'turnitintooltwo'), array('class' => 'sr-only')); - $migrationValue = html_writer::tag('span', $sronly, array('class' => 'fa fa-check')); - - $assignmenttitle = format_string($value->name); - } else { - $checkbox = ""; - $sronly = html_writer::tag('span', get_string('no', 'turnitintooltwo'), array('class' => 'sr-only')); - $migrationValue = html_writer::tag('span', $sronly, array('class' => 'fa fa-times')); + $assignmentlink = new moodle_url('/mod/turnitintool/view.php', array('a' => $value->id, 'id' => '0')); + $assignmenttitle = html_writer::link($assignmentlink, format_string($value->name), array('target' => '_blank' )); - $assignmentlink = new moodle_url('/mod/turnitintool/view.php', array('a' => $value->id, 'id' => '0')); - $assignmenttitle = html_writer::link($assignmentlink, format_string($value->name), array('target' => '_blank' )); - } - $outputrows[] = array($checkbox, $value->id, $assignmenttitle, $migrationValue); + $outputrows[] = array($value->id, $assignmenttitle); } - $expectedoutput = array("aaData" => $outputrows, - "sEcho" => $_POST["sEcho"], - "iTotalRecords" => $_POST["iDisplayLength"], - "iTotalDisplayRecords" => $totalassignments); + $expectedoutput = array("aaData" => $outputrows, + "sEcho" => $_POST["sEcho"], + "iTotalRecords" => 10, + "iTotalDisplayRecords" => 20); $this->assertEquals($_POST["iDisplayLength"], count($assignments)); $response = v1migration::turnitintooltwo_getassignments(); @@ -825,9 +794,9 @@ public function test_turnitintooltwo_getassignments() { /** - * Test that assignments are deleted when given a list of assignments. + * Test that assignments are deleted when given an assignment. */ - public function test_turnitintooltwo_delete_assignments() { + public function test_turnitintooltwo_delete_assignment() { global $DB; if (!$this->v1installed()) { @@ -838,23 +807,19 @@ public function test_turnitintooltwo_delete_assignments() { $course = $this->getDataGenerator()->create_course(); // Create some V1 assignments. - $v1assignment1 = $this->make_test_assignment($course->id, 'turnitintool', "Assignment 1", 5); - $v1assignment2 = $this->make_test_assignment($course->id, 'turnitintool', "Assignment 2", 5); - $v1assignment3 = $this->make_test_assignment($course->id, 'turnitintool', "Assignment 3", 5); - $cm1 = get_coursemodule_from_instance('turnitintool', $v1assignment1->id); - $cm2 = get_coursemodule_from_instance('turnitintool', $v1assignment2->id); - $cm3 = get_coursemodule_from_instance('turnitintool', $v1assignment3->id); + $v1assignment = $this->make_test_assignment($course->id, 'turnitintool', "Assignment 1", 5); + $cm1 = get_coursemodule_from_instance('turnitintool', $v1assignment->id); // Check that the assignments have been created correctly. $v1assignments = $DB->get_records('turnitintool'); $v1parts = $DB->get_records('turnitintool_parts'); $v1submissions = $DB->get_records('turnitintool_submissions'); - $this->assertEquals(3, count($v1assignments)); - $this->assertEquals(3, count($v1parts)); - $this->assertEquals(15, count($v1submissions)); + $this->assertEquals(1, count($v1assignments)); + $this->assertEquals(1, count($v1parts)); + $this->assertEquals(5, count($v1submissions)); - // Delete the assignments. - $response = v1migration::turnitintooltwo_delete_assignments(array($v1assignment1->id, $v1assignment2->id, $v1assignment3->id)); + // Delete the assignment. + v1migration::turnitintooltwo_delete_assignment($v1assignment->id); // Verify that they have been deleted. $v1assignments = $DB->get_records('turnitintool'); @@ -867,10 +832,6 @@ public function test_turnitintooltwo_delete_assignments() { // Verify that records have been removed from the course_modules table. $v1cm = $DB->get_records('course_modules', array('id' => $cm1->id)); $this->assertEquals(0, count($v1cm)); - $v2cm = $DB->get_records('course_modules', array('id' => $cm2->id)); - $this->assertEquals(0, count($v2cm)); - $v3cm = $DB->get_records('course_modules', array('id' => $cm3->id)); - $this->assertEquals(0, count($v3cm)); } /** diff --git a/tests/unit/generator/lib.php b/tests/unit/generator/lib.php index 120efc18..51aea0fe 100644 --- a/tests/unit/generator/lib.php +++ b/tests/unit/generator/lib.php @@ -42,16 +42,17 @@ abstract class test_lib extends advanced_testcase { * @param string $modname Module name (turnitintool or turnitintooltwo) * @param int $assignmentid Assignment Module ID * @param int $number_of_parts - The number of parts to create + * @param int $tiiassignid - Specify a Turnitin assignment ID - use when creating multiple assignments to differentiate them. * * @return array $parts_created - parts added to the assignment listed as partid => partobject */ - public function make_test_parts($modname, $assignmentid, $number_of_parts) { + public function make_test_parts($modname, $assignmentid, $number_of_parts, $tiiassignid = 0) { global $DB; $modulevar = $modname.'id'; $part = new stdClass(); $part->$modulevar = $assignmentid; - $part->tiiassignid = 0; + $part->tiiassignid = $tiiassignid; $part->dtstart = 0; $part->dtdue = 0; $part->dtpost = 0; diff --git a/tests/unit/lib_test.php b/tests/unit/lib_test.php index 1a29ada0..9b844084 100644 --- a/tests/unit/lib_test.php +++ b/tests/unit/lib_test.php @@ -73,16 +73,16 @@ public function test_turnitintooltwo_cron_migrate_gradebook() { turnitintooltwo_cron_migrate_gradebook(); - /** + /** * Test that we migrate the gradebook when using the cron workflow. * There should be no grades that require a migration. */ $submissions = $DB->get_records('turnitintooltwo_submissions', array('turnitintooltwoid' => $v2assignment->id, 'migrate_gradebook' => 1)); $this->assertEquals(0, count($submissions)); - // Test that the title gets updated after the migration. + // Test that the V1 assignment has been deleted. $updatedassignment = $DB->get_record('turnitintool', array('id' => $v1assignment->id)); - $this->assertEquals("Test Assignment (Migrated)", $updatedassignment->name); + $this->assertFalse($updatedassignment); } /** @@ -114,13 +114,15 @@ public function test_turnitintooltwo_cron_migrate_gradebook_1000() { // Create V1 Assignment. $v1assignmenttitle = "Test Assignment (Migration in progress...)"; - $v1assignment = $v1migrationtest->make_test_assignment($course->id, 'turnitintool', $v1assignmenttitle); + $v1assignment = $v1migrationtest->make_test_assignment($course->id, 'turnitintool', $v1assignmenttitle, 1, 1); + $v1migrationtest->make_test_assignment($course->id, 'turnitintool', $v1assignmenttitle, 1, 2); + $v1migrationtest->make_test_assignment($course->id, 'turnitintool', $v1assignmenttitle, 1, 3); $v1migration = new v1migration($course->id, $v1assignment); // Create V2 Assignment. - $v2assignment1 = $v1migrationtest->make_test_assignment($course->id, 'turnitintooltwo', "Test Assignment 1", 400); - $v2assignment2 = $v1migrationtest->make_test_assignment($course->id, 'turnitintooltwo', "Test Assignment 2", 400); - $v2assignment3 = $v1migrationtest->make_test_assignment($course->id, 'turnitintooltwo', "Test Assignment 3", 400); + $v2assignment1 = $v1migrationtest->make_test_assignment($course->id, 'turnitintooltwo', "Test Assignment 1", 400, 1); + $v2assignment2 = $v1migrationtest->make_test_assignment($course->id, 'turnitintooltwo', "Test Assignment 2", 400, 2); + $v2assignment3 = $v1migrationtest->make_test_assignment($course->id, 'turnitintooltwo', "Test Assignment 3", 400, 3); // Set migrate gradebook to 1 so the assignments will get migrated when we call the function. $DB->set_field('turnitintooltwo_submissions', "migrate_gradebook", 1); @@ -203,7 +205,7 @@ public function test_turnitintooltwo_generate_part_dates() { $this->assertEquals(gmdate("Y-m-d\TH:i:s\Z", $turnitintooltwoassignment->turnitintooltwo->dtpost1), $response_post); // Check functionality with new dates. We won't know what the current time will be when the function is called so we check that new dates is not equal to the assignment date. - + $response_start = turnitintooltwo_generate_part_dates(1, "start", $turnitintooltwoassignment->turnitintooltwo, 1); $response_due = turnitintooltwo_generate_part_dates(1, "due", $turnitintooltwoassignment->turnitintooltwo, 1); $response_post = turnitintooltwo_generate_part_dates(1, "post", $turnitintooltwoassignment->turnitintooltwo, 1); From 609165b83e8f941b67561bebc0458b839775b11f Mon Sep 17 00:00:00 2001 From: David Winn Date: Mon, 19 Feb 2018 15:41:49 +0000 Subject: [PATCH 02/21] Language string changes and adding widths for table. --- lang/en/turnitintooltwo.php | 5 +---- settings_extras.php | 5 +++-- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/lang/en/turnitintooltwo.php b/lang/en/turnitintooltwo.php index ce624856..3a5817e7 100755 --- a/lang/en/turnitintooltwo.php +++ b/lang/en/turnitintooltwo.php @@ -588,7 +588,7 @@ $string['migrationredirect'] = 'You will be redirected to the Moodle Direct V2 assignment upon completion.'; $string['migration_event_name'] = 'Migrate V1 Assignment To V2'; $string['migration_event_desc'] = 'Turnitin Tool V1 Course: {$a->v1_name} ({$a->v1_cm_id}) has been migrated to Turnitin V2 ({$a->v2_cm_id}).'; -$string['migrationtoolprogress'] = 'Select the migrated V1 assignments that you\'d like to remove. V1 assignments that have not yet been migrated cannot be removed.'; +$string['migratiojntoolv1list'] = 'Below is a list of V1 assignments which have not yet been migrated.'; $string['complete'] = 'complete'; $string['assignments'] = 'assignments'; $string['migrationtoolerror'] = 'The migration of this assignment has failed. Please try again.'; @@ -625,15 +625,12 @@ $string['migrationredirect'] = 'You will be redirected to the Moodle Direct V2 assignment upon completion.'; $string['migration_event_name'] = 'Migrate V1 Assignment To V2'; $string['migration_event_desc'] = 'Turnitin Tool V1 Course: {$a->v1_name} ({$a->v1_cm_id}) has been migrated to Turnitin V2 ({$a->v2_cm_id}).'; -$string['migrationtoolprogress'] = 'Select the migrated V1 assignments that you\'d like to remove. V1 assignments that have not yet been migrated cannot be removed.'; $string['complete'] = 'complete'; $string['assignments'] = 'assignments'; $string['migrationtoolerror'] = 'The migration of this assignment has failed. Please try again.'; $string['assignmentid'] = 'V1 Assignment ID'; $string['migrationassignmenttitle'] = 'V1 Assignment Title'; $string['migration_status'] = 'Migration Status'; -$string['delete_selected'] = 'Delete Selected'; -$string['v1assignmentsdeleted'] = 'The assignment(s) have been successfully deleted.'; $string['migrationtoolaccounterror'] = 'You must use the same Turnitin account ID in both your V1 and V2 plugins to enable the Moodle Migration Tool.'; $string['hasmigrated'] = 'Migrated?'; $string['migrationselectall'] = 'Select all migrated assignments'; diff --git a/settings_extras.php b/settings_extras.php index 399b4306..e13b200a 100644 --- a/settings_extras.php +++ b/settings_extras.php @@ -481,7 +481,7 @@ $html .= html_writer::tag('hr', ''); $html .= html_writer::tag('h2', get_string('migration_status', 'turnitintooltwo'), array('class' => 'migrationheader')); - $html .= html_writer::tag('p', get_string('migrationtoolprogress', 'turnitintooltwo')); + $html .= html_writer::tag('p', get_string('migrationtoolv1list', 'turnitintooltwo')); $jsrequired = true; @@ -496,7 +496,8 @@ $cells = array(); $cells['assignmentid'] = new html_table_cell(get_string('assignmentid', 'turnitintooltwo')); $cells['title'] = new html_table_cell(get_string('migrationassignmenttitle', 'turnitintooltwo')); - $cells['assignmentid']->attributes['width'] = "150px"; + $cells['assignmentid']->attributes['width'] = "20%"; + $cells['title']->attributes['width'] = "80%"; $table->head = $cells; $html .= $OUTPUT->box(html_writer::table($table), ''); From c1626649522ad6740fef7273e34bfdd3d3c1aee2 Mon Sep 17 00:00:00 2001 From: David Winn Date: Wed, 21 Feb 2018 10:13:52 +0000 Subject: [PATCH 03/21] Implement check to ensure grades are migrated across and display error if not. --- ajax.php | 9 +-- classes/v1migration/v1migration.php | 51 +++++++++++++++-- jquery/turnitintooltwo_migration_tool.js | 4 +- jquery/turnitintooltwo_migration_tool.min.js | 4 +- lang/en/turnitintooltwo.php | 4 +- mod_form.php | 2 +- sass/_variables.scss | 4 -- sass/partials/_warnings.scss | 56 ------------------- sass/styles.scss | 1 - styles.css | 2 +- styles.css.map | 2 +- .../classes/v1migration/v1migration_test.php | 52 +++++------------ turnitintooltwo_submission.class.php | 4 +- turnitintooltwo_view.class.php | 2 +- view.php | 12 +++- 15 files changed, 88 insertions(+), 121 deletions(-) delete mode 100644 sass/partials/_warnings.scss diff --git a/ajax.php b/ajax.php index ec85bc0b..0bc9ee13 100644 --- a/ajax.php +++ b/ajax.php @@ -904,12 +904,13 @@ $v1migration = new v1migration($courseid, $turnitintool); try { - $turnitintooltwoid = $v1migration->migrate(); - $cm = get_coursemodule_from_instance("turnitintooltwo", $turnitintooltwoid); + $response = $v1migration->migrate(); + $cm = get_coursemodule_from_instance("turnitintooltwo", $response["turnitintooltwoid"]); // The returned CMID will be used for the redirect. - if ((int)$turnitintooltwoid > 0) { - echo '{ "id": '.$cm->id.' }'; + if ((int)$response["turnitintooltwoid"] > 0) { + echo '{ "id": '.$cm->id.', + "gradebook": "'.$response["gradebook"].'" }'; exit(); } } catch(Exception $e) { diff --git a/classes/v1migration/v1migration.php b/classes/v1migration/v1migration.php index bee0b8de..54cc322e 100644 --- a/classes/v1migration/v1migration.php +++ b/classes/v1migration/v1migration.php @@ -231,17 +231,24 @@ public function migrate() { // Once grades have been updated we can run the post migration task. if ($gradeupdates == "migrated") { - $this->post_migration($turnitintooltwoid); + $gradebook = $this->post_migration($turnitintooltwoid); } // Link the v2 id to the v1 id in the session. if (is_int($turnitintooltwoid)) { $_SESSION["migrationtool"][$this->v1assignment->id] = $turnitintooltwoid; - return $turnitintooltwoid; + return array("turnitintooltwoid" => $turnitintooltwoid, + "gradebook" => $gradebook); } else { return false; } + + + //TODO: OUTPUT THE ERROR OR SUCCESS MESSAGE WITHIN THE V2 ASSIGNMENT INBOX. + + + } /** @@ -448,8 +455,38 @@ public function post_migration($v2assignmentid) { $params['itemname'] = $this->v1assignment->name; grade_update('mod/turnitintooltwo', $this->courseid, 'mod', 'turnitintooltwo', $v2assignmentid, 0, NULL, $params); - // Delete the V1 assignment. - $this->turnitintooltwo_delete_assignment($this->v1assignment->id); + // Perform a grade check to double check the grades are in the gradebook. + $v1_grades = $this->get_grades_array("turnitintool", $this->v1assignment->id); + $v2_grades = $this->get_grades_array("turnitintooltwo", $v2assignmentid); + + // We only want to delete the V1 assignment if all grades are in the gradebook. + if ($v1_grades === $v2_grades) { + $this->turnitintooltwo_delete_assignment($this->v1assignment->id); + + return "success"; + } else { + return "gradebookerror"; + } + } + + private function get_grades_array($module, $assignmentid) { + + $cm = get_coursemodule_from_instance($module, $assignmentid); + $context = context_module::instance($cm->id); + $enrolled_students = get_enrolled_users($context, 'mod/'.$module.':submit', 0, 'u.id'); + + $userids = array(); + foreach ($enrolled_students as $student) { + $userids[] = $student->id; + } + + $grades = grade_get_grades($this->courseid, 'mod', $module, $assignmentid, $userids); + $response = array(); + foreach ($grades->items[0]->grades as $student => $grade_item) { + $response[$student] = $grade_item->grade; + } + + return $response; } /** @@ -683,15 +720,17 @@ public static function activate_migration() { return $activation; } - public static function check_account($accountid) { + public static function check_account($accountid, $error = 0) { global $CFG; $config = turnitintooltwo_admin_config(); $tiiapiurl = (substr($config->apiurl, -1) == '/') ? substr($config->apiurl, 0, -1) : $config->apiurl; + $errorType = ($error) ? "&error=gradebook" : ""; + $ch = curl_init(); - curl_setopt($ch, CURLOPT_URL, $tiiapiurl."/api/rest/check?lang=en_us&operation=mdl-migration&account=".$accountid); + curl_setopt($ch, CURLOPT_URL, $tiiapiurl."/api/rest/check?lang=en_us&operation=mdl-migration&account=".$accountid.$errorType); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); if (isset($CFG->proxyhost) AND !empty($CFG->proxyhost)) { diff --git a/jquery/turnitintooltwo_migration_tool.js b/jquery/turnitintooltwo_migration_tool.js index c3d4aadd..1de28fe6 100644 --- a/jquery/turnitintooltwo_migration_tool.js +++ b/jquery/turnitintooltwo_migration_tool.js @@ -76,7 +76,9 @@ function migrate(courseid, turnitintoolid) { $.colorbox.close(); } $('#migration_alert').hide(); - window.location.href = M.cfg.wwwroot + "/mod/turnitintooltwo/view.php?id="+data.id+"&migrated=1"; + + var migrated = (data.gradebook === "gradebookerror") ? 2 : 1; + window.location.href = M.cfg.wwwroot + "/mod/turnitintooltwo/view.php?id="+data.id+"&migrated="+migrated; }, error: function(error) { var data = error.responseJSON; diff --git a/jquery/turnitintooltwo_migration_tool.min.js b/jquery/turnitintooltwo_migration_tool.min.js index 47d5447c..cfa089d8 100644 --- a/jquery/turnitintooltwo_migration_tool.min.js +++ b/jquery/turnitintooltwo_migration_tool.min.js @@ -1,2 +1,2 @@ -function dontmigrate(t){$("#migration_alert").hide(),t.close()}function lightBoxCloseButton(t){$("body").append('")}function displayMigrationModal(){$("#migrate_type").data("turnitintoolid")!=$("#migrate_type").data("lastasked")&&($.colorbox({width:550,height:600,inline:!0,opacity:"0.7",href:"#migration_alert",onLoad:function(){$("#asktomigrate").show(),lightBoxCloseButton(),$(".tii_close_link").click($.proxy(dontmigrate,null,$.colorbox))},onCleanup:function(){$("#tii_close_bar").remove(),$("#migration_alert").hide()}}),$("#migration_alert").show()),2==$("#migrate_type").data("migratetype")&&($("#asktomigrate").hide(),$("#migrating").show(),migrate($("#migrate_type").data("courseid"),$("#migrate_type").data("turnitintoolid")))}function migrate(t,o){$.ajax({dataType:"json",type:"POST",url:M.cfg.wwwroot+"/mod/turnitintooltwo/ajax.php",data:{action:"begin_migration",courseid:t,turnitintoolid:o,sesskey:M.cfg.sesskey},success:function(t){$.colorbox&&$.colorbox.close(),$("#migration_alert").hide(),window.location.href=M.cfg.wwwroot+"/mod/turnitintooltwo/view.php?id="+t.id+"&migrated=1"},error:function(t){var o=t.responseJSON;$.colorbox&&$.colorbox.close(),$("#migration_alert").hide(),$("#turnitintool_style").prepend('
'+o.error+" "+o.message+"
"),o.hasOwnProperty("trace")&&(console.error(o.message),console.error(JSON.stringify(o.trace,null,4)))}})}$(document).ready(function(){$.ajax({dataType:"json",type:"POST",url:M.cfg.wwwroot+"/mod/turnitintooltwo/ajax.php",data:{action:"check_migrated",turnitintoolid:$("#migrate_type").data("turnitintoolid"),sesskey:M.cfg.sesskey},success:function(t){t.migrated===!0?window.location.href=M.cfg.wwwroot+"/mod/turnitintooltwo/view.php?id="+t.v2id:(displayMigrationModal(),$(".dontmigrate_link").click($.proxy(dontmigrate,null,$.colorbox)))}})}),$(".migrate_link").on("click",function(){$("#asktomigrate").hide(),$("#migrating").show(),migrate($(this).data("courseid"),$(this).data("turnitintoolid"))}); -//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInR1cm5pdGludG9vbHR3b19taWdyYXRpb25fdG9vbC5qcyJdLCJuYW1lcyI6WyJkb250bWlncmF0ZSIsImNiIiwiJCIsImhpZGUiLCJjbG9zZSIsImxpZ2h0Qm94Q2xvc2VCdXR0b24iLCJhcHBlbmQiLCJNIiwic3RyIiwidHVybml0aW50b29sdHdvIiwiY2xvc2VidXR0b24iLCJkaXNwbGF5TWlncmF0aW9uTW9kYWwiLCJkYXRhIiwiY29sb3Jib3giLCJ3aWR0aCIsImhlaWdodCIsImlubGluZSIsIm9wYWNpdHkiLCJocmVmIiwib25Mb2FkIiwic2hvdyIsImNsaWNrIiwicHJveHkiLCJvbkNsZWFudXAiLCJyZW1vdmUiLCJtaWdyYXRlIiwiY291cnNlaWQiLCJ0dXJuaXRpbnRvb2xpZCIsImFqYXgiLCJkYXRhVHlwZSIsInR5cGUiLCJ1cmwiLCJjZmciLCJ3d3dyb290IiwiYWN0aW9uIiwic2Vzc2tleSIsInN1Y2Nlc3MiLCJ3aW5kb3ciLCJsb2NhdGlvbiIsImlkIiwiZXJyb3IiLCJyZXNwb25zZUpTT04iLCJwcmVwZW5kIiwibWVzc2FnZSIsImhhc093blByb3BlcnR5IiwiY29uc29sZSIsIkpTT04iLCJzdHJpbmdpZnkiLCJ0cmFjZSIsImRvY3VtZW50IiwicmVhZHkiLCJtaWdyYXRlZCIsInYyaWQiLCJvbiIsInRoaXMiXSwibWFwcGluZ3MiOiJBQThCQSxRQUFTQSxhQUFZQyxHQUNqQkMsRUFBRSxvQkFBb0JDLE9BQ3RCRixFQUFHRyxRQUdQLFFBQVNDLHFCQUFvQkosR0FDekJDLEVBQUUsUUFBUUksT0FBTyw4REFBZ0VDLEVBQUVDLElBQUlDLGdCQUFnQkMsWUFBYyxjQUl6SCxRQUFTQyx5QkFFRFQsRUFBRSxpQkFBaUJVLEtBQUssbUJBQXFCVixFQUFFLGlCQUFpQlUsS0FBSyxlQUNyRVYsRUFBRVcsVUFBVUMsTUFBTyxJQUFLQyxPQUFRLElBQUtDLFFBQU8sRUFBTUMsUUFBUyxNQUFPQyxLQUFLLG1CQUNuRUMsT0FBUSxXQUNKakIsRUFBRSxpQkFBaUJrQixPQUNuQmYsc0JBRUFILEVBQUUsbUJBQW1CbUIsTUFBTW5CLEVBQUVvQixNQUFNdEIsWUFBYSxLQUFNRSxFQUFFVyxZQUU1RFUsVUFBVSxXQUNOckIsRUFBRSxrQkFBa0JzQixTQUNwQnRCLEVBQUUsb0JBQW9CQyxVQUk5QkQsRUFBRSxvQkFBb0JrQixRQUdvQixHQUExQ2xCLEVBQUUsaUJBQWlCVSxLQUFLLGlCQUN4QlYsRUFBRSxpQkFBaUJDLE9BQ25CRCxFQUFFLGNBQWNrQixPQUVoQkssUUFBUXZCLEVBQUUsaUJBQWlCVSxLQUFLLFlBQWFWLEVBQUUsaUJBQWlCVSxLQUFLLG9CQUk3RSxRQUFTYSxTQUFRQyxFQUFVQyxHQUN2QnpCLEVBQUUwQixNQUNFQyxTQUFZLE9BQ1pDLEtBQVEsT0FDUkMsSUFBS3hCLEVBQUV5QixJQUFJQyxRQUFVLGdDQUNyQnJCLE1BQVNzQixPQUFRLGtCQUFtQlIsU0FBVUEsRUFBVUMsZUFBZ0JBLEVBQWdCUSxRQUFTNUIsRUFBRXlCLElBQUlHLFNBQ3ZHQyxRQUFTLFNBQVN4QixHQUNWVixFQUFFVyxVQUNGWCxFQUFFVyxTQUFTVCxRQUVmRixFQUFFLG9CQUFvQkMsT0FDdEJrQyxPQUFPQyxTQUFTcEIsS0FBT1gsRUFBRXlCLElBQUlDLFFBQVUsb0NBQW9DckIsRUFBSzJCLEdBQUcsZUFFdkZDLE1BQU8sU0FBU0EsR0FDWixHQUFJNUIsR0FBTzRCLEVBQU1DLFlBQ2J2QyxHQUFFVyxVQUNGWCxFQUFFVyxTQUFTVCxRQUVmRixFQUFFLG9CQUFvQkMsT0FDdEJELEVBQUUsdUJBQ0d3QyxRQUFRLHlEQUEyRDlCLEVBQUs0QixNQUFRLElBQU01QixFQUFLK0IsUUFBVSxVQUd0Ry9CLEVBQUtnQyxlQUFlLFdBQ3BCQyxRQUFRTCxNQUFNNUIsRUFBSytCLFNBQ25CRSxRQUFRTCxNQUFNTSxLQUFLQyxVQUFVbkMsRUFBS29DLE1BQU8sS0FBTSxRQTVGL0Q5QyxFQUFFK0MsVUFBVUMsTUFBTSxXQUdkaEQsRUFBRTBCLE1BQ0VDLFNBQVksT0FDWkMsS0FBUSxPQUNSQyxJQUFPeEIsRUFBRXlCLElBQUlDLFFBQVUsZ0NBQ3ZCckIsTUFDSXNCLE9BQVEsaUJBQ1JQLGVBQWdCekIsRUFBRSxpQkFBaUJVLEtBQUssa0JBQ3hDdUIsUUFBUzVCLEVBQUV5QixJQUFJRyxTQUVuQkMsUUFBVyxTQUFTeEIsR0FDWkEsRUFBS3VDLFlBQWEsRUFDbEJkLE9BQU9DLFNBQVNwQixLQUFPWCxFQUFFeUIsSUFBSUMsUUFBVSxvQ0FBb0NyQixFQUFLd0MsTUFFaEZ6Qyx3QkFFQVQsRUFBRSxxQkFBcUJtQixNQUFNbkIsRUFBRW9CLE1BQU10QixZQUFhLEtBQU1FLEVBQUVXLGlCQU0xRVgsRUFBRSxpQkFBaUJtRCxHQUFHLFFBQVMsV0FDM0JuRCxFQUFFLGlCQUFpQkMsT0FDbkJELEVBQUUsY0FBY2tCLE9BQ2hCSyxRQUFRdkIsRUFBRW9ELE1BQU0xQyxLQUFLLFlBQWFWLEVBQUVvRCxNQUFNMUMsS0FBSyIsImZpbGUiOiJ0dXJuaXRpbnRvb2x0d29fbWlncmF0aW9uX3Rvb2wubWluLmpzIiwic291cmNlc0NvbnRlbnQiOlsiJChkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24oKXtcblxuICAgIC8vIENoZWNrIHdoZXRoZXIgdGhpcyBhc3NpZ25tZW50IGhhcyBiZWVuIG1pZ3JhdGVkIGluIHRoaXMgc2Vzc2lvbiBhbmQgcmVkaXJlY3QgaWYgc28uXG4gICAgJC5hamF4KHtcbiAgICAgICAgXCJkYXRhVHlwZVwiOiAnanNvbicsXG4gICAgICAgIFwidHlwZVwiOiBcIlBPU1RcIixcbiAgICAgICAgXCJ1cmxcIjogTS5jZmcud3d3cm9vdCArIFwiL21vZC90dXJuaXRpbnRvb2x0d28vYWpheC5waHBcIixcbiAgICAgICAgXCJkYXRhXCI6IHtcbiAgICAgICAgICAgIGFjdGlvbjogXCJjaGVja19taWdyYXRlZFwiLFxuICAgICAgICAgICAgdHVybml0aW50b29saWQ6ICQoXCIjbWlncmF0ZV90eXBlXCIpLmRhdGEoXCJ0dXJuaXRpbnRvb2xpZFwiKSxcbiAgICAgICAgICAgIHNlc3NrZXk6IE0uY2ZnLnNlc3NrZXlcbiAgICAgICAgfSxcbiAgICAgICAgXCJzdWNjZXNzXCI6IGZ1bmN0aW9uKGRhdGEpIHtcbiAgICAgICAgICAgIGlmIChkYXRhLm1pZ3JhdGVkID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSBNLmNmZy53d3dyb290ICsgXCIvbW9kL3R1cm5pdGludG9vbHR3by92aWV3LnBocD9pZD1cIitkYXRhLnYyaWQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGRpc3BsYXlNaWdyYXRpb25Nb2RhbCgpO1xuXG4gICAgICAgICAgICAgICAgJCgnLmRvbnRtaWdyYXRlX2xpbmsnKS5jbGljaygkLnByb3h5KGRvbnRtaWdyYXRlLCBudWxsLCAkLmNvbG9yYm94KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcbn0pO1xuXG4kKCcubWlncmF0ZV9saW5rJykub24oJ2NsaWNrJywgZnVuY3Rpb24oKSB7XG4gICAgJCgnI2Fza3RvbWlncmF0ZScpLmhpZGUoKTtcbiAgICAkKCcjbWlncmF0aW5nJykuc2hvdygpO1xuICAgIG1pZ3JhdGUoJCh0aGlzKS5kYXRhKFwiY291cnNlaWRcIiksICQodGhpcykuZGF0YShcInR1cm5pdGludG9vbGlkXCIpKTtcbn0pO1xuXG5mdW5jdGlvbiBkb250bWlncmF0ZShjYikge1xuICAgICQoJyNtaWdyYXRpb25fYWxlcnQnKS5oaWRlKCk7XG4gICAgY2IuY2xvc2UoKTtcbn1cblxuZnVuY3Rpb24gbGlnaHRCb3hDbG9zZUJ1dHRvbihjYikge1xuICAgICQoJ2JvZHknKS5hcHBlbmQoJzxkaXYgaWQ9XCJ0aWlfY2xvc2VfYmFyXCI+PGEgY2xhc3M9XCJ0aWlfY2xvc2VfbGlua1wiIGhyZWY9XCIjXCI+JyArIE0uc3RyLnR1cm5pdGludG9vbHR3by5jbG9zZWJ1dHRvbiArICc8L2E+PC9kaXY+Jyk7XG59XG5cblxuZnVuY3Rpb24gZGlzcGxheU1pZ3JhdGlvbk1vZGFsKCkge1xuICAgIC8vIE9ubHkgZGlzcGxheSB0aGUgbW9kYWwgZHVyaW5nIGEgbWFudWFsIG1pZ3JhdGlvbi5cbiAgICBpZiAoJCgnI21pZ3JhdGVfdHlwZScpLmRhdGEoXCJ0dXJuaXRpbnRvb2xpZFwiKSAhPSAkKFwiI21pZ3JhdGVfdHlwZVwiKS5kYXRhKFwibGFzdGFza2VkXCIpKSB7XG4gICAgICAgICQuY29sb3Jib3goe3dpZHRoOiA1NTAsIGhlaWdodDogNjAwLCBpbmxpbmU6dHJ1ZSwgb3BhY2l0eTogXCIwLjdcIiwgaHJlZjpcIiNtaWdyYXRpb25fYWxlcnRcIixcbiAgICAgICAgICAgIG9uTG9hZDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgJCgnI2Fza3RvbWlncmF0ZScpLnNob3coKTtcbiAgICAgICAgICAgICAgICBsaWdodEJveENsb3NlQnV0dG9uKCk7XG5cbiAgICAgICAgICAgICAgICAkKCcudGlpX2Nsb3NlX2xpbmsnKS5jbGljaygkLnByb3h5KGRvbnRtaWdyYXRlLCBudWxsLCAkLmNvbG9yYm94KSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgb25DbGVhbnVwOmZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICQoJyN0aWlfY2xvc2VfYmFyJykucmVtb3ZlKCk7XG4gICAgICAgICAgICAgICAgJCgnI21pZ3JhdGlvbl9hbGVydCcpLmhpZGUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgJCgnI21pZ3JhdGlvbl9hbGVydCcpLnNob3coKTtcbiAgICB9XG5cbiAgICBpZiAoJCgnI21pZ3JhdGVfdHlwZScpLmRhdGEoXCJtaWdyYXRldHlwZVwiKSA9PSAyKSB7XG4gICAgICAgICQoJyNhc2t0b21pZ3JhdGUnKS5oaWRlKCk7XG4gICAgICAgICQoJyNtaWdyYXRpbmcnKS5zaG93KCk7XG5cbiAgICAgICAgbWlncmF0ZSgkKFwiI21pZ3JhdGVfdHlwZVwiKS5kYXRhKFwiY291cnNlaWRcIiksICQoXCIjbWlncmF0ZV90eXBlXCIpLmRhdGEoXCJ0dXJuaXRpbnRvb2xpZFwiKSk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBtaWdyYXRlKGNvdXJzZWlkLCB0dXJuaXRpbnRvb2xpZCkge1xuICAgICQuYWpheCh7XG4gICAgICAgIFwiZGF0YVR5cGVcIjogJ2pzb24nLFxuICAgICAgICBcInR5cGVcIjogXCJQT1NUXCIsXG4gICAgICAgIHVybDogTS5jZmcud3d3cm9vdCArIFwiL21vZC90dXJuaXRpbnRvb2x0d28vYWpheC5waHBcIixcbiAgICAgICAgXCJkYXRhXCI6IHthY3Rpb246IFwiYmVnaW5fbWlncmF0aW9uXCIsIGNvdXJzZWlkOiBjb3Vyc2VpZCwgdHVybml0aW50b29saWQ6IHR1cm5pdGludG9vbGlkLCBzZXNza2V5OiBNLmNmZy5zZXNza2V5fSxcbiAgICAgICAgc3VjY2VzczogZnVuY3Rpb24oZGF0YSkge1xuICAgICAgICAgICAgaWYgKCQuY29sb3Jib3gpIHtcbiAgICAgICAgICAgICAgICAkLmNvbG9yYm94LmNsb3NlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAkKCcjbWlncmF0aW9uX2FsZXJ0JykuaGlkZSgpO1xuICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSBNLmNmZy53d3dyb290ICsgXCIvbW9kL3R1cm5pdGludG9vbHR3by92aWV3LnBocD9pZD1cIitkYXRhLmlkK1wiJm1pZ3JhdGVkPTFcIjtcbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3I6IGZ1bmN0aW9uKGVycm9yKSB7XG4gICAgICAgICAgICB2YXIgZGF0YSA9IGVycm9yLnJlc3BvbnNlSlNPTjtcbiAgICAgICAgICAgIGlmICgkLmNvbG9yYm94KSB7XG4gICAgICAgICAgICAgICAgJC5jb2xvcmJveC5jbG9zZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgJCgnI21pZ3JhdGlvbl9hbGVydCcpLmhpZGUoKTtcbiAgICAgICAgICAgICQoJyN0dXJuaXRpbnRvb2xfc3R5bGUnKVxuICAgICAgICAgICAgICAgIC5wcmVwZW5kKCc8ZGl2IGlkPVwiZnVsbC1lcnJvclwiIGNsYXNzPVwiYm94IGdlbmVyYWxib3ggbm90aWNlYm94XCI+JyArIGRhdGEuZXJyb3IgKyAnICcgKyBkYXRhLm1lc3NhZ2UgKyAnPC9kaXY+Jyk7XG5cbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHdlIGhhdmUgYSBzdGFjayB0cmFjZSBpbmNsdWRlZC5cbiAgICAgICAgICAgIGlmIChkYXRhLmhhc093blByb3BlcnR5KCd0cmFjZScpKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihkYXRhLm1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoSlNPTi5zdHJpbmdpZnkoZGF0YS50cmFjZSwgbnVsbCwgNCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG59XG4iXX0= +function dontmigrate(o){$("#migration_alert").hide(),o.close()}function lightBoxCloseButton(o){$("body").append('")}function displayMigrationModal(){$("#migrate_type").data("turnitintoolid")!=$("#migrate_type").data("lastasked")&&($.colorbox({width:550,height:600,inline:!0,opacity:"0.7",href:"#migration_alert",onLoad:function(){$("#asktomigrate").show(),lightBoxCloseButton(),$(".tii_close_link").click($.proxy(dontmigrate,null,$.colorbox))},onCleanup:function(){$("#tii_close_bar").remove(),$("#migration_alert").hide()}}),$("#migration_alert").show()),2==$("#migrate_type").data("migratetype")&&($("#asktomigrate").hide(),$("#migrating").show(),migrate($("#migrate_type").data("courseid"),$("#migrate_type").data("turnitintoolid")))}function migrate(o,t){$.ajax({dataType:"json",type:"POST",url:M.cfg.wwwroot+"/mod/turnitintooltwo/ajax.php",data:{action:"begin_migration",courseid:o,turnitintoolid:t,sesskey:M.cfg.sesskey},success:function(o){$.colorbox&&$.colorbox.close(),$("#migration_alert").hide();var t="gradebookerror"===o.gradebook?2:1;window.location.href=M.cfg.wwwroot+"/mod/turnitintooltwo/view.php?id="+o.id+"&migrated="+t},error:function(o){var t=o.responseJSON;$.colorbox&&$.colorbox.close(),$("#migration_alert").hide(),$("#turnitintool_style").prepend('
'+t.error+" "+t.message+"
"),t.hasOwnProperty("trace")&&(console.error(t.message),console.error(JSON.stringify(t.trace,null,4)))}})}$(document).ready(function(){$.ajax({dataType:"json",type:"POST",url:M.cfg.wwwroot+"/mod/turnitintooltwo/ajax.php",data:{action:"check_migrated",turnitintoolid:$("#migrate_type").data("turnitintoolid"),sesskey:M.cfg.sesskey},success:function(o){o.migrated===!0?window.location.href=M.cfg.wwwroot+"/mod/turnitintooltwo/view.php?id="+o.v2id:(displayMigrationModal(),$(".dontmigrate_link").click($.proxy(dontmigrate,null,$.colorbox)))}})}),$(".migrate_link").on("click",function(){$("#asktomigrate").hide(),$("#migrating").show(),migrate($(this).data("courseid"),$(this).data("turnitintoolid"))}); +//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInR1cm5pdGludG9vbHR3b19taWdyYXRpb25fdG9vbC5qcyJdLCJuYW1lcyI6WyJkb250bWlncmF0ZSIsImNiIiwiJCIsImhpZGUiLCJjbG9zZSIsImxpZ2h0Qm94Q2xvc2VCdXR0b24iLCJhcHBlbmQiLCJNIiwic3RyIiwidHVybml0aW50b29sdHdvIiwiY2xvc2VidXR0b24iLCJkaXNwbGF5TWlncmF0aW9uTW9kYWwiLCJkYXRhIiwiY29sb3Jib3giLCJ3aWR0aCIsImhlaWdodCIsImlubGluZSIsIm9wYWNpdHkiLCJocmVmIiwib25Mb2FkIiwic2hvdyIsImNsaWNrIiwicHJveHkiLCJvbkNsZWFudXAiLCJyZW1vdmUiLCJtaWdyYXRlIiwiY291cnNlaWQiLCJ0dXJuaXRpbnRvb2xpZCIsImFqYXgiLCJkYXRhVHlwZSIsInR5cGUiLCJ1cmwiLCJjZmciLCJ3d3dyb290IiwiYWN0aW9uIiwic2Vzc2tleSIsInN1Y2Nlc3MiLCJtaWdyYXRlZCIsImdyYWRlYm9vayIsIndpbmRvdyIsImxvY2F0aW9uIiwiaWQiLCJlcnJvciIsInJlc3BvbnNlSlNPTiIsInByZXBlbmQiLCJtZXNzYWdlIiwiaGFzT3duUHJvcGVydHkiLCJjb25zb2xlIiwiSlNPTiIsInN0cmluZ2lmeSIsInRyYWNlIiwiZG9jdW1lbnQiLCJyZWFkeSIsInYyaWQiLCJvbiIsInRoaXMiXSwibWFwcGluZ3MiOiJBQThCQSxRQUFTQSxhQUFZQyxHQUNqQkMsRUFBRSxvQkFBb0JDLE9BQ3RCRixFQUFHRyxRQUdQLFFBQVNDLHFCQUFvQkosR0FDekJDLEVBQUUsUUFBUUksT0FBTyw4REFBZ0VDLEVBQUVDLElBQUlDLGdCQUFnQkMsWUFBYyxjQUl6SCxRQUFTQyx5QkFFRFQsRUFBRSxpQkFBaUJVLEtBQUssbUJBQXFCVixFQUFFLGlCQUFpQlUsS0FBSyxlQUNyRVYsRUFBRVcsVUFBVUMsTUFBTyxJQUFLQyxPQUFRLElBQUtDLFFBQU8sRUFBTUMsUUFBUyxNQUFPQyxLQUFLLG1CQUNuRUMsT0FBUSxXQUNKakIsRUFBRSxpQkFBaUJrQixPQUNuQmYsc0JBRUFILEVBQUUsbUJBQW1CbUIsTUFBTW5CLEVBQUVvQixNQUFNdEIsWUFBYSxLQUFNRSxFQUFFVyxZQUU1RFUsVUFBVSxXQUNOckIsRUFBRSxrQkFBa0JzQixTQUNwQnRCLEVBQUUsb0JBQW9CQyxVQUk5QkQsRUFBRSxvQkFBb0JrQixRQUdvQixHQUExQ2xCLEVBQUUsaUJBQWlCVSxLQUFLLGlCQUN4QlYsRUFBRSxpQkFBaUJDLE9BQ25CRCxFQUFFLGNBQWNrQixPQUVoQkssUUFBUXZCLEVBQUUsaUJBQWlCVSxLQUFLLFlBQWFWLEVBQUUsaUJBQWlCVSxLQUFLLG9CQUk3RSxRQUFTYSxTQUFRQyxFQUFVQyxHQUN2QnpCLEVBQUUwQixNQUNFQyxTQUFZLE9BQ1pDLEtBQVEsT0FDUkMsSUFBS3hCLEVBQUV5QixJQUFJQyxRQUFVLGdDQUNyQnJCLE1BQVNzQixPQUFRLGtCQUFtQlIsU0FBVUEsRUFBVUMsZUFBZ0JBLEVBQWdCUSxRQUFTNUIsRUFBRXlCLElBQUlHLFNBQ3ZHQyxRQUFTLFNBQVN4QixHQUNWVixFQUFFVyxVQUNGWCxFQUFFVyxTQUFTVCxRQUVmRixFQUFFLG9CQUFvQkMsTUFFdEIsSUFBSWtDLEdBQStCLG1CQUFuQnpCLEVBQUswQixVQUFrQyxFQUFJLENBQzNEQyxRQUFPQyxTQUFTdEIsS0FBT1gsRUFBRXlCLElBQUlDLFFBQVUsb0NBQW9DckIsRUFBSzZCLEdBQUcsYUFBYUosR0FFcEdLLE1BQU8sU0FBU0EsR0FDWixHQUFJOUIsR0FBTzhCLEVBQU1DLFlBQ2J6QyxHQUFFVyxVQUNGWCxFQUFFVyxTQUFTVCxRQUVmRixFQUFFLG9CQUFvQkMsT0FDdEJELEVBQUUsdUJBQ0cwQyxRQUFRLHlEQUEyRGhDLEVBQUs4QixNQUFRLElBQU05QixFQUFLaUMsUUFBVSxVQUd0R2pDLEVBQUtrQyxlQUFlLFdBQ3BCQyxRQUFRTCxNQUFNOUIsRUFBS2lDLFNBQ25CRSxRQUFRTCxNQUFNTSxLQUFLQyxVQUFVckMsRUFBS3NDLE1BQU8sS0FBTSxRQTlGL0RoRCxFQUFFaUQsVUFBVUMsTUFBTSxXQUdkbEQsRUFBRTBCLE1BQ0VDLFNBQVksT0FDWkMsS0FBUSxPQUNSQyxJQUFPeEIsRUFBRXlCLElBQUlDLFFBQVUsZ0NBQ3ZCckIsTUFDSXNCLE9BQVEsaUJBQ1JQLGVBQWdCekIsRUFBRSxpQkFBaUJVLEtBQUssa0JBQ3hDdUIsUUFBUzVCLEVBQUV5QixJQUFJRyxTQUVuQkMsUUFBVyxTQUFTeEIsR0FDWkEsRUFBS3lCLFlBQWEsRUFDbEJFLE9BQU9DLFNBQVN0QixLQUFPWCxFQUFFeUIsSUFBSUMsUUFBVSxvQ0FBb0NyQixFQUFLeUMsTUFFaEYxQyx3QkFFQVQsRUFBRSxxQkFBcUJtQixNQUFNbkIsRUFBRW9CLE1BQU10QixZQUFhLEtBQU1FLEVBQUVXLGlCQU0xRVgsRUFBRSxpQkFBaUJvRCxHQUFHLFFBQVMsV0FDM0JwRCxFQUFFLGlCQUFpQkMsT0FDbkJELEVBQUUsY0FBY2tCLE9BQ2hCSyxRQUFRdkIsRUFBRXFELE1BQU0zQyxLQUFLLFlBQWFWLEVBQUVxRCxNQUFNM0MsS0FBSyIsImZpbGUiOiJ0dXJuaXRpbnRvb2x0d29fbWlncmF0aW9uX3Rvb2wubWluLmpzIiwic291cmNlc0NvbnRlbnQiOlsiJChkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24oKXtcblxuICAgIC8vIENoZWNrIHdoZXRoZXIgdGhpcyBhc3NpZ25tZW50IGhhcyBiZWVuIG1pZ3JhdGVkIGluIHRoaXMgc2Vzc2lvbiBhbmQgcmVkaXJlY3QgaWYgc28uXG4gICAgJC5hamF4KHtcbiAgICAgICAgXCJkYXRhVHlwZVwiOiAnanNvbicsXG4gICAgICAgIFwidHlwZVwiOiBcIlBPU1RcIixcbiAgICAgICAgXCJ1cmxcIjogTS5jZmcud3d3cm9vdCArIFwiL21vZC90dXJuaXRpbnRvb2x0d28vYWpheC5waHBcIixcbiAgICAgICAgXCJkYXRhXCI6IHtcbiAgICAgICAgICAgIGFjdGlvbjogXCJjaGVja19taWdyYXRlZFwiLFxuICAgICAgICAgICAgdHVybml0aW50b29saWQ6ICQoXCIjbWlncmF0ZV90eXBlXCIpLmRhdGEoXCJ0dXJuaXRpbnRvb2xpZFwiKSxcbiAgICAgICAgICAgIHNlc3NrZXk6IE0uY2ZnLnNlc3NrZXlcbiAgICAgICAgfSxcbiAgICAgICAgXCJzdWNjZXNzXCI6IGZ1bmN0aW9uKGRhdGEpIHtcbiAgICAgICAgICAgIGlmIChkYXRhLm1pZ3JhdGVkID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSBNLmNmZy53d3dyb290ICsgXCIvbW9kL3R1cm5pdGludG9vbHR3by92aWV3LnBocD9pZD1cIitkYXRhLnYyaWQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGRpc3BsYXlNaWdyYXRpb25Nb2RhbCgpO1xuXG4gICAgICAgICAgICAgICAgJCgnLmRvbnRtaWdyYXRlX2xpbmsnKS5jbGljaygkLnByb3h5KGRvbnRtaWdyYXRlLCBudWxsLCAkLmNvbG9yYm94KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcbn0pO1xuXG4kKCcubWlncmF0ZV9saW5rJykub24oJ2NsaWNrJywgZnVuY3Rpb24oKSB7XG4gICAgJCgnI2Fza3RvbWlncmF0ZScpLmhpZGUoKTtcbiAgICAkKCcjbWlncmF0aW5nJykuc2hvdygpO1xuICAgIG1pZ3JhdGUoJCh0aGlzKS5kYXRhKFwiY291cnNlaWRcIiksICQodGhpcykuZGF0YShcInR1cm5pdGludG9vbGlkXCIpKTtcbn0pO1xuXG5mdW5jdGlvbiBkb250bWlncmF0ZShjYikge1xuICAgICQoJyNtaWdyYXRpb25fYWxlcnQnKS5oaWRlKCk7XG4gICAgY2IuY2xvc2UoKTtcbn1cblxuZnVuY3Rpb24gbGlnaHRCb3hDbG9zZUJ1dHRvbihjYikge1xuICAgICQoJ2JvZHknKS5hcHBlbmQoJzxkaXYgaWQ9XCJ0aWlfY2xvc2VfYmFyXCI+PGEgY2xhc3M9XCJ0aWlfY2xvc2VfbGlua1wiIGhyZWY9XCIjXCI+JyArIE0uc3RyLnR1cm5pdGludG9vbHR3by5jbG9zZWJ1dHRvbiArICc8L2E+PC9kaXY+Jyk7XG59XG5cblxuZnVuY3Rpb24gZGlzcGxheU1pZ3JhdGlvbk1vZGFsKCkge1xuICAgIC8vIE9ubHkgZGlzcGxheSB0aGUgbW9kYWwgZHVyaW5nIGEgbWFudWFsIG1pZ3JhdGlvbi5cbiAgICBpZiAoJCgnI21pZ3JhdGVfdHlwZScpLmRhdGEoXCJ0dXJuaXRpbnRvb2xpZFwiKSAhPSAkKFwiI21pZ3JhdGVfdHlwZVwiKS5kYXRhKFwibGFzdGFza2VkXCIpKSB7XG4gICAgICAgICQuY29sb3Jib3goe3dpZHRoOiA1NTAsIGhlaWdodDogNjAwLCBpbmxpbmU6dHJ1ZSwgb3BhY2l0eTogXCIwLjdcIiwgaHJlZjpcIiNtaWdyYXRpb25fYWxlcnRcIixcbiAgICAgICAgICAgIG9uTG9hZDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgJCgnI2Fza3RvbWlncmF0ZScpLnNob3coKTtcbiAgICAgICAgICAgICAgICBsaWdodEJveENsb3NlQnV0dG9uKCk7XG5cbiAgICAgICAgICAgICAgICAkKCcudGlpX2Nsb3NlX2xpbmsnKS5jbGljaygkLnByb3h5KGRvbnRtaWdyYXRlLCBudWxsLCAkLmNvbG9yYm94KSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgb25DbGVhbnVwOmZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICQoJyN0aWlfY2xvc2VfYmFyJykucmVtb3ZlKCk7XG4gICAgICAgICAgICAgICAgJCgnI21pZ3JhdGlvbl9hbGVydCcpLmhpZGUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgJCgnI21pZ3JhdGlvbl9hbGVydCcpLnNob3coKTtcbiAgICB9XG5cbiAgICBpZiAoJCgnI21pZ3JhdGVfdHlwZScpLmRhdGEoXCJtaWdyYXRldHlwZVwiKSA9PSAyKSB7XG4gICAgICAgICQoJyNhc2t0b21pZ3JhdGUnKS5oaWRlKCk7XG4gICAgICAgICQoJyNtaWdyYXRpbmcnKS5zaG93KCk7XG5cbiAgICAgICAgbWlncmF0ZSgkKFwiI21pZ3JhdGVfdHlwZVwiKS5kYXRhKFwiY291cnNlaWRcIiksICQoXCIjbWlncmF0ZV90eXBlXCIpLmRhdGEoXCJ0dXJuaXRpbnRvb2xpZFwiKSk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBtaWdyYXRlKGNvdXJzZWlkLCB0dXJuaXRpbnRvb2xpZCkge1xuICAgICQuYWpheCh7XG4gICAgICAgIFwiZGF0YVR5cGVcIjogJ2pzb24nLFxuICAgICAgICBcInR5cGVcIjogXCJQT1NUXCIsXG4gICAgICAgIHVybDogTS5jZmcud3d3cm9vdCArIFwiL21vZC90dXJuaXRpbnRvb2x0d28vYWpheC5waHBcIixcbiAgICAgICAgXCJkYXRhXCI6IHthY3Rpb246IFwiYmVnaW5fbWlncmF0aW9uXCIsIGNvdXJzZWlkOiBjb3Vyc2VpZCwgdHVybml0aW50b29saWQ6IHR1cm5pdGludG9vbGlkLCBzZXNza2V5OiBNLmNmZy5zZXNza2V5fSxcbiAgICAgICAgc3VjY2VzczogZnVuY3Rpb24oZGF0YSkge1xuICAgICAgICAgICAgaWYgKCQuY29sb3Jib3gpIHtcbiAgICAgICAgICAgICAgICAkLmNvbG9yYm94LmNsb3NlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAkKCcjbWlncmF0aW9uX2FsZXJ0JykuaGlkZSgpO1xuXG4gICAgICAgICAgICB2YXIgbWlncmF0ZWQgPSAoZGF0YS5ncmFkZWJvb2sgPT09IFwiZ3JhZGVib29rZXJyb3JcIikgPyAyIDogMTtcbiAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gTS5jZmcud3d3cm9vdCArIFwiL21vZC90dXJuaXRpbnRvb2x0d28vdmlldy5waHA/aWQ9XCIrZGF0YS5pZCtcIiZtaWdyYXRlZD1cIittaWdyYXRlZDtcbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3I6IGZ1bmN0aW9uKGVycm9yKSB7XG4gICAgICAgICAgICB2YXIgZGF0YSA9IGVycm9yLnJlc3BvbnNlSlNPTjtcbiAgICAgICAgICAgIGlmICgkLmNvbG9yYm94KSB7XG4gICAgICAgICAgICAgICAgJC5jb2xvcmJveC5jbG9zZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgJCgnI21pZ3JhdGlvbl9hbGVydCcpLmhpZGUoKTtcbiAgICAgICAgICAgICQoJyN0dXJuaXRpbnRvb2xfc3R5bGUnKVxuICAgICAgICAgICAgICAgIC5wcmVwZW5kKCc8ZGl2IGlkPVwiZnVsbC1lcnJvclwiIGNsYXNzPVwiYm94IGdlbmVyYWxib3ggbm90aWNlYm94XCI+JyArIGRhdGEuZXJyb3IgKyAnICcgKyBkYXRhLm1lc3NhZ2UgKyAnPC9kaXY+Jyk7XG5cbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHdlIGhhdmUgYSBzdGFjayB0cmFjZSBpbmNsdWRlZC5cbiAgICAgICAgICAgIGlmIChkYXRhLmhhc093blByb3BlcnR5KCd0cmFjZScpKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihkYXRhLm1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoSlNPTi5zdHJpbmdpZnkoZGF0YS50cmFjZSwgbnVsbCwgNCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG59XG4iXX0= diff --git a/lang/en/turnitintooltwo.php b/lang/en/turnitintooltwo.php index 3a5817e7..995646b4 100755 --- a/lang/en/turnitintooltwo.php +++ b/lang/en/turnitintooltwo.php @@ -588,7 +588,7 @@ $string['migrationredirect'] = 'You will be redirected to the Moodle Direct V2 assignment upon completion.'; $string['migration_event_name'] = 'Migrate V1 Assignment To V2'; $string['migration_event_desc'] = 'Turnitin Tool V1 Course: {$a->v1_name} ({$a->v1_cm_id}) has been migrated to Turnitin V2 ({$a->v2_cm_id}).'; -$string['migratiojntoolv1list'] = 'Below is a list of V1 assignments which have not yet been migrated.'; +$string['migrationtoolv1list'] = 'Below is a list of V1 assignments which have not yet been migrated.'; $string['complete'] = 'complete'; $string['assignments'] = 'assignments'; $string['migrationtoolerror'] = 'The migration of this assignment has failed. Please try again.'; @@ -647,3 +647,5 @@ $string['renew_assignment_dates_help'] = 'Select this option to use new assignment dates when resetting a course. The assignment start date will be set to the date and time of the course reset, while the due and post date will elapse seven days from now.

If you’d rather not use new assignment dates, that’s fine; Turnitin will use the course’s original assignment dates instead. However, any anonymous marking settings will not be carried over for assignments where the post date has passed.'; $string['v1migrationearlyaccess'] = 'Early Access'; $string['reportgenspeed_resubmission'] = 'You have already submitted a paper to this assignment and a Similarity Report was generated for your submission. If you choose to resubmit your paper, your earlier submission will be replaced and a new report will be generated. After {$a->num_resubmissions} resubmissions, you will need to wait {$a->num_hours} hours after a resubmission to see a new Similarity Report.'; +$string['migrationtool:gradebookerror'] = 'Your assignment was migrated but the grades could not be confirmed in the gradebook so the V1 assignment has not been deleted.

Please check the grades in the gradebook and remove the V1 assignment once you are happy - leaving it may cause the grades to be counted in the total twice.'; +$string['migrationtool:successful'] = "Your assignment has been successfully migrated from Moodle Direct V1 to V2 and the V1 assignment has been removed."; \ No newline at end of file diff --git a/mod_form.php b/mod_form.php index 5c629bcf..968666d2 100755 --- a/mod_form.php +++ b/mod_form.php @@ -187,7 +187,7 @@ public function show_form($instructorrubrics, $sharedrubrics, $modulestring = '' if (isset($_SESSION["notice"])) { $notice = $_SESSION["notice"]; if (empty($_SESSION["notice"]["type"])) { - $notice["type"] = "general"; + $notice["type"] = "info"; } unset($_SESSION["notice"]); } else { diff --git a/sass/_variables.scss b/sass/_variables.scss index 64a15304..4fbf1e65 100644 --- a/sass/_variables.scss +++ b/sass/_variables.scss @@ -16,10 +16,6 @@ $border-color: $light-grey; $odd-color: $light-grey; $even-color: $white; -// Warning colours -$warning: $red; -$warning-border: darken($red, 20%); - // Table padding $table-padding: 15px; $table-head-padding: $table-padding - 5px; \ No newline at end of file diff --git a/sass/partials/_warnings.scss b/sass/partials/_warnings.scss deleted file mode 100644 index 00316397..00000000 --- a/sass/partials/_warnings.scss +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Warning styles - */ - -.tii_library_not_present_warning { - border: 1px solid $warning-border; - padding: 8px; - background: $warning; - width: 99%; - text-align:center; - display:block; - margin-bottom:6px; - color: white; -} - -.mod_turnitintooltwo { - - noscript.warning, - .library_not_present_warning, - .general_warning, - #error, - #full-error { - border: 1px solid $warning-border; - padding: 8px; - background: $warning; - width: 99%; - text-align:center; - display:block; - margin-bottom:6px; - color: white; - } - - #error { - margin-left:24px; - margin-right:24px; - width:96%; - } - - .submission_failure_msg, - .box_receipt { - padding: 16px; - } - - .submission_failure_msg .general_warning { - margin-top: 16px; - width: auto; - } - - #enrolling_error { - margin-top: 8px; - } - - .manual_submission_failure_msg { - margin-bottom: 12px; - } -} \ No newline at end of file diff --git a/sass/styles.scss b/sass/styles.scss index dea7cb2f..9dabb960 100644 --- a/sass/styles.scss +++ b/sass/styles.scss @@ -7,7 +7,6 @@ @import "partials/table"; @import "partials/part_details"; @import "partials/modal"; -@import "partials/warnings"; @import "partials/eula"; @import "partials/digital_receipt"; @import "partials/inbox"; diff --git a/styles.css b/styles.css index be8ea2ec..9a3c80b2 100644 --- a/styles.css +++ b/styles.css @@ -1,2 +1,2 @@ -.listbar,.listbar .messages_inbox .smallicon{vertical-align:middle}.dropdown-menu,.mod_turnitintooltwo .nowrap{white-space:nowrap}.clearfix:after{content:".";visibility:hidden;display:block;height:0;clear:both}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.listbar,.listbar input,.listbar select{border:1px solid #EFEFEF;background:#fff}h3.main{line-height:40px}.mod_turnitintooltwo .fitem_fbutton{padding-top:12px}.listbar,.mod_turnitintooltwo #assignmentBrowserTable_wrapper{padding:10px}.mod_turnitintooltwo span.dimmed{color:#999}.mod_turnitintooltwo .italic{font-style:italic}.mod_turnitintooltwo .underline{text-decoration:underline}#courseBrowserTable a,#ppErrors a,#tii_close_bar a,.listbar .messages_inbox,.submissionsDataTable a{text-decoration:none}.mod_turnitintooltwo #or_container,.mod_turnitintooltwo .bold{font-weight:700}.mod_turnitintooltwo span.link{color:#00F}.listbar-container{display:table;width:100%}.listbar{position:relative;display:table-cell}.listbar input,.listbar label,.listbar select{margin:0}.listbar input,.listbar select{height:30px;padding:0 5px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.listbar .nonsubmitters_link,.listbar .refresh_link,.listbar .refreshing_link{float:right;margin-left:30px;padding:5px 0;width:195px}.listbar .nonsubmitters_link{text-decoration:none;display:none}.listbar .messages_inbox{float:right;margin-left:30px;padding:5px 0}.listbar .messages_loading_span{float:none!important;margin:0!important}.listbar .zip_downloads{float:left;position:relative;top:4px;height:22px}.listbar .zip_downloads img{position:relative;top:4px;left:-2px}.listbar .zip_downloads a.gmpdfzip_box,.listbar .zip_downloads div.origchecked_zip_open{padding:3px 16px;display:block}.listbar .zip_downloads a.gmpdfzip_box:hover{background:#00699e;color:#fff}.listbar .zip_downloads .zip_open{display:inline}.listbar .dataTables_filter{float:right!important;text-align:left!important}.listbar .dataTables_length{float:left!important}#courseBrowserTable,#ppErrors,.submissionsDataTable{font-size:13px;border:1px solid #EFEFEF;width:100%!important;margin-top:6px!important}#courseBrowserTable .ccheckbox,#ppErrors .ccheckbox,.submissionsDataTable .ccheckbox{text-align:center;padding:8px 10px 2px!important}#courseBrowserTable .odd,#ppErrors .odd,.submissionsDataTable .odd{background:#EFEFEF!important}#courseBrowserTable .odd .sorting_1,#ppErrors .odd .sorting_1,.submissionsDataTable .odd .sorting_1{background:#e7e7e7!important}#courseBrowserTable .even,#ppErrors .even,.submissionsDataTable .even{background:#fff!important}#courseBrowserTable .even .sorting_1,#ppErrors .even .sorting_1,.submissionsDataTable .even .sorting_1{background:#fafafa!important}#courseBrowserTable thead th,#ppErrors thead th,.submissionsDataTable thead th{border-bottom:0!important}#courseBrowserTable th,#ppErrors th,.submissionsDataTable th{padding:10px 20px!important}#courseBrowserTable td,#ppErrors td,.submissionsDataTable td{padding:15px 10px!important;font-size:13px;vertical-align:top}#courseBrowserTable .sorting_disabled,#ppErrors .sorting_disabled,.submissionsDataTable .sorting_disabled{cursor:default}#courseBrowserTable .left,#ppErrors .left,.submissionsDataTable .left{text-align:left}#courseBrowserTable .right,#ppErrors .right,.submissionsDataTable .right{text-align:right}#tii_close_bar a,.partDetails td.data,.partDetails td.export_data,.partDetails td.rubric_qm{text-align:center}#courseBrowserTable .grademark_grade,#courseBrowserTable .grademark_open,#courseBrowserTable .origreport_score,#ppErrors .grademark_grade,#ppErrors .grademark_open,#ppErrors .origreport_score,.submissionsDataTable .grademark_grade,.submissionsDataTable .grademark_open,.submissionsDataTable .origreport_score{float:right}#courseBrowserTable .grademark_grade,#courseBrowserTable .origreport_score,#ppErrors .grademark_grade,#ppErrors .origreport_score,.submissionsDataTable .grademark_grade,.submissionsDataTable .origreport_score{padding-right:8px}#courseBrowserTable td.narrow,#courseBrowserTable th.narrow,#ppErrors td.narrow,#ppErrors th.narrow,.submissionsDataTable td.narrow,.submissionsDataTable th.narrow{width:60px}#courseBrowserTable .delete_paper,#courseBrowserTable .submission_title,#courseBrowserTable .submit_nothing,#ppErrors .delete_paper,#ppErrors .submission_title,#ppErrors .submit_nothing,.submissionsDataTable .delete_paper,.submissionsDataTable .submission_title,.submissionsDataTable .submit_nothing{cursor:pointer}#courseBrowserTable .score_colour,#ppErrors .score_colour,.submissionsDataTable .score_colour{width:36px;display:inline-block;float:right}#courseBrowserTable .late_submission,#ppErrors .late_submission,.submissionsDataTable .late_submission{color:#d31900}#courseBrowserTable #tii_digital_receipt_icon,#ppErrors #tii_digital_receipt_icon,.submissionsDataTable #tii_digital_receipt_icon{margin-top:-3px;margin-right:5px}.dataTables_paginate{margin-top:6px;font-size:12px;float:right}.dataTables_paginate a{display:inline-block;border:1px solid #EFEFEF;padding:2px 5px;background-position:left -2px}.dataTables_paginate .current{background:#EFEFEF}.dataTables_paginate .previous,.dataTables_paginate span a{border-right:0}.dataTables_info{float:left;clear:none;margin-top:8px;text-transform:uppercase;font-size:11px}.mod_turnitintooltwo .score_colour_{background:#999}.mod_turnitintooltwo .score_colour_0{background:#3552B7}.mod_turnitintooltwo .score_colour_10{background:#617B8D}.mod_turnitintooltwo .score_colour_20{background:#A1B556}.mod_turnitintooltwo .score_colour_30{background:#DAE235}.mod_turnitintooltwo .score_colour_40{background:#EDAC28}.mod_turnitintooltwo .score_colour_50{background:#EDD42F}.mod_turnitintooltwo .score_colour_60{background:#ECAD28}.mod_turnitintooltwo .score_colour_70{background:#E15A21}.mod_turnitintooltwo .score_colour_80{background:#E05A21}.mod_turnitintooltwo .score_colour_90{background:#DC4321}.mod_turnitintooltwo .score_colour_100{background:#DB4221}.mod_turnitintooltwo .enrol_link{padding:6px 18px 0 0}.partDetails{font-size:13px;margin-bottom:0;width:100%;border:1px solid #EFEFEF}.partDetails tr{border-right:1px solid #EFEFEF}.partDetails th{padding:6px 12px;border-bottom:1px solid #EFEFEF}.partDetails td{border:1px solid #EFEFEF;border-top:0;padding:12px 12px 4px}.partDetails td.export_data{padding-top:12px}.partDetails td.introduction_cell,.partDetails td.peermark_assignments_cell{padding:0;border:0}.partDetails td.peermarks{border:0}.partDetails .editable-click{border:none;position:relative;padding-right:24px}.partDetails .editable-click:before{position:absolute;font-family:FontAwesome;top:0;right:0;font-size:1.33333em!important;color:#A8A8A8!important;line-height:.75em;vertical-align:-15%;content:"\f040";display:inline-block;font-style:normal;font-weight:400;font-size-adjust:none;font-stretch:normal;font-feature-settings:normal;font-language-override:normal;font-kerning:auto;font-synthesis:weight style;font-variant:normal;text-rendering:auto;-moz-osx-font-smoothing:grayscale}.partDetails .editable-click:hover{border-bottom:0!important}.partDetails .introduction,.partDetails .peermark_instructions{padding:6px 10px;border-bottom:1px solid #EFEFEF;display:none}.partDetails .introduction h2{margin:8px 0}.partDetails .introduction p{margin:6px 0}.partDetails .row_export_orig,.partDetails .row_export_pdf,.partDetails .row_export_xls,.partDetails .row_quickmark_manager,.partDetails .row_rubric_manager,.partDetails .zip_open{display:inline}.partDetails .toggle_peermark_instructions img{display:block}.partDetails .toggle_peermark_instructions,.partDetails .toggle_peermarks,.partDetails .toggle_summary{cursor:pointer;float:left;position:relative;top:-3px;margin-right:8px}.partDetails .peermark_header{margin-bottom:8px;float:left}#turnitin_sync_all_grades{float:right;font-size:16px}.turnitin_sync_grades,.turnitin_syncing_grades{cursor:pointer;margin-bottom:20px}.turnitin_syncing_grades{display:none}.peermarkDetails{width:100%;border-top:1px solid #EFEFEF}.peermarkDetails td{padding:8px 12px;border-bottom-width:0}.peermarkDetails td.peermark_instructions_cell{border:0;padding:0}.quickmark_manager_launch{padding:2px 0 2px 30px;height:20px;color:#0070A8!important}.rubric_manager_launch,.rubric_view_launch{padding:4px 0;line-height:22px;color:#0070A8!important}.rubric_right_margin{margin-right:7px}.tii_peermark_manager_launch,.tii_peermark_reviews_launch{color:#090!important;padding:4px 0 4px 46px;height:22px}.mod_turnitintooltwo .peermark_loading_row{text-align:center;margin:0 auto 8px}.mod_turnitintooltwo #id_submissiontext{width:80%;height:320px}#colorbox{margin-top:60px;outline:0!important;overflow:visible!important}.cboxIframe{border-radius:5px}#cboxContent{margin-top:0!important}#tii_close_bar{position:fixed;z-index:9999;right:0;top:0;width:100%;height:45px;background:rgba(0,0,0,.3)}#tii_close_bar a{color:#fff;display:block;background:#000;width:100px;float:right;height:45px;line-height:43px}#page-admin-setting-modsettingturnitintooltwo .tii_upgrade_check,.turnitin_ula{text-decoration:underline;cursor:pointer}.mod_turnitintooltwo #error,.mod_turnitintooltwo #full-error,.mod_turnitintooltwo .general_warning,.mod_turnitintooltwo .library_not_present_warning,.mod_turnitintooltwo noscript.warning,.tii_library_not_present_warning{border:1px solid #702c2b;padding:8px;background:#B94A48;width:99%;text-align:center;display:block;margin-bottom:6px;color:#fff}.turnitin_ula,noscript.turnitin_ula_noscript{border:1px solid #C00;text-align:center;display:block}.mod_turnitintooltwo #error{margin-left:24px;margin-right:24px;width:96%}.mod_turnitintooltwo .box_receipt,.mod_turnitintooltwo .submission_failure_msg{padding:16px}.mod_turnitintooltwo .submission_failure_msg .general_warning{margin-top:16px;width:auto}.mod_turnitintooltwo #enrolling_error{margin-top:8px}.mod_turnitintooltwo .manual_submission_failure_msg{margin-bottom:12px}.turnitin_ula_text{padding-top:15px;text-align:center}.turnitin_ula input[type=submit]{margin:0}.turnitin_ula{padding:12px;color:red;margin-top:12px;margin-bottom:16px!important;font-size:14px;font-weight:700}noscript.turnitin_ula_noscript{padding:8px;background:#FFE9E8;width:99%;margin:16px 6px;line-height:28px}.ui-widget-content,.ui-widget-header{border:0!important}.turnitin_ula_warn{color:red}.tii_digital_receipt{display:inline-block;width:150px}#tii_digital_receipt_box{padding:20px;background:#fff}#tii_digital_receipt_box .generaltable{width:100%}#tii_digital_receipt_box .logo{display:block;margin:0 auto;width:214px;height:68px}#tii_digital_receipt_box #tii_receipt_print{text-align:right;display:block}#digital_receipt{margin:0}.mod_turnitintooltwo #upload_success{color:#C00}.ui-widget-header{background:#EFEFEF!important;margin-bottom:6px!important}.ui-tabs .ui-tabs-panel{padding:0!important}.ui-tabs .ui-tabs-nav{padding:10px 10px 0!important}.mod_turnitintooltwo .edit_course_end_date_form,.tii_unanonymise_reveal_form .unanonymise_form{background:#FFF;padding:12px 12px 0;height:100%;overflow:hidden}.mod_turnitintooltwo .nonsubmittersform textarea,.tii_unanonymise_reveal_form .unanonymise_form textarea{height:90px;width:80%}.tii_unanonymise_reveal_form #unanonymise_desc{text-align:center;font-weight:700;display:block;margin-bottom:10px}.mod_turnitintooltwo .nonsubmitters_desc{padding:10px 0}.mod_turnitintooltwo #fitem_id_nonsubmitters_sendtoself .fitemtitle{display:none}.mod_turnitintooltwo .nonsubmittersform .general_warning{margin-top:8px}.mod_turnitintooltwo .nonsubmittersformsuccessmsg{text-align:center;padding-top:46px}#download_links{margin-left:15px;top:-5px}.dropdown-menu .origchecked_zip_open:hover{background-color:#00699e;display:block;line-height:20px;color:#fff;font-weight:400}.dropdown-menu{margin-top:2px!important}#rubric_view_form{padding-left:6px}.inbox .peermark-loading-span img.icon{margin-right:0}.selectlong{width:530px}.members .dataTables_wrapper .dataTables_processing{top:0;left:0;right:0;height:100%;margin:0;padding:0}.members .dataTables_wrapper .dataTables_processing .loading-message{position:absolute;top:50%;left:0;right:0;margin-top:-10px}.edit_course_end_date_form{padding:20px;background:#fff}.edit_course_end_date_form #edit_end_date_desc{text-align:center;margin-bottom:20px}.edit_course_end_date_form .fitemtitle{float:none!important;text-align:center!important;width:100%!important;display:block!important}.edit_course_end_date_form .fdate_selector{float:none!important;display:block!important;margin:0 auto!important;width:256px!important}.edit_course_end_date_form .fbutton{width:100%!important;margin:0!important}.edit_course_end_date_form #id_save_end_date{margin:0 auto!important;display:block!important}#page-admin-setting-modsettingturnitintooltwo #test_link,#page-admin-setting-modsettingturnitintooltwo #testing_container{margin-bottom:8px}#page-admin-setting-modsettingturnitintooltwo #test_link img{position:relative;top:4px}#page-admin-setting-modsettingturnitintooltwo #test_result{margin:4px 0 0;padding:5px 10px;width:500px;text-align:center}#page-admin-setting-modsettingturnitintooltwo .test_link_success{border:1px solid #0C0;background:#C3FDB8}#page-admin-setting-modsettingturnitintooltwo .test_link_fail{border:1px solid #C00;background:#E77471}#page-admin-setting-modsettingturnitintooltwo .smallicon{vertical-align:middle}#page-admin-setting-modsettingturnitintooltwo .tii_upgrade_check,#page-admin-setting-modsettingturnitintooltwo .tii_upgrading_check{font-size:12px;width:30px;height:30px;display:inline-block}#page-admin-setting-modsettingturnitintooltwo .tii_upgrade_check img,#page-admin-setting-modsettingturnitintooltwo .tii_upgrading_check img{padding:0 0 5px 5px;vertical-align:middle}#page-admin-setting-modsettingturnitintooltwo .tii_upgrading_check img{position:relative;top:3px}.centered_cell,.centered_div,.student_read{text-align:center!important}.centered_cb_cell{padding-right:8px;padding-left:8px}body[class*='-moodle23'] .mod_turnitintooltwo .centered_cb_cell input{position:relative;left:-1px}#page-admin-setting-modsettingturnitintooltwo #test_link,#page-admin-setting-modsettingturnitintooltwo #test_result,#page-admin-setting-modsettingturnitintooltwo #testing_container,#page-admin-setting-modsettingturnitintooltwo .test_connection,#page-admin-setting-modsettingturnitintooltwo .tii_upgrading_check,.mod_turnitintooltwo #assignment_id,.mod_turnitintooltwo #class_ids,.mod_turnitintooltwo #courseBrowserTable_filter,.mod_turnitintooltwo #course_category,.mod_turnitintooltwo #course_id,.mod_turnitintooltwo #create_assignments,.mod_turnitintooltwo #enrolling_error,.mod_turnitintooltwo #inbox_form,.mod_turnitintooltwo #submission_id,.mod_turnitintooltwo #tii_course_id,.mod_turnitintooltwo #tii_course_name,.mod_turnitintooltwo #user_role,.mod_turnitintooltwo #useragreement_form form,.mod_turnitintooltwo #view_context,.mod_turnitintooltwo .dv_url,.mod_turnitintooltwo .edit_course_end_date_form,.mod_turnitintooltwo .enrolling_container,.mod_turnitintooltwo .hidden_class,.mod_turnitintooltwo .js_required,.mod_turnitintooltwo .launch_form,.mod_turnitintooltwo .messages_loading,.mod_turnitintooltwo .peermark_instructions,.mod_turnitintooltwo .peermark_loading,.mod_turnitintooltwo .refresh_row .fa-spinner,.mod_turnitintooltwo .row_peermark_reviews,.mod_turnitintooltwo .tii_table_functions,.mod_turnitintooltwo .toggle_peermark_instructions .hide_peermark_instructions,.mod_turnitintooltwo .unanonymise_form,.mod_turnitintooltwo .zip_downloads{display:none}.mod_turnitintooltwo #digital_receipt,.mod_turnitintooltwo .class_recreation,.mod_turnitintooltwo .submission_form_container{padding:0 24px}.mod_turnitintooltwo .row_peermark_manager,.mod_turnitintooltwo .row_peermark_reviews,.mod_turnitintooltwo .row_score{float:right}#page-admin-setting-modsettingturnitintooltwo #test_link,.mod_turnitintooltwo .download_original_open,.mod_turnitintooltwo .enrol_link,.mod_turnitintooltwo .grademark_open,.mod_turnitintooltwo .messages_inbox,.mod_turnitintooltwo .origreport_open,.mod_turnitintooltwo .quickmark_manager_launch,.mod_turnitintooltwo .refresh_link,.mod_turnitintooltwo .refresh_row,.mod_turnitintooltwo .rubric_manager_launch,.mod_turnitintooltwo .rubric_view_launch,.mod_turnitintooltwo .tii_peermark_manager_launch,.mod_turnitintooltwo .tii_peermark_reviews_launch,.mod_turnitintooltwo .zip_open,.mod_turnitintooltwo span.link{cursor:pointer}.mod_turnitintooltwo #refresh_loading,.mod_turnitintooltwo #submitting_loader{display:none;padding:16px 0 8px;text-align:center}.grey{color:#A8A8A8!important}.light-blue{color:#bbe6ff!important}.gm-blue{color:#0070A8!important}.green{color:#19B719!important}.red{color:#B94A48!important}.tii_checkagainstnote,.tii_genspeednote{border:1px solid #6fcaff;background:#bbe6ff;padding:10px;margin-bottom:16px}.partDetails .fa,.submissionsDataTable .fa{color:#8f8f8f}.middle-padding{padding:0 5px}.mod_turnitintooltwo #course_search_options,.mod_turnitintooltwo .create_checkboxes{border:1px solid #EFEFEF;padding:6px 10px}.mod_turnitintooltwo .create_checkboxes{display:none;margin-top:12px}.icon_margin{margin-right:20px}.icon_smallmargin{margin-right:10px}#btn_tiisupportform_link,#tii_helpdesk_mod_id,#tii_solution_template,.tii_solutions,.tii_wizard_options{display:none}#tii_solution_template,#tii_wizard_container,.mod_turnitintooltwo iframe{border:1px solid #EFEFEF}#tii_solution_template{padding:0 16px 16px}#tii_wizard_container{padding:16px 16px 12px;margin-bottom:12px}#migration-progress-bar{background-color:#FFF;height:30px;line-height:28px;border:1px solid;border-radius:3px;margin:15px 0 30px}#migration-progress,#migration-progress-todo{width:0%;height:100%;float:left;font-size:14px;text-align:center}#migration-progress{background-color:#0073D2;color:#fff}.migration-spinner{text-align:center}.enablemigrationtool{text-align:center;text-shadow:0 -1px 0 rgba(0,0,0,.25);background-color:#0e90d2;background-image:-moz-linear-gradient(top,#149bdf,#0480be);background-image:-webkit-gradient(linear,0 0,0 100%,from(#149bdf),to(#0480be));background-image:-webkit-linear-gradient(top,#149bdf,#0480be);background-image:-o-linear-gradient(top,#149bdf,#0480be);background-image:linear-gradient(to bottom,#149bdf,#0480be);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf', endColorstr='#ff0480be', GradientType=0);-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-moz-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-transition:width .6s ease;-moz-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.data-table-splitter{float:left;padding-right:20px}.yellowtest{color:#ff0}#fitem_id_enablemigrationtool,#migration-delete-selected #fitem_id_submitbutton,#migrationform #fitem_id_submitbutton{width:75%;margin:0 auto;background-color:#FFF}#fitem_id_enablemigrationtool .fitemtitle{width:300px}#migrationform{margin:30px 0}.migrationheader{color:#003A69;font-weight:400;margin-bottom:15px}.mod_turnitintooltwo .btn-primary{background:#0073D2;box-shadow:none;border:none;height:35px;margin-right:11px;border-radius:3px}.mod_turnitintooltwo .btn-primary:hover{background:#00569E}.mod_turnitintooltwo .btn-primary:active{background:#003A69}.migrationTable_length{margin-top:20px}#migrationTable .fa-times{color:red}#migrationTable .fa-check{color:green} +.listbar,.listbar .messages_inbox .smallicon{vertical-align:middle}.dropdown-menu,.mod_turnitintooltwo .nowrap{white-space:nowrap}.clearfix:after{content:".";visibility:hidden;display:block;height:0;clear:both}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.listbar,.listbar input,.listbar select{border:1px solid #EFEFEF;background:#fff}h3.main{line-height:40px}.mod_turnitintooltwo .fitem_fbutton{padding-top:12px}.listbar,.mod_turnitintooltwo #assignmentBrowserTable_wrapper{padding:10px}.mod_turnitintooltwo span.dimmed{color:#999}.mod_turnitintooltwo .italic{font-style:italic}.mod_turnitintooltwo .underline{text-decoration:underline}#courseBrowserTable a,#ppErrors a,#tii_close_bar a,.listbar .messages_inbox,.submissionsDataTable a{text-decoration:none}.mod_turnitintooltwo #or_container,.mod_turnitintooltwo .bold{font-weight:700}.mod_turnitintooltwo span.link{color:#00F}.listbar-container{display:table;width:100%}.listbar{position:relative;display:table-cell}.listbar input,.listbar label,.listbar select{margin:0}.listbar input,.listbar select{height:30px;padding:0 5px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.listbar .nonsubmitters_link,.listbar .refresh_link,.listbar .refreshing_link{float:right;margin-left:30px;padding:5px 0;width:195px}.listbar .nonsubmitters_link{text-decoration:none;display:none}.listbar .messages_inbox{float:right;margin-left:30px;padding:5px 0}.listbar .messages_loading_span{float:none!important;margin:0!important}.listbar .zip_downloads{float:left;position:relative;top:4px;height:22px}.listbar .zip_downloads img{position:relative;top:4px;left:-2px}.listbar .zip_downloads a.gmpdfzip_box,.listbar .zip_downloads div.origchecked_zip_open{padding:3px 16px;display:block}.listbar .zip_downloads a.gmpdfzip_box:hover{background:#00699e;color:#fff}.listbar .zip_downloads .zip_open{display:inline}.listbar .dataTables_filter{float:right!important;text-align:left!important}.listbar .dataTables_length{float:left!important}#courseBrowserTable,#ppErrors,.submissionsDataTable{font-size:13px;border:1px solid #EFEFEF;width:100%!important;margin-top:6px!important}#courseBrowserTable .ccheckbox,#ppErrors .ccheckbox,.submissionsDataTable .ccheckbox{text-align:center;padding:8px 10px 2px!important}#courseBrowserTable .odd,#ppErrors .odd,.submissionsDataTable .odd{background:#EFEFEF!important}#courseBrowserTable .odd .sorting_1,#ppErrors .odd .sorting_1,.submissionsDataTable .odd .sorting_1{background:#e7e7e7!important}#courseBrowserTable .even,#ppErrors .even,.submissionsDataTable .even{background:#fff!important}#courseBrowserTable .even .sorting_1,#ppErrors .even .sorting_1,.submissionsDataTable .even .sorting_1{background:#fafafa!important}#courseBrowserTable thead th,#ppErrors thead th,.submissionsDataTable thead th{border-bottom:0!important}#courseBrowserTable th,#ppErrors th,.submissionsDataTable th{padding:10px 20px!important}#courseBrowserTable td,#ppErrors td,.submissionsDataTable td{padding:15px 10px!important;font-size:13px;vertical-align:top}#courseBrowserTable .sorting_disabled,#ppErrors .sorting_disabled,.submissionsDataTable .sorting_disabled{cursor:default}#courseBrowserTable .left,#ppErrors .left,.submissionsDataTable .left{text-align:left}#courseBrowserTable .right,#ppErrors .right,.submissionsDataTable .right{text-align:right}#courseBrowserTable .grademark_grade,#courseBrowserTable .grademark_open,#courseBrowserTable .origreport_score,#ppErrors .grademark_grade,#ppErrors .grademark_open,#ppErrors .origreport_score,.submissionsDataTable .grademark_grade,.submissionsDataTable .grademark_open,.submissionsDataTable .origreport_score{float:right}#courseBrowserTable .grademark_grade,#courseBrowserTable .origreport_score,#ppErrors .grademark_grade,#ppErrors .origreport_score,.submissionsDataTable .grademark_grade,.submissionsDataTable .origreport_score{padding-right:8px}#courseBrowserTable td.narrow,#courseBrowserTable th.narrow,#ppErrors td.narrow,#ppErrors th.narrow,.submissionsDataTable td.narrow,.submissionsDataTable th.narrow{width:60px}#courseBrowserTable .delete_paper,#courseBrowserTable .submission_title,#courseBrowserTable .submit_nothing,#ppErrors .delete_paper,#ppErrors .submission_title,#ppErrors .submit_nothing,.submissionsDataTable .delete_paper,.submissionsDataTable .submission_title,.submissionsDataTable .submit_nothing{cursor:pointer}#courseBrowserTable .score_colour,#ppErrors .score_colour,.submissionsDataTable .score_colour{width:36px;display:inline-block;float:right}#courseBrowserTable .late_submission,#ppErrors .late_submission,.submissionsDataTable .late_submission{color:#d31900}#courseBrowserTable #tii_digital_receipt_icon,#ppErrors #tii_digital_receipt_icon,.submissionsDataTable #tii_digital_receipt_icon{margin-top:-3px;margin-right:5px}.dataTables_paginate{margin-top:6px;font-size:12px;float:right}.dataTables_paginate a{display:inline-block;border:1px solid #EFEFEF;padding:2px 5px;background-position:left -2px}.dataTables_paginate .current{background:#EFEFEF}.dataTables_paginate .previous,.dataTables_paginate span a{border-right:0}.dataTables_info{float:left;clear:none;margin-top:8px;text-transform:uppercase;font-size:11px}.mod_turnitintooltwo .score_colour_{background:#999}.mod_turnitintooltwo .score_colour_0{background:#3552B7}.mod_turnitintooltwo .score_colour_10{background:#617B8D}.mod_turnitintooltwo .score_colour_20{background:#A1B556}.mod_turnitintooltwo .score_colour_30{background:#DAE235}.mod_turnitintooltwo .score_colour_40{background:#EDAC28}.mod_turnitintooltwo .score_colour_50{background:#EDD42F}.mod_turnitintooltwo .score_colour_60{background:#ECAD28}.mod_turnitintooltwo .score_colour_70{background:#E15A21}.mod_turnitintooltwo .score_colour_80{background:#E05A21}.mod_turnitintooltwo .score_colour_90{background:#DC4321}.mod_turnitintooltwo .score_colour_100{background:#DB4221}.mod_turnitintooltwo .enrol_link{padding:6px 18px 0 0}.partDetails{font-size:13px;margin-bottom:0;width:100%;border:1px solid #EFEFEF}.partDetails tr{border-right:1px solid #EFEFEF}.partDetails th{padding:6px 12px;border-bottom:1px solid #EFEFEF}.partDetails td{border:1px solid #EFEFEF;border-top:0;padding:12px 12px 4px}.partDetails td.data,.partDetails td.export_data,.partDetails td.rubric_qm{text-align:center}.partDetails td.export_data{padding-top:12px}.partDetails td.introduction_cell,.partDetails td.peermark_assignments_cell{padding:0;border:0}.partDetails td.peermarks{border:0}.partDetails .editable-click{border:none;position:relative;padding-right:24px}.partDetails .editable-click:before{position:absolute;font-family:FontAwesome;top:0;right:0;font-size:1.33333em!important;color:#A8A8A8!important;line-height:.75em;vertical-align:-15%;content:"\f040";display:inline-block;font-style:normal;font-weight:400;font-size-adjust:none;font-stretch:normal;font-feature-settings:normal;font-language-override:normal;font-kerning:auto;font-synthesis:weight style;font-variant:normal;text-rendering:auto;-moz-osx-font-smoothing:grayscale}.partDetails .editable-click:hover{border-bottom:0!important}.partDetails .introduction,.partDetails .peermark_instructions{padding:6px 10px;border-bottom:1px solid #EFEFEF;display:none}.partDetails .introduction h2{margin:8px 0}.partDetails .introduction p{margin:6px 0}.partDetails .row_export_orig,.partDetails .row_export_pdf,.partDetails .row_export_xls,.partDetails .row_quickmark_manager,.partDetails .row_rubric_manager,.partDetails .zip_open{display:inline}.partDetails .toggle_peermark_instructions img{display:block}.partDetails .toggle_peermark_instructions,.partDetails .toggle_peermarks,.partDetails .toggle_summary{cursor:pointer;float:left;position:relative;top:-3px;margin-right:8px}.partDetails .peermark_header{margin-bottom:8px;float:left}#turnitin_sync_all_grades{float:right;font-size:16px}.turnitin_sync_grades,.turnitin_syncing_grades{cursor:pointer;margin-bottom:20px}.turnitin_syncing_grades{display:none}.peermarkDetails{width:100%;border-top:1px solid #EFEFEF}.peermarkDetails td{padding:8px 12px;border-bottom-width:0}.peermarkDetails td.peermark_instructions_cell{border:0;padding:0}.quickmark_manager_launch{padding:2px 0 2px 30px;height:20px;color:#0070A8!important}.rubric_manager_launch,.rubric_view_launch{padding:4px 0;line-height:22px;color:#0070A8!important}.rubric_right_margin{margin-right:7px}.tii_peermark_manager_launch,.tii_peermark_reviews_launch{color:#090!important;padding:4px 0 4px 46px;height:22px}.mod_turnitintooltwo .peermark_loading_row{text-align:center;margin:0 auto 8px}.mod_turnitintooltwo #id_submissiontext{width:80%;height:320px}#colorbox{margin-top:60px;outline:0!important;overflow:visible!important}.cboxIframe{border-radius:5px}.turnitin_ula,noscript.turnitin_ula_noscript{border:1px solid #C00;text-align:center;display:block}#cboxContent{margin-top:0!important}#tii_close_bar{position:fixed;z-index:9999;right:0;top:0;width:100%;height:45px;background:rgba(0,0,0,.3)}#tii_close_bar a{color:#fff;display:block;background:#000;width:100px;text-align:center;float:right;height:45px;line-height:43px}#page-admin-setting-modsettingturnitintooltwo .tii_upgrade_check,.turnitin_ula{text-decoration:underline;cursor:pointer}.turnitin_ula_text{padding-top:15px;text-align:center}.turnitin_ula input[type=submit]{margin:0}.turnitin_ula{padding:12px;color:red;margin-top:12px;margin-bottom:16px!important;font-size:14px;font-weight:700}noscript.turnitin_ula_noscript{padding:8px;background:#FFE9E8;width:99%;margin:16px 6px;line-height:28px}.ui-widget-content,.ui-widget-header{border:0!important}.turnitin_ula_warn{color:red}.tii_digital_receipt{display:inline-block;width:150px}#tii_digital_receipt_box{padding:20px;background:#fff}#tii_digital_receipt_box .generaltable{width:100%}#tii_digital_receipt_box .logo{display:block;margin:0 auto;width:214px;height:68px}#tii_digital_receipt_box #tii_receipt_print{text-align:right;display:block}#digital_receipt{margin:0}.mod_turnitintooltwo #upload_success{color:#C00}.ui-widget-header{background:#EFEFEF!important;margin-bottom:6px!important}.ui-tabs .ui-tabs-panel{padding:0!important}.ui-tabs .ui-tabs-nav{padding:10px 10px 0!important}.mod_turnitintooltwo .edit_course_end_date_form,.tii_unanonymise_reveal_form .unanonymise_form{background:#FFF;padding:12px 12px 0;height:100%;overflow:hidden}.mod_turnitintooltwo .nonsubmittersform textarea,.tii_unanonymise_reveal_form .unanonymise_form textarea{height:90px;width:80%}.tii_unanonymise_reveal_form #unanonymise_desc{text-align:center;font-weight:700;display:block;margin-bottom:10px}.mod_turnitintooltwo .nonsubmitters_desc{padding:10px 0}.mod_turnitintooltwo #fitem_id_nonsubmitters_sendtoself .fitemtitle{display:none}.mod_turnitintooltwo .nonsubmittersform .general_warning{margin-top:8px}.mod_turnitintooltwo .nonsubmittersformsuccessmsg{text-align:center;padding-top:46px}#download_links{margin-left:15px;top:-5px}.dropdown-menu .origchecked_zip_open:hover{background-color:#00699e;display:block;line-height:20px;color:#fff;font-weight:400}.dropdown-menu{margin-top:2px!important}#rubric_view_form{padding-left:6px}.inbox .peermark-loading-span img.icon{margin-right:0}.selectlong{width:530px}.members .dataTables_wrapper .dataTables_processing{top:0;left:0;right:0;height:100%;margin:0;padding:0}.members .dataTables_wrapper .dataTables_processing .loading-message{position:absolute;top:50%;left:0;right:0;margin-top:-10px}.edit_course_end_date_form{padding:20px;background:#fff}.edit_course_end_date_form #edit_end_date_desc{text-align:center;margin-bottom:20px}.edit_course_end_date_form .fitemtitle{float:none!important;text-align:center!important;width:100%!important;display:block!important}.edit_course_end_date_form .fdate_selector{float:none!important;display:block!important;margin:0 auto!important;width:256px!important}.edit_course_end_date_form .fbutton{width:100%!important;margin:0!important}.edit_course_end_date_form #id_save_end_date{margin:0 auto!important;display:block!important}#page-admin-setting-modsettingturnitintooltwo #test_link,#page-admin-setting-modsettingturnitintooltwo #testing_container{margin-bottom:8px}#page-admin-setting-modsettingturnitintooltwo #test_link img{position:relative;top:4px}#page-admin-setting-modsettingturnitintooltwo #test_result{margin:4px 0 0;padding:5px 10px;width:500px;text-align:center}#page-admin-setting-modsettingturnitintooltwo .test_link_success{border:1px solid #0C0;background:#C3FDB8}#page-admin-setting-modsettingturnitintooltwo .test_link_fail{border:1px solid #C00;background:#E77471}#page-admin-setting-modsettingturnitintooltwo .smallicon{vertical-align:middle}#page-admin-setting-modsettingturnitintooltwo .tii_upgrade_check,#page-admin-setting-modsettingturnitintooltwo .tii_upgrading_check{font-size:12px;width:30px;height:30px;display:inline-block}#page-admin-setting-modsettingturnitintooltwo .tii_upgrade_check img,#page-admin-setting-modsettingturnitintooltwo .tii_upgrading_check img{padding:0 0 5px 5px;vertical-align:middle}#page-admin-setting-modsettingturnitintooltwo .tii_upgrading_check img{position:relative;top:3px}.centered_cell,.centered_div,.student_read{text-align:center!important}.centered_cb_cell{padding-right:8px;padding-left:8px}body[class*='-moodle23'] .mod_turnitintooltwo .centered_cb_cell input{position:relative;left:-1px}#page-admin-setting-modsettingturnitintooltwo #test_link,#page-admin-setting-modsettingturnitintooltwo #test_result,#page-admin-setting-modsettingturnitintooltwo #testing_container,#page-admin-setting-modsettingturnitintooltwo .test_connection,#page-admin-setting-modsettingturnitintooltwo .tii_upgrading_check,.mod_turnitintooltwo #assignment_id,.mod_turnitintooltwo #class_ids,.mod_turnitintooltwo #courseBrowserTable_filter,.mod_turnitintooltwo #course_category,.mod_turnitintooltwo #course_id,.mod_turnitintooltwo #create_assignments,.mod_turnitintooltwo #enrolling_error,.mod_turnitintooltwo #inbox_form,.mod_turnitintooltwo #submission_id,.mod_turnitintooltwo #tii_course_id,.mod_turnitintooltwo #tii_course_name,.mod_turnitintooltwo #user_role,.mod_turnitintooltwo #useragreement_form form,.mod_turnitintooltwo #view_context,.mod_turnitintooltwo .dv_url,.mod_turnitintooltwo .edit_course_end_date_form,.mod_turnitintooltwo .enrolling_container,.mod_turnitintooltwo .hidden_class,.mod_turnitintooltwo .js_required,.mod_turnitintooltwo .launch_form,.mod_turnitintooltwo .messages_loading,.mod_turnitintooltwo .peermark_instructions,.mod_turnitintooltwo .peermark_loading,.mod_turnitintooltwo .refresh_row .fa-spinner,.mod_turnitintooltwo .row_peermark_reviews,.mod_turnitintooltwo .tii_table_functions,.mod_turnitintooltwo .toggle_peermark_instructions .hide_peermark_instructions,.mod_turnitintooltwo .unanonymise_form,.mod_turnitintooltwo .zip_downloads{display:none}.mod_turnitintooltwo #digital_receipt,.mod_turnitintooltwo .class_recreation,.mod_turnitintooltwo .submission_form_container{padding:0 24px}.mod_turnitintooltwo .row_peermark_manager,.mod_turnitintooltwo .row_peermark_reviews,.mod_turnitintooltwo .row_score{float:right}#page-admin-setting-modsettingturnitintooltwo #test_link,.mod_turnitintooltwo .download_original_open,.mod_turnitintooltwo .enrol_link,.mod_turnitintooltwo .grademark_open,.mod_turnitintooltwo .messages_inbox,.mod_turnitintooltwo .origreport_open,.mod_turnitintooltwo .quickmark_manager_launch,.mod_turnitintooltwo .refresh_link,.mod_turnitintooltwo .refresh_row,.mod_turnitintooltwo .rubric_manager_launch,.mod_turnitintooltwo .rubric_view_launch,.mod_turnitintooltwo .tii_peermark_manager_launch,.mod_turnitintooltwo .tii_peermark_reviews_launch,.mod_turnitintooltwo .zip_open,.mod_turnitintooltwo span.link{cursor:pointer}.mod_turnitintooltwo #refresh_loading,.mod_turnitintooltwo #submitting_loader{display:none;padding:16px 0 8px;text-align:center}.grey{color:#A8A8A8!important}.light-blue{color:#bbe6ff!important}.gm-blue{color:#0070A8!important}.green{color:#19B719!important}.red{color:#B94A48!important}.tii_checkagainstnote,.tii_genspeednote{border:1px solid #6fcaff;background:#bbe6ff;padding:10px;margin-bottom:16px}.partDetails .fa,.submissionsDataTable .fa{color:#8f8f8f}.middle-padding{padding:0 5px}.mod_turnitintooltwo #course_search_options,.mod_turnitintooltwo .create_checkboxes{border:1px solid #EFEFEF;padding:6px 10px}.mod_turnitintooltwo .create_checkboxes{display:none;margin-top:12px}.icon_margin{margin-right:20px}.icon_smallmargin{margin-right:10px}#btn_tiisupportform_link,#tii_helpdesk_mod_id,#tii_solution_template,.tii_solutions,.tii_wizard_options{display:none}#tii_solution_template,#tii_wizard_container,.mod_turnitintooltwo iframe{border:1px solid #EFEFEF}#tii_solution_template{padding:0 16px 16px}#tii_wizard_container{padding:16px 16px 12px;margin-bottom:12px}#migration-progress-bar{background-color:#FFF;height:30px;line-height:28px;border:1px solid;border-radius:3px;margin:15px 0 30px}#migration-progress,#migration-progress-todo{width:0%;height:100%;float:left;font-size:14px;text-align:center}#migration-progress{background-color:#0073D2;color:#fff}.migration-spinner{text-align:center}.enablemigrationtool{text-align:center;text-shadow:0 -1px 0 rgba(0,0,0,.25);background-color:#0e90d2;background-image:-moz-linear-gradient(top,#149bdf,#0480be);background-image:-webkit-gradient(linear,0 0,0 100%,from(#149bdf),to(#0480be));background-image:-webkit-linear-gradient(top,#149bdf,#0480be);background-image:-o-linear-gradient(top,#149bdf,#0480be);background-image:linear-gradient(to bottom,#149bdf,#0480be);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf', endColorstr='#ff0480be', GradientType=0);-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-moz-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-transition:width .6s ease;-moz-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.data-table-splitter{float:left;padding-right:20px}.yellowtest{color:#ff0}#fitem_id_enablemigrationtool,#migration-delete-selected #fitem_id_submitbutton,#migrationform #fitem_id_submitbutton{width:75%;margin:0 auto;background-color:#FFF}#fitem_id_enablemigrationtool .fitemtitle{width:300px}#migrationform{margin:30px 0}.migrationheader{color:#003A69;font-weight:400;margin-bottom:15px}.mod_turnitintooltwo .btn-primary{background:#0073D2;box-shadow:none;border:none;height:35px;margin-right:11px;border-radius:3px}.mod_turnitintooltwo .btn-primary:hover{background:#00569E}.mod_turnitintooltwo .btn-primary:active{background:#003A69}.migrationTable_length{margin-top:20px}#migrationTable .fa-times{color:red}#migrationTable .fa-check{color:green} /*# sourceMappingURL=styles.css.map */ diff --git a/styles.css.map b/styles.css.map index 9fd0f8b2..298ad531 100644 --- a/styles.css.map +++ b/styles.css.map @@ -1 +1 @@ -{"version":3,"sources":["partials/_listbar.scss","partials/_inbox.scss","_utilities.scss","_variables.scss","partials/_table.scss","partials/_modal.scss","partials/_part_details.scss","settings_partials/_settings_tab.scss","partials/_eula.scss","_other.scss","partials/_warnings.scss","partials/_digital_receipt.scss","partials/_members.scss","settings_partials/_class_migration_tab.scss"],"names":[],"mappings":"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","file":"styles.css","sourcesContent":["/*\n * Listbar - Contains datatables links, dropdowns and search\n */\n\n.listbar-container {\n display: table;\n width: 100%;\n}\n\n.listbar {\n background: #fff;\n border: 1px solid $border-color;\n position: relative;\n display: table-cell;\n vertical-align: middle;\n padding: 10px;\n\n label,\n input,\n select {\n margin: 0;\n }\n\n select,\n input {\n height: 30px;\n padding: 0 5px;\n border: 1px solid #EFEFEF;\n -webkit-border-radius: 4px;\n -moz-border-radius: 4px;\n border-radius: 4px;\n background: #fff;\n }\n\n .refresh_link,\n .refreshing_link,\n .nonsubmitters_link {\n float: right;\n margin-left: 30px;\n padding: 5px 0;\n width: 195px;\n }\n\n .nonsubmitters_link {\n text-decoration: none;\n display: none;\n }\n\n /*\n * Messages inbox link in listbar\n */\n .messages_inbox {\n float: right;\n margin-left: 30px;\n padding: 5px 0;\n text-decoration: none;\n }\n\n .messages_loading_span {\n float: none !important;\n margin: 0 !important;\n }\n\n .messages_inbox .smallicon {\n vertical-align: middle;\n }\n\n // Zip file download links\n .zip_downloads {\n float: left;\n position: relative;\n top: 4px;\n height: 22px;\n\n img {\n position:relative;\n top:4px;\n left:-2px;\n }\n\n div.origchecked_zip_open,\n a.gmpdfzip_box {\n padding:3px 16px;\n display: block;\n }\n\n a.gmpdfzip_box:hover {\n background: $hover-blue;\n color: $white;\n }\n\n .zip_open {\n display: inline;\n }\n }\n\n /*\n * DataTables filter (search bar)\n */\n .dataTables_filter {\n float: right !important;\n text-align: left !important;\n }\n\n /*\n * DataTables length (how many per page)\n */\n .dataTables_length {\n float: left !important;\n }\n}","/*\n * Tabs on inbox page\n */\n.ui-widget-header {\n background: $light-grey !important;\n border: 0 !important;\n margin-bottom: 6px !important;\n}\n\n.ui-widget-content {\n border: 0 !important;\n}\n\n.ui-tabs .ui-tabs-panel {\n padding: 0 !important;\n}\n\n.ui-tabs .ui-tabs-nav {\n padding: 10px 10px 0 !important;\n}\n\n/*\n * Unanonymise form in modal\n */\n.tii_unanonymise_reveal_form .unanonymise_form,\n.mod_turnitintooltwo .edit_course_end_date_form {\n background: #FFFFFF;\n padding: 12px 12px 0;\n height: 100%;\n overflow: hidden\n}\n\n.tii_unanonymise_reveal_form #unanonymise_desc {\n text-align: center;\n font-weight: bold;\n display: block;\n margin-bottom: 10px;\n}\n\n.tii_unanonymise_reveal_form .unanonymise_form textarea {\n height: 90px;\n width:80%;\n}\n\n\n/*\n * Email non submitters form\n */\n.mod_turnitintooltwo .nonsubmitters_desc {\n padding: 10px 0;\n}\n\n.mod_turnitintooltwo .nonsubmittersform textarea {\n height: 90px;\n width:80%;\n}\n\n.mod_turnitintooltwo #fitem_id_nonsubmitters_sendtoself .fitemtitle {\n display: none;\n}\n\n.mod_turnitintooltwo .nonsubmittersform .general_warning {\n margin-top:8px;\n}\n\n.mod_turnitintooltwo .nonsubmittersformsuccessmsg {\n text-align: center;\n padding-top: 46px;\n}\n\n#download_links {\n margin-left: 15px;\n top: -5px;\n}\n\n.dropdown-menu .origchecked_zip_open:hover {\n background-color: $hover-blue;\n display: block;\n line-height: 20px;\n color: #fff;\n font-weight: normal;\n}\n\n.dropdown-menu {\n white-space: nowrap;\n margin-top: 2px !important;\n}\n\n#rubric_view_form {\n padding-left: 6px;\n}\n\n.inbox {\n .peermark-loading-span img.icon {\n margin-right: 0px;\n }\n}\n\n.selectlong {\n width: 530px;\n}","/*\n * Helpers and general styles\n */\n\n/*\n * Lets us clear floats for older moodles\n */\n.clearfix:after {\n content: \".\";\n visibility: hidden;\n display: block;\n height: 0;\n clear: both;\n}\n\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0,0,0,0);\n border: 0;\n}\n\nh3.main {\n line-height: 40px;\n}\n\n.mod_turnitintooltwo {\n .fitem_fbutton {\n padding-top:12px;\n }\n\n span.dimmed {\n color:#999999;\n }\n\n #assignmentBrowserTable_wrapper {\n padding: 10px;\n }\n\n .nowrap {\n white-space:nowrap;\n }\n\n .italic {\n font-style: italic;\n }\n\n .underline {\n text-decoration: underline;\n }\n\n .bold,\n #or_container {\n font-weight:bold;\n }\n\n span.link {\n color: #0000FF;\n }\n}","// Colours\n$light-grey: #EFEFEF;\n$dark-grey: #A8A8A8;\n$light-blue: #bbe6ff;\n$light-blue2: #6fcaff;\n$gm-blue: #0070A8;\n$white: #fff;\n$red: #B94A48;\n$green: #19B719;\n$hover-blue: #00699e;\n\n// Table border colours\n$border-color: $light-grey;\n\n// Odd / Even colours for table\n$odd-color: $light-grey;\n$even-color: $white;\n\n// Warning colours\n$warning: $red;\n$warning-border: darken($red, 20%);\n\n// Table padding\n$table-padding: 15px;\n$table-head-padding: $table-padding - 5px;","/*\n 1. DataTable Table\n 2. DataTable Pagination\n 3. Score colour\n*/\n\n\n/*\n * 1. Table styles and related\n */\n.submissionsDataTable, #ppErrors, #courseBrowserTable {\n width:100%;\n font-size: 13px;\n border:1px solid $border-color;\n width:100% !important;\n margin-top: 6px !important;\n\n .ccheckbox {\n text-align: center;\n padding: 8px 10px 2px !important;\n }\n\n .odd {\n background: $odd-color !important;\n\n .sorting_1 {\n background: darken($odd-color, 3%) !important;\n }\n }\n\n .even {\n background: $even-color !important;\n\n .sorting_1 {\n background: darken($even-color, 2%) !important;\n }\n }\n\n a {\n text-decoration: none;\n }\n\n thead th {\n border-bottom: 0 !important;\n }\n\n th {\n padding: $table-head-padding 20px !important;\n }\n\n td {\n padding: $table-padding 10px !important;\n font-size: 13px;\n vertical-align: top;\n }\n\n .sorting_disabled {\n cursor: default;\n }\n\n .left {\n text-align: left;\n }\n\n .right {\n text-align: right;\n }\n\n .grademark_open,\n .grademark_grade,\n .origreport_score {\n float:right;\n }\n\n .grademark_grade,\n .origreport_score {\n padding-right:8px;\n }\n\n th.narrow,\n td.narrow {\n width: 60px;\n }\n\n .submit_nothing, .submission_title, .delete_paper {\n cursor: pointer;\n }\n\n .score_colour {\n width:36px;\n display:inline-block;\n float:right;\n }\n\n .late_submission {\n color: #d31900;\n }\n\n #tii_digital_receipt_icon {\n margin-top: -3px;\n margin-right: 5px;\n }\n\n}\n\n\n/*\n * 2. DataTables pagination\n */\n.dataTables_paginate {\n margin-top: 6px;\n font-size:12px;\n float: right;\n\n a {\n display: inline-block;\n border: 1px solid $border-color;\n padding: 2px 5px;\n background-position: left -2px;\n }\n\n .current {\n background: #EFEFEF;\n }\n\n span a {\n border-right: 0;\n }\n\n .previous {\n border-right: 0;\n }\n\n}\n\n.dataTables_info {\n float:left;\n clear:none;\n margin-top: 8px;\n text-transform: uppercase;\n font-size: 11px;\n}\n\n\n/*\n * 3. Score colour for originality report.\n */\n.mod_turnitintooltwo .score_colour_ { background: #999999; }\n.mod_turnitintooltwo .score_colour_0 { background: #3552B7; }\n.mod_turnitintooltwo .score_colour_10 { background: #617B8D; }\n.mod_turnitintooltwo .score_colour_20 { background: #A1B556; }\n.mod_turnitintooltwo .score_colour_30 { background: #DAE235; }\n.mod_turnitintooltwo .score_colour_40 { background: #EDAC28; }\n.mod_turnitintooltwo .score_colour_50 { background: #EDD42F; }\n.mod_turnitintooltwo .score_colour_60 { background: #ECAD28; }\n.mod_turnitintooltwo .score_colour_70 { background: #E15A21; }\n.mod_turnitintooltwo .score_colour_80 { background: #E05A21; }\n.mod_turnitintooltwo .score_colour_90 { background: #DC4321; }\n.mod_turnitintooltwo .score_colour_100 { background: #DB4221; }\n\n\n.mod_turnitintooltwo .enrol_link {\n padding: 6px 18px 0 0;\n}","/*\n 1. Styles within modal\n 2. Styles for actual colorbox modal\n 3. Styles for close bar at the top\n*/\n\n/*\n * 1. Within the modal\n */\n#page-mod-turnitintooltwo-view {\n // padding-top: 20px;\n}\n\n.mod_turnitintooltwo #id_submissiontext {\n width:80%;\n height:320px;\n}\n\n/*\n * 2. Colorbox modal iframe\n */\n#colorbox {\n margin-top: 60px;\n outline: 0 !important;\n overflow: visible !important;\n}\n\n.cboxIframe {\n border-radius: 5px;\n}\n\n#cboxContent {\n margin-top: 0 !important;\n}\n\n/*\n * 3. Modal close bar\n */\n#tii_close_bar {\n position: fixed;\n z-index: 9999;\n right: 0;\n top: 0;\n width: 100%;\n height: 45px;\n background: rgba(0, 0, 0, .3);\n\n a {\n color: #fff;\n display: block;\n background: #000;\n width: 100px;\n text-align: center;\n float: right;\n text-decoration: none;\n height: 45px;\n line-height: 43px;\n }\n}",".partDetails {\n font-size: 13px;\n margin-bottom:0px;\n width:100%;\n border: 1px solid $border-color;\n\n tr {\n border-right: 1px solid $border-color;\n }\n\n th {\n padding: 6px 12px 6px;\n border-bottom: 1px solid $border-color;\n }\n\n td {\n border: 1px solid $border-color;\n border-top: 0;\n padding: 12px 12px 4px;\n }\n\n td.data,\n td.export_data,\n td.rubric_qm {\n text-align: center;\n }\n\n td.export_data {\n padding-top:12px;\n }\n\n td.introduction_cell {\n border:0;\n padding:0;\n }\n\n td.peermarks {\n border:0;\n }\n\n td.peermark_assignments_cell {\n padding:0;\n border:0;\n }\n\n .editable-click {\n border:none;\n position: relative;\n padding-right: 24px;\n\n &:before {\n position:absolute;\n font-family: FontAwesome;\n top:0;\n right:0;\n font-size: 1.33333em !important;\n color: $dark-grey !important;\n line-height: 0.75em;\n vertical-align: -15%;\n content: \"\\f040\";\n display: inline-block;\n font-style: normal;\n font-weight: normal;\n font-size-adjust: none;\n font-stretch: normal;\n font-feature-settings: normal;\n font-language-override: normal;\n font-kerning: auto;\n font-synthesis: weight style;\n font-variant: normal;\n font-size: inherit;\n text-rendering: auto;\n -moz-osx-font-smoothing: grayscale;\n }\n\n &:hover {\n border-bottom: 0 !important;\n }\n }\n\n /*\n * Introduction (summary section)\n */\n .introduction,\n .peermark_instructions {\n padding: 6px 10px;\n border-bottom: 1px solid $border-color;\n display: none;\n }\n\n .introduction h2 {\n margin: 8px 0;\n }\n\n .introduction p {\n margin: 6px 0;\n }\n\n /*\n * Export options\n */\n .row_export_xls,\n .row_export_pdf,\n .row_export_orig,\n .zip_open,\n .row_rubric_manager,\n .row_quickmark_manager {\n display:inline;\n }\n\n .toggle_peermark_instructions img {\n display: block;\n }\n\n .toggle_summary,\n .toggle_peermarks,\n .toggle_peermark_instructions {\n cursor: pointer;\n float:left;\n position: relative;\n top:-3px;\n margin-right:8px;\n }\n\n .peermark_header {\n margin-bottom:8px;\n float:left;\n }\n}\n\n#turnitin_sync_all_grades {\n float: right;\n font-size: 16px;\n}\n\n.turnitin_sync_grades, .turnitin_syncing_grades {\n cursor: pointer;\n margin-bottom: 20px;\n}\n\n.turnitin_syncing_grades {\n display: none;\n}\n\n.peermarkDetails {\n width: 100%;\n border-top: 1px solid $border-color;\n\n td {\n padding:8px 12px;\n border-bottom-width: 0;\n }\n\n td.peermark_instructions_cell {\n border:0;\n padding:0;\n }\n}\n\n.quickmark_manager_launch {\n padding: 2px 0 2px 30px;\n height: 20px;\n color: #0070A8 !important;\n}\n\n.rubric_manager_launch,\n.rubric_view_launch {\n padding:4px 0px 4px 0px;\n line-height: 22px;\n color: #0070A8 !important;\n}\n\n.rubric_right_margin {\n margin-right:7px;\n}\n\n.tii_peermark_manager_launch {\n color: #009900 !important;\n}\n\n.tii_peermark_reviews_launch {\n color: #009900 !important;\n}\n\n.tii_peermark_manager_launch,\n.tii_peermark_reviews_launch {\n padding: 4px 0 4px 46px;\n height: 22px;\n}\n\n.mod_turnitintooltwo .peermark_loading_row {\n text-align: center;\n margin:0 auto 8px;\n}","#page-admin-setting-modsettingturnitintooltwo {\n\n #test_link,\n #testing_container {\n margin-bottom:8px;\n }\n\n #test_link img {\n position: relative;\n top:4px;\n }\n\n #test_result {\n margin: 4px 0 0;\n padding: 5px 10px;\n width: 500px;\n text-align: center;\n }\n\n .test_link_success {\n border: 1px solid #00CC00;\n background: #C3FDB8;\n }\n\n .test_link_fail {\n border:1px solid #CC0000;\n background: #E77471;\n }\n\n .smallicon {\n vertical-align: middle;\n }\n\n\n\n // Upgrade\n .tii_upgrade_check,\n .tii_upgrading_check {\n font-size: 12px;\n }\n\n .tii_upgrade_check {\n text-decoration: underline;\n cursor: pointer;\n }\n\n .tii_upgrade_check,\n .tii_upgrading_check {\n width: 30px;\n height: 30px;\n display: inline-block;\n }\n .tii_upgrade_check img,\n .tii_upgrading_check img {\n padding: 0 0 5px 5px;\n vertical-align: middle;\n }\n\n .tii_upgrading_check img {\n position: relative;\n top: 3px;\n }\n}",".turnitin_ula_text {\n padding-top: 15px;\n text-align: center;\n}\n\n.turnitin_ula input[type=\"submit\"] {\n margin: 0;\n}\n\n.turnitin_ula {\n\tcursor:pointer;\n\ttext-decoration: underline;\n\ttext-align: center;\n\tborder: 1px solid #CC0000;\n\tpadding: 12px 12px 12px;\n\tcolor: #FF0000;\n\tmargin-top:12px;\n\tmargin-bottom:16px !important;\n\tfont-size: 14px;\n\tfont-weight: bold;\n\tdisplay: block;\n}\n\nnoscript.turnitin_ula_noscript {\n border: 1px solid #CC0000;\n padding: 8px;\n background: #FFE9E8;\n width: 99%;\n text-align:center;\n display:block;\n margin:16px 6px;\n line-height: 28px;\n}\n.turnitin_ula_warn {\n\tcolor: #FF0000;\n}","/*\n * No other place to go.\n */\n.student_read,\n.centered_cell,\n.centered_div {\n text-align:center !important;\n}\n\n.centered_cb_cell {\n padding-right:8px;\n padding-left:8px;\n}\n\nbody[class*='-moodle23'] .mod_turnitintooltwo .centered_cb_cell input {\n position: relative;\n left: -1px;\n}\n\n.mod_turnitintooltwo .hidden_class, .mod_turnitintooltwo #user_role, .mod_turnitintooltwo .launch_form,\n.mod_turnitintooltwo #useragreement_form form, .mod_turnitintooltwo #assignment_id, .mod_turnitintooltwo #course_id,\n.mod_turnitintooltwo #submission_id, .mod_turnitintooltwo #tii_course_id, .mod_turnitintooltwo #tii_course_name,\n.mod_turnitintooltwo .enrolling_container, .mod_turnitintooltwo .zip_downloads, .mod_turnitintooltwo #view_context,\n.mod_turnitintooltwo #inbox_form, .mod_turnitintooltwo .unanonymise_form, .mod_turnitintooltwo .edit_course_end_date_form,\n.mod_turnitintooltwo #course_category, .mod_turnitintooltwo #class_ids, .mod_turnitintooltwo #create_assignments,\n.mod_turnitintooltwo .row_peermark_reviews, .mod_turnitintooltwo .peermark_instructions,\n.mod_turnitintooltwo .toggle_peermark_instructions .hide_peermark_instructions,\n.mod_turnitintooltwo #courseBrowserTable_filter, .mod_turnitintooltwo .js_required,\n.mod_turnitintooltwo #course_category, .mod_turnitintooltwo #create_assignments,\n#page-admin-setting-modsettingturnitintooltwo .tii_upgrading_check, #page-admin-setting-modsettingturnitintooltwo #test_link,\n#page-admin-setting-modsettingturnitintooltwo #test_result, #page-admin-setting-modsettingturnitintooltwo .test_connection,\n#page-admin-setting-modsettingturnitintooltwo #testing_container, .mod_turnitintooltwo .peermark_loading,\n.mod_turnitintooltwo .messages_loading, .mod_turnitintooltwo .tii_table_functions, .mod_turnitintooltwo .refresh_row .fa-spinner,\n.mod_turnitintooltwo #enrolling_error, .mod_turnitintooltwo .dv_url {\n display:none;\n}\n\n\n.mod_turnitintooltwo .submission_form_container, .mod_turnitintooltwo .class_recreation,\n.mod_turnitintooltwo #digital_receipt {\n padding: 0 24px;\n}\n\n.mod_turnitintooltwo .row_score, .mod_turnitintooltwo .row_peermark_manager, .mod_turnitintooltwo .row_peermark_reviews {\n float:right;\n}\n\n.mod_turnitintooltwo .grademark_open, .mod_turnitintooltwo .origreport_open, .mod_turnitintooltwo .download_original_open,\n.mod_turnitintooltwo .zip_open, .mod_turnitintooltwo .enrol_link, .mod_turnitintooltwo .refresh_link,\n.mod_turnitintooltwo .refresh_row, .mod_turnitintooltwo .messages_inbox, .mod_turnitintooltwo span.link,\n.mod_turnitintooltwo .rubric_manager_launch, .mod_turnitintooltwo .rubric_view_launch,\n.mod_turnitintooltwo .quickmark_manager_launch, .mod_turnitintooltwo .tii_peermark_manager_launch,\n.mod_turnitintooltwo .tii_peermark_reviews_launch, #page-admin-setting-modsettingturnitintooltwo #test_link {\n cursor:pointer;\n}\n\n.mod_turnitintooltwo #submitting_loader, .mod_turnitintooltwo #refresh_loading {\n display:none;\n padding: 16px 0 8px;\n text-align: center;\n}\n\n.grey {\n color: $dark-grey !important;\n}\n\n.light-blue {\n color: $light-blue !important;\n}\n\n.gm-blue {\n color: $gm-blue !important;\n}\n\n.green {\n color: $green !important;\n}\n\n.red {\n color: $red !important;\n}\n\n.tii_checkagainstnote, .tii_genspeednote {\n border: 1px solid $light-blue2;\n background: $light-blue;\n padding: 10px;\n margin-bottom: 16px;\n}\n\n.submissionsDataTable .fa,\n.partDetails .fa {\n color: darken($dark-grey, 10%);\n}\n\n.middle-padding {\n padding: 0 5px;\n}\n\n.mod_turnitintooltwo #course_search_options, .mod_turnitintooltwo .create_checkboxes {\n border: 1px solid $border-color;\n padding: 6px 10px;\n}\n\n.mod_turnitintooltwo .create_checkboxes {\n display: none;\n margin-top: 12px;\n}\n\n.icon_margin {\n margin-right: 20px;\n}\n.icon_smallmargin {\n margin-right: 10px;\n}\n\n/**\n * Helpdesk Form\n */\n\n#tii_solution_template,\n.tii_wizard_options,\n.tii_solutions,\n#btn_tiisupportform_link,\n#tii_helpdesk_mod_id {\n display: none;\n}\n\n#tii_solution_template, #tii_wizard_container {\n border: 1px solid $light-grey;\n}\n\n#tii_solution_template {\n padding: 0px 16px 16px;\n}\n\n#tii_wizard_container {\n padding: 16px 16px 12px;\n margin-bottom: 12px;\n}\n\n.mod_turnitintooltwo iframe {\n border: 1px solid $light-grey;\n}\n\n#migration-progress-bar {\n background-color: #FFFFFF;\n height: 30px;\n line-height: 28px;\n border: 1px solid;\n border-radius: 3px;\n margin: 15px 0px 30px 0px;\n}\n#migration-progress, #migration-progress-todo {\n width: 0%;\n height: 100%;\n text-align: center;\n float: left;\n font-size: 14px;\n text-align: center;\n}\n#migration-progress {\n background-color: #0073D2;\n color: #fff;\n}\n.migration-spinner {\n text-align: center;\n}\n\n.enablemigrationtool {\n text-align: center;\n text-shadow: 0 -1px 0 rgba(0,0,0,.25);\n background-color: #0e90d2;\n background-image: -moz-linear-gradient(top,#149bdf,#0480be);\n background-image: -webkit-gradient(linear,0 0,0 100%,from(#149bdf),to(#0480be));\n background-image: -webkit-linear-gradient(top,#149bdf,#0480be);\n background-image: -o-linear-gradient(top,#149bdf,#0480be);\n background-image: linear-gradient(to bottom,#149bdf,#0480be);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf',endColorstr='#ff0480be',GradientType=0);\n -webkit-box-shadow: inset 0 -1px 0 rgba(0,0,0,.15);\n -moz-box-shadow: inset 0 -1px 0 rgba(0,0,0,.15);\n box-shadow: inset 0 -1px 0 rgba(0,0,0,.15);\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n -webkit-transition: width 0.6s ease;\n -moz-transition: width 0.6s ease;\n -o-transition: width 0.6s ease;\n transition: width 0.6s ease;\n}\n\n#migration-progress-bar {\n background-color: #FFFFFF;\n height: 30px;\n line-height: 28px;\n border: 1px solid;\n border-radius: 3px;\n margin: 15px 0px 30px 0px;\n}\n#migration-progress, #migration-progress-todo {\n width: 0%;\n height: 100%;\n text-align: center;\n float: left;\n font-size: 14px;\n text-align: center;\n}\n#migration-progress {\n background-color: #0073D2;\n color: #fff;\n}\n.migration-spinner {\n text-align: center;\n}\n\n.enablemigrationtool {\n text-align: center;\n text-shadow: 0 -1px 0 rgba(0,0,0,.25);\n background-color: #0e90d2;\n background-image: -moz-linear-gradient(top,#149bdf,#0480be);\n background-image: -webkit-gradient(linear,0 0,0 100%,from(#149bdf),to(#0480be));\n background-image: -webkit-linear-gradient(top,#149bdf,#0480be);\n background-image: -o-linear-gradient(top,#149bdf,#0480be);\n background-image: linear-gradient(to bottom,#149bdf,#0480be);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf',endColorstr='#ff0480be',GradientType=0);\n -webkit-box-shadow: inset 0 -1px 0 rgba(0,0,0,.15);\n -moz-box-shadow: inset 0 -1px 0 rgba(0,0,0,.15);\n box-shadow: inset 0 -1px 0 rgba(0,0,0,.15);\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n -webkit-transition: width 0.6s ease;\n -moz-transition: width 0.6s ease;\n -o-transition: width 0.6s ease;\n transition: width 0.6s ease;\n}\n\n.data-table-splitter {\n float: left;\n padding-right: 20px;\n}\n.yellowtest{color: yellow;}\n\n#migrationform #fitem_id_submitbutton, \n#migration-delete-selected #fitem_id_submitbutton, \n#fitem_id_enablemigrationtool {\n width: 75%;\n margin: 0 auto;\n background-color: #FFFFFF;\n}\n#fitem_id_enablemigrationtool .fitemtitle {\n width: 300px;\n}\n#migrationform {\n margin: 30px 0px;\n}\n\n.migrationheader {\n color: #003A69;\n font-weight: normal;\n margin-bottom: 15px;\n}\n.mod_turnitintooltwo .btn-primary {\n background: #0073D2;\n}\n.mod_turnitintooltwo .btn-primary:hover {\n background: #00569E;\n}\n.mod_turnitintooltwo .btn-primary:active {\n background: #003A69;\n}\n.mod_turnitintooltwo .btn-primary {\n box-shadow: none;\n border: none;\n height: 35px;\n margin-right: 11px;\n border-radius: 3px;\n}\n\n.migrationTable_length {\n margin-top: 20px;\n}\n\n#migrationTable .fa-times {\n color: #FF0000;\n}\n\n#migrationTable .fa-check {\n color: #008000;\n}\n","/*\n * Warning styles\n */\n\n.tii_library_not_present_warning {\n border: 1px solid $warning-border;\n padding: 8px;\n background: $warning;\n width: 99%;\n text-align:center;\n display:block;\n margin-bottom:6px;\n color: white;\n}\n\n.mod_turnitintooltwo {\n\n noscript.warning,\n .library_not_present_warning,\n .general_warning,\n #error,\n #full-error {\n border: 1px solid $warning-border;\n padding: 8px;\n background: $warning;\n width: 99%;\n text-align:center;\n display:block;\n margin-bottom:6px;\n color: white;\n }\n\n #error {\n margin-left:24px;\n margin-right:24px;\n width:96%;\n }\n\n .submission_failure_msg,\n .box_receipt {\n padding: 16px;\n }\n\n .submission_failure_msg .general_warning {\n margin-top: 16px;\n width: auto;\n }\n\n #enrolling_error {\n margin-top: 8px;\n }\n\n .manual_submission_failure_msg {\n margin-bottom: 12px;\n }\n}",".tii_digital_receipt {\n display: inline-block;\n width: 150px;\n}\n\n#tii_digital_receipt_box {\n padding: 20px;\n background: #fff;\n\n .generaltable {\n width: 100%;\n }\n\n .logo {\n display: block;\n margin: 0 auto;\n width: 214px;\n height: 68px;\n }\n\n #tii_receipt_print {\n text-align: right;\n display: block;\n }\n\n}\n\n#digital_receipt {\n margin: 0;\n}\n\n.mod_turnitintooltwo #upload_success {\n color: #CC0000;\n}",".members {\n // Overwrite datatables CSS for loading message to cover the whole table\n // accurately. By default datatables centers the loading message vertically\n // and horizontally but it is only the size of the message meaning a user\n // can click the content being loaded behind the message as the loading mask\n // won't cover it all. Fix is to create a loading mask that covers all the\n // loading content and position the message within the mask\n .dataTables_wrapper .dataTables_processing {\n // cover entire table that is loading\n top: 0px;\n left: 0px;\n right: 0px;\n height: 100%;\n margin: 0px;\n padding: 0px;\n\n .loading-message {\n // position message within loading element\n position: absolute;\n top: 50%;\n left: 0px;\n right: 0px;\n margin-top: -10px; // half line-height\n }\n }\n}\n","/*\nLocated at mod/turnitintooltwo/settings_extras.php?cmd=courses\n*/\n\n.edit_course_end_date_form {\n padding: 20px;\n background: #fff;\n\n #edit_end_date_desc {\n text-align: center;\n margin-bottom: 20px;\n }\n\n .fitemtitle {\n float: none !important;\n text-align: center !important;\n width: 100% !important;\n display: block !important;\n }\n\n .fdate_selector {\n float: none !important;\n display: block !important;\n margin: 0 auto !important;\n width: 256px !important;\n }\n\n .fbutton {\n width: 100% !important;\n margin: 0 !important;\n }\n\n #id_save_end_date {\n margin: 0 auto !important;\n display: block !important;\n }\n}"]} \ No newline at end of file +{"version":3,"sources":["partials/_listbar.scss","partials/_inbox.scss","_utilities.scss","_variables.scss","partials/_table.scss","partials/_modal.scss","partials/_part_details.scss","partials/_eula.scss","settings_partials/_settings_tab.scss","_other.scss","partials/_digital_receipt.scss","partials/_members.scss","settings_partials/_class_migration_tab.scss"],"names":[],"mappings":"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","file":"styles.css","sourcesContent":["/*\n * Listbar - Contains datatables links, dropdowns and search\n */\n\n.listbar-container {\n display: table;\n width: 100%;\n}\n\n.listbar {\n background: #fff;\n border: 1px solid $border-color;\n position: relative;\n display: table-cell;\n vertical-align: middle;\n padding: 10px;\n\n label,\n input,\n select {\n margin: 0;\n }\n\n select,\n input {\n height: 30px;\n padding: 0 5px;\n border: 1px solid #EFEFEF;\n -webkit-border-radius: 4px;\n -moz-border-radius: 4px;\n border-radius: 4px;\n background: #fff;\n }\n\n .refresh_link,\n .refreshing_link,\n .nonsubmitters_link {\n float: right;\n margin-left: 30px;\n padding: 5px 0;\n width: 195px;\n }\n\n .nonsubmitters_link {\n text-decoration: none;\n display: none;\n }\n\n /*\n * Messages inbox link in listbar\n */\n .messages_inbox {\n float: right;\n margin-left: 30px;\n padding: 5px 0;\n text-decoration: none;\n }\n\n .messages_loading_span {\n float: none !important;\n margin: 0 !important;\n }\n\n .messages_inbox .smallicon {\n vertical-align: middle;\n }\n\n // Zip file download links\n .zip_downloads {\n float: left;\n position: relative;\n top: 4px;\n height: 22px;\n\n img {\n position:relative;\n top:4px;\n left:-2px;\n }\n\n div.origchecked_zip_open,\n a.gmpdfzip_box {\n padding:3px 16px;\n display: block;\n }\n\n a.gmpdfzip_box:hover {\n background: $hover-blue;\n color: $white;\n }\n\n .zip_open {\n display: inline;\n }\n }\n\n /*\n * DataTables filter (search bar)\n */\n .dataTables_filter {\n float: right !important;\n text-align: left !important;\n }\n\n /*\n * DataTables length (how many per page)\n */\n .dataTables_length {\n float: left !important;\n }\n}","/*\n * Tabs on inbox page\n */\n.ui-widget-header {\n background: $light-grey !important;\n border: 0 !important;\n margin-bottom: 6px !important;\n}\n\n.ui-widget-content {\n border: 0 !important;\n}\n\n.ui-tabs .ui-tabs-panel {\n padding: 0 !important;\n}\n\n.ui-tabs .ui-tabs-nav {\n padding: 10px 10px 0 !important;\n}\n\n/*\n * Unanonymise form in modal\n */\n.tii_unanonymise_reveal_form .unanonymise_form,\n.mod_turnitintooltwo .edit_course_end_date_form {\n background: #FFFFFF;\n padding: 12px 12px 0;\n height: 100%;\n overflow: hidden\n}\n\n.tii_unanonymise_reveal_form #unanonymise_desc {\n text-align: center;\n font-weight: bold;\n display: block;\n margin-bottom: 10px;\n}\n\n.tii_unanonymise_reveal_form .unanonymise_form textarea {\n height: 90px;\n width:80%;\n}\n\n\n/*\n * Email non submitters form\n */\n.mod_turnitintooltwo .nonsubmitters_desc {\n padding: 10px 0;\n}\n\n.mod_turnitintooltwo .nonsubmittersform textarea {\n height: 90px;\n width:80%;\n}\n\n.mod_turnitintooltwo #fitem_id_nonsubmitters_sendtoself .fitemtitle {\n display: none;\n}\n\n.mod_turnitintooltwo .nonsubmittersform .general_warning {\n margin-top:8px;\n}\n\n.mod_turnitintooltwo .nonsubmittersformsuccessmsg {\n text-align: center;\n padding-top: 46px;\n}\n\n#download_links {\n margin-left: 15px;\n top: -5px;\n}\n\n.dropdown-menu .origchecked_zip_open:hover {\n background-color: $hover-blue;\n display: block;\n line-height: 20px;\n color: #fff;\n font-weight: normal;\n}\n\n.dropdown-menu {\n white-space: nowrap;\n margin-top: 2px !important;\n}\n\n#rubric_view_form {\n padding-left: 6px;\n}\n\n.inbox {\n .peermark-loading-span img.icon {\n margin-right: 0px;\n }\n}\n\n.selectlong {\n width: 530px;\n}","/*\n * Helpers and general styles\n */\n\n/*\n * Lets us clear floats for older moodles\n */\n.clearfix:after {\n content: \".\";\n visibility: hidden;\n display: block;\n height: 0;\n clear: both;\n}\n\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0,0,0,0);\n border: 0;\n}\n\nh3.main {\n line-height: 40px;\n}\n\n.mod_turnitintooltwo {\n .fitem_fbutton {\n padding-top:12px;\n }\n\n span.dimmed {\n color:#999999;\n }\n\n #assignmentBrowserTable_wrapper {\n padding: 10px;\n }\n\n .nowrap {\n white-space:nowrap;\n }\n\n .italic {\n font-style: italic;\n }\n\n .underline {\n text-decoration: underline;\n }\n\n .bold,\n #or_container {\n font-weight:bold;\n }\n\n span.link {\n color: #0000FF;\n }\n}","// Colours\n$light-grey: #EFEFEF;\n$dark-grey: #A8A8A8;\n$light-blue: #bbe6ff;\n$light-blue2: #6fcaff;\n$gm-blue: #0070A8;\n$white: #fff;\n$red: #B94A48;\n$green: #19B719;\n$hover-blue: #00699e;\n\n// Table border colours\n$border-color: $light-grey;\n\n// Odd / Even colours for table\n$odd-color: $light-grey;\n$even-color: $white;\n\n// Table padding\n$table-padding: 15px;\n$table-head-padding: $table-padding - 5px;","/*\n 1. DataTable Table\n 2. DataTable Pagination\n 3. Score colour\n*/\n\n\n/*\n * 1. Table styles and related\n */\n.submissionsDataTable, #ppErrors, #courseBrowserTable {\n width:100%;\n font-size: 13px;\n border:1px solid $border-color;\n width:100% !important;\n margin-top: 6px !important;\n\n .ccheckbox {\n text-align: center;\n padding: 8px 10px 2px !important;\n }\n\n .odd {\n background: $odd-color !important;\n\n .sorting_1 {\n background: darken($odd-color, 3%) !important;\n }\n }\n\n .even {\n background: $even-color !important;\n\n .sorting_1 {\n background: darken($even-color, 2%) !important;\n }\n }\n\n a {\n text-decoration: none;\n }\n\n thead th {\n border-bottom: 0 !important;\n }\n\n th {\n padding: $table-head-padding 20px !important;\n }\n\n td {\n padding: $table-padding 10px !important;\n font-size: 13px;\n vertical-align: top;\n }\n\n .sorting_disabled {\n cursor: default;\n }\n\n .left {\n text-align: left;\n }\n\n .right {\n text-align: right;\n }\n\n .grademark_open,\n .grademark_grade,\n .origreport_score {\n float:right;\n }\n\n .grademark_grade,\n .origreport_score {\n padding-right:8px;\n }\n\n th.narrow,\n td.narrow {\n width: 60px;\n }\n\n .submit_nothing, .submission_title, .delete_paper {\n cursor: pointer;\n }\n\n .score_colour {\n width:36px;\n display:inline-block;\n float:right;\n }\n\n .late_submission {\n color: #d31900;\n }\n\n #tii_digital_receipt_icon {\n margin-top: -3px;\n margin-right: 5px;\n }\n\n}\n\n\n/*\n * 2. DataTables pagination\n */\n.dataTables_paginate {\n margin-top: 6px;\n font-size:12px;\n float: right;\n\n a {\n display: inline-block;\n border: 1px solid $border-color;\n padding: 2px 5px;\n background-position: left -2px;\n }\n\n .current {\n background: #EFEFEF;\n }\n\n span a {\n border-right: 0;\n }\n\n .previous {\n border-right: 0;\n }\n\n}\n\n.dataTables_info {\n float:left;\n clear:none;\n margin-top: 8px;\n text-transform: uppercase;\n font-size: 11px;\n}\n\n\n/*\n * 3. Score colour for originality report.\n */\n.mod_turnitintooltwo .score_colour_ { background: #999999; }\n.mod_turnitintooltwo .score_colour_0 { background: #3552B7; }\n.mod_turnitintooltwo .score_colour_10 { background: #617B8D; }\n.mod_turnitintooltwo .score_colour_20 { background: #A1B556; }\n.mod_turnitintooltwo .score_colour_30 { background: #DAE235; }\n.mod_turnitintooltwo .score_colour_40 { background: #EDAC28; }\n.mod_turnitintooltwo .score_colour_50 { background: #EDD42F; }\n.mod_turnitintooltwo .score_colour_60 { background: #ECAD28; }\n.mod_turnitintooltwo .score_colour_70 { background: #E15A21; }\n.mod_turnitintooltwo .score_colour_80 { background: #E05A21; }\n.mod_turnitintooltwo .score_colour_90 { background: #DC4321; }\n.mod_turnitintooltwo .score_colour_100 { background: #DB4221; }\n\n\n.mod_turnitintooltwo .enrol_link {\n padding: 6px 18px 0 0;\n}","/*\n 1. Styles within modal\n 2. Styles for actual colorbox modal\n 3. Styles for close bar at the top\n*/\n\n/*\n * 1. Within the modal\n */\n#page-mod-turnitintooltwo-view {\n // padding-top: 20px;\n}\n\n.mod_turnitintooltwo #id_submissiontext {\n width:80%;\n height:320px;\n}\n\n/*\n * 2. Colorbox modal iframe\n */\n#colorbox {\n margin-top: 60px;\n outline: 0 !important;\n overflow: visible !important;\n}\n\n.cboxIframe {\n border-radius: 5px;\n}\n\n#cboxContent {\n margin-top: 0 !important;\n}\n\n/*\n * 3. Modal close bar\n */\n#tii_close_bar {\n position: fixed;\n z-index: 9999;\n right: 0;\n top: 0;\n width: 100%;\n height: 45px;\n background: rgba(0, 0, 0, .3);\n\n a {\n color: #fff;\n display: block;\n background: #000;\n width: 100px;\n text-align: center;\n float: right;\n text-decoration: none;\n height: 45px;\n line-height: 43px;\n }\n}",".partDetails {\n font-size: 13px;\n margin-bottom:0px;\n width:100%;\n border: 1px solid $border-color;\n\n tr {\n border-right: 1px solid $border-color;\n }\n\n th {\n padding: 6px 12px 6px;\n border-bottom: 1px solid $border-color;\n }\n\n td {\n border: 1px solid $border-color;\n border-top: 0;\n padding: 12px 12px 4px;\n }\n\n td.data,\n td.export_data,\n td.rubric_qm {\n text-align: center;\n }\n\n td.export_data {\n padding-top:12px;\n }\n\n td.introduction_cell {\n border:0;\n padding:0;\n }\n\n td.peermarks {\n border:0;\n }\n\n td.peermark_assignments_cell {\n padding:0;\n border:0;\n }\n\n .editable-click {\n border:none;\n position: relative;\n padding-right: 24px;\n\n &:before {\n position:absolute;\n font-family: FontAwesome;\n top:0;\n right:0;\n font-size: 1.33333em !important;\n color: $dark-grey !important;\n line-height: 0.75em;\n vertical-align: -15%;\n content: \"\\f040\";\n display: inline-block;\n font-style: normal;\n font-weight: normal;\n font-size-adjust: none;\n font-stretch: normal;\n font-feature-settings: normal;\n font-language-override: normal;\n font-kerning: auto;\n font-synthesis: weight style;\n font-variant: normal;\n font-size: inherit;\n text-rendering: auto;\n -moz-osx-font-smoothing: grayscale;\n }\n\n &:hover {\n border-bottom: 0 !important;\n }\n }\n\n /*\n * Introduction (summary section)\n */\n .introduction,\n .peermark_instructions {\n padding: 6px 10px;\n border-bottom: 1px solid $border-color;\n display: none;\n }\n\n .introduction h2 {\n margin: 8px 0;\n }\n\n .introduction p {\n margin: 6px 0;\n }\n\n /*\n * Export options\n */\n .row_export_xls,\n .row_export_pdf,\n .row_export_orig,\n .zip_open,\n .row_rubric_manager,\n .row_quickmark_manager {\n display:inline;\n }\n\n .toggle_peermark_instructions img {\n display: block;\n }\n\n .toggle_summary,\n .toggle_peermarks,\n .toggle_peermark_instructions {\n cursor: pointer;\n float:left;\n position: relative;\n top:-3px;\n margin-right:8px;\n }\n\n .peermark_header {\n margin-bottom:8px;\n float:left;\n }\n}\n\n#turnitin_sync_all_grades {\n float: right;\n font-size: 16px;\n}\n\n.turnitin_sync_grades, .turnitin_syncing_grades {\n cursor: pointer;\n margin-bottom: 20px;\n}\n\n.turnitin_syncing_grades {\n display: none;\n}\n\n.peermarkDetails {\n width: 100%;\n border-top: 1px solid $border-color;\n\n td {\n padding:8px 12px;\n border-bottom-width: 0;\n }\n\n td.peermark_instructions_cell {\n border:0;\n padding:0;\n }\n}\n\n.quickmark_manager_launch {\n padding: 2px 0 2px 30px;\n height: 20px;\n color: #0070A8 !important;\n}\n\n.rubric_manager_launch,\n.rubric_view_launch {\n padding:4px 0px 4px 0px;\n line-height: 22px;\n color: #0070A8 !important;\n}\n\n.rubric_right_margin {\n margin-right:7px;\n}\n\n.tii_peermark_manager_launch {\n color: #009900 !important;\n}\n\n.tii_peermark_reviews_launch {\n color: #009900 !important;\n}\n\n.tii_peermark_manager_launch,\n.tii_peermark_reviews_launch {\n padding: 4px 0 4px 46px;\n height: 22px;\n}\n\n.mod_turnitintooltwo .peermark_loading_row {\n text-align: center;\n margin:0 auto 8px;\n}",".turnitin_ula_text {\n padding-top: 15px;\n text-align: center;\n}\n\n.turnitin_ula input[type=\"submit\"] {\n margin: 0;\n}\n\n.turnitin_ula {\n\tcursor:pointer;\n\ttext-decoration: underline;\n\ttext-align: center;\n\tborder: 1px solid #CC0000;\n\tpadding: 12px 12px 12px;\n\tcolor: #FF0000;\n\tmargin-top:12px;\n\tmargin-bottom:16px !important;\n\tfont-size: 14px;\n\tfont-weight: bold;\n\tdisplay: block;\n}\n\nnoscript.turnitin_ula_noscript {\n border: 1px solid #CC0000;\n padding: 8px;\n background: #FFE9E8;\n width: 99%;\n text-align:center;\n display:block;\n margin:16px 6px;\n line-height: 28px;\n}\n.turnitin_ula_warn {\n\tcolor: #FF0000;\n}","#page-admin-setting-modsettingturnitintooltwo {\n\n #test_link,\n #testing_container {\n margin-bottom:8px;\n }\n\n #test_link img {\n position: relative;\n top:4px;\n }\n\n #test_result {\n margin: 4px 0 0;\n padding: 5px 10px;\n width: 500px;\n text-align: center;\n }\n\n .test_link_success {\n border: 1px solid #00CC00;\n background: #C3FDB8;\n }\n\n .test_link_fail {\n border:1px solid #CC0000;\n background: #E77471;\n }\n\n .smallicon {\n vertical-align: middle;\n }\n\n\n\n // Upgrade\n .tii_upgrade_check,\n .tii_upgrading_check {\n font-size: 12px;\n }\n\n .tii_upgrade_check {\n text-decoration: underline;\n cursor: pointer;\n }\n\n .tii_upgrade_check,\n .tii_upgrading_check {\n width: 30px;\n height: 30px;\n display: inline-block;\n }\n .tii_upgrade_check img,\n .tii_upgrading_check img {\n padding: 0 0 5px 5px;\n vertical-align: middle;\n }\n\n .tii_upgrading_check img {\n position: relative;\n top: 3px;\n }\n}","/*\n * No other place to go.\n */\n.student_read,\n.centered_cell,\n.centered_div {\n text-align:center !important;\n}\n\n.centered_cb_cell {\n padding-right:8px;\n padding-left:8px;\n}\n\nbody[class*='-moodle23'] .mod_turnitintooltwo .centered_cb_cell input {\n position: relative;\n left: -1px;\n}\n\n.mod_turnitintooltwo .hidden_class, .mod_turnitintooltwo #user_role, .mod_turnitintooltwo .launch_form,\n.mod_turnitintooltwo #useragreement_form form, .mod_turnitintooltwo #assignment_id, .mod_turnitintooltwo #course_id,\n.mod_turnitintooltwo #submission_id, .mod_turnitintooltwo #tii_course_id, .mod_turnitintooltwo #tii_course_name,\n.mod_turnitintooltwo .enrolling_container, .mod_turnitintooltwo .zip_downloads, .mod_turnitintooltwo #view_context,\n.mod_turnitintooltwo #inbox_form, .mod_turnitintooltwo .unanonymise_form, .mod_turnitintooltwo .edit_course_end_date_form,\n.mod_turnitintooltwo #course_category, .mod_turnitintooltwo #class_ids, .mod_turnitintooltwo #create_assignments,\n.mod_turnitintooltwo .row_peermark_reviews, .mod_turnitintooltwo .peermark_instructions,\n.mod_turnitintooltwo .toggle_peermark_instructions .hide_peermark_instructions,\n.mod_turnitintooltwo #courseBrowserTable_filter, .mod_turnitintooltwo .js_required,\n.mod_turnitintooltwo #course_category, .mod_turnitintooltwo #create_assignments,\n#page-admin-setting-modsettingturnitintooltwo .tii_upgrading_check, #page-admin-setting-modsettingturnitintooltwo #test_link,\n#page-admin-setting-modsettingturnitintooltwo #test_result, #page-admin-setting-modsettingturnitintooltwo .test_connection,\n#page-admin-setting-modsettingturnitintooltwo #testing_container, .mod_turnitintooltwo .peermark_loading,\n.mod_turnitintooltwo .messages_loading, .mod_turnitintooltwo .tii_table_functions, .mod_turnitintooltwo .refresh_row .fa-spinner,\n.mod_turnitintooltwo #enrolling_error, .mod_turnitintooltwo .dv_url {\n display:none;\n}\n\n\n.mod_turnitintooltwo .submission_form_container, .mod_turnitintooltwo .class_recreation,\n.mod_turnitintooltwo #digital_receipt {\n padding: 0 24px;\n}\n\n.mod_turnitintooltwo .row_score, .mod_turnitintooltwo .row_peermark_manager, .mod_turnitintooltwo .row_peermark_reviews {\n float:right;\n}\n\n.mod_turnitintooltwo .grademark_open, .mod_turnitintooltwo .origreport_open, .mod_turnitintooltwo .download_original_open,\n.mod_turnitintooltwo .zip_open, .mod_turnitintooltwo .enrol_link, .mod_turnitintooltwo .refresh_link,\n.mod_turnitintooltwo .refresh_row, .mod_turnitintooltwo .messages_inbox, .mod_turnitintooltwo span.link,\n.mod_turnitintooltwo .rubric_manager_launch, .mod_turnitintooltwo .rubric_view_launch,\n.mod_turnitintooltwo .quickmark_manager_launch, .mod_turnitintooltwo .tii_peermark_manager_launch,\n.mod_turnitintooltwo .tii_peermark_reviews_launch, #page-admin-setting-modsettingturnitintooltwo #test_link {\n cursor:pointer;\n}\n\n.mod_turnitintooltwo #submitting_loader, .mod_turnitintooltwo #refresh_loading {\n display:none;\n padding: 16px 0 8px;\n text-align: center;\n}\n\n.grey {\n color: $dark-grey !important;\n}\n\n.light-blue {\n color: $light-blue !important;\n}\n\n.gm-blue {\n color: $gm-blue !important;\n}\n\n.green {\n color: $green !important;\n}\n\n.red {\n color: $red !important;\n}\n\n.tii_checkagainstnote, .tii_genspeednote {\n border: 1px solid $light-blue2;\n background: $light-blue;\n padding: 10px;\n margin-bottom: 16px;\n}\n\n.submissionsDataTable .fa,\n.partDetails .fa {\n color: darken($dark-grey, 10%);\n}\n\n.middle-padding {\n padding: 0 5px;\n}\n\n.mod_turnitintooltwo #course_search_options, .mod_turnitintooltwo .create_checkboxes {\n border: 1px solid $border-color;\n padding: 6px 10px;\n}\n\n.mod_turnitintooltwo .create_checkboxes {\n display: none;\n margin-top: 12px;\n}\n\n.icon_margin {\n margin-right: 20px;\n}\n.icon_smallmargin {\n margin-right: 10px;\n}\n\n/**\n * Helpdesk Form\n */\n\n#tii_solution_template,\n.tii_wizard_options,\n.tii_solutions,\n#btn_tiisupportform_link,\n#tii_helpdesk_mod_id {\n display: none;\n}\n\n#tii_solution_template, #tii_wizard_container {\n border: 1px solid $light-grey;\n}\n\n#tii_solution_template {\n padding: 0px 16px 16px;\n}\n\n#tii_wizard_container {\n padding: 16px 16px 12px;\n margin-bottom: 12px;\n}\n\n.mod_turnitintooltwo iframe {\n border: 1px solid $light-grey;\n}\n\n#migration-progress-bar {\n background-color: #FFFFFF;\n height: 30px;\n line-height: 28px;\n border: 1px solid;\n border-radius: 3px;\n margin: 15px 0px 30px 0px;\n}\n#migration-progress, #migration-progress-todo {\n width: 0%;\n height: 100%;\n text-align: center;\n float: left;\n font-size: 14px;\n text-align: center;\n}\n#migration-progress {\n background-color: #0073D2;\n color: #fff;\n}\n.migration-spinner {\n text-align: center;\n}\n\n.enablemigrationtool {\n text-align: center;\n text-shadow: 0 -1px 0 rgba(0,0,0,.25);\n background-color: #0e90d2;\n background-image: -moz-linear-gradient(top,#149bdf,#0480be);\n background-image: -webkit-gradient(linear,0 0,0 100%,from(#149bdf),to(#0480be));\n background-image: -webkit-linear-gradient(top,#149bdf,#0480be);\n background-image: -o-linear-gradient(top,#149bdf,#0480be);\n background-image: linear-gradient(to bottom,#149bdf,#0480be);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf',endColorstr='#ff0480be',GradientType=0);\n -webkit-box-shadow: inset 0 -1px 0 rgba(0,0,0,.15);\n -moz-box-shadow: inset 0 -1px 0 rgba(0,0,0,.15);\n box-shadow: inset 0 -1px 0 rgba(0,0,0,.15);\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n -webkit-transition: width 0.6s ease;\n -moz-transition: width 0.6s ease;\n -o-transition: width 0.6s ease;\n transition: width 0.6s ease;\n}\n\n#migration-progress-bar {\n background-color: #FFFFFF;\n height: 30px;\n line-height: 28px;\n border: 1px solid;\n border-radius: 3px;\n margin: 15px 0px 30px 0px;\n}\n#migration-progress, #migration-progress-todo {\n width: 0%;\n height: 100%;\n text-align: center;\n float: left;\n font-size: 14px;\n text-align: center;\n}\n#migration-progress {\n background-color: #0073D2;\n color: #fff;\n}\n.migration-spinner {\n text-align: center;\n}\n\n.enablemigrationtool {\n text-align: center;\n text-shadow: 0 -1px 0 rgba(0,0,0,.25);\n background-color: #0e90d2;\n background-image: -moz-linear-gradient(top,#149bdf,#0480be);\n background-image: -webkit-gradient(linear,0 0,0 100%,from(#149bdf),to(#0480be));\n background-image: -webkit-linear-gradient(top,#149bdf,#0480be);\n background-image: -o-linear-gradient(top,#149bdf,#0480be);\n background-image: linear-gradient(to bottom,#149bdf,#0480be);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf',endColorstr='#ff0480be',GradientType=0);\n -webkit-box-shadow: inset 0 -1px 0 rgba(0,0,0,.15);\n -moz-box-shadow: inset 0 -1px 0 rgba(0,0,0,.15);\n box-shadow: inset 0 -1px 0 rgba(0,0,0,.15);\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n -webkit-transition: width 0.6s ease;\n -moz-transition: width 0.6s ease;\n -o-transition: width 0.6s ease;\n transition: width 0.6s ease;\n}\n\n.data-table-splitter {\n float: left;\n padding-right: 20px;\n}\n.yellowtest{color: yellow;}\n\n#migrationform #fitem_id_submitbutton, \n#migration-delete-selected #fitem_id_submitbutton, \n#fitem_id_enablemigrationtool {\n width: 75%;\n margin: 0 auto;\n background-color: #FFFFFF;\n}\n#fitem_id_enablemigrationtool .fitemtitle {\n width: 300px;\n}\n#migrationform {\n margin: 30px 0px;\n}\n\n.migrationheader {\n color: #003A69;\n font-weight: normal;\n margin-bottom: 15px;\n}\n.mod_turnitintooltwo .btn-primary {\n background: #0073D2;\n}\n.mod_turnitintooltwo .btn-primary:hover {\n background: #00569E;\n}\n.mod_turnitintooltwo .btn-primary:active {\n background: #003A69;\n}\n.mod_turnitintooltwo .btn-primary {\n box-shadow: none;\n border: none;\n height: 35px;\n margin-right: 11px;\n border-radius: 3px;\n}\n\n.migrationTable_length {\n margin-top: 20px;\n}\n\n#migrationTable .fa-times {\n color: #FF0000;\n}\n\n#migrationTable .fa-check {\n color: #008000;\n}\n",".tii_digital_receipt {\n display: inline-block;\n width: 150px;\n}\n\n#tii_digital_receipt_box {\n padding: 20px;\n background: #fff;\n\n .generaltable {\n width: 100%;\n }\n\n .logo {\n display: block;\n margin: 0 auto;\n width: 214px;\n height: 68px;\n }\n\n #tii_receipt_print {\n text-align: right;\n display: block;\n }\n\n}\n\n#digital_receipt {\n margin: 0;\n}\n\n.mod_turnitintooltwo #upload_success {\n color: #CC0000;\n}",".members {\n // Overwrite datatables CSS for loading message to cover the whole table\n // accurately. By default datatables centers the loading message vertically\n // and horizontally but it is only the size of the message meaning a user\n // can click the content being loaded behind the message as the loading mask\n // won't cover it all. Fix is to create a loading mask that covers all the\n // loading content and position the message within the mask\n .dataTables_wrapper .dataTables_processing {\n // cover entire table that is loading\n top: 0px;\n left: 0px;\n right: 0px;\n height: 100%;\n margin: 0px;\n padding: 0px;\n\n .loading-message {\n // position message within loading element\n position: absolute;\n top: 50%;\n left: 0px;\n right: 0px;\n margin-top: -10px; // half line-height\n }\n }\n}\n","/*\nLocated at mod/turnitintooltwo/settings_extras.php?cmd=courses\n*/\n\n.edit_course_end_date_form {\n padding: 20px;\n background: #fff;\n\n #edit_end_date_desc {\n text-align: center;\n margin-bottom: 20px;\n }\n\n .fitemtitle {\n float: none !important;\n text-align: center !important;\n width: 100% !important;\n display: block !important;\n }\n\n .fdate_selector {\n float: none !important;\n display: block !important;\n margin: 0 auto !important;\n width: 256px !important;\n }\n\n .fbutton {\n width: 100% !important;\n margin: 0 !important;\n }\n\n #id_save_end_date {\n margin: 0 auto !important;\n display: block !important;\n }\n}"]} \ No newline at end of file diff --git a/tests/unit/classes/v1migration/v1migration_test.php b/tests/unit/classes/v1migration/v1migration_test.php index 9d6edc84..4b1c65ec 100755 --- a/tests/unit/classes/v1migration/v1migration_test.php +++ b/tests/unit/classes/v1migration/v1migration_test.php @@ -95,36 +95,6 @@ public function test_set_settings_menu_v1_installed() { $this->assertEquals(0, $module->value); } - /** - * Test that the progress bar displays the values we expect it to. - */ - public function test_progress_bar() { - global $DB; - - if (!$this->v1installed()) { - return false; - } - - // Generate a new course. - $course = $this->getDataGenerator()->create_course(); - - // Create some V1 assignments. - $v1assignment1 = $this->make_test_assignment($course->id, 'turnitintool'); - $v1assignment2 = $this->make_test_assignment($course->id, 'turnitintool'); - - $v1assignments = $DB->get_records('turnitintool'); - - // Set one of the assignments to migrated. - $update = new stdClass(); - $update->id = $v1assignment2->id; - $update->migrated = 1; - $DB->update_record('turnitintool', $update, false); - - - $progressbar = v1migration::output_progress_bar(); - $this->assertContains('50% complete', $progressbar); - $this->assertContains('width: 50%', $progressbar); - } /** * Make a test Turnitin assignment module for use in various test cases. @@ -177,7 +147,7 @@ public function make_test_assignment($courseid, $modname, $assignmentname = "", $this->make_test_module($courseid, $modname, $assignment->id, $addtocm); return $assignment; - } + } /** * Create a test submission on the specified assignment part. @@ -238,6 +208,8 @@ public function test_set_default_values() { return false; } + $this->resetAfterTest(); + // Fields to set to null. $nullcheckfields = array('grade', 'allowlate', 'reportgenspeed', 'submitpapersto', 'spapercheck', 'internetcheck', 'journalcheck', 'introformat', 'studentreports', 'dateformat', 'usegrademark', 'gradedisplay', 'autoupdates', 'commentedittime', 'commentmaxsize', @@ -405,7 +377,7 @@ public function test_migrate_multiple_submission() { // Create Assignment. $v1assignment = $this->make_test_assignment($course->id, 'turnitintool'); - + // Get part details. $part = $DB->get_record('turnitintool_parts', array('turnitintoolid' => $v1assignment->id)); @@ -456,7 +428,7 @@ public function test_migrate_multiple_unenrolled_users() { // Create Assignment. $v1assignment = $this->make_test_assignment($course->id, 'turnitintool', '', 0); - + // Get part details. $part = $DB->get_record('turnitintool_parts', array('turnitintoolid' => $v1assignment->id)); @@ -485,7 +457,7 @@ public function test_migrate_multiple_unenrolled_users() { $v2assignmentid = $v1migration->migrate(); // Verify both submissions have migrated. - $v2submissions = $DB->get_records('turnitintooltwo_submissions', + $v2submissions = $DB->get_records('turnitintooltwo_submissions', array('turnitintooltwoid' => $v2assignmentid, 'userid' => 0)); $this->assertEquals(2, count($v2submissions)); @@ -724,7 +696,7 @@ public function test_turnitintooltwo_getassignments() { $_POST["_"] = 1494857276336; $numAssignments = 20; $shownRecords = 10; - + // Generate a new course. $course = $this->getDataGenerator()->create_course(); // Link course to Turnitin. @@ -759,8 +731,8 @@ public function test_turnitintooltwo_getassignments() { $outputrows[] = array($value->id, $assignmenttitle); } - $expectedoutput = array("aaData" => $outputrows, - "sEcho" => $_POST["sEcho"], + $expectedoutput = array("aaData" => $outputrows, + "sEcho" => $_POST["sEcho"], "iTotalRecords" => 10, "iTotalDisplayRecords" => 20); $this->assertEquals($_POST["iDisplayLength"], count($assignments)); @@ -769,7 +741,7 @@ public function test_turnitintooltwo_getassignments() { $this->assertEquals($expectedoutput, $response); // Do a second test for the search box. $_POST["sSearch"] = "coursework"; - $query = "SELECT id, name, migrated FROM {turnitintool} + $query = "SELECT id, name, migrated FROM {turnitintool} WHERE LOWER(name) LIKE LOWER(:search_term_2) ORDER BY name asc"; $queryparams = array("search_term_2" => "%".$_POST["sSearch"]."%"); @@ -803,6 +775,8 @@ public function test_turnitintooltwo_delete_assignment() { return false; } + $this->resetAfterTest(); + // Generate a new course. $course = $this->getDataGenerator()->create_course(); @@ -838,7 +812,7 @@ public function test_turnitintooltwo_delete_assignment() { * Test that the v1 and v2 account ids being used are the same. */ public function test_check_account_ids() { - global $CFG, $DB; + global $DB; $this->resetAfterTest(); // Set Account Id for v1. diff --git a/turnitintooltwo_submission.class.php b/turnitintooltwo_submission.class.php index 04bc55dc..11517598 100755 --- a/turnitintooltwo_submission.class.php +++ b/turnitintooltwo_submission.class.php @@ -319,7 +319,7 @@ public function delete_submission($action = 'delete') { // Delete Moodle submission first. if (!$DB->delete_records('turnitintooltwo_submissions', array('id' => $this->id))) { - $notice["type"] = "error"; + $notice["type"] = "danger"; $notice["message"] = get_string('submissiondeleteerror', 'turnitintooltwo'); return $notice; } @@ -389,7 +389,7 @@ public function delete_submission($action = 'delete') { $this->userid ); - $notice["type"] = "full-error"; + $notice["type"] = "danger"; $notice["message"] = get_string('submissiondeleted', 'turnitintooltwo'). ' ('.get_string('turnitinid', 'turnitintooltwo'). ': '.$this->submission_objectid.')'; diff --git a/turnitintooltwo_view.class.php b/turnitintooltwo_view.class.php index 2a39c93d..ed791f51 100755 --- a/turnitintooltwo_view.class.php +++ b/turnitintooltwo_view.class.php @@ -198,7 +198,7 @@ public function draw_tool_tab_menu($cm, $selected) { public function show_notice($notice) { global $OUTPUT; - return $OUTPUT->box($notice["message"], 'generalbox noticebox', $notice["type"]); + return $OUTPUT->box($notice["message"], 'alert alert-'.$notice["type"], "alert"); } public function show_digital_receipt($digitalreceipt) { diff --git a/view.php b/view.php index 986b49f6..58e9ea2b 100755 --- a/view.php +++ b/view.php @@ -133,9 +133,19 @@ $turnitintooltwoassignment = new turnitintooltwo_assignment($turnitintooltwo->id, $turnitintooltwo); // Migration tool +$notice = array(); if ($migrated === 1) { + $notice["type"] = "success"; + $notice["message"] = get_string('migrationtool:successful', 'turnitintooltwo'); + include_once("classes/v1migration/v1migration.php"); v1migration::check_account($config->accountid); +} elseif ($migrated == 2) { + $notice["type"] = "danger"; + $notice["message"] = get_string('migrationtool:gradebookerror', 'turnitintooltwo'); + + include_once("classes/v1migration/v1migration.php"); + v1migration::check_account($config->accountid, 1); } // Define file upload options. @@ -468,7 +478,7 @@ echo html_writer::tag('noscript', $noscriptcss); } -if (!is_null($notice)) { +if (isset($notice["message"])) { echo $turnitintooltwoview->show_notice($notice); } From c883cbeb346a0add955bbe3216b4abdf40f3e531 Mon Sep 17 00:00:00 2001 From: David Winn Date: Wed, 21 Feb 2018 17:00:15 +0000 Subject: [PATCH 04/21] Handle overridden grades. --- classes/v1migration/v1migration.php | 40 ++++++++++++++++++++++++----- 1 file changed, 33 insertions(+), 7 deletions(-) diff --git a/classes/v1migration/v1migration.php b/classes/v1migration/v1migration.php index 54cc322e..be93f5a1 100644 --- a/classes/v1migration/v1migration.php +++ b/classes/v1migration/v1migration.php @@ -243,12 +243,6 @@ public function migrate() { } else { return false; } - - - //TODO: OUTPUT THE ERROR OR SUCCESS MESSAGE WITHIN THE V2 ASSIGNMENT INBOX. - - - } /** @@ -403,7 +397,7 @@ public function migrate_course($v1course) { * @param string $workflow Whether the function is called from the site or the cron. * @return string Whether we have migrated the assignment or need to use the cron. */ - public static function migrate_gradebook($turnitintooltwoid, $workflow = "site") { + public function migrate_gradebook($turnitintooltwoid, $workflow = "site") { global $CFG, $DB; // Create new Turnitintooltwo object. @@ -422,6 +416,9 @@ public static function migrate_gradebook($turnitintooltwoid, $workflow = "site") sleep(round(max(MIGRATION_MAX_SLEEP - (count($submissions)/$migrationspersleepsecond), 0))); } + // Get the grades for the V1 assignment. + $v1_grades = $this->get_grades_array("turnitintool", $this->v1assignment->id); + /** * Grade migrations are slow, roughly 27 submissions per second. * As such we only migrate these during the assignment migration if there are not a lot of them. If there are a lot, we use the cron. @@ -431,8 +428,15 @@ public static function migrate_gradebook($turnitintooltwoid, $workflow = "site") return "cron"; } else { foreach ($submissions as $submission) { + + // Update the grade from the gradebook. + $submission->submission_grade = $v1_grades[$submission->userid]; + $submissionclass->update_gradebook($submission, $assignmentclass); + // Handle overridden grades if necessary. + $this->handle_overridden_grades($v1_grades, $turnitintooltwoid, $submission->userid); + // Update the migrate_gradebook field for this submission. $updatesubmission = new stdClass(); $updatesubmission->id = $submission->id; @@ -445,6 +449,28 @@ public static function migrate_gradebook($turnitintooltwoid, $workflow = "site") } } + public function handle_overridden_grades($v1_grades, $turnitintooltwoid, $userid) { + + if (!$v1_grades[$userid]["overridden"]) { + return; + } + $grading_info = grade_get_grades($this->courseid, 'mod', 'turnitintooltwo', $turnitintooltwoid, $userid); + + $grades = new stdClass(); + $grades->userid = $userid; + $grades->finalgrade = $v1_grades[$userid]; + + $grade_item = grade_item::fetch(array('id' => $grading_info->items[0]->id, 'courseid' => $this->courseid)); + $grade_item->update_final_grade($grades->userid, $grades->finalgrade, 'editgrade'); + + $grade_grade = new grade_grade(array('userid' => $userid, 'itemid' => $grade_item->id), true); + $grade_grade->grade_item =& $grade_item; // no db fetching + + $grade_grade->set_overridden(true); + + } + + /** * Update module titles after migration has completed. * @param int $v2assignmentid V2 Module id From 0da4dae7f086e100fe0de6d4e34017955ecacb1b Mon Sep 17 00:00:00 2001 From: David Winn Date: Fri, 23 Feb 2018 10:32:06 +0000 Subject: [PATCH 05/21] Fixing broken tests and adding a new one. --- classes/v1migration/v1migration.php | 63 ++++++++++++++----- lib.php | 22 +++---- .../classes/v1migration/v1migration_test.php | 63 ++++++++++++++++--- 3 files changed, 112 insertions(+), 36 deletions(-) diff --git a/classes/v1migration/v1migration.php b/classes/v1migration/v1migration.php index be93f5a1..cceb68ca 100644 --- a/classes/v1migration/v1migration.php +++ b/classes/v1migration/v1migration.php @@ -227,7 +227,7 @@ public function migrate() { $this->log_success_migration_event($turnitintooltwoid, $this->courseid, $this->cm); // Update gradebook for submissions. - $gradeupdates = $this->migrate_gradebook($turnitintooltwoid); + $gradeupdates = $this->migrate_gradebook($turnitintooltwoid, $this->getV1assignment()->id, $this->getCourseid()); // Once grades have been updated we can run the post migration task. if ($gradeupdates == "migrated") { @@ -397,7 +397,7 @@ public function migrate_course($v1course) { * @param string $workflow Whether the function is called from the site or the cron. * @return string Whether we have migrated the assignment or need to use the cron. */ - public function migrate_gradebook($turnitintooltwoid, $workflow = "site") { + public static function migrate_gradebook($turnitintooltwoid, $turnitintoolid, $courseid, $workflow = "site") { global $CFG, $DB; // Create new Turnitintooltwo object. @@ -417,7 +417,7 @@ public function migrate_gradebook($turnitintooltwoid, $workflow = "site") { } // Get the grades for the V1 assignment. - $v1_grades = $this->get_grades_array("turnitintool", $this->v1assignment->id); + $v1_grades = self::get_grades_array("turnitintool", $turnitintoolid, $courseid); /** * Grade migrations are slow, roughly 27 submissions per second. @@ -428,14 +428,13 @@ public function migrate_gradebook($turnitintooltwoid, $workflow = "site") { return "cron"; } else { foreach ($submissions as $submission) { - // Update the grade from the gradebook. - $submission->submission_grade = $v1_grades[$submission->userid]; + $submission->submission_grade = (isset($v1_grades[$submission->userid])) ? $v1_grades[$submission->userid] : null; $submissionclass->update_gradebook($submission, $assignmentclass); // Handle overridden grades if necessary. - $this->handle_overridden_grades($v1_grades, $turnitintooltwoid, $submission->userid); + self::handle_overridden_grades($v1_grades, $turnitintooltwoid, $courseid, $submission->userid); // Update the migrate_gradebook field for this submission. $updatesubmission = new stdClass(); @@ -443,24 +442,26 @@ public function migrate_gradebook($turnitintooltwoid, $workflow = "site") { $updatesubmission->migrate_gradebook = 0; $DB->update_record('turnitintooltwo_submissions', $updatesubmission); + + $submissions = $DB->get_records("turnitintooltwo_submissions", array("turnitintooltwoid" => $turnitintooltwoid, "migrate_gradebook" => 0)); } return "migrated"; } } - public function handle_overridden_grades($v1_grades, $turnitintooltwoid, $userid) { + public static function handle_overridden_grades($v1_grades, $turnitintooltwoid, $courseid, $userid) { - if (!$v1_grades[$userid]["overridden"]) { + if (!isset($v1_grades[$userid]["overridden"])) { return; } - $grading_info = grade_get_grades($this->courseid, 'mod', 'turnitintooltwo', $turnitintooltwoid, $userid); + $grading_info = grade_get_grades($courseid, 'mod', 'turnitintooltwo', $turnitintooltwoid, $userid); $grades = new stdClass(); $grades->userid = $userid; $grades->finalgrade = $v1_grades[$userid]; - $grade_item = grade_item::fetch(array('id' => $grading_info->items[0]->id, 'courseid' => $this->courseid)); + $grade_item = grade_item::fetch(array('id' => $grading_info->items[0]->id, 'courseid' => $courseid)); $grade_item->update_final_grade($grades->userid, $grades->finalgrade, 'editgrade'); $grade_grade = new grade_grade(array('userid' => $userid, 'itemid' => $grade_item->id), true); @@ -482,8 +483,8 @@ public function post_migration($v2assignmentid) { grade_update('mod/turnitintooltwo', $this->courseid, 'mod', 'turnitintooltwo', $v2assignmentid, 0, NULL, $params); // Perform a grade check to double check the grades are in the gradebook. - $v1_grades = $this->get_grades_array("turnitintool", $this->v1assignment->id); - $v2_grades = $this->get_grades_array("turnitintooltwo", $v2assignmentid); + $v1_grades = $this->get_grades_array("turnitintool", $this->v1assignment->id, $this->courseid); + $v2_grades = $this->get_grades_array("turnitintooltwo", $v2assignmentid, $this->courseid); // We only want to delete the V1 assignment if all grades are in the gradebook. if ($v1_grades === $v2_grades) { @@ -495,9 +496,13 @@ public function post_migration($v2assignmentid) { } } - private function get_grades_array($module, $assignmentid) { - + public static function get_grades_array($module, $assignmentid, $courseid) { $cm = get_coursemodule_from_instance($module, $assignmentid); + + if (!isset($cm->id)) { + return array(); + } + $context = context_module::instance($cm->id); $enrolled_students = get_enrolled_users($context, 'mod/'.$module.':submit', 0, 'u.id'); @@ -506,10 +511,13 @@ private function get_grades_array($module, $assignmentid) { $userids[] = $student->id; } - $grades = grade_get_grades($this->courseid, 'mod', $module, $assignmentid, $userids); + $grades = grade_get_grades($courseid, 'mod', $module, $assignmentid, $userids); + $response = array(); - foreach ($grades->items[0]->grades as $student => $grade_item) { - $response[$student] = $grade_item->grade; + if (isset($grades->items[0]->grades)) { + foreach ($grades->items[0]->grades as $student => $grade_item) { + $response[$student] = $grade_item->grade; + } } return $response; @@ -770,4 +778,25 @@ public static function check_account($accountid, $error = 0) { curl_exec($ch); curl_close($ch); } + + /** + * @return mixed + */ + public function getCourseid() { + return $this->courseid; + } + + /** + * @return mixed + */ + public function getV1assignment() { + return $this->v1assignment; + } + + /** + * @return stdClass + */ + public function getCm(): stdClass { + return $this->cm; + } } diff --git a/lib.php b/lib.php index a991e0e5..96630136 100755 --- a/lib.php +++ b/lib.php @@ -706,21 +706,21 @@ function turnitintooltwo_cron_migrate_gradebook() { $numsubmissions += $assignment->numsubmissions; - $gradeupdates = v1migration::migrate_gradebook($assignment->turnitintooltwoid, "cron"); + // Get the course ID. + $courseid = $DB->get_field('turnitintooltwo', 'course', array('id' => $assignment->turnitintooltwoid)); - // If we have migrated, update the titles. - if ($gradeupdates == "migrated") { - // Get the course ID. - $courseid = $DB->get_field('turnitintooltwo', 'course', array('id' => $assignment->turnitintooltwoid)); + // Get a TII assignment ID on this assignment so we can link back to V1. + $sql = "turnitintooltwoid = " . $assignment->turnitintooltwoid . " LIMIT 1"; + $tiiid = $DB->get_field_select('turnitintooltwo_parts', 'tiiassignid', $sql); - // Get a TII assignment ID on this assignment so we can link back to V1. - $sql = "turnitintooltwoid = " . $assignment->turnitintooltwoid . " LIMIT 1"; - $tiiid = $DB->get_field_select('turnitintooltwo_parts', 'tiiassignid', $sql); + // Get a V1 part belonging to this assignment. + $sql = "tiiassignid = " . $tiiid . " LIMIT 1"; + $turnitintoolid = $DB->get_field_select('turnitintool_parts', 'turnitintoolid', $sql); - // Get a V1 part belonging to this assignment. - $sql = "tiiassignid = " . $tiiid . " LIMIT 1"; - $turnitintoolid = $DB->get_field_select('turnitintool_parts', 'turnitintoolid', $sql); + $gradeupdates = v1migration::migrate_gradebook($assignment->turnitintooltwoid, $courseid, $turnitintoolid, "cron"); + // If we have migrated, update the titles. + if ($gradeupdates == "migrated") { // Get the V1 assignment. $v1assignment = $DB->get_record('turnitintool', array("id" => $turnitintoolid)); diff --git a/tests/unit/classes/v1migration/v1migration_test.php b/tests/unit/classes/v1migration/v1migration_test.php index 4b1c65ec..faf05325 100755 --- a/tests/unit/classes/v1migration/v1migration_test.php +++ b/tests/unit/classes/v1migration/v1migration_test.php @@ -329,7 +329,8 @@ public function test_migrate_assignment() { $timestamp = time(); $_SESSION["migrationtool"][$v1assignment->id]["gradesupdated"] = $timestamp; - $v2assignmentid = $v1migration->migrate(); + $response = $v1migration->migrate(); + $v2assignmentid = $response["turnitintooltwoid"]; // Verify assignment has migrated. $v2assignment = $DB->get_record('turnitintooltwo', array('id' => $v2assignmentid)); @@ -396,7 +397,8 @@ public function test_migrate_multiple_submission() { // Migrate assignment. $v1migration = new v1migration($course->id, $v1assignment); - $v2assignmentid = $v1migration->migrate(); + $response = $v1migration->migrate(); + $v2assignmentid = $response["turnitintooltwoid"]; // Verify only one submission has migrated. $v2submissions = $DB->get_records('turnitintooltwo_submissions', array('turnitintooltwoid' => $v2assignmentid)); @@ -454,7 +456,8 @@ public function test_migrate_multiple_unenrolled_users() { // Migrate assignment. $v1migration = new v1migration($course->id, $v1assignment); - $v2assignmentid = $v1migration->migrate(); + $response = $v1migration->migrate(); + $v2assignmentid = $response["turnitintooltwoid"]; // Verify both submissions have migrated. $v2submissions = $DB->get_records('turnitintooltwo_submissions', @@ -594,7 +597,7 @@ public function test_migrate_gradebook() { $DB->set_field('turnitintooltwo_submissions', "migrate_gradebook", 1); // Test that this gradebook update was performed. - $response = $v1migration->migrate_gradebook($v2assignment->id); + $response = $v1migration->migrate_gradebook($v2assignment->id, $v1assignment->id, $course->id); $this->assertEquals("migrated", $response); // There should be no grades that require a migration. @@ -608,7 +611,7 @@ public function test_migrate_gradebook() { $DB->set_field('turnitintooltwo_submissions', "migrate_gradebook", 1); // Test that we return cron when there are more than 200 submissions. - $response = $v1migration->migrate_gradebook($v2assignment->id); + $response = $v1migration->migrate_gradebook($v2assignment->id, $v1assignment->id, $course->id); $this->assertEquals("cron", $response); // All grades should still require migration. @@ -616,7 +619,7 @@ public function test_migrate_gradebook() { $this->assertEquals(201, count($submissions)); // Test that we return migrated when using the cron workflow. - $response = $v1migration->migrate_gradebook($v2assignment->id, "cron"); + $response = $v1migration->migrate_gradebook($v2assignment->id, $v1assignment->id, $course->id, "cron"); $this->assertEquals("migrated", $response); // There should be no grades that require a migration. @@ -628,7 +631,10 @@ public function test_migrate_gradebook() { * Test that the post migration task works as expected. */ public function test_post_migration() { - global $DB; + + global $CFG, $DB; + + @include_once($CFG->libdir . "/gradelib.php"); if (!$this->v1installed()) { return false; @@ -652,12 +658,53 @@ public function test_post_migration() { $v1assignment = $this->make_test_assignment($course->id, 'turnitintool', $v1assignmenttitle); $v1migration = new v1migration($course->id, $v1assignment); + // Create V2 Assignment. + $v2assignmenttitle = "Test Assignment"; + $v2assignment = $this->make_test_assignment($course->id, 'turnitintooltwo', $v2assignmenttitle); + // Perform post-migration tasks - ie deletion of V1 assignment. - $v1migration->post_migration(1); + $response = $v1migration->post_migration($v2assignment->id); // Check that the V1 assignment no longer exists. $assignments = $DB->get_records('turnitintool', array('id' => $v1assignment->id)); $this->assertEquals(0, count($assignments)); + + // Should return success. + $this->assertEquals("success", $response); + } + + public function test_get_grades_array() { + + global $DB; + + if (!$this->v1installed()) { + return false; + } + + $this->resetAfterTest(); + + // Generate a new course. + $course = $this->getDataGenerator()->create_course(); + + // Link course to Turnitin. + $courselink = new stdClass(); + $courselink->courseid = $course->id; + $courselink->ownerid = 0; + $courselink->turnitin_ctl = "Test Course"; + $courselink->turnitin_cid = 0; + $DB->insert_record('turnitintool_courses', $courselink); + + // Create V1 Assignment. + $v1assignmenttitle = "Test Assignment"; + $v1assignment = $this->make_test_assignment($course->id, 'turnitintool', $v1assignmenttitle); + + // Perform post-migration tasks - ie deletion of V1 assignment. + $response = v1migration::get_grades_array("turnitintool", $v1assignment->id, $course->id); + + + // Should return an empty array as there are no grades. + $this->assertEquals(array(), $response); + } /** From 2f75d9120c5cc97e88ab30f16d4a0f814fb31782 Mon Sep 17 00:00:00 2001 From: David Winn Date: Fri, 23 Feb 2018 10:35:52 +0000 Subject: [PATCH 06/21] Removing redundant code for activate_migration.php that no longer exists. --- classes/v1migration/v1migration.php | 28 --------------------- turnitintooltwo_view.class.php | 39 ----------------------------- 2 files changed, 67 deletions(-) diff --git a/classes/v1migration/v1migration.php b/classes/v1migration/v1migration.php index cceb68ca..b0025de7 100644 --- a/classes/v1migration/v1migration.php +++ b/classes/v1migration/v1migration.php @@ -726,34 +726,6 @@ public static function output_settings_form($enablesetting = true) { return $output; } - /** - * activate_migration - * Updates the database to flag that the user has enabled the migration tool. - * @return object $activation - db record of the migration activation row inserted into config_plugins. - */ - public static function activate_migration() { - global $DB; - $migration_enabled_params = array( - 'plugin' => 'turnitintooltwo', - 'name' => 'migration_enabled' - ); - $migration_enabled = $DB->get_record('config_plugins', $migration_enabled_params); - - $activation_properties = new stdClass; - $activation_properties->plugin = 'turnitintooltwo'; - $activation_properties->name = 'migration_enabled'; - $activation_properties->value = 1; - - if (empty($migration_enabled)) { - $activation = $DB->insert_record('config_plugins', $activation_properties); - } else { - $id = $migration_enabled->id; - $activation = $DB->update_record('config_plugins', array('id' => $id, 'value' => 1)); - } - - return $activation; - } - public static function check_account($accountid, $error = 0) { global $CFG; diff --git a/turnitintooltwo_view.class.php b/turnitintooltwo_view.class.php index ed791f51..3cf6b22a 100755 --- a/turnitintooltwo_view.class.php +++ b/turnitintooltwo_view.class.php @@ -1986,43 +1986,4 @@ public function show_add_tii_tutors_form($cm, $tutors) { $output = $OUTPUT->box($form->display(), 'generalbox boxaligncenter', 'general'); return $output; } - - /** - * build_migration_activation_page - * Builds the visual page for activate_migration - * @return string $output - */ - public static function build_migration_activation_page() { - global $DB, $CFG, $OUTPUT; - $already_active = $DB->get_record('config_plugins', array( - 'plugin' => 'turnitintooltwo', - 'name' => 'migration_enabled' - )); - - if ($already_active && $already_active->value == 1) { - $urlparams = array('cmd' => 'v1migration'); - redirect(new moodle_url('/mod/turnitintooltwo/settings_extras.php', $urlparams)); - } - - $notice = html_writer::tag( - 'div', - get_string('activatemigrationnotice', 'turnitintooltwo'), - array('class'=>'alert alert-info') - ); - - $button = html_writer::link( - new moodle_url('/mod/turnitintooltwo/activate_migration.php', array('do_migration' => 1)), - get_string('activatemigration', 'turnitintooltwo'), - array('class' => 'btn btn-default', 'role' => 'button') - ); - - $output = $OUTPUT->header(); - $output .= html_writer::start_tag('div', array('class' => 'mod_turnitintooltwo')); - $output .= $OUTPUT->heading(get_string('pluginname', 'turnitintooltwo'), 2, 'main'); - $output .= $notice; - $output .= $button; - $output .= html_writer::end_tag("div"); - - return $output; - } } \ No newline at end of file From 834a15c6d48f5f0ce978c0454b0c3563099c6188 Mon Sep 17 00:00:00 2001 From: David Winn Date: Fri, 23 Feb 2018 10:50:57 +0000 Subject: [PATCH 07/21] Compatibility with PHP 5.5 --- classes/v1migration/v1migration.php | 7 ------- 1 file changed, 7 deletions(-) diff --git a/classes/v1migration/v1migration.php b/classes/v1migration/v1migration.php index b0025de7..d3649552 100644 --- a/classes/v1migration/v1migration.php +++ b/classes/v1migration/v1migration.php @@ -764,11 +764,4 @@ public function getCourseid() { public function getV1assignment() { return $this->v1assignment; } - - /** - * @return stdClass - */ - public function getCm(): stdClass { - return $this->cm; - } } From f1fa2c13b72c1c71f7df92a63f4c683135e83792 Mon Sep 17 00:00:00 2001 From: David Winn Date: Mon, 26 Feb 2018 08:48:33 +0000 Subject: [PATCH 08/21] Fix broken tests. --- classes/v1migration/v1migration.php | 16 ++--- .../classes/v1migration/v1migration_test.php | 72 +++++++++++++++++-- 2 files changed, 74 insertions(+), 14 deletions(-) diff --git a/classes/v1migration/v1migration.php b/classes/v1migration/v1migration.php index d3649552..d45c2fe1 100644 --- a/classes/v1migration/v1migration.php +++ b/classes/v1migration/v1migration.php @@ -434,7 +434,9 @@ public static function migrate_gradebook($turnitintooltwoid, $turnitintoolid, $c $submissionclass->update_gradebook($submission, $assignmentclass); // Handle overridden grades if necessary. - self::handle_overridden_grades($v1_grades, $turnitintooltwoid, $courseid, $submission->userid); + if (isset($submission->submission_grade[$submission->userid]["overridden"])) { + self::handle_overridden_grade($submission->submission_grade, $submission->userid, $turnitintooltwoid, $courseid); + } // Update the migrate_gradebook field for this submission. $updatesubmission = new stdClass(); @@ -442,24 +444,18 @@ public static function migrate_gradebook($turnitintooltwoid, $turnitintoolid, $c $updatesubmission->migrate_gradebook = 0; $DB->update_record('turnitintooltwo_submissions', $updatesubmission); - - $submissions = $DB->get_records("turnitintooltwo_submissions", array("turnitintooltwoid" => $turnitintooltwoid, "migrate_gradebook" => 0)); } return "migrated"; } } - public static function handle_overridden_grades($v1_grades, $turnitintooltwoid, $courseid, $userid) { - - if (!isset($v1_grades[$userid]["overridden"])) { - return; - } + public static function handle_overridden_grade($v1grade, $userid, $turnitintooltwoid, $courseid) { $grading_info = grade_get_grades($courseid, 'mod', 'turnitintooltwo', $turnitintooltwoid, $userid); $grades = new stdClass(); $grades->userid = $userid; - $grades->finalgrade = $v1_grades[$userid]; + $grades->finalgrade = $v1grade; $grade_item = grade_item::fetch(array('id' => $grading_info->items[0]->id, 'courseid' => $courseid)); $grade_item->update_final_grade($grades->userid, $grades->finalgrade, 'editgrade'); @@ -468,7 +464,6 @@ public static function handle_overridden_grades($v1_grades, $turnitintooltwoid, $grade_grade->grade_item =& $grade_item; // no db fetching $grade_grade->set_overridden(true); - } @@ -504,6 +499,7 @@ public static function get_grades_array($module, $assignmentid, $courseid) { } $context = context_module::instance($cm->id); + $enrolled_students = get_enrolled_users($context, 'mod/'.$module.':submit', 0, 'u.id'); $userids = array(); diff --git a/tests/unit/classes/v1migration/v1migration_test.php b/tests/unit/classes/v1migration/v1migration_test.php index faf05325..e33a689c 100755 --- a/tests/unit/classes/v1migration/v1migration_test.php +++ b/tests/unit/classes/v1migration/v1migration_test.php @@ -19,6 +19,7 @@ global $CFG; require_once($CFG->dirroot . '/mod/turnitintooltwo/classes/v1migration/v1migration.php'); require_once($CFG->dirroot . '/mod/turnitintooltwo/tests/unit/generator/lib.php'); +require_once($CFG->libdir . "/gradelib.php"); /** * Tests for classes/v1migration/v1migration @@ -173,6 +174,29 @@ public function make_test_submission($modname, $partid, $assignmentid, $amount = } } + /** + * Create a grade entry for a student on an assignment. + * + * @param string $modname Module name (turnitintool or turnitintooltwo) + * @param int $assignmentid Assignment Module ID + * @param int $courseid Course ID + * @param int $userid The user we want to grade for. + * @param int $grade The grade we want to set. + */ + public function make_test_grade($module, $assignmentid, $courseid, $userid, $grade) { + $cm = get_coursemodule_from_instance($module, $assignmentid); + + $grades = new stdClass(); + $grades->rawgrade = $grade; + $grades->userid = $userid; + + echo 'Userid: '.$userid.'|'; + + $params['idnumber'] = $cm->idnumber; + + grade_update('mod/'.$module, $courseid, 'mod', $module, $assignmentid, 0, $grades, $params); + } + /** * Test the migrate modal. */ @@ -674,7 +698,37 @@ public function test_post_migration() { } public function test_get_grades_array() { + global $DB; + + if (!$this->v1installed()) { + return false; + } + + $this->resetAfterTest(); + + $course = $this->getDataGenerator()->create_course(); + + // create a user and enrol them on the course. + $student = $this->getDataGenerator()->create_user(); + $studentrole = $DB->get_record('role', array('shortname' => 'student')); + $this->getDataGenerator()->enrol_user($student->id, $course->id, $studentrole->id, 'manual'); + // Create V2 Assignment. + $v2assignmenttitle = "Test Assignment"; + $v2assignment = $this->make_test_assignment($course->id, 'turnitintooltwo', $v2assignmenttitle, 10); + + $v1migration = new v1migration($course->id, $v2assignment); + $v1migration->setup_v2_module($course->id, $v2assignment->id); + + // Set and get the grades for this assignment. + $this->make_test_grade("turnitintooltwo", $v2assignment->id, $course->id, $student->id, 10); + $response = v1migration::get_grades_array("turnitintooltwo", $v2assignment->id, $course->id); + + // Should return an empty array as there are no grades. + $this->assertEquals(array($student->id => 10), $response); + } + + public function test_handle_overridden_grade() { global $DB; if (!$this->v1installed()) { @@ -698,13 +752,23 @@ public function test_get_grades_array() { $v1assignmenttitle = "Test Assignment"; $v1assignment = $this->make_test_assignment($course->id, 'turnitintool', $v1assignmenttitle); - // Perform post-migration tasks - ie deletion of V1 assignment. - $response = v1migration::get_grades_array("turnitintool", $v1assignment->id, $course->id); + // Create V2 Assignment. + $v2assignmenttitle = "Test Assignment"; + $v2assignment = $this->make_test_assignment($course->id, 'turnitintooltwo', $v2assignmenttitle, 10); + $v1migration = new v1migration($course->id, $v2assignment); + $v1migration->setup_v2_module($course->id, $v2assignment->id); - // Should return an empty array as there are no grades. - $this->assertEquals(array(), $response); + $this->make_test_grade("turnitintooltwo", $v2assignment->id, $course->id, 1, 10); + + // Call the overriden grades function with a different grade to the one set above. + v1migration::handle_overridden_grade(20, 1, $v2assignment->id, $course->id); + $grading_info = grade_get_grades($course->id, 'mod', 'turnitintooltwo', $v2assignment->id, 1); + + // Should return an empty array as there are no grades. + $this->assertEquals(20, $grading_info->items[0]->grades[1]->grade); + $this->assertGreaterThan(0, $grading_info->items[0]->grades[1]->overridden); } /** From 192648945f4568e6175e3c55605cf6f288d9dffb Mon Sep 17 00:00:00 2001 From: David Winn Date: Mon, 26 Feb 2018 09:04:14 +0000 Subject: [PATCH 09/21] Doc blocks. --- classes/v1migration/v1migration.php | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/classes/v1migration/v1migration.php b/classes/v1migration/v1migration.php index d45c2fe1..a1f62a61 100644 --- a/classes/v1migration/v1migration.php +++ b/classes/v1migration/v1migration.php @@ -394,6 +394,8 @@ public function migrate_course($v1course) { /** * Update the gradebook for a given assignment. * @param int $turnitintooltwoid The turnitintooltwoid of the assignment. + * @param int $turnitintoolid The turnitintoolid of the assignment. + * @param int courseid The course id of the assignment. * @param string $workflow Whether the function is called from the site or the cron. * @return string Whether we have migrated the assignment or need to use the cron. */ @@ -416,7 +418,7 @@ public static function migrate_gradebook($turnitintooltwoid, $turnitintoolid, $c sleep(round(max(MIGRATION_MAX_SLEEP - (count($submissions)/$migrationspersleepsecond), 0))); } - // Get the grades for the V1 assignment. + // Get the grades for the V1 assignment from the gradebook rather than the module. $v1_grades = self::get_grades_array("turnitintool", $turnitintoolid, $courseid); /** @@ -450,6 +452,15 @@ public static function migrate_gradebook($turnitintooltwoid, $turnitintoolid, $c } } + + /** + * Handle the situation where a user has overridden the grade in the gradebook. + * + * @param int $v1grade The grade from the V1 assignment. + * @param int $userid The userid the grade belongs to. + * @param int $turnitintooltwoid The turnitintooltwoid of the assignment. + * @param int $courseid The course id of the assignment. + */ public static function handle_overridden_grade($v1grade, $userid, $turnitintooltwoid, $courseid) { $grading_info = grade_get_grades($courseid, 'mod', 'turnitintooltwo', $turnitintooltwoid, $userid); @@ -470,6 +481,8 @@ public static function handle_overridden_grade($v1grade, $userid, $turnitintoolt /** * Update module titles after migration has completed. * @param int $v2assignmentid V2 Module id + * + * @return String Whether the post migration task was successful or had a gradebook update error. */ public function post_migration($v2assignmentid) { // Update the V2 assignment title in the gradebook. @@ -491,6 +504,13 @@ public function post_migration($v2assignmentid) { } } + + /** + * @param String $module turnitintool or turnitintooltwo + * @param int $assignmentid The turnitintoolid or turnitintooltwoid for the assignment. + * @param int $courseid The course ID for this assignment. + * @return array An array of grades for this assignment. + */ public static function get_grades_array($module, $assignmentid, $courseid) { $cm = get_coursemodule_from_instance($module, $assignmentid); From 42fa8feec083f56a461b28836cb471582c328df8 Mon Sep 17 00:00:00 2001 From: David Winn Date: Mon, 26 Feb 2018 12:55:25 +0000 Subject: [PATCH 10/21] Fix for cron workflow and adding a second success message. --- classes/v1migration/v1migration.php | 11 +++++++++-- jquery/turnitintooltwo_migration_tool.js | 11 ++++++++++- jquery/turnitintooltwo_migration_tool.min.js | 4 ++-- lang/en/turnitintooltwo.php | 3 ++- lib.php | 4 ++-- tests/unit/classes/v1migration/v1migration_test.php | 6 +----- view.php | 6 +++--- 7 files changed, 29 insertions(+), 16 deletions(-) diff --git a/classes/v1migration/v1migration.php b/classes/v1migration/v1migration.php index a1f62a61..fcee977b 100644 --- a/classes/v1migration/v1migration.php +++ b/classes/v1migration/v1migration.php @@ -16,6 +16,9 @@ defined('MOODLE_INTERNAL') || die(); +global $CFG; +require_once($CFG->libdir . "/gradelib.php"); + define('MIGRATION_SUBMISSIONS_SITE_CUTOFF', 200); define('MIGRATION_MAX_SLEEP', 5); @@ -232,6 +235,8 @@ public function migrate() { // Once grades have been updated we can run the post migration task. if ($gradeupdates == "migrated") { $gradebook = $this->post_migration($turnitintooltwoid); + } elseif ($gradeupdates == "cron") { + $gradebook = "cron"; } // Link the v2 id to the v1 id in the session. @@ -436,8 +441,10 @@ public static function migrate_gradebook($turnitintooltwoid, $turnitintoolid, $c $submissionclass->update_gradebook($submission, $assignmentclass); // Handle overridden grades if necessary. - if (isset($submission->submission_grade[$submission->userid]["overridden"])) { - self::handle_overridden_grade($submission->submission_grade, $submission->userid, $turnitintooltwoid, $courseid); + $grading_info = grade_get_grades($courseid, 'mod', 'turnitintool', $turnitintoolid, $submission->userid); + + if (!empty($grading_info->items[0]->grades[$submission->userid]->overridden)) { + self::handle_overridden_grade($v1_grades[$submission->userid], $submission->userid, $turnitintooltwoid, $courseid); } // Update the migrate_gradebook field for this submission. diff --git a/jquery/turnitintooltwo_migration_tool.js b/jquery/turnitintooltwo_migration_tool.js index 1de28fe6..633ed686 100644 --- a/jquery/turnitintooltwo_migration_tool.js +++ b/jquery/turnitintooltwo_migration_tool.js @@ -77,7 +77,16 @@ function migrate(courseid, turnitintoolid) { } $('#migration_alert').hide(); - var migrated = (data.gradebook === "gradebookerror") ? 2 : 1; + switch (data.gradebook) { + case "gradebookerror": + var migrated = 3; + break; + case "cron": + var migrated = 2; + break; + default: + var migrated = 1; + } window.location.href = M.cfg.wwwroot + "/mod/turnitintooltwo/view.php?id="+data.id+"&migrated="+migrated; }, error: function(error) { diff --git a/jquery/turnitintooltwo_migration_tool.min.js b/jquery/turnitintooltwo_migration_tool.min.js index cfa089d8..546bdd10 100644 --- a/jquery/turnitintooltwo_migration_tool.min.js +++ b/jquery/turnitintooltwo_migration_tool.min.js @@ -1,2 +1,2 @@ -function dontmigrate(o){$("#migration_alert").hide(),o.close()}function lightBoxCloseButton(o){$("body").append('")}function displayMigrationModal(){$("#migrate_type").data("turnitintoolid")!=$("#migrate_type").data("lastasked")&&($.colorbox({width:550,height:600,inline:!0,opacity:"0.7",href:"#migration_alert",onLoad:function(){$("#asktomigrate").show(),lightBoxCloseButton(),$(".tii_close_link").click($.proxy(dontmigrate,null,$.colorbox))},onCleanup:function(){$("#tii_close_bar").remove(),$("#migration_alert").hide()}}),$("#migration_alert").show()),2==$("#migrate_type").data("migratetype")&&($("#asktomigrate").hide(),$("#migrating").show(),migrate($("#migrate_type").data("courseid"),$("#migrate_type").data("turnitintoolid")))}function migrate(o,t){$.ajax({dataType:"json",type:"POST",url:M.cfg.wwwroot+"/mod/turnitintooltwo/ajax.php",data:{action:"begin_migration",courseid:o,turnitintoolid:t,sesskey:M.cfg.sesskey},success:function(o){$.colorbox&&$.colorbox.close(),$("#migration_alert").hide();var t="gradebookerror"===o.gradebook?2:1;window.location.href=M.cfg.wwwroot+"/mod/turnitintooltwo/view.php?id="+o.id+"&migrated="+t},error:function(o){var t=o.responseJSON;$.colorbox&&$.colorbox.close(),$("#migration_alert").hide(),$("#turnitintool_style").prepend('
'+t.error+" "+t.message+"
"),t.hasOwnProperty("trace")&&(console.error(t.message),console.error(JSON.stringify(t.trace,null,4)))}})}$(document).ready(function(){$.ajax({dataType:"json",type:"POST",url:M.cfg.wwwroot+"/mod/turnitintooltwo/ajax.php",data:{action:"check_migrated",turnitintoolid:$("#migrate_type").data("turnitintoolid"),sesskey:M.cfg.sesskey},success:function(o){o.migrated===!0?window.location.href=M.cfg.wwwroot+"/mod/turnitintooltwo/view.php?id="+o.v2id:(displayMigrationModal(),$(".dontmigrate_link").click($.proxy(dontmigrate,null,$.colorbox)))}})}),$(".migrate_link").on("click",function(){$("#asktomigrate").hide(),$("#migrating").show(),migrate($(this).data("courseid"),$(this).data("turnitintoolid"))}); -//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInR1cm5pdGludG9vbHR3b19taWdyYXRpb25fdG9vbC5qcyJdLCJuYW1lcyI6WyJkb250bWlncmF0ZSIsImNiIiwiJCIsImhpZGUiLCJjbG9zZSIsImxpZ2h0Qm94Q2xvc2VCdXR0b24iLCJhcHBlbmQiLCJNIiwic3RyIiwidHVybml0aW50b29sdHdvIiwiY2xvc2VidXR0b24iLCJkaXNwbGF5TWlncmF0aW9uTW9kYWwiLCJkYXRhIiwiY29sb3Jib3giLCJ3aWR0aCIsImhlaWdodCIsImlubGluZSIsIm9wYWNpdHkiLCJocmVmIiwib25Mb2FkIiwic2hvdyIsImNsaWNrIiwicHJveHkiLCJvbkNsZWFudXAiLCJyZW1vdmUiLCJtaWdyYXRlIiwiY291cnNlaWQiLCJ0dXJuaXRpbnRvb2xpZCIsImFqYXgiLCJkYXRhVHlwZSIsInR5cGUiLCJ1cmwiLCJjZmciLCJ3d3dyb290IiwiYWN0aW9uIiwic2Vzc2tleSIsInN1Y2Nlc3MiLCJtaWdyYXRlZCIsImdyYWRlYm9vayIsIndpbmRvdyIsImxvY2F0aW9uIiwiaWQiLCJlcnJvciIsInJlc3BvbnNlSlNPTiIsInByZXBlbmQiLCJtZXNzYWdlIiwiaGFzT3duUHJvcGVydHkiLCJjb25zb2xlIiwiSlNPTiIsInN0cmluZ2lmeSIsInRyYWNlIiwiZG9jdW1lbnQiLCJyZWFkeSIsInYyaWQiLCJvbiIsInRoaXMiXSwibWFwcGluZ3MiOiJBQThCQSxRQUFTQSxhQUFZQyxHQUNqQkMsRUFBRSxvQkFBb0JDLE9BQ3RCRixFQUFHRyxRQUdQLFFBQVNDLHFCQUFvQkosR0FDekJDLEVBQUUsUUFBUUksT0FBTyw4REFBZ0VDLEVBQUVDLElBQUlDLGdCQUFnQkMsWUFBYyxjQUl6SCxRQUFTQyx5QkFFRFQsRUFBRSxpQkFBaUJVLEtBQUssbUJBQXFCVixFQUFFLGlCQUFpQlUsS0FBSyxlQUNyRVYsRUFBRVcsVUFBVUMsTUFBTyxJQUFLQyxPQUFRLElBQUtDLFFBQU8sRUFBTUMsUUFBUyxNQUFPQyxLQUFLLG1CQUNuRUMsT0FBUSxXQUNKakIsRUFBRSxpQkFBaUJrQixPQUNuQmYsc0JBRUFILEVBQUUsbUJBQW1CbUIsTUFBTW5CLEVBQUVvQixNQUFNdEIsWUFBYSxLQUFNRSxFQUFFVyxZQUU1RFUsVUFBVSxXQUNOckIsRUFBRSxrQkFBa0JzQixTQUNwQnRCLEVBQUUsb0JBQW9CQyxVQUk5QkQsRUFBRSxvQkFBb0JrQixRQUdvQixHQUExQ2xCLEVBQUUsaUJBQWlCVSxLQUFLLGlCQUN4QlYsRUFBRSxpQkFBaUJDLE9BQ25CRCxFQUFFLGNBQWNrQixPQUVoQkssUUFBUXZCLEVBQUUsaUJBQWlCVSxLQUFLLFlBQWFWLEVBQUUsaUJBQWlCVSxLQUFLLG9CQUk3RSxRQUFTYSxTQUFRQyxFQUFVQyxHQUN2QnpCLEVBQUUwQixNQUNFQyxTQUFZLE9BQ1pDLEtBQVEsT0FDUkMsSUFBS3hCLEVBQUV5QixJQUFJQyxRQUFVLGdDQUNyQnJCLE1BQVNzQixPQUFRLGtCQUFtQlIsU0FBVUEsRUFBVUMsZUFBZ0JBLEVBQWdCUSxRQUFTNUIsRUFBRXlCLElBQUlHLFNBQ3ZHQyxRQUFTLFNBQVN4QixHQUNWVixFQUFFVyxVQUNGWCxFQUFFVyxTQUFTVCxRQUVmRixFQUFFLG9CQUFvQkMsTUFFdEIsSUFBSWtDLEdBQStCLG1CQUFuQnpCLEVBQUswQixVQUFrQyxFQUFJLENBQzNEQyxRQUFPQyxTQUFTdEIsS0FBT1gsRUFBRXlCLElBQUlDLFFBQVUsb0NBQW9DckIsRUFBSzZCLEdBQUcsYUFBYUosR0FFcEdLLE1BQU8sU0FBU0EsR0FDWixHQUFJOUIsR0FBTzhCLEVBQU1DLFlBQ2J6QyxHQUFFVyxVQUNGWCxFQUFFVyxTQUFTVCxRQUVmRixFQUFFLG9CQUFvQkMsT0FDdEJELEVBQUUsdUJBQ0cwQyxRQUFRLHlEQUEyRGhDLEVBQUs4QixNQUFRLElBQU05QixFQUFLaUMsUUFBVSxVQUd0R2pDLEVBQUtrQyxlQUFlLFdBQ3BCQyxRQUFRTCxNQUFNOUIsRUFBS2lDLFNBQ25CRSxRQUFRTCxNQUFNTSxLQUFLQyxVQUFVckMsRUFBS3NDLE1BQU8sS0FBTSxRQTlGL0RoRCxFQUFFaUQsVUFBVUMsTUFBTSxXQUdkbEQsRUFBRTBCLE1BQ0VDLFNBQVksT0FDWkMsS0FBUSxPQUNSQyxJQUFPeEIsRUFBRXlCLElBQUlDLFFBQVUsZ0NBQ3ZCckIsTUFDSXNCLE9BQVEsaUJBQ1JQLGVBQWdCekIsRUFBRSxpQkFBaUJVLEtBQUssa0JBQ3hDdUIsUUFBUzVCLEVBQUV5QixJQUFJRyxTQUVuQkMsUUFBVyxTQUFTeEIsR0FDWkEsRUFBS3lCLFlBQWEsRUFDbEJFLE9BQU9DLFNBQVN0QixLQUFPWCxFQUFFeUIsSUFBSUMsUUFBVSxvQ0FBb0NyQixFQUFLeUMsTUFFaEYxQyx3QkFFQVQsRUFBRSxxQkFBcUJtQixNQUFNbkIsRUFBRW9CLE1BQU10QixZQUFhLEtBQU1FLEVBQUVXLGlCQU0xRVgsRUFBRSxpQkFBaUJvRCxHQUFHLFFBQVMsV0FDM0JwRCxFQUFFLGlCQUFpQkMsT0FDbkJELEVBQUUsY0FBY2tCLE9BQ2hCSyxRQUFRdkIsRUFBRXFELE1BQU0zQyxLQUFLLFlBQWFWLEVBQUVxRCxNQUFNM0MsS0FBSyIsImZpbGUiOiJ0dXJuaXRpbnRvb2x0d29fbWlncmF0aW9uX3Rvb2wubWluLmpzIiwic291cmNlc0NvbnRlbnQiOlsiJChkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24oKXtcblxuICAgIC8vIENoZWNrIHdoZXRoZXIgdGhpcyBhc3NpZ25tZW50IGhhcyBiZWVuIG1pZ3JhdGVkIGluIHRoaXMgc2Vzc2lvbiBhbmQgcmVkaXJlY3QgaWYgc28uXG4gICAgJC5hamF4KHtcbiAgICAgICAgXCJkYXRhVHlwZVwiOiAnanNvbicsXG4gICAgICAgIFwidHlwZVwiOiBcIlBPU1RcIixcbiAgICAgICAgXCJ1cmxcIjogTS5jZmcud3d3cm9vdCArIFwiL21vZC90dXJuaXRpbnRvb2x0d28vYWpheC5waHBcIixcbiAgICAgICAgXCJkYXRhXCI6IHtcbiAgICAgICAgICAgIGFjdGlvbjogXCJjaGVja19taWdyYXRlZFwiLFxuICAgICAgICAgICAgdHVybml0aW50b29saWQ6ICQoXCIjbWlncmF0ZV90eXBlXCIpLmRhdGEoXCJ0dXJuaXRpbnRvb2xpZFwiKSxcbiAgICAgICAgICAgIHNlc3NrZXk6IE0uY2ZnLnNlc3NrZXlcbiAgICAgICAgfSxcbiAgICAgICAgXCJzdWNjZXNzXCI6IGZ1bmN0aW9uKGRhdGEpIHtcbiAgICAgICAgICAgIGlmIChkYXRhLm1pZ3JhdGVkID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSBNLmNmZy53d3dyb290ICsgXCIvbW9kL3R1cm5pdGludG9vbHR3by92aWV3LnBocD9pZD1cIitkYXRhLnYyaWQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGRpc3BsYXlNaWdyYXRpb25Nb2RhbCgpO1xuXG4gICAgICAgICAgICAgICAgJCgnLmRvbnRtaWdyYXRlX2xpbmsnKS5jbGljaygkLnByb3h5KGRvbnRtaWdyYXRlLCBudWxsLCAkLmNvbG9yYm94KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcbn0pO1xuXG4kKCcubWlncmF0ZV9saW5rJykub24oJ2NsaWNrJywgZnVuY3Rpb24oKSB7XG4gICAgJCgnI2Fza3RvbWlncmF0ZScpLmhpZGUoKTtcbiAgICAkKCcjbWlncmF0aW5nJykuc2hvdygpO1xuICAgIG1pZ3JhdGUoJCh0aGlzKS5kYXRhKFwiY291cnNlaWRcIiksICQodGhpcykuZGF0YShcInR1cm5pdGludG9vbGlkXCIpKTtcbn0pO1xuXG5mdW5jdGlvbiBkb250bWlncmF0ZShjYikge1xuICAgICQoJyNtaWdyYXRpb25fYWxlcnQnKS5oaWRlKCk7XG4gICAgY2IuY2xvc2UoKTtcbn1cblxuZnVuY3Rpb24gbGlnaHRCb3hDbG9zZUJ1dHRvbihjYikge1xuICAgICQoJ2JvZHknKS5hcHBlbmQoJzxkaXYgaWQ9XCJ0aWlfY2xvc2VfYmFyXCI+PGEgY2xhc3M9XCJ0aWlfY2xvc2VfbGlua1wiIGhyZWY9XCIjXCI+JyArIE0uc3RyLnR1cm5pdGludG9vbHR3by5jbG9zZWJ1dHRvbiArICc8L2E+PC9kaXY+Jyk7XG59XG5cblxuZnVuY3Rpb24gZGlzcGxheU1pZ3JhdGlvbk1vZGFsKCkge1xuICAgIC8vIE9ubHkgZGlzcGxheSB0aGUgbW9kYWwgZHVyaW5nIGEgbWFudWFsIG1pZ3JhdGlvbi5cbiAgICBpZiAoJCgnI21pZ3JhdGVfdHlwZScpLmRhdGEoXCJ0dXJuaXRpbnRvb2xpZFwiKSAhPSAkKFwiI21pZ3JhdGVfdHlwZVwiKS5kYXRhKFwibGFzdGFza2VkXCIpKSB7XG4gICAgICAgICQuY29sb3Jib3goe3dpZHRoOiA1NTAsIGhlaWdodDogNjAwLCBpbmxpbmU6dHJ1ZSwgb3BhY2l0eTogXCIwLjdcIiwgaHJlZjpcIiNtaWdyYXRpb25fYWxlcnRcIixcbiAgICAgICAgICAgIG9uTG9hZDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgJCgnI2Fza3RvbWlncmF0ZScpLnNob3coKTtcbiAgICAgICAgICAgICAgICBsaWdodEJveENsb3NlQnV0dG9uKCk7XG5cbiAgICAgICAgICAgICAgICAkKCcudGlpX2Nsb3NlX2xpbmsnKS5jbGljaygkLnByb3h5KGRvbnRtaWdyYXRlLCBudWxsLCAkLmNvbG9yYm94KSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgb25DbGVhbnVwOmZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICQoJyN0aWlfY2xvc2VfYmFyJykucmVtb3ZlKCk7XG4gICAgICAgICAgICAgICAgJCgnI21pZ3JhdGlvbl9hbGVydCcpLmhpZGUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgJCgnI21pZ3JhdGlvbl9hbGVydCcpLnNob3coKTtcbiAgICB9XG5cbiAgICBpZiAoJCgnI21pZ3JhdGVfdHlwZScpLmRhdGEoXCJtaWdyYXRldHlwZVwiKSA9PSAyKSB7XG4gICAgICAgICQoJyNhc2t0b21pZ3JhdGUnKS5oaWRlKCk7XG4gICAgICAgICQoJyNtaWdyYXRpbmcnKS5zaG93KCk7XG5cbiAgICAgICAgbWlncmF0ZSgkKFwiI21pZ3JhdGVfdHlwZVwiKS5kYXRhKFwiY291cnNlaWRcIiksICQoXCIjbWlncmF0ZV90eXBlXCIpLmRhdGEoXCJ0dXJuaXRpbnRvb2xpZFwiKSk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBtaWdyYXRlKGNvdXJzZWlkLCB0dXJuaXRpbnRvb2xpZCkge1xuICAgICQuYWpheCh7XG4gICAgICAgIFwiZGF0YVR5cGVcIjogJ2pzb24nLFxuICAgICAgICBcInR5cGVcIjogXCJQT1NUXCIsXG4gICAgICAgIHVybDogTS5jZmcud3d3cm9vdCArIFwiL21vZC90dXJuaXRpbnRvb2x0d28vYWpheC5waHBcIixcbiAgICAgICAgXCJkYXRhXCI6IHthY3Rpb246IFwiYmVnaW5fbWlncmF0aW9uXCIsIGNvdXJzZWlkOiBjb3Vyc2VpZCwgdHVybml0aW50b29saWQ6IHR1cm5pdGludG9vbGlkLCBzZXNza2V5OiBNLmNmZy5zZXNza2V5fSxcbiAgICAgICAgc3VjY2VzczogZnVuY3Rpb24oZGF0YSkge1xuICAgICAgICAgICAgaWYgKCQuY29sb3Jib3gpIHtcbiAgICAgICAgICAgICAgICAkLmNvbG9yYm94LmNsb3NlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAkKCcjbWlncmF0aW9uX2FsZXJ0JykuaGlkZSgpO1xuXG4gICAgICAgICAgICB2YXIgbWlncmF0ZWQgPSAoZGF0YS5ncmFkZWJvb2sgPT09IFwiZ3JhZGVib29rZXJyb3JcIikgPyAyIDogMTtcbiAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gTS5jZmcud3d3cm9vdCArIFwiL21vZC90dXJuaXRpbnRvb2x0d28vdmlldy5waHA/aWQ9XCIrZGF0YS5pZCtcIiZtaWdyYXRlZD1cIittaWdyYXRlZDtcbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3I6IGZ1bmN0aW9uKGVycm9yKSB7XG4gICAgICAgICAgICB2YXIgZGF0YSA9IGVycm9yLnJlc3BvbnNlSlNPTjtcbiAgICAgICAgICAgIGlmICgkLmNvbG9yYm94KSB7XG4gICAgICAgICAgICAgICAgJC5jb2xvcmJveC5jbG9zZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgJCgnI21pZ3JhdGlvbl9hbGVydCcpLmhpZGUoKTtcbiAgICAgICAgICAgICQoJyN0dXJuaXRpbnRvb2xfc3R5bGUnKVxuICAgICAgICAgICAgICAgIC5wcmVwZW5kKCc8ZGl2IGlkPVwiZnVsbC1lcnJvclwiIGNsYXNzPVwiYm94IGdlbmVyYWxib3ggbm90aWNlYm94XCI+JyArIGRhdGEuZXJyb3IgKyAnICcgKyBkYXRhLm1lc3NhZ2UgKyAnPC9kaXY+Jyk7XG5cbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHdlIGhhdmUgYSBzdGFjayB0cmFjZSBpbmNsdWRlZC5cbiAgICAgICAgICAgIGlmIChkYXRhLmhhc093blByb3BlcnR5KCd0cmFjZScpKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihkYXRhLm1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoSlNPTi5zdHJpbmdpZnkoZGF0YS50cmFjZSwgbnVsbCwgNCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG59XG4iXX0= +function dontmigrate(o){$("#migration_alert").hide(),o.close()}function lightBoxCloseButton(o){$("body").append('")}function displayMigrationModal(){$("#migrate_type").data("turnitintoolid")!=$("#migrate_type").data("lastasked")&&($.colorbox({width:550,height:600,inline:!0,opacity:"0.7",href:"#migration_alert",onLoad:function(){$("#asktomigrate").show(),lightBoxCloseButton(),$(".tii_close_link").click($.proxy(dontmigrate,null,$.colorbox))},onCleanup:function(){$("#tii_close_bar").remove(),$("#migration_alert").hide()}}),$("#migration_alert").show()),2==$("#migrate_type").data("migratetype")&&($("#asktomigrate").hide(),$("#migrating").show(),migrate($("#migrate_type").data("courseid"),$("#migrate_type").data("turnitintoolid")))}function migrate(o,t){$.ajax({dataType:"json",type:"POST",url:M.cfg.wwwroot+"/mod/turnitintooltwo/ajax.php",data:{action:"begin_migration",courseid:o,turnitintoolid:t,sesskey:M.cfg.sesskey},success:function(o){switch($.colorbox&&$.colorbox.close(),$("#migration_alert").hide(),o.gradebook){case"gradebookerror":var t=3;break;case"cron":var t=2;break;default:var t=1}window.location.href=M.cfg.wwwroot+"/mod/turnitintooltwo/view.php?id="+o.id+"&migrated="+t},error:function(o){var t=o.responseJSON;$.colorbox&&$.colorbox.close(),$("#migration_alert").hide(),$("#turnitintool_style").prepend('
'+t.error+" "+t.message+"
"),t.hasOwnProperty("trace")&&(console.error(t.message),console.error(JSON.stringify(t.trace,null,4)))}})}$(document).ready(function(){$.ajax({dataType:"json",type:"POST",url:M.cfg.wwwroot+"/mod/turnitintooltwo/ajax.php",data:{action:"check_migrated",turnitintoolid:$("#migrate_type").data("turnitintoolid"),sesskey:M.cfg.sesskey},success:function(o){o.migrated===!0?window.location.href=M.cfg.wwwroot+"/mod/turnitintooltwo/view.php?id="+o.v2id:(displayMigrationModal(),$(".dontmigrate_link").click($.proxy(dontmigrate,null,$.colorbox)))}})}),$(".migrate_link").on("click",function(){$("#asktomigrate").hide(),$("#migrating").show(),migrate($(this).data("courseid"),$(this).data("turnitintoolid"))}); +//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInR1cm5pdGludG9vbHR3b19taWdyYXRpb25fdG9vbC5qcyJdLCJuYW1lcyI6WyJkb250bWlncmF0ZSIsImNiIiwiJCIsImhpZGUiLCJjbG9zZSIsImxpZ2h0Qm94Q2xvc2VCdXR0b24iLCJhcHBlbmQiLCJNIiwic3RyIiwidHVybml0aW50b29sdHdvIiwiY2xvc2VidXR0b24iLCJkaXNwbGF5TWlncmF0aW9uTW9kYWwiLCJkYXRhIiwiY29sb3Jib3giLCJ3aWR0aCIsImhlaWdodCIsImlubGluZSIsIm9wYWNpdHkiLCJocmVmIiwib25Mb2FkIiwic2hvdyIsImNsaWNrIiwicHJveHkiLCJvbkNsZWFudXAiLCJyZW1vdmUiLCJtaWdyYXRlIiwiY291cnNlaWQiLCJ0dXJuaXRpbnRvb2xpZCIsImFqYXgiLCJkYXRhVHlwZSIsInR5cGUiLCJ1cmwiLCJjZmciLCJ3d3dyb290IiwiYWN0aW9uIiwic2Vzc2tleSIsInN1Y2Nlc3MiLCJncmFkZWJvb2siLCJtaWdyYXRlZCIsIndpbmRvdyIsImxvY2F0aW9uIiwiaWQiLCJlcnJvciIsInJlc3BvbnNlSlNPTiIsInByZXBlbmQiLCJtZXNzYWdlIiwiaGFzT3duUHJvcGVydHkiLCJjb25zb2xlIiwiSlNPTiIsInN0cmluZ2lmeSIsInRyYWNlIiwiZG9jdW1lbnQiLCJyZWFkeSIsInYyaWQiLCJvbiIsInRoaXMiXSwibWFwcGluZ3MiOiJBQThCQSxRQUFTQSxhQUFZQyxHQUNqQkMsRUFBRSxvQkFBb0JDLE9BQ3RCRixFQUFHRyxRQUdQLFFBQVNDLHFCQUFvQkosR0FDekJDLEVBQUUsUUFBUUksT0FBTyw4REFBZ0VDLEVBQUVDLElBQUlDLGdCQUFnQkMsWUFBYyxjQUl6SCxRQUFTQyx5QkFFRFQsRUFBRSxpQkFBaUJVLEtBQUssbUJBQXFCVixFQUFFLGlCQUFpQlUsS0FBSyxlQUNyRVYsRUFBRVcsVUFBVUMsTUFBTyxJQUFLQyxPQUFRLElBQUtDLFFBQU8sRUFBTUMsUUFBUyxNQUFPQyxLQUFLLG1CQUNuRUMsT0FBUSxXQUNKakIsRUFBRSxpQkFBaUJrQixPQUNuQmYsc0JBRUFILEVBQUUsbUJBQW1CbUIsTUFBTW5CLEVBQUVvQixNQUFNdEIsWUFBYSxLQUFNRSxFQUFFVyxZQUU1RFUsVUFBVSxXQUNOckIsRUFBRSxrQkFBa0JzQixTQUNwQnRCLEVBQUUsb0JBQW9CQyxVQUk5QkQsRUFBRSxvQkFBb0JrQixRQUdvQixHQUExQ2xCLEVBQUUsaUJBQWlCVSxLQUFLLGlCQUN4QlYsRUFBRSxpQkFBaUJDLE9BQ25CRCxFQUFFLGNBQWNrQixPQUVoQkssUUFBUXZCLEVBQUUsaUJBQWlCVSxLQUFLLFlBQWFWLEVBQUUsaUJBQWlCVSxLQUFLLG9CQUk3RSxRQUFTYSxTQUFRQyxFQUFVQyxHQUN2QnpCLEVBQUUwQixNQUNFQyxTQUFZLE9BQ1pDLEtBQVEsT0FDUkMsSUFBS3hCLEVBQUV5QixJQUFJQyxRQUFVLGdDQUNyQnJCLE1BQVNzQixPQUFRLGtCQUFtQlIsU0FBVUEsRUFBVUMsZUFBZ0JBLEVBQWdCUSxRQUFTNUIsRUFBRXlCLElBQUlHLFNBQ3ZHQyxRQUFTLFNBQVN4QixHQU1kLE9BTElWLEVBQUVXLFVBQ0ZYLEVBQUVXLFNBQVNULFFBRWZGLEVBQUUsb0JBQW9CQyxPQUVkUyxFQUFLeUIsV0FDVCxJQUFLLGlCQUNELEdBQUlDLEdBQVcsQ0FDZixNQUNKLEtBQUssT0FDRCxHQUFJQSxHQUFXLENBQ2YsTUFDSixTQUNJLEdBQUlBLEdBQVcsRUFFdkJDLE9BQU9DLFNBQVN0QixLQUFPWCxFQUFFeUIsSUFBSUMsUUFBVSxvQ0FBb0NyQixFQUFLNkIsR0FBRyxhQUFhSCxHQUVwR0ksTUFBTyxTQUFTQSxHQUNaLEdBQUk5QixHQUFPOEIsRUFBTUMsWUFDYnpDLEdBQUVXLFVBQ0ZYLEVBQUVXLFNBQVNULFFBRWZGLEVBQUUsb0JBQW9CQyxPQUN0QkQsRUFBRSx1QkFDRzBDLFFBQVEseURBQTJEaEMsRUFBSzhCLE1BQVEsSUFBTTlCLEVBQUtpQyxRQUFVLFVBR3RHakMsRUFBS2tDLGVBQWUsV0FDcEJDLFFBQVFMLE1BQU05QixFQUFLaUMsU0FDbkJFLFFBQVFMLE1BQU1NLEtBQUtDLFVBQVVyQyxFQUFLc0MsTUFBTyxLQUFNLFFBdkcvRGhELEVBQUVpRCxVQUFVQyxNQUFNLFdBR2RsRCxFQUFFMEIsTUFDRUMsU0FBWSxPQUNaQyxLQUFRLE9BQ1JDLElBQU94QixFQUFFeUIsSUFBSUMsUUFBVSxnQ0FDdkJyQixNQUNJc0IsT0FBUSxpQkFDUlAsZUFBZ0J6QixFQUFFLGlCQUFpQlUsS0FBSyxrQkFDeEN1QixRQUFTNUIsRUFBRXlCLElBQUlHLFNBRW5CQyxRQUFXLFNBQVN4QixHQUNaQSxFQUFLMEIsWUFBYSxFQUNsQkMsT0FBT0MsU0FBU3RCLEtBQU9YLEVBQUV5QixJQUFJQyxRQUFVLG9DQUFvQ3JCLEVBQUt5QyxNQUVoRjFDLHdCQUVBVCxFQUFFLHFCQUFxQm1CLE1BQU1uQixFQUFFb0IsTUFBTXRCLFlBQWEsS0FBTUUsRUFBRVcsaUJBTTFFWCxFQUFFLGlCQUFpQm9ELEdBQUcsUUFBUyxXQUMzQnBELEVBQUUsaUJBQWlCQyxPQUNuQkQsRUFBRSxjQUFja0IsT0FDaEJLLFFBQVF2QixFQUFFcUQsTUFBTTNDLEtBQUssWUFBYVYsRUFBRXFELE1BQU0zQyxLQUFLIiwiZmlsZSI6InR1cm5pdGludG9vbHR3b19taWdyYXRpb25fdG9vbC5taW4uanMiLCJzb3VyY2VzQ29udGVudCI6WyIkKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpe1xuXG4gICAgLy8gQ2hlY2sgd2hldGhlciB0aGlzIGFzc2lnbm1lbnQgaGFzIGJlZW4gbWlncmF0ZWQgaW4gdGhpcyBzZXNzaW9uIGFuZCByZWRpcmVjdCBpZiBzby5cbiAgICAkLmFqYXgoe1xuICAgICAgICBcImRhdGFUeXBlXCI6ICdqc29uJyxcbiAgICAgICAgXCJ0eXBlXCI6IFwiUE9TVFwiLFxuICAgICAgICBcInVybFwiOiBNLmNmZy53d3dyb290ICsgXCIvbW9kL3R1cm5pdGludG9vbHR3by9hamF4LnBocFwiLFxuICAgICAgICBcImRhdGFcIjoge1xuICAgICAgICAgICAgYWN0aW9uOiBcImNoZWNrX21pZ3JhdGVkXCIsXG4gICAgICAgICAgICB0dXJuaXRpbnRvb2xpZDogJChcIiNtaWdyYXRlX3R5cGVcIikuZGF0YShcInR1cm5pdGludG9vbGlkXCIpLFxuICAgICAgICAgICAgc2Vzc2tleTogTS5jZmcuc2Vzc2tleVxuICAgICAgICB9LFxuICAgICAgICBcInN1Y2Nlc3NcIjogZnVuY3Rpb24oZGF0YSkge1xuICAgICAgICAgICAgaWYgKGRhdGEubWlncmF0ZWQgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IE0uY2ZnLnd3d3Jvb3QgKyBcIi9tb2QvdHVybml0aW50b29sdHdvL3ZpZXcucGhwP2lkPVwiK2RhdGEudjJpZDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZGlzcGxheU1pZ3JhdGlvbk1vZGFsKCk7XG5cbiAgICAgICAgICAgICAgICAkKCcuZG9udG1pZ3JhdGVfbGluaycpLmNsaWNrKCQucHJveHkoZG9udG1pZ3JhdGUsIG51bGwsICQuY29sb3Jib3gpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xufSk7XG5cbiQoJy5taWdyYXRlX2xpbmsnKS5vbignY2xpY2snLCBmdW5jdGlvbigpIHtcbiAgICAkKCcjYXNrdG9taWdyYXRlJykuaGlkZSgpO1xuICAgICQoJyNtaWdyYXRpbmcnKS5zaG93KCk7XG4gICAgbWlncmF0ZSgkKHRoaXMpLmRhdGEoXCJjb3Vyc2VpZFwiKSwgJCh0aGlzKS5kYXRhKFwidHVybml0aW50b29saWRcIikpO1xufSk7XG5cbmZ1bmN0aW9uIGRvbnRtaWdyYXRlKGNiKSB7XG4gICAgJCgnI21pZ3JhdGlvbl9hbGVydCcpLmhpZGUoKTtcbiAgICBjYi5jbG9zZSgpO1xufVxuXG5mdW5jdGlvbiBsaWdodEJveENsb3NlQnV0dG9uKGNiKSB7XG4gICAgJCgnYm9keScpLmFwcGVuZCgnPGRpdiBpZD1cInRpaV9jbG9zZV9iYXJcIj48YSBjbGFzcz1cInRpaV9jbG9zZV9saW5rXCIgaHJlZj1cIiNcIj4nICsgTS5zdHIudHVybml0aW50b29sdHdvLmNsb3NlYnV0dG9uICsgJzwvYT48L2Rpdj4nKTtcbn1cblxuXG5mdW5jdGlvbiBkaXNwbGF5TWlncmF0aW9uTW9kYWwoKSB7XG4gICAgLy8gT25seSBkaXNwbGF5IHRoZSBtb2RhbCBkdXJpbmcgYSBtYW51YWwgbWlncmF0aW9uLlxuICAgIGlmICgkKCcjbWlncmF0ZV90eXBlJykuZGF0YShcInR1cm5pdGludG9vbGlkXCIpICE9ICQoXCIjbWlncmF0ZV90eXBlXCIpLmRhdGEoXCJsYXN0YXNrZWRcIikpIHtcbiAgICAgICAgJC5jb2xvcmJveCh7d2lkdGg6IDU1MCwgaGVpZ2h0OiA2MDAsIGlubGluZTp0cnVlLCBvcGFjaXR5OiBcIjAuN1wiLCBocmVmOlwiI21pZ3JhdGlvbl9hbGVydFwiLFxuICAgICAgICAgICAgb25Mb2FkOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAkKCcjYXNrdG9taWdyYXRlJykuc2hvdygpO1xuICAgICAgICAgICAgICAgIGxpZ2h0Qm94Q2xvc2VCdXR0b24oKTtcblxuICAgICAgICAgICAgICAgICQoJy50aWlfY2xvc2VfbGluaycpLmNsaWNrKCQucHJveHkoZG9udG1pZ3JhdGUsIG51bGwsICQuY29sb3Jib3gpKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvbkNsZWFudXA6ZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgJCgnI3RpaV9jbG9zZV9iYXInKS5yZW1vdmUoKTtcbiAgICAgICAgICAgICAgICAkKCcjbWlncmF0aW9uX2FsZXJ0JykuaGlkZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAkKCcjbWlncmF0aW9uX2FsZXJ0Jykuc2hvdygpO1xuICAgIH1cblxuICAgIGlmICgkKCcjbWlncmF0ZV90eXBlJykuZGF0YShcIm1pZ3JhdGV0eXBlXCIpID09IDIpIHtcbiAgICAgICAgJCgnI2Fza3RvbWlncmF0ZScpLmhpZGUoKTtcbiAgICAgICAgJCgnI21pZ3JhdGluZycpLnNob3coKTtcblxuICAgICAgICBtaWdyYXRlKCQoXCIjbWlncmF0ZV90eXBlXCIpLmRhdGEoXCJjb3Vyc2VpZFwiKSwgJChcIiNtaWdyYXRlX3R5cGVcIikuZGF0YShcInR1cm5pdGludG9vbGlkXCIpKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIG1pZ3JhdGUoY291cnNlaWQsIHR1cm5pdGludG9vbGlkKSB7XG4gICAgJC5hamF4KHtcbiAgICAgICAgXCJkYXRhVHlwZVwiOiAnanNvbicsXG4gICAgICAgIFwidHlwZVwiOiBcIlBPU1RcIixcbiAgICAgICAgdXJsOiBNLmNmZy53d3dyb290ICsgXCIvbW9kL3R1cm5pdGludG9vbHR3by9hamF4LnBocFwiLFxuICAgICAgICBcImRhdGFcIjoge2FjdGlvbjogXCJiZWdpbl9taWdyYXRpb25cIiwgY291cnNlaWQ6IGNvdXJzZWlkLCB0dXJuaXRpbnRvb2xpZDogdHVybml0aW50b29saWQsIHNlc3NrZXk6IE0uY2ZnLnNlc3NrZXl9LFxuICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbihkYXRhKSB7XG4gICAgICAgICAgICBpZiAoJC5jb2xvcmJveCkge1xuICAgICAgICAgICAgICAgICQuY29sb3Jib3guY2xvc2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgICQoJyNtaWdyYXRpb25fYWxlcnQnKS5oaWRlKCk7XG5cbiAgICAgICAgICAgIHN3aXRjaCAoZGF0YS5ncmFkZWJvb2spIHtcbiAgICAgICAgICAgICAgICBjYXNlIFwiZ3JhZGVib29rZXJyb3JcIjpcbiAgICAgICAgICAgICAgICAgICAgdmFyIG1pZ3JhdGVkID0gMztcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcImNyb25cIjpcbiAgICAgICAgICAgICAgICAgICAgdmFyIG1pZ3JhdGVkID0gMjtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgdmFyIG1pZ3JhdGVkID0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gTS5jZmcud3d3cm9vdCArIFwiL21vZC90dXJuaXRpbnRvb2x0d28vdmlldy5waHA/aWQ9XCIrZGF0YS5pZCtcIiZtaWdyYXRlZD1cIittaWdyYXRlZDtcbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3I6IGZ1bmN0aW9uKGVycm9yKSB7XG4gICAgICAgICAgICB2YXIgZGF0YSA9IGVycm9yLnJlc3BvbnNlSlNPTjtcbiAgICAgICAgICAgIGlmICgkLmNvbG9yYm94KSB7XG4gICAgICAgICAgICAgICAgJC5jb2xvcmJveC5jbG9zZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgJCgnI21pZ3JhdGlvbl9hbGVydCcpLmhpZGUoKTtcbiAgICAgICAgICAgICQoJyN0dXJuaXRpbnRvb2xfc3R5bGUnKVxuICAgICAgICAgICAgICAgIC5wcmVwZW5kKCc8ZGl2IGlkPVwiZnVsbC1lcnJvclwiIGNsYXNzPVwiYm94IGdlbmVyYWxib3ggbm90aWNlYm94XCI+JyArIGRhdGEuZXJyb3IgKyAnICcgKyBkYXRhLm1lc3NhZ2UgKyAnPC9kaXY+Jyk7XG5cbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHdlIGhhdmUgYSBzdGFjayB0cmFjZSBpbmNsdWRlZC5cbiAgICAgICAgICAgIGlmIChkYXRhLmhhc093blByb3BlcnR5KCd0cmFjZScpKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihkYXRhLm1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoSlNPTi5zdHJpbmdpZnkoZGF0YS50cmFjZSwgbnVsbCwgNCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG59XG4iXX0= diff --git a/lang/en/turnitintooltwo.php b/lang/en/turnitintooltwo.php index 995646b4..d96ed934 100755 --- a/lang/en/turnitintooltwo.php +++ b/lang/en/turnitintooltwo.php @@ -648,4 +648,5 @@ $string['v1migrationearlyaccess'] = 'Early Access'; $string['reportgenspeed_resubmission'] = 'You have already submitted a paper to this assignment and a Similarity Report was generated for your submission. If you choose to resubmit your paper, your earlier submission will be replaced and a new report will be generated. After {$a->num_resubmissions} resubmissions, you will need to wait {$a->num_hours} hours after a resubmission to see a new Similarity Report.'; $string['migrationtool:gradebookerror'] = 'Your assignment was migrated but the grades could not be confirmed in the gradebook so the V1 assignment has not been deleted.

Please check the grades in the gradebook and remove the V1 assignment once you are happy - leaving it may cause the grades to be counted in the total twice.'; -$string['migrationtool:successful'] = "Your assignment has been successfully migrated from Moodle Direct V1 to V2 and the V1 assignment has been removed."; \ No newline at end of file +$string['migrationtool:successful1'] = "Your assignment has been successfully migrated from Moodle Direct V1 to V2 and the V1 assignment has been removed."; +$string['migrationtool:successful2'] = "Your assignment has been successfully migrated from Moodle Direct V1 to V2.

However as there were more than 200 grades in this assignment the gradebook will be updated via the cron task. Once this has been completed the V1 assignment will be removed.

Please do not remove the V1 assignment yourself as this may cause the grades to not be updated correctly."; \ No newline at end of file diff --git a/lib.php b/lib.php index 96630136..5527d3dd 100755 --- a/lib.php +++ b/lib.php @@ -691,7 +691,7 @@ function turnitintooltwo_cron() { * Migrate the gradebook for submissions which were not migrated during the migration tool. */ function turnitintooltwo_cron_migrate_gradebook() { - global $DB, $CFG; + global $DB; // Get a list of assignments with outstanding gradebook migrations. require_once(__DIR__.'/classes/v1migration/v1migration.php'); @@ -717,7 +717,7 @@ function turnitintooltwo_cron_migrate_gradebook() { $sql = "tiiassignid = " . $tiiid . " LIMIT 1"; $turnitintoolid = $DB->get_field_select('turnitintool_parts', 'turnitintoolid', $sql); - $gradeupdates = v1migration::migrate_gradebook($assignment->turnitintooltwoid, $courseid, $turnitintoolid, "cron"); + $gradeupdates = v1migration::migrate_gradebook($assignment->turnitintooltwoid, $turnitintoolid, $courseid, "cron"); // If we have migrated, update the titles. if ($gradeupdates == "migrated") { diff --git a/tests/unit/classes/v1migration/v1migration_test.php b/tests/unit/classes/v1migration/v1migration_test.php index e33a689c..3d75c313 100755 --- a/tests/unit/classes/v1migration/v1migration_test.php +++ b/tests/unit/classes/v1migration/v1migration_test.php @@ -190,8 +190,6 @@ public function make_test_grade($module, $assignmentid, $courseid, $userid, $gra $grades->rawgrade = $grade; $grades->userid = $userid; - echo 'Userid: '.$userid.'|'; - $params['idnumber'] = $cm->idnumber; grade_update('mod/'.$module, $courseid, 'mod', $module, $assignmentid, 0, $grades, $params); @@ -656,9 +654,7 @@ public function test_migrate_gradebook() { */ public function test_post_migration() { - global $CFG, $DB; - - @include_once($CFG->libdir . "/gradelib.php"); + global $DB; if (!$this->v1installed()) { return false; diff --git a/view.php b/view.php index 58e9ea2b..07e6228d 100755 --- a/view.php +++ b/view.php @@ -134,13 +134,13 @@ // Migration tool $notice = array(); -if ($migrated === 1) { +if ($migrated == 1 || $migrated == 2) { $notice["type"] = "success"; - $notice["message"] = get_string('migrationtool:successful', 'turnitintooltwo'); + $notice["message"] = get_string('migrationtool:successful'.$migrated, 'turnitintooltwo'); include_once("classes/v1migration/v1migration.php"); v1migration::check_account($config->accountid); -} elseif ($migrated == 2) { +} elseif ($migrated == 3) { $notice["type"] = "danger"; $notice["message"] = get_string('migrationtool:gradebookerror', 'turnitintooltwo'); From 19ae609e4645e5d57c41251ee55deeb02d19111d Mon Sep 17 00:00:00 2001 From: David Winn Date: Mon, 26 Feb 2018 14:49:48 +0000 Subject: [PATCH 11/21] Rename turnitintooltwo_delete_assignment and remove migrated field from DB call. --- classes/v1migration/v1migration.php | 9 +++------ tests/unit/classes/v1migration/v1migration_test.php | 2 +- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/classes/v1migration/v1migration.php b/classes/v1migration/v1migration.php index fcee977b..565ec8d3 100644 --- a/classes/v1migration/v1migration.php +++ b/classes/v1migration/v1migration.php @@ -459,7 +459,6 @@ public static function migrate_gradebook($turnitintooltwoid, $turnitintoolid, $c } } - /** * Handle the situation where a user has overridden the grade in the gradebook. * @@ -484,7 +483,6 @@ public static function handle_overridden_grade($v1grade, $userid, $turnitintoolt $grade_grade->set_overridden(true); } - /** * Update module titles after migration has completed. * @param int $v2assignmentid V2 Module id @@ -503,7 +501,7 @@ public function post_migration($v2assignmentid) { // We only want to delete the V1 assignment if all grades are in the gradebook. if ($v1_grades === $v2_grades) { - $this->turnitintooltwo_delete_assignment($this->v1assignment->id); + $this->delete_migrated_assignment($this->v1assignment->id); return "success"; } else { @@ -511,7 +509,6 @@ public function post_migration($v2assignmentid) { } } - /** * @param String $module turnitintool or turnitintooltwo * @param int $assignmentid The turnitintoolid or turnitintooltwoid for the assignment. @@ -631,7 +628,7 @@ public static function turnitintooltwo_getassignments() { $querywhere = substr_replace( $querywhere, "", -3 ); $querywhere .= " )"; } - $query = "SELECT id, name, migrated FROM {turnitintool}".$querywhere.$queryorder; + $query = "SELECT id, name FROM {turnitintool}".$querywhere.$queryorder; $assignments = $DB->get_records_sql($query, $queryparams, $idisplaystart, $idisplaylength); $totalassignments = count($DB->get_records_sql($query, $queryparams)); @@ -653,7 +650,7 @@ public static function turnitintooltwo_getassignments() { * * @param int $assignmentid The assignment ID to delete. */ - public static function turnitintooltwo_delete_assignment($assignmentid) { + public static function delete_migrated_assignment($assignmentid) { global $CFG, $DB; require_once($CFG->dirroot . "/mod/turnitintool/lib.php"); diff --git a/tests/unit/classes/v1migration/v1migration_test.php b/tests/unit/classes/v1migration/v1migration_test.php index 3d75c313..31420066 100755 --- a/tests/unit/classes/v1migration/v1migration_test.php +++ b/tests/unit/classes/v1migration/v1migration_test.php @@ -900,7 +900,7 @@ public function test_turnitintooltwo_delete_assignment() { $this->assertEquals(5, count($v1submissions)); // Delete the assignment. - v1migration::turnitintooltwo_delete_assignment($v1assignment->id); + v1migration::delete_migrated_assignment($v1assignment->id); // Verify that they have been deleted. $v1assignments = $DB->get_records('turnitintool'); From cb7a33115464e0cfc50a2ba21cf424a44b4769a1 Mon Sep 17 00:00:00 2001 From: David Winn Date: Mon, 26 Feb 2018 15:35:26 +0000 Subject: [PATCH 12/21] Rename function test_turnitintooltwo_delete_assignment in test file. --- tests/unit/classes/v1migration/v1migration_test.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/unit/classes/v1migration/v1migration_test.php b/tests/unit/classes/v1migration/v1migration_test.php index 31420066..96f8d9ab 100755 --- a/tests/unit/classes/v1migration/v1migration_test.php +++ b/tests/unit/classes/v1migration/v1migration_test.php @@ -875,7 +875,7 @@ public function test_turnitintooltwo_getassignments() { /** * Test that assignments are deleted when given an assignment. */ - public function test_turnitintooltwo_delete_assignment() { + public function test_delete_migrated_assignment() { global $DB; if (!$this->v1installed()) { From 00b67facdf7126fdabc3ece0c0c86216f11a85a6 Mon Sep 17 00:00:00 2001 From: David Winn Date: Tue, 27 Feb 2018 08:55:41 +0000 Subject: [PATCH 13/21] Adding null check, adding triple equals. --- tests/unit/generator/lib.php | 4 ++-- view.php | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/unit/generator/lib.php b/tests/unit/generator/lib.php index 51aea0fe..aeaff815 100644 --- a/tests/unit/generator/lib.php +++ b/tests/unit/generator/lib.php @@ -46,13 +46,13 @@ abstract class test_lib extends advanced_testcase { * * @return array $parts_created - parts added to the assignment listed as partid => partobject */ - public function make_test_parts($modname, $assignmentid, $number_of_parts, $tiiassignid = 0) { + public function make_test_parts($modname, $assignmentid, $number_of_parts, $tiiassignid = null) { global $DB; $modulevar = $modname.'id'; $part = new stdClass(); $part->$modulevar = $assignmentid; - $part->tiiassignid = $tiiassignid; + $part->tiiassignid = is_null($tiiassignid) ? 0 : $tiiassignid; $part->dtstart = 0; $part->dtdue = 0; $part->dtpost = 0; diff --git a/view.php b/view.php index 07e6228d..904c8b95 100755 --- a/view.php +++ b/view.php @@ -134,13 +134,13 @@ // Migration tool $notice = array(); -if ($migrated == 1 || $migrated == 2) { +if ($migrated === 1 || $migrated === 2) { $notice["type"] = "success"; $notice["message"] = get_string('migrationtool:successful'.$migrated, 'turnitintooltwo'); include_once("classes/v1migration/v1migration.php"); v1migration::check_account($config->accountid); -} elseif ($migrated == 3) { +} elseif ($migrated === 3) { $notice["type"] = "danger"; $notice["message"] = get_string('migrationtool:gradebookerror', 'turnitintooltwo'); From e65cb6b336b64e388038c5a113f30c99020da874 Mon Sep 17 00:00:00 2001 From: David Winn Date: Thu, 1 Mar 2018 16:21:27 +0000 Subject: [PATCH 14/21] Reworking of the migrated parameter to store the status in the session instead. --- ajax.php | 9 +++-- classes/v1migration/v1migration.php | 9 +++-- jquery/turnitintooltwo_migration_tool.js | 12 +------ jquery/turnitintooltwo_migration_tool.min.js | 4 +-- lang/en/turnitintooltwo.php | 4 +-- .../classes/v1migration/v1migration_test.php | 9 ++--- view.php | 35 ++++++++++++------- 7 files changed, 38 insertions(+), 44 deletions(-) diff --git a/ajax.php b/ajax.php index 0bc9ee13..ec85bc0b 100644 --- a/ajax.php +++ b/ajax.php @@ -904,13 +904,12 @@ $v1migration = new v1migration($courseid, $turnitintool); try { - $response = $v1migration->migrate(); - $cm = get_coursemodule_from_instance("turnitintooltwo", $response["turnitintooltwoid"]); + $turnitintooltwoid = $v1migration->migrate(); + $cm = get_coursemodule_from_instance("turnitintooltwo", $turnitintooltwoid); // The returned CMID will be used for the redirect. - if ((int)$response["turnitintooltwoid"] > 0) { - echo '{ "id": '.$cm->id.', - "gradebook": "'.$response["gradebook"].'" }'; + if ((int)$turnitintooltwoid > 0) { + echo '{ "id": '.$cm->id.' }'; exit(); } } catch(Exception $e) { diff --git a/classes/v1migration/v1migration.php b/classes/v1migration/v1migration.php index 565ec8d3..798dc8b9 100644 --- a/classes/v1migration/v1migration.php +++ b/classes/v1migration/v1migration.php @@ -234,17 +234,16 @@ public function migrate() { // Once grades have been updated we can run the post migration task. if ($gradeupdates == "migrated") { - $gradebook = $this->post_migration($turnitintooltwoid); + $_SESSION["migrationtool"]["status"] = $this->post_migration($turnitintooltwoid); } elseif ($gradeupdates == "cron") { - $gradebook = "cron"; + $_SESSION["migrationtool"]["status"] = "cron"; } // Link the v2 id to the v1 id in the session. if (is_int($turnitintooltwoid)) { $_SESSION["migrationtool"][$this->v1assignment->id] = $turnitintooltwoid; - return array("turnitintooltwoid" => $turnitintooltwoid, - "gradebook" => $gradebook); + return $turnitintooltwoid; } else { return false; } @@ -746,7 +745,7 @@ public static function output_settings_form($enablesetting = true) { return $output; } - public static function check_account($accountid, $error = 0) { + public static function check_account($accountid, $error = false) { global $CFG; $config = turnitintooltwo_admin_config(); diff --git a/jquery/turnitintooltwo_migration_tool.js b/jquery/turnitintooltwo_migration_tool.js index 633ed686..a3f4f7a3 100644 --- a/jquery/turnitintooltwo_migration_tool.js +++ b/jquery/turnitintooltwo_migration_tool.js @@ -77,17 +77,7 @@ function migrate(courseid, turnitintoolid) { } $('#migration_alert').hide(); - switch (data.gradebook) { - case "gradebookerror": - var migrated = 3; - break; - case "cron": - var migrated = 2; - break; - default: - var migrated = 1; - } - window.location.href = M.cfg.wwwroot + "/mod/turnitintooltwo/view.php?id="+data.id+"&migrated="+migrated; + window.location.href = M.cfg.wwwroot + "/mod/turnitintooltwo/view.php?id="+data.id; }, error: function(error) { var data = error.responseJSON; diff --git a/jquery/turnitintooltwo_migration_tool.min.js b/jquery/turnitintooltwo_migration_tool.min.js index 546bdd10..3ff97fa0 100644 --- a/jquery/turnitintooltwo_migration_tool.min.js +++ b/jquery/turnitintooltwo_migration_tool.min.js @@ -1,2 +1,2 @@ -function dontmigrate(o){$("#migration_alert").hide(),o.close()}function lightBoxCloseButton(o){$("body").append('")}function displayMigrationModal(){$("#migrate_type").data("turnitintoolid")!=$("#migrate_type").data("lastasked")&&($.colorbox({width:550,height:600,inline:!0,opacity:"0.7",href:"#migration_alert",onLoad:function(){$("#asktomigrate").show(),lightBoxCloseButton(),$(".tii_close_link").click($.proxy(dontmigrate,null,$.colorbox))},onCleanup:function(){$("#tii_close_bar").remove(),$("#migration_alert").hide()}}),$("#migration_alert").show()),2==$("#migrate_type").data("migratetype")&&($("#asktomigrate").hide(),$("#migrating").show(),migrate($("#migrate_type").data("courseid"),$("#migrate_type").data("turnitintoolid")))}function migrate(o,t){$.ajax({dataType:"json",type:"POST",url:M.cfg.wwwroot+"/mod/turnitintooltwo/ajax.php",data:{action:"begin_migration",courseid:o,turnitintoolid:t,sesskey:M.cfg.sesskey},success:function(o){switch($.colorbox&&$.colorbox.close(),$("#migration_alert").hide(),o.gradebook){case"gradebookerror":var t=3;break;case"cron":var t=2;break;default:var t=1}window.location.href=M.cfg.wwwroot+"/mod/turnitintooltwo/view.php?id="+o.id+"&migrated="+t},error:function(o){var t=o.responseJSON;$.colorbox&&$.colorbox.close(),$("#migration_alert").hide(),$("#turnitintool_style").prepend('
'+t.error+" "+t.message+"
"),t.hasOwnProperty("trace")&&(console.error(t.message),console.error(JSON.stringify(t.trace,null,4)))}})}$(document).ready(function(){$.ajax({dataType:"json",type:"POST",url:M.cfg.wwwroot+"/mod/turnitintooltwo/ajax.php",data:{action:"check_migrated",turnitintoolid:$("#migrate_type").data("turnitintoolid"),sesskey:M.cfg.sesskey},success:function(o){o.migrated===!0?window.location.href=M.cfg.wwwroot+"/mod/turnitintooltwo/view.php?id="+o.v2id:(displayMigrationModal(),$(".dontmigrate_link").click($.proxy(dontmigrate,null,$.colorbox)))}})}),$(".migrate_link").on("click",function(){$("#asktomigrate").hide(),$("#migrating").show(),migrate($(this).data("courseid"),$(this).data("turnitintoolid"))}); -//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInR1cm5pdGludG9vbHR3b19taWdyYXRpb25fdG9vbC5qcyJdLCJuYW1lcyI6WyJkb250bWlncmF0ZSIsImNiIiwiJCIsImhpZGUiLCJjbG9zZSIsImxpZ2h0Qm94Q2xvc2VCdXR0b24iLCJhcHBlbmQiLCJNIiwic3RyIiwidHVybml0aW50b29sdHdvIiwiY2xvc2VidXR0b24iLCJkaXNwbGF5TWlncmF0aW9uTW9kYWwiLCJkYXRhIiwiY29sb3Jib3giLCJ3aWR0aCIsImhlaWdodCIsImlubGluZSIsIm9wYWNpdHkiLCJocmVmIiwib25Mb2FkIiwic2hvdyIsImNsaWNrIiwicHJveHkiLCJvbkNsZWFudXAiLCJyZW1vdmUiLCJtaWdyYXRlIiwiY291cnNlaWQiLCJ0dXJuaXRpbnRvb2xpZCIsImFqYXgiLCJkYXRhVHlwZSIsInR5cGUiLCJ1cmwiLCJjZmciLCJ3d3dyb290IiwiYWN0aW9uIiwic2Vzc2tleSIsInN1Y2Nlc3MiLCJncmFkZWJvb2siLCJtaWdyYXRlZCIsIndpbmRvdyIsImxvY2F0aW9uIiwiaWQiLCJlcnJvciIsInJlc3BvbnNlSlNPTiIsInByZXBlbmQiLCJtZXNzYWdlIiwiaGFzT3duUHJvcGVydHkiLCJjb25zb2xlIiwiSlNPTiIsInN0cmluZ2lmeSIsInRyYWNlIiwiZG9jdW1lbnQiLCJyZWFkeSIsInYyaWQiLCJvbiIsInRoaXMiXSwibWFwcGluZ3MiOiJBQThCQSxRQUFTQSxhQUFZQyxHQUNqQkMsRUFBRSxvQkFBb0JDLE9BQ3RCRixFQUFHRyxRQUdQLFFBQVNDLHFCQUFvQkosR0FDekJDLEVBQUUsUUFBUUksT0FBTyw4REFBZ0VDLEVBQUVDLElBQUlDLGdCQUFnQkMsWUFBYyxjQUl6SCxRQUFTQyx5QkFFRFQsRUFBRSxpQkFBaUJVLEtBQUssbUJBQXFCVixFQUFFLGlCQUFpQlUsS0FBSyxlQUNyRVYsRUFBRVcsVUFBVUMsTUFBTyxJQUFLQyxPQUFRLElBQUtDLFFBQU8sRUFBTUMsUUFBUyxNQUFPQyxLQUFLLG1CQUNuRUMsT0FBUSxXQUNKakIsRUFBRSxpQkFBaUJrQixPQUNuQmYsc0JBRUFILEVBQUUsbUJBQW1CbUIsTUFBTW5CLEVBQUVvQixNQUFNdEIsWUFBYSxLQUFNRSxFQUFFVyxZQUU1RFUsVUFBVSxXQUNOckIsRUFBRSxrQkFBa0JzQixTQUNwQnRCLEVBQUUsb0JBQW9CQyxVQUk5QkQsRUFBRSxvQkFBb0JrQixRQUdvQixHQUExQ2xCLEVBQUUsaUJBQWlCVSxLQUFLLGlCQUN4QlYsRUFBRSxpQkFBaUJDLE9BQ25CRCxFQUFFLGNBQWNrQixPQUVoQkssUUFBUXZCLEVBQUUsaUJBQWlCVSxLQUFLLFlBQWFWLEVBQUUsaUJBQWlCVSxLQUFLLG9CQUk3RSxRQUFTYSxTQUFRQyxFQUFVQyxHQUN2QnpCLEVBQUUwQixNQUNFQyxTQUFZLE9BQ1pDLEtBQVEsT0FDUkMsSUFBS3hCLEVBQUV5QixJQUFJQyxRQUFVLGdDQUNyQnJCLE1BQVNzQixPQUFRLGtCQUFtQlIsU0FBVUEsRUFBVUMsZUFBZ0JBLEVBQWdCUSxRQUFTNUIsRUFBRXlCLElBQUlHLFNBQ3ZHQyxRQUFTLFNBQVN4QixHQU1kLE9BTElWLEVBQUVXLFVBQ0ZYLEVBQUVXLFNBQVNULFFBRWZGLEVBQUUsb0JBQW9CQyxPQUVkUyxFQUFLeUIsV0FDVCxJQUFLLGlCQUNELEdBQUlDLEdBQVcsQ0FDZixNQUNKLEtBQUssT0FDRCxHQUFJQSxHQUFXLENBQ2YsTUFDSixTQUNJLEdBQUlBLEdBQVcsRUFFdkJDLE9BQU9DLFNBQVN0QixLQUFPWCxFQUFFeUIsSUFBSUMsUUFBVSxvQ0FBb0NyQixFQUFLNkIsR0FBRyxhQUFhSCxHQUVwR0ksTUFBTyxTQUFTQSxHQUNaLEdBQUk5QixHQUFPOEIsRUFBTUMsWUFDYnpDLEdBQUVXLFVBQ0ZYLEVBQUVXLFNBQVNULFFBRWZGLEVBQUUsb0JBQW9CQyxPQUN0QkQsRUFBRSx1QkFDRzBDLFFBQVEseURBQTJEaEMsRUFBSzhCLE1BQVEsSUFBTTlCLEVBQUtpQyxRQUFVLFVBR3RHakMsRUFBS2tDLGVBQWUsV0FDcEJDLFFBQVFMLE1BQU05QixFQUFLaUMsU0FDbkJFLFFBQVFMLE1BQU1NLEtBQUtDLFVBQVVyQyxFQUFLc0MsTUFBTyxLQUFNLFFBdkcvRGhELEVBQUVpRCxVQUFVQyxNQUFNLFdBR2RsRCxFQUFFMEIsTUFDRUMsU0FBWSxPQUNaQyxLQUFRLE9BQ1JDLElBQU94QixFQUFFeUIsSUFBSUMsUUFBVSxnQ0FDdkJyQixNQUNJc0IsT0FBUSxpQkFDUlAsZUFBZ0J6QixFQUFFLGlCQUFpQlUsS0FBSyxrQkFDeEN1QixRQUFTNUIsRUFBRXlCLElBQUlHLFNBRW5CQyxRQUFXLFNBQVN4QixHQUNaQSxFQUFLMEIsWUFBYSxFQUNsQkMsT0FBT0MsU0FBU3RCLEtBQU9YLEVBQUV5QixJQUFJQyxRQUFVLG9DQUFvQ3JCLEVBQUt5QyxNQUVoRjFDLHdCQUVBVCxFQUFFLHFCQUFxQm1CLE1BQU1uQixFQUFFb0IsTUFBTXRCLFlBQWEsS0FBTUUsRUFBRVcsaUJBTTFFWCxFQUFFLGlCQUFpQm9ELEdBQUcsUUFBUyxXQUMzQnBELEVBQUUsaUJBQWlCQyxPQUNuQkQsRUFBRSxjQUFja0IsT0FDaEJLLFFBQVF2QixFQUFFcUQsTUFBTTNDLEtBQUssWUFBYVYsRUFBRXFELE1BQU0zQyxLQUFLIiwiZmlsZSI6InR1cm5pdGludG9vbHR3b19taWdyYXRpb25fdG9vbC5taW4uanMiLCJzb3VyY2VzQ29udGVudCI6WyIkKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpe1xuXG4gICAgLy8gQ2hlY2sgd2hldGhlciB0aGlzIGFzc2lnbm1lbnQgaGFzIGJlZW4gbWlncmF0ZWQgaW4gdGhpcyBzZXNzaW9uIGFuZCByZWRpcmVjdCBpZiBzby5cbiAgICAkLmFqYXgoe1xuICAgICAgICBcImRhdGFUeXBlXCI6ICdqc29uJyxcbiAgICAgICAgXCJ0eXBlXCI6IFwiUE9TVFwiLFxuICAgICAgICBcInVybFwiOiBNLmNmZy53d3dyb290ICsgXCIvbW9kL3R1cm5pdGludG9vbHR3by9hamF4LnBocFwiLFxuICAgICAgICBcImRhdGFcIjoge1xuICAgICAgICAgICAgYWN0aW9uOiBcImNoZWNrX21pZ3JhdGVkXCIsXG4gICAgICAgICAgICB0dXJuaXRpbnRvb2xpZDogJChcIiNtaWdyYXRlX3R5cGVcIikuZGF0YShcInR1cm5pdGludG9vbGlkXCIpLFxuICAgICAgICAgICAgc2Vzc2tleTogTS5jZmcuc2Vzc2tleVxuICAgICAgICB9LFxuICAgICAgICBcInN1Y2Nlc3NcIjogZnVuY3Rpb24oZGF0YSkge1xuICAgICAgICAgICAgaWYgKGRhdGEubWlncmF0ZWQgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IE0uY2ZnLnd3d3Jvb3QgKyBcIi9tb2QvdHVybml0aW50b29sdHdvL3ZpZXcucGhwP2lkPVwiK2RhdGEudjJpZDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZGlzcGxheU1pZ3JhdGlvbk1vZGFsKCk7XG5cbiAgICAgICAgICAgICAgICAkKCcuZG9udG1pZ3JhdGVfbGluaycpLmNsaWNrKCQucHJveHkoZG9udG1pZ3JhdGUsIG51bGwsICQuY29sb3Jib3gpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xufSk7XG5cbiQoJy5taWdyYXRlX2xpbmsnKS5vbignY2xpY2snLCBmdW5jdGlvbigpIHtcbiAgICAkKCcjYXNrdG9taWdyYXRlJykuaGlkZSgpO1xuICAgICQoJyNtaWdyYXRpbmcnKS5zaG93KCk7XG4gICAgbWlncmF0ZSgkKHRoaXMpLmRhdGEoXCJjb3Vyc2VpZFwiKSwgJCh0aGlzKS5kYXRhKFwidHVybml0aW50b29saWRcIikpO1xufSk7XG5cbmZ1bmN0aW9uIGRvbnRtaWdyYXRlKGNiKSB7XG4gICAgJCgnI21pZ3JhdGlvbl9hbGVydCcpLmhpZGUoKTtcbiAgICBjYi5jbG9zZSgpO1xufVxuXG5mdW5jdGlvbiBsaWdodEJveENsb3NlQnV0dG9uKGNiKSB7XG4gICAgJCgnYm9keScpLmFwcGVuZCgnPGRpdiBpZD1cInRpaV9jbG9zZV9iYXJcIj48YSBjbGFzcz1cInRpaV9jbG9zZV9saW5rXCIgaHJlZj1cIiNcIj4nICsgTS5zdHIudHVybml0aW50b29sdHdvLmNsb3NlYnV0dG9uICsgJzwvYT48L2Rpdj4nKTtcbn1cblxuXG5mdW5jdGlvbiBkaXNwbGF5TWlncmF0aW9uTW9kYWwoKSB7XG4gICAgLy8gT25seSBkaXNwbGF5IHRoZSBtb2RhbCBkdXJpbmcgYSBtYW51YWwgbWlncmF0aW9uLlxuICAgIGlmICgkKCcjbWlncmF0ZV90eXBlJykuZGF0YShcInR1cm5pdGludG9vbGlkXCIpICE9ICQoXCIjbWlncmF0ZV90eXBlXCIpLmRhdGEoXCJsYXN0YXNrZWRcIikpIHtcbiAgICAgICAgJC5jb2xvcmJveCh7d2lkdGg6IDU1MCwgaGVpZ2h0OiA2MDAsIGlubGluZTp0cnVlLCBvcGFjaXR5OiBcIjAuN1wiLCBocmVmOlwiI21pZ3JhdGlvbl9hbGVydFwiLFxuICAgICAgICAgICAgb25Mb2FkOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAkKCcjYXNrdG9taWdyYXRlJykuc2hvdygpO1xuICAgICAgICAgICAgICAgIGxpZ2h0Qm94Q2xvc2VCdXR0b24oKTtcblxuICAgICAgICAgICAgICAgICQoJy50aWlfY2xvc2VfbGluaycpLmNsaWNrKCQucHJveHkoZG9udG1pZ3JhdGUsIG51bGwsICQuY29sb3Jib3gpKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvbkNsZWFudXA6ZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgJCgnI3RpaV9jbG9zZV9iYXInKS5yZW1vdmUoKTtcbiAgICAgICAgICAgICAgICAkKCcjbWlncmF0aW9uX2FsZXJ0JykuaGlkZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAkKCcjbWlncmF0aW9uX2FsZXJ0Jykuc2hvdygpO1xuICAgIH1cblxuICAgIGlmICgkKCcjbWlncmF0ZV90eXBlJykuZGF0YShcIm1pZ3JhdGV0eXBlXCIpID09IDIpIHtcbiAgICAgICAgJCgnI2Fza3RvbWlncmF0ZScpLmhpZGUoKTtcbiAgICAgICAgJCgnI21pZ3JhdGluZycpLnNob3coKTtcblxuICAgICAgICBtaWdyYXRlKCQoXCIjbWlncmF0ZV90eXBlXCIpLmRhdGEoXCJjb3Vyc2VpZFwiKSwgJChcIiNtaWdyYXRlX3R5cGVcIikuZGF0YShcInR1cm5pdGludG9vbGlkXCIpKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIG1pZ3JhdGUoY291cnNlaWQsIHR1cm5pdGludG9vbGlkKSB7XG4gICAgJC5hamF4KHtcbiAgICAgICAgXCJkYXRhVHlwZVwiOiAnanNvbicsXG4gICAgICAgIFwidHlwZVwiOiBcIlBPU1RcIixcbiAgICAgICAgdXJsOiBNLmNmZy53d3dyb290ICsgXCIvbW9kL3R1cm5pdGludG9vbHR3by9hamF4LnBocFwiLFxuICAgICAgICBcImRhdGFcIjoge2FjdGlvbjogXCJiZWdpbl9taWdyYXRpb25cIiwgY291cnNlaWQ6IGNvdXJzZWlkLCB0dXJuaXRpbnRvb2xpZDogdHVybml0aW50b29saWQsIHNlc3NrZXk6IE0uY2ZnLnNlc3NrZXl9LFxuICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbihkYXRhKSB7XG4gICAgICAgICAgICBpZiAoJC5jb2xvcmJveCkge1xuICAgICAgICAgICAgICAgICQuY29sb3Jib3guY2xvc2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgICQoJyNtaWdyYXRpb25fYWxlcnQnKS5oaWRlKCk7XG5cbiAgICAgICAgICAgIHN3aXRjaCAoZGF0YS5ncmFkZWJvb2spIHtcbiAgICAgICAgICAgICAgICBjYXNlIFwiZ3JhZGVib29rZXJyb3JcIjpcbiAgICAgICAgICAgICAgICAgICAgdmFyIG1pZ3JhdGVkID0gMztcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcImNyb25cIjpcbiAgICAgICAgICAgICAgICAgICAgdmFyIG1pZ3JhdGVkID0gMjtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgdmFyIG1pZ3JhdGVkID0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gTS5jZmcud3d3cm9vdCArIFwiL21vZC90dXJuaXRpbnRvb2x0d28vdmlldy5waHA/aWQ9XCIrZGF0YS5pZCtcIiZtaWdyYXRlZD1cIittaWdyYXRlZDtcbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3I6IGZ1bmN0aW9uKGVycm9yKSB7XG4gICAgICAgICAgICB2YXIgZGF0YSA9IGVycm9yLnJlc3BvbnNlSlNPTjtcbiAgICAgICAgICAgIGlmICgkLmNvbG9yYm94KSB7XG4gICAgICAgICAgICAgICAgJC5jb2xvcmJveC5jbG9zZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgJCgnI21pZ3JhdGlvbl9hbGVydCcpLmhpZGUoKTtcbiAgICAgICAgICAgICQoJyN0dXJuaXRpbnRvb2xfc3R5bGUnKVxuICAgICAgICAgICAgICAgIC5wcmVwZW5kKCc8ZGl2IGlkPVwiZnVsbC1lcnJvclwiIGNsYXNzPVwiYm94IGdlbmVyYWxib3ggbm90aWNlYm94XCI+JyArIGRhdGEuZXJyb3IgKyAnICcgKyBkYXRhLm1lc3NhZ2UgKyAnPC9kaXY+Jyk7XG5cbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHdlIGhhdmUgYSBzdGFjayB0cmFjZSBpbmNsdWRlZC5cbiAgICAgICAgICAgIGlmIChkYXRhLmhhc093blByb3BlcnR5KCd0cmFjZScpKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihkYXRhLm1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoSlNPTi5zdHJpbmdpZnkoZGF0YS50cmFjZSwgbnVsbCwgNCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG59XG4iXX0= +function dontmigrate(t){$("#migration_alert").hide(),t.close()}function lightBoxCloseButton(t){$("body").append('")}function displayMigrationModal(){$("#migrate_type").data("turnitintoolid")!=$("#migrate_type").data("lastasked")&&($.colorbox({width:550,height:600,inline:!0,opacity:"0.7",href:"#migration_alert",onLoad:function(){$("#asktomigrate").show(),lightBoxCloseButton(),$(".tii_close_link").click($.proxy(dontmigrate,null,$.colorbox))},onCleanup:function(){$("#tii_close_bar").remove(),$("#migration_alert").hide()}}),$("#migration_alert").show()),2==$("#migrate_type").data("migratetype")&&($("#asktomigrate").hide(),$("#migrating").show(),migrate($("#migrate_type").data("courseid"),$("#migrate_type").data("turnitintoolid")))}function migrate(t,o){$.ajax({dataType:"json",type:"POST",url:M.cfg.wwwroot+"/mod/turnitintooltwo/ajax.php",data:{action:"begin_migration",courseid:t,turnitintoolid:o,sesskey:M.cfg.sesskey},success:function(t){$.colorbox&&$.colorbox.close(),$("#migration_alert").hide(),window.location.href=M.cfg.wwwroot+"/mod/turnitintooltwo/view.php?id="+t.id},error:function(t){var o=t.responseJSON;$.colorbox&&$.colorbox.close(),$("#migration_alert").hide(),$("#turnitintool_style").prepend('
'+o.error+" "+o.message+"
"),o.hasOwnProperty("trace")&&(console.error(o.message),console.error(JSON.stringify(o.trace,null,4)))}})}$(document).ready(function(){$.ajax({dataType:"json",type:"POST",url:M.cfg.wwwroot+"/mod/turnitintooltwo/ajax.php",data:{action:"check_migrated",turnitintoolid:$("#migrate_type").data("turnitintoolid"),sesskey:M.cfg.sesskey},success:function(t){t.migrated===!0?window.location.href=M.cfg.wwwroot+"/mod/turnitintooltwo/view.php?id="+t.v2id:(displayMigrationModal(),$(".dontmigrate_link").click($.proxy(dontmigrate,null,$.colorbox)))}})}),$(".migrate_link").on("click",function(){$("#asktomigrate").hide(),$("#migrating").show(),migrate($(this).data("courseid"),$(this).data("turnitintoolid"))}); +//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInR1cm5pdGludG9vbHR3b19taWdyYXRpb25fdG9vbC5qcyJdLCJuYW1lcyI6WyJkb250bWlncmF0ZSIsImNiIiwiJCIsImhpZGUiLCJjbG9zZSIsImxpZ2h0Qm94Q2xvc2VCdXR0b24iLCJhcHBlbmQiLCJNIiwic3RyIiwidHVybml0aW50b29sdHdvIiwiY2xvc2VidXR0b24iLCJkaXNwbGF5TWlncmF0aW9uTW9kYWwiLCJkYXRhIiwiY29sb3Jib3giLCJ3aWR0aCIsImhlaWdodCIsImlubGluZSIsIm9wYWNpdHkiLCJocmVmIiwib25Mb2FkIiwic2hvdyIsImNsaWNrIiwicHJveHkiLCJvbkNsZWFudXAiLCJyZW1vdmUiLCJtaWdyYXRlIiwiY291cnNlaWQiLCJ0dXJuaXRpbnRvb2xpZCIsImFqYXgiLCJkYXRhVHlwZSIsInR5cGUiLCJ1cmwiLCJjZmciLCJ3d3dyb290IiwiYWN0aW9uIiwic2Vzc2tleSIsInN1Y2Nlc3MiLCJ3aW5kb3ciLCJsb2NhdGlvbiIsImlkIiwiZXJyb3IiLCJyZXNwb25zZUpTT04iLCJwcmVwZW5kIiwibWVzc2FnZSIsImhhc093blByb3BlcnR5IiwiY29uc29sZSIsIkpTT04iLCJzdHJpbmdpZnkiLCJ0cmFjZSIsImRvY3VtZW50IiwicmVhZHkiLCJtaWdyYXRlZCIsInYyaWQiLCJvbiIsInRoaXMiXSwibWFwcGluZ3MiOiJBQThCQSxRQUFTQSxhQUFZQyxHQUNqQkMsRUFBRSxvQkFBb0JDLE9BQ3RCRixFQUFHRyxRQUdQLFFBQVNDLHFCQUFvQkosR0FDekJDLEVBQUUsUUFBUUksT0FBTyw4REFBZ0VDLEVBQUVDLElBQUlDLGdCQUFnQkMsWUFBYyxjQUl6SCxRQUFTQyx5QkFFRFQsRUFBRSxpQkFBaUJVLEtBQUssbUJBQXFCVixFQUFFLGlCQUFpQlUsS0FBSyxlQUNyRVYsRUFBRVcsVUFBVUMsTUFBTyxJQUFLQyxPQUFRLElBQUtDLFFBQU8sRUFBTUMsUUFBUyxNQUFPQyxLQUFLLG1CQUNuRUMsT0FBUSxXQUNKakIsRUFBRSxpQkFBaUJrQixPQUNuQmYsc0JBRUFILEVBQUUsbUJBQW1CbUIsTUFBTW5CLEVBQUVvQixNQUFNdEIsWUFBYSxLQUFNRSxFQUFFVyxZQUU1RFUsVUFBVSxXQUNOckIsRUFBRSxrQkFBa0JzQixTQUNwQnRCLEVBQUUsb0JBQW9CQyxVQUk5QkQsRUFBRSxvQkFBb0JrQixRQUdvQixHQUExQ2xCLEVBQUUsaUJBQWlCVSxLQUFLLGlCQUN4QlYsRUFBRSxpQkFBaUJDLE9BQ25CRCxFQUFFLGNBQWNrQixPQUVoQkssUUFBUXZCLEVBQUUsaUJBQWlCVSxLQUFLLFlBQWFWLEVBQUUsaUJBQWlCVSxLQUFLLG9CQUk3RSxRQUFTYSxTQUFRQyxFQUFVQyxHQUN2QnpCLEVBQUUwQixNQUNFQyxTQUFZLE9BQ1pDLEtBQVEsT0FDUkMsSUFBS3hCLEVBQUV5QixJQUFJQyxRQUFVLGdDQUNyQnJCLE1BQVNzQixPQUFRLGtCQUFtQlIsU0FBVUEsRUFBVUMsZUFBZ0JBLEVBQWdCUSxRQUFTNUIsRUFBRXlCLElBQUlHLFNBQ3ZHQyxRQUFTLFNBQVN4QixHQUNWVixFQUFFVyxVQUNGWCxFQUFFVyxTQUFTVCxRQUVmRixFQUFFLG9CQUFvQkMsT0FFdEJrQyxPQUFPQyxTQUFTcEIsS0FBT1gsRUFBRXlCLElBQUlDLFFBQVUsb0NBQW9DckIsRUFBSzJCLElBRXBGQyxNQUFPLFNBQVNBLEdBQ1osR0FBSTVCLEdBQU80QixFQUFNQyxZQUNidkMsR0FBRVcsVUFDRlgsRUFBRVcsU0FBU1QsUUFFZkYsRUFBRSxvQkFBb0JDLE9BQ3RCRCxFQUFFLHVCQUNHd0MsUUFBUSx5REFBMkQ5QixFQUFLNEIsTUFBUSxJQUFNNUIsRUFBSytCLFFBQVUsVUFHdEcvQixFQUFLZ0MsZUFBZSxXQUNwQkMsUUFBUUwsTUFBTTVCLEVBQUsrQixTQUNuQkUsUUFBUUwsTUFBTU0sS0FBS0MsVUFBVW5DLEVBQUtvQyxNQUFPLEtBQU0sUUE3Ri9EOUMsRUFBRStDLFVBQVVDLE1BQU0sV0FHZGhELEVBQUUwQixNQUNFQyxTQUFZLE9BQ1pDLEtBQVEsT0FDUkMsSUFBT3hCLEVBQUV5QixJQUFJQyxRQUFVLGdDQUN2QnJCLE1BQ0lzQixPQUFRLGlCQUNSUCxlQUFnQnpCLEVBQUUsaUJBQWlCVSxLQUFLLGtCQUN4Q3VCLFFBQVM1QixFQUFFeUIsSUFBSUcsU0FFbkJDLFFBQVcsU0FBU3hCLEdBQ1pBLEVBQUt1QyxZQUFhLEVBQ2xCZCxPQUFPQyxTQUFTcEIsS0FBT1gsRUFBRXlCLElBQUlDLFFBQVUsb0NBQW9DckIsRUFBS3dDLE1BRWhGekMsd0JBRUFULEVBQUUscUJBQXFCbUIsTUFBTW5CLEVBQUVvQixNQUFNdEIsWUFBYSxLQUFNRSxFQUFFVyxpQkFNMUVYLEVBQUUsaUJBQWlCbUQsR0FBRyxRQUFTLFdBQzNCbkQsRUFBRSxpQkFBaUJDLE9BQ25CRCxFQUFFLGNBQWNrQixPQUNoQkssUUFBUXZCLEVBQUVvRCxNQUFNMUMsS0FBSyxZQUFhVixFQUFFb0QsTUFBTTFDLEtBQUsiLCJmaWxlIjoidHVybml0aW50b29sdHdvX21pZ3JhdGlvbl90b29sLm1pbi5qcyIsInNvdXJjZXNDb250ZW50IjpbIiQoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uKCl7XG5cbiAgICAvLyBDaGVjayB3aGV0aGVyIHRoaXMgYXNzaWdubWVudCBoYXMgYmVlbiBtaWdyYXRlZCBpbiB0aGlzIHNlc3Npb24gYW5kIHJlZGlyZWN0IGlmIHNvLlxuICAgICQuYWpheCh7XG4gICAgICAgIFwiZGF0YVR5cGVcIjogJ2pzb24nLFxuICAgICAgICBcInR5cGVcIjogXCJQT1NUXCIsXG4gICAgICAgIFwidXJsXCI6IE0uY2ZnLnd3d3Jvb3QgKyBcIi9tb2QvdHVybml0aW50b29sdHdvL2FqYXgucGhwXCIsXG4gICAgICAgIFwiZGF0YVwiOiB7XG4gICAgICAgICAgICBhY3Rpb246IFwiY2hlY2tfbWlncmF0ZWRcIixcbiAgICAgICAgICAgIHR1cm5pdGludG9vbGlkOiAkKFwiI21pZ3JhdGVfdHlwZVwiKS5kYXRhKFwidHVybml0aW50b29saWRcIiksXG4gICAgICAgICAgICBzZXNza2V5OiBNLmNmZy5zZXNza2V5XG4gICAgICAgIH0sXG4gICAgICAgIFwic3VjY2Vzc1wiOiBmdW5jdGlvbihkYXRhKSB7XG4gICAgICAgICAgICBpZiAoZGF0YS5taWdyYXRlZCA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gTS5jZmcud3d3cm9vdCArIFwiL21vZC90dXJuaXRpbnRvb2x0d28vdmlldy5waHA/aWQ9XCIrZGF0YS52MmlkO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBkaXNwbGF5TWlncmF0aW9uTW9kYWwoKTtcblxuICAgICAgICAgICAgICAgICQoJy5kb250bWlncmF0ZV9saW5rJykuY2xpY2soJC5wcm94eShkb250bWlncmF0ZSwgbnVsbCwgJC5jb2xvcmJveCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG59KTtcblxuJCgnLm1pZ3JhdGVfbGluaycpLm9uKCdjbGljaycsIGZ1bmN0aW9uKCkge1xuICAgICQoJyNhc2t0b21pZ3JhdGUnKS5oaWRlKCk7XG4gICAgJCgnI21pZ3JhdGluZycpLnNob3coKTtcbiAgICBtaWdyYXRlKCQodGhpcykuZGF0YShcImNvdXJzZWlkXCIpLCAkKHRoaXMpLmRhdGEoXCJ0dXJuaXRpbnRvb2xpZFwiKSk7XG59KTtcblxuZnVuY3Rpb24gZG9udG1pZ3JhdGUoY2IpIHtcbiAgICAkKCcjbWlncmF0aW9uX2FsZXJ0JykuaGlkZSgpO1xuICAgIGNiLmNsb3NlKCk7XG59XG5cbmZ1bmN0aW9uIGxpZ2h0Qm94Q2xvc2VCdXR0b24oY2IpIHtcbiAgICAkKCdib2R5JykuYXBwZW5kKCc8ZGl2IGlkPVwidGlpX2Nsb3NlX2JhclwiPjxhIGNsYXNzPVwidGlpX2Nsb3NlX2xpbmtcIiBocmVmPVwiI1wiPicgKyBNLnN0ci50dXJuaXRpbnRvb2x0d28uY2xvc2VidXR0b24gKyAnPC9hPjwvZGl2PicpO1xufVxuXG5cbmZ1bmN0aW9uIGRpc3BsYXlNaWdyYXRpb25Nb2RhbCgpIHtcbiAgICAvLyBPbmx5IGRpc3BsYXkgdGhlIG1vZGFsIGR1cmluZyBhIG1hbnVhbCBtaWdyYXRpb24uXG4gICAgaWYgKCQoJyNtaWdyYXRlX3R5cGUnKS5kYXRhKFwidHVybml0aW50b29saWRcIikgIT0gJChcIiNtaWdyYXRlX3R5cGVcIikuZGF0YShcImxhc3Rhc2tlZFwiKSkge1xuICAgICAgICAkLmNvbG9yYm94KHt3aWR0aDogNTUwLCBoZWlnaHQ6IDYwMCwgaW5saW5lOnRydWUsIG9wYWNpdHk6IFwiMC43XCIsIGhyZWY6XCIjbWlncmF0aW9uX2FsZXJ0XCIsXG4gICAgICAgICAgICBvbkxvYWQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICQoJyNhc2t0b21pZ3JhdGUnKS5zaG93KCk7XG4gICAgICAgICAgICAgICAgbGlnaHRCb3hDbG9zZUJ1dHRvbigpO1xuXG4gICAgICAgICAgICAgICAgJCgnLnRpaV9jbG9zZV9saW5rJykuY2xpY2soJC5wcm94eShkb250bWlncmF0ZSwgbnVsbCwgJC5jb2xvcmJveCkpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG9uQ2xlYW51cDpmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAkKCcjdGlpX2Nsb3NlX2JhcicpLnJlbW92ZSgpO1xuICAgICAgICAgICAgICAgICQoJyNtaWdyYXRpb25fYWxlcnQnKS5oaWRlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgICQoJyNtaWdyYXRpb25fYWxlcnQnKS5zaG93KCk7XG4gICAgfVxuXG4gICAgaWYgKCQoJyNtaWdyYXRlX3R5cGUnKS5kYXRhKFwibWlncmF0ZXR5cGVcIikgPT0gMikge1xuICAgICAgICAkKCcjYXNrdG9taWdyYXRlJykuaGlkZSgpO1xuICAgICAgICAkKCcjbWlncmF0aW5nJykuc2hvdygpO1xuXG4gICAgICAgIG1pZ3JhdGUoJChcIiNtaWdyYXRlX3R5cGVcIikuZGF0YShcImNvdXJzZWlkXCIpLCAkKFwiI21pZ3JhdGVfdHlwZVwiKS5kYXRhKFwidHVybml0aW50b29saWRcIikpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gbWlncmF0ZShjb3Vyc2VpZCwgdHVybml0aW50b29saWQpIHtcbiAgICAkLmFqYXgoe1xuICAgICAgICBcImRhdGFUeXBlXCI6ICdqc29uJyxcbiAgICAgICAgXCJ0eXBlXCI6IFwiUE9TVFwiLFxuICAgICAgICB1cmw6IE0uY2ZnLnd3d3Jvb3QgKyBcIi9tb2QvdHVybml0aW50b29sdHdvL2FqYXgucGhwXCIsXG4gICAgICAgIFwiZGF0YVwiOiB7YWN0aW9uOiBcImJlZ2luX21pZ3JhdGlvblwiLCBjb3Vyc2VpZDogY291cnNlaWQsIHR1cm5pdGludG9vbGlkOiB0dXJuaXRpbnRvb2xpZCwgc2Vzc2tleTogTS5jZmcuc2Vzc2tleX0sXG4gICAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uKGRhdGEpIHtcbiAgICAgICAgICAgIGlmICgkLmNvbG9yYm94KSB7XG4gICAgICAgICAgICAgICAgJC5jb2xvcmJveC5jbG9zZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgJCgnI21pZ3JhdGlvbl9hbGVydCcpLmhpZGUoKTtcblxuICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSBNLmNmZy53d3dyb290ICsgXCIvbW9kL3R1cm5pdGludG9vbHR3by92aWV3LnBocD9pZD1cIitkYXRhLmlkO1xuICAgICAgICB9LFxuICAgICAgICBlcnJvcjogZnVuY3Rpb24oZXJyb3IpIHtcbiAgICAgICAgICAgIHZhciBkYXRhID0gZXJyb3IucmVzcG9uc2VKU09OO1xuICAgICAgICAgICAgaWYgKCQuY29sb3Jib3gpIHtcbiAgICAgICAgICAgICAgICAkLmNvbG9yYm94LmNsb3NlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAkKCcjbWlncmF0aW9uX2FsZXJ0JykuaGlkZSgpO1xuICAgICAgICAgICAgJCgnI3R1cm5pdGludG9vbF9zdHlsZScpXG4gICAgICAgICAgICAgICAgLnByZXBlbmQoJzxkaXYgaWQ9XCJmdWxsLWVycm9yXCIgY2xhc3M9XCJib3ggZ2VuZXJhbGJveCBub3RpY2Vib3hcIj4nICsgZGF0YS5lcnJvciArICcgJyArIGRhdGEubWVzc2FnZSArICc8L2Rpdj4nKTtcblxuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgd2UgaGF2ZSBhIHN0YWNrIHRyYWNlIGluY2x1ZGVkLlxuICAgICAgICAgICAgaWYgKGRhdGEuaGFzT3duUHJvcGVydHkoJ3RyYWNlJykpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGRhdGEubWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihKU09OLnN0cmluZ2lmeShkYXRhLnRyYWNlLCBudWxsLCA0KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbiJdfQ== diff --git a/lang/en/turnitintooltwo.php b/lang/en/turnitintooltwo.php index d96ed934..61662c58 100755 --- a/lang/en/turnitintooltwo.php +++ b/lang/en/turnitintooltwo.php @@ -648,5 +648,5 @@ $string['v1migrationearlyaccess'] = 'Early Access'; $string['reportgenspeed_resubmission'] = 'You have already submitted a paper to this assignment and a Similarity Report was generated for your submission. If you choose to resubmit your paper, your earlier submission will be replaced and a new report will be generated. After {$a->num_resubmissions} resubmissions, you will need to wait {$a->num_hours} hours after a resubmission to see a new Similarity Report.'; $string['migrationtool:gradebookerror'] = 'Your assignment was migrated but the grades could not be confirmed in the gradebook so the V1 assignment has not been deleted.

Please check the grades in the gradebook and remove the V1 assignment once you are happy - leaving it may cause the grades to be counted in the total twice.'; -$string['migrationtool:successful1'] = "Your assignment has been successfully migrated from Moodle Direct V1 to V2 and the V1 assignment has been removed."; -$string['migrationtool:successful2'] = "Your assignment has been successfully migrated from Moodle Direct V1 to V2.

However as there were more than 200 grades in this assignment the gradebook will be updated via the cron task. Once this has been completed the V1 assignment will be removed.

Please do not remove the V1 assignment yourself as this may cause the grades to not be updated correctly."; \ No newline at end of file +$string['migrationtool:successful'] = "Your assignment has been successfully migrated from Moodle Direct V1 to V2 and the V1 assignment has been removed."; +$string['migrationtool:successfulcron'] = "Your assignment has been successfully migrated from Moodle Direct V1 to V2.

However as there were more than 200 grades in this assignment the gradebook will be updated via the cron task. Once this has been completed the V1 assignment will be removed.

Please do not remove the V1 assignment yourself as this may cause the grades to not be updated correctly."; \ No newline at end of file diff --git a/tests/unit/classes/v1migration/v1migration_test.php b/tests/unit/classes/v1migration/v1migration_test.php index 96f8d9ab..50053164 100755 --- a/tests/unit/classes/v1migration/v1migration_test.php +++ b/tests/unit/classes/v1migration/v1migration_test.php @@ -351,8 +351,7 @@ public function test_migrate_assignment() { $timestamp = time(); $_SESSION["migrationtool"][$v1assignment->id]["gradesupdated"] = $timestamp; - $response = $v1migration->migrate(); - $v2assignmentid = $response["turnitintooltwoid"]; + $v2assignmentid = $v1migration->migrate(); // Verify assignment has migrated. $v2assignment = $DB->get_record('turnitintooltwo', array('id' => $v2assignmentid)); @@ -419,8 +418,7 @@ public function test_migrate_multiple_submission() { // Migrate assignment. $v1migration = new v1migration($course->id, $v1assignment); - $response = $v1migration->migrate(); - $v2assignmentid = $response["turnitintooltwoid"]; + $v2assignmentid = $v1migration->migrate(); // Verify only one submission has migrated. $v2submissions = $DB->get_records('turnitintooltwo_submissions', array('turnitintooltwoid' => $v2assignmentid)); @@ -478,8 +476,7 @@ public function test_migrate_multiple_unenrolled_users() { // Migrate assignment. $v1migration = new v1migration($course->id, $v1assignment); - $response = $v1migration->migrate(); - $v2assignmentid = $response["turnitintooltwoid"]; + $v2assignmentid = $v1migration->migrate(); // Verify both submissions have migrated. $v2submissions = $DB->get_records('turnitintooltwo_submissions', diff --git a/view.php b/view.php index 904c8b95..906b22d7 100755 --- a/view.php +++ b/view.php @@ -107,9 +107,9 @@ $PAGE->set_pagelayout('standard'); // Settings for page navigation. +$config = turnitintooltwo_admin_config(); if ($viewcontext == "window") { // Show navigation if required. - $config = turnitintooltwo_admin_config(); if ($config->inboxlayout == 1) { $PAGE->set_cm($cm); $PAGE->set_pagelayout('incourse'); @@ -132,20 +132,29 @@ $turnitintooltwoassignment = new turnitintooltwo_assignment($turnitintooltwo->id, $turnitintooltwo); -// Migration tool -$notice = array(); -if ($migrated === 1 || $migrated === 2) { - $notice["type"] = "success"; - $notice["message"] = get_string('migrationtool:successful'.$migrated, 'turnitintooltwo'); - +if (isset($_SESSION["migrationtool"]["status"])) { + $notice = array(); + switch ($_SESSION["migrationtool"]["status"]) { + case "success": + $notice["type"] = "success"; + $notice["message"] = get_string('migrationtool:successful', 'turnitintooltwo'); + $error = false; + break; + case "cron": + $notice["type"] = "success"; + $notice["message"] = get_string('migrationtool:successfulcron', 'turnitintooltwo'); + $error = false; + break; + case "gradebookerror": + $notice["type"] = "danger"; + $notice["message"] = get_string('migrationtool:gradebookerror', 'turnitintooltwo'); + $error = true; + break; + } include_once("classes/v1migration/v1migration.php"); - v1migration::check_account($config->accountid); -} elseif ($migrated === 3) { - $notice["type"] = "danger"; - $notice["message"] = get_string('migrationtool:gradebookerror', 'turnitintooltwo'); + v1migration::check_account($config->accountid, $error); - include_once("classes/v1migration/v1migration.php"); - v1migration::check_account($config->accountid, 1); + unset($_SESSION["migrationtool"]["status"]); } // Define file upload options. From bbc6637196e481bb1d4cf330e11d4f9e6c8b0997 Mon Sep 17 00:00:00 2001 From: David Winn Date: Mon, 5 Mar 2018 14:19:17 +0000 Subject: [PATCH 15/21] Migration tool string changes. --- lang/en/turnitintooltwo.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lang/en/turnitintooltwo.php b/lang/en/turnitintooltwo.php index 61662c58..5cba4a9a 100755 --- a/lang/en/turnitintooltwo.php +++ b/lang/en/turnitintooltwo.php @@ -588,7 +588,7 @@ $string['migrationredirect'] = 'You will be redirected to the Moodle Direct V2 assignment upon completion.'; $string['migration_event_name'] = 'Migrate V1 Assignment To V2'; $string['migration_event_desc'] = 'Turnitin Tool V1 Course: {$a->v1_name} ({$a->v1_cm_id}) has been migrated to Turnitin V2 ({$a->v2_cm_id}).'; -$string['migrationtoolv1list'] = 'Below is a list of V1 assignments which have not yet been migrated.'; +$string['migrationtoolv1list'] = 'Below, you can find a list of Moodle Direct V1 assignments that have not yet migrated to V2.'; $string['complete'] = 'complete'; $string['assignments'] = 'assignments'; $string['migrationtoolerror'] = 'The migration of this assignment has failed. Please try again.'; @@ -647,6 +647,6 @@ $string['renew_assignment_dates_help'] = 'Select this option to use new assignment dates when resetting a course. The assignment start date will be set to the date and time of the course reset, while the due and post date will elapse seven days from now.

If you’d rather not use new assignment dates, that’s fine; Turnitin will use the course’s original assignment dates instead. However, any anonymous marking settings will not be carried over for assignments where the post date has passed.'; $string['v1migrationearlyaccess'] = 'Early Access'; $string['reportgenspeed_resubmission'] = 'You have already submitted a paper to this assignment and a Similarity Report was generated for your submission. If you choose to resubmit your paper, your earlier submission will be replaced and a new report will be generated. After {$a->num_resubmissions} resubmissions, you will need to wait {$a->num_hours} hours after a resubmission to see a new Similarity Report.'; -$string['migrationtool:gradebookerror'] = 'Your assignment was migrated but the grades could not be confirmed in the gradebook so the V1 assignment has not been deleted.

Please check the grades in the gradebook and remove the V1 assignment once you are happy - leaving it may cause the grades to be counted in the total twice.'; -$string['migrationtool:successful'] = "Your assignment has been successfully migrated from Moodle Direct V1 to V2 and the V1 assignment has been removed."; -$string['migrationtool:successfulcron'] = "Your assignment has been successfully migrated from Moodle Direct V1 to V2.

However as there were more than 200 grades in this assignment the gradebook will be updated via the cron task. Once this has been completed the V1 assignment will be removed.

Please do not remove the V1 assignment yourself as this may cause the grades to not be updated correctly."; \ No newline at end of file +$string['migrationtool:gradebookerror'] = 'Your assignment has successfully migrated from Moodle Direct V1 to V2. However, some grades failed to update in the grade book during migration. The original V1 assignment is available for you to check any conflicting grades. Please remove the V1 assignment once you’ve completed this check.

Warning: Failing to remove a migrated V1 assignment may cause grades to count twice towards the grade book total.'; +$string['migrationtool:successful'] = "Your assignment has successfully migrated from Moodle Direct V1 to V2. The original V1 assignment has been removed."; +$string['migrationtool:successfulcron'] = "Your assignment has successfully migrated from Moodle Direct V1 to V2. As this is a large assignment, please allow time for the grade book to update. The original V1 assignment will be removed automatically once the update is complete.

Warning: Removing the V1 assignment manually may result in the grade book failing to update correctly."; \ No newline at end of file From 1f81431f8de5418fff128e5eab8625db365da296 Mon Sep 17 00:00:00 2001 From: David Winn Date: Mon, 5 Mar 2018 14:21:12 +0000 Subject: [PATCH 16/21] Apostrophe --- lang/en/turnitintooltwo.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lang/en/turnitintooltwo.php b/lang/en/turnitintooltwo.php index 5cba4a9a..0b7b2093 100755 --- a/lang/en/turnitintooltwo.php +++ b/lang/en/turnitintooltwo.php @@ -647,6 +647,6 @@ $string['renew_assignment_dates_help'] = 'Select this option to use new assignment dates when resetting a course. The assignment start date will be set to the date and time of the course reset, while the due and post date will elapse seven days from now.

If you’d rather not use new assignment dates, that’s fine; Turnitin will use the course’s original assignment dates instead. However, any anonymous marking settings will not be carried over for assignments where the post date has passed.'; $string['v1migrationearlyaccess'] = 'Early Access'; $string['reportgenspeed_resubmission'] = 'You have already submitted a paper to this assignment and a Similarity Report was generated for your submission. If you choose to resubmit your paper, your earlier submission will be replaced and a new report will be generated. After {$a->num_resubmissions} resubmissions, you will need to wait {$a->num_hours} hours after a resubmission to see a new Similarity Report.'; -$string['migrationtool:gradebookerror'] = 'Your assignment has successfully migrated from Moodle Direct V1 to V2. However, some grades failed to update in the grade book during migration. The original V1 assignment is available for you to check any conflicting grades. Please remove the V1 assignment once you’ve completed this check.

Warning: Failing to remove a migrated V1 assignment may cause grades to count twice towards the grade book total.'; +$string['migrationtool:gradebookerror'] = 'Your assignment has successfully migrated from Moodle Direct V1 to V2. However, some grades failed to update in the grade book during migration. The original V1 assignment is available for you to check any conflicting grades. Please remove the V1 assignment once you\'ve completed this check.

Warning: Failing to remove a migrated V1 assignment may cause grades to count twice towards the grade book total.'; $string['migrationtool:successful'] = "Your assignment has successfully migrated from Moodle Direct V1 to V2. The original V1 assignment has been removed."; $string['migrationtool:successfulcron'] = "Your assignment has successfully migrated from Moodle Direct V1 to V2. As this is a large assignment, please allow time for the grade book to update. The original V1 assignment will be removed automatically once the update is complete.

Warning: Removing the V1 assignment manually may result in the grade book failing to update correctly."; \ No newline at end of file From 9d4d313269f319372a8f53882f6e6cf7a80d96d9 Mon Sep 17 00:00:00 2001 From: David Winn Date: Wed, 7 Mar 2018 15:15:17 +0000 Subject: [PATCH 17/21] Reinstate previous functionality. --- classes/v1migration/v1migration.php | 58 ++++++++-- jquery/turnitintooltwo_extra.js | 46 +++++++- jquery/turnitintooltwo_extra.min.js | 4 +- lang/en/turnitintooltwo.php | 3 + settings_extras.php | 38 +++++- .../classes/v1migration/v1migration_test.php | 108 +++++++++++++++--- 6 files changed, 229 insertions(+), 28 deletions(-) diff --git a/classes/v1migration/v1migration.php b/classes/v1migration/v1migration.php index 798dc8b9..5827fe81 100644 --- a/classes/v1migration/v1migration.php +++ b/classes/v1migration/v1migration.php @@ -580,7 +580,7 @@ public static function turnitintooltwo_getassignments() { $idisplaystart = optional_param('iDisplayStart', 0, PARAM_INT); $idisplaylength = optional_param('iDisplayLength', 10, PARAM_INT); $secho = optional_param('sEcho', 1, PARAM_INT); - $displaycolumns = array('id', 'name'); + $displaycolumns = array('', 'id', 'name', 'migrated'); $queryparams = array(); // Add sort to query. $isortcol[0] = optional_param('iSortCol_0', null, PARAM_INT); @@ -627,16 +627,27 @@ public static function turnitintooltwo_getassignments() { $querywhere = substr_replace( $querywhere, "", -3 ); $querywhere .= " )"; } - $query = "SELECT id, name FROM {turnitintool}".$querywhere.$queryorder; + $query = "SELECT id, name, migrated FROM {turnitintool}".$querywhere.$queryorder; $assignments = $DB->get_records_sql($query, $queryparams, $idisplaystart, $idisplaylength); $totalassignments = count($DB->get_records_sql($query, $queryparams)); $return["aaData"] = array(); foreach ($assignments as $assignment) { - $assignmentlink = new moodle_url('/mod/turnitintool/view.php', array('a' => $assignment->id, 'id' => '0')); - $assignmenttitle = html_writer::link($assignmentlink, format_string($assignment->name), array('target' => '_blank' )); + if ($assignment->migrated == 1) { + $checkbox = html_writer::checkbox('assignmentids[]', $assignment->id, false, '', array("class" => "browser_checkbox")); + $sronly = html_writer::tag('span', get_string('yes', 'turnitintooltwo'), array('class' => 'sr-only')); + $assignment->migrated = html_writer::tag('span', $sronly, array('class' => 'fa fa-check')); - $return["aaData"][] = array($assignment->id, $assignmenttitle); + $assignmenttitle = format_string($assignment->name); + } else { + $checkbox = ""; + $sronly = html_writer::tag('span', get_string('no', 'turnitintooltwo'), array('class' => 'sr-only')); + $assignment->migrated = html_writer::tag('span', $sronly, array('class' => 'fa fa-times')); + + $assignmentlink = new moodle_url('/mod/turnitintool/view.php', array('a' => $assignment->id, 'id' => '0')); + $assignmenttitle = html_writer::link($assignmentlink, format_string($assignment->name), array('target' => '_blank' )); + } + $return["aaData"][] = array($checkbox, $assignment->id, $assignmenttitle, $assignment->migrated); } $return["sEcho"] = $secho; $return["iTotalRecords"] = count($assignments); @@ -670,6 +681,34 @@ public static function delete_migrated_assignment($assignmentid) { } } + /** + * Delete a list of assignments. + * + * @param array $assignmentids The assignment IDs to delete. + */ + public static function turnitintooltwo_delete_assignments($assignmentids) { + global $CFG, $DB; + + require_once($CFG->dirroot . "/mod/turnitintool/lib.php"); + + foreach ($assignmentids as $assignmentid) { + $cm = get_coursemodule_from_instance('turnitintool', $assignmentid); + + // We have found that backups aren't reliable on MSSQL so rather than use Moodle's + // function which uses the recycle tool and the backup procedure. We handle the deletion directly. + if ($CFG->dbtype == 'mssql' || $CFG->dbtype == 'sqlsrv') { + turnitintool_delete_instance($assignmentid); + + // Delete course module. + $DB->delete_records('course_modules', array('id' => $cm->id)); + + rebuild_course_cache($cm->course); + } else { + course_delete_module($cm->id); + } + } + } + /** * Check that v1 and v2 account ids are the same. */ @@ -697,7 +736,7 @@ public static function check_account_ids() { * @param $enablesetting - whether the settings form should be enabled. */ public static function output_settings_form($enablesetting = true) { - global $CFG, $DB; + global $CFG, $DB, $PAGE; $output = ""; require_once($CFG->dirroot.'/mod/turnitintooltwo/turnitintooltwo_form.class.php'); @@ -734,7 +773,12 @@ public static function output_settings_form($enablesetting = true) { $customdata["elements"] = $elements; $customdata["disable_form_change_checker"] = true; $customdata["show_cancel"] = false; - + + // Strings for javascript confirm deletion. + $PAGE->requires->string_for_js('confirmv1deletetitle', 'turnitintooltwo'); + $PAGE->requires->string_for_js('confirmv1deletetext', 'turnitintooltwo'); + $PAGE->requires->string_for_js('confirmv1deletewarning', 'turnitintooltwo'); + $migrationform = new turnitintooltwo_form($CFG->wwwroot.'/mod/turnitintooltwo/settings_extras.php?cmd=v1migration', $customdata); diff --git a/jquery/turnitintooltwo_extra.js b/jquery/turnitintooltwo_extra.js index 238ee0f1..d1652a55 100644 --- a/jquery/turnitintooltwo_extra.js +++ b/jquery/turnitintooltwo_extra.js @@ -56,20 +56,60 @@ jQuery(document).ready(function($) { } }); + // Disable the submit button if Turnitin v1 and v2 account ids are different in Migration Tool. + if ( $('#sametiiaccount').data('sametiiaccount') == "0" ) { + $('select[name="enablemigrationtool"]').attr('disabled', 'disabled'); + $('select[name="enablemigrationtool"]').closest('form').find('input[name="submitbutton"]').attr('disabled', 'disabled'); + } + + // Disable the delete button in migration tab if there are no results selected and re-enable if there are. + $('input[name="selectallcb"]').closest('form').find('input[name="submitbutton"]').attr('disabled', 'disabled'); + $(document).on('click', '#migrationTable input[name="selectallcb"], #migrationTable .browser_checkbox', function() { + if ($('#migrationTable .browser_checkbox:checked').length > 0) { + $('#migrationTable .browser_checkbox').closest('form').find('input[name="submitbutton"]').removeAttr('disabled'); + } else { + $('#migrationTable .browser_checkbox').closest('form').find('input[name="submitbutton"]').attr('disabled', 'disabled'); + } + }); + + // Ask administrator for confirmation if user clicks to delete selected V1 assignments. + var submitbutton = $('#migrationTable').closest('form').find('input[name="submitbutton"]'); + submitbutton.click(function(ev) { + ev.preventDefault(); + + // Construct confirm message to administrator. + var message = M.str.turnitintooltwo.confirmv1deletetitle+'\n\n'; + message += M.util.get_string('confirmv1deletetext', 'turnitintooltwo', $('#migrationTable .browser_checkbox:checked').length)+'\n\n'; + message += M.str.turnitintooltwo.confirmv1deletewarning; + + if (confirm(message)) { + $('#migrationTable').closest('form').submit(); + } + + }); + // Configure the migration datatable in the plugin settings area. $('#migrationTable').dataTable({ "bDestroy": true, "bProcessing": true, "bServerSide": true, "oLanguage": dataTablesLangMigration, - "aaSorting": [[ 1, "asc" ]], + "aaSorting": [[ 2, "asc" ]], "aLengthMenu": [[10, 25, 50, 100, -1], [10, 25, 50, 100, "All"]], "sAjaxSource": "ajax.php?action=get_assignments", "sDom": '<"top"lf>rt<"bottom"irp><"clear">', "aoColumns": [ + {"bSortable": false, "bSearchable": false, + "fnCreatedCell": function (nTd, sData, oData, iRow, iCol) { + $(nTd).addClass('centered_cell'); + }}, {"bSortable": true, "sClass": "centered_cell", "bSearchable": false}, - {"bSortable": true, "bSearchable": true} - ] + {"bSortable": true, "bSearchable": true}, + {"bSortable": true, "sClass": "centered_cell", "bSearchable": false} + ], + "fnDrawCallback": function() { + $('input[name="selectallcb"]').attr('checked', false); + } }); $('#migrationTable_filter input').attr("placeholder", 'Search'); diff --git a/jquery/turnitintooltwo_extra.min.js b/jquery/turnitintooltwo_extra.min.js index 311a1a4b..516df2be 100644 --- a/jquery/turnitintooltwo_extra.min.js +++ b/jquery/turnitintooltwo_extra.min.js @@ -1,2 +1,2 @@ -jQuery(document).ready(function($){function initialiseEditEndDate(){$("a.edit_course_end_link").colorbox({inline:!0,width:"60%",top:"100px",background:"#fff",height:"260px",opacity:"0.7",className:"edit_end_date_form",onLoad:function(){lightBoxCloseButton()},onComplete:function(){var current_date=$("#"+$(this).attr("id")+" span").attr("id");current_date=current_date.split("_"),$("#id_new_course_end_date_day").val(current_date[1]),$("#id_new_course_end_date_month").val(current_date[2]),$("#id_new_course_end_date_year").val(current_date[3]);var idStr=$(this).attr("id").split("_"),tii_course_id=idStr[2];$('input[name="tii_course_id"]').val(tii_course_id),$('input[name="tii_course_title"]').val($("a#course_"+tii_course_id).html()),$("#cboxLoadedContent .edit_course_end_date_form").show(),$("#dateselector-calendar-panel").css("z-index","9999"),$("#id_save_end_date").click(function(){$.ajax({dataType:"json",type:"POST",url:"ajax.php",data:{action:"edit_course_end_date",tii_course_id:tii_course_id,tii_course_title:$("a#course_"+tii_course_id).html(),sesskey:M.cfg.sesskey,end_date_d:$("#id_new_course_end_date_day").val(),end_date_m:$("#id_new_course_end_date_month").val(),end_date_y:$("#id_new_course_end_date_year").val()},success:function(data){if(eval(data),"success"==data.status)parent.$.fn.colorbox.close(),$("#course_date_"+tii_course_id+" span").html(data.end_date);else{var current_msg=$("#edit_end_date_desc").html;$("#edit_end_date_desc").html(current_msg+" "+data.msg)}}})})},onCleanup:function(){$(".edit_course_end_date_form").hide(),$("#tii_close_bar").remove()}})}function lightBoxCloseButton(){$("body").append('")}function initialiseCourseRecreation(){var e=$(window).width(),t="80%";e<1e3&&(t="860px");var a=$(window).width(),s="80%";a<700&&(s="600px"),$("a.course_recreate").colorbox({iframe:!0,width:t,height:s,top:"100px",className:"migration",opacity:"0.7",onLoad:function(){lightBoxCloseButton()},onCleanup:function(){$("#tii_close_bar").remove()}}),$(".browser_checkbox").click(function(){$(".browser_checkbox:checked").length>0?$(".create_checkboxes").slideDown():$(".create_checkboxes").slideUp()})}function initialiseCourseBrowserButtons(e){$("#id_create_course").click(function(){$.ajax({dataType:"html",type:"POST",url:"ajax.php",data:{action:"create_course",tii_course_id:$("#tii_course_id").html(),tii_course_name:encodeURIComponent($("#tii_course_name").html()),course_name:encodeURIComponent($("#id_coursename").val()),course_category:$("#id_coursecategory").val(),sesskey:M.cfg.sesskey},success:function(t){var a=jQuery.parseJSON(t);hideCourseCreationOptions(a,e)}})}),$("#id_update_course").click(function(){$.ajax({dataType:"html",type:"POST",url:"ajax.php",data:{action:"link_course",tii_course_id:$("#tii_course_id").html(),tii_course_name:$("#tii_course_name").html(),course_to_link:$("#id_coursetolink").val(),sesskey:M.cfg.sesskey},success:function(t){var a=jQuery.parseJSON(t);hideCourseCreationOptions(a,e)}})})}function hideCourseCreationOptions(e,t){if(0!=e){$("#course_id").html(e.courseid);var a='input[name="check_'+$("#tii_course_id").html()+'"]';parent.$(a).hide();var s="#tick_"+$("#tii_course_id").html();parent.$(s).show(),$('fieldset[id$="create_course_fieldset"]').parent().slideToggle(),$('fieldset[id$="update_course_fieldset"]').parent().slideToggle(),$("#or_container").hide(),$("#existing_course_title_span").html(e.coursename),$(".existing_course_title_h3").removeClass("hidden_class"),$(".assignmentids_check").length>0&&($(".assignmentids_check").removeAttr("disabled"),$("#id_assignmentname").removeAttr("disabled"),$("#id_create_assignment").removeAttr("disabled")),$(".assignmentids_check").change(function(){$(".assignmentids_check").filter(":checked").length>=5?$(".assignmentids_check").not(":checked").attr("disabled","disabled"):$(".assignmentids_check").removeAttr("disabled")}),initialiseCreateAssignmentButton(t)}}function initialiseCreateAssignmentButton(e){$("#id_create_assignment").unbind("click"),$("#id_create_assignment").click(function(){var t="";$(".assignmentids_check:checked").each(function(e){t+=$(this).val()+","}),","==t.charAt(t.length-1)&&t.substring(0,t.length-1),$("#id_create_assignment").attr("disabled","disabled"),$.ajax({dataType:"html",type:"POST",url:"ajax.php",data:{action:"create_assignment",course_id:$("#course_id").html(),assignment_name:$("#id_assignmentname").val(),parts:t,sesskey:M.cfg.sesskey},success:function(t){e.fnReloadAjax(),e.fnStandingRedraw(),$("#id_assignmentname").removeAttr("disabled"),$("#id_create_assignment").removeAttr("disabled"),$(".assignmentids_check").removeAttr("disabled")}})})}$(".submissionsDataTable thead tr, #courseBrowserTable thead tr").toggleClass("header");var dataTablesLang={nointegration:M.str.turnitintooltwo.nointegration,sProcessing:M.str.turnitintooltwo.sprocessing,sZeroRecords:M.str.turnitintooltwo.szerorecords,sInfo:M.str.turnitintooltwo.sinfo,sSearch:M.str.turnitintooltwo.ssearch,sLengthMenu:M.str.turnitintooltwo.slengthmenu,sInfoEmpty:M.str.turnitintooltwo.semptytable,oPaginate:{sNext:M.str.turnitintooltwo.snext,sPrevious:M.str.turnitintooltwo.sprevious}},dataTablesLangMigration={nointegration:M.str.turnitintooltwo.nointegration,sProcessing:M.str.turnitintooltwo.sprocessing,sZeroRecords:M.str.turnitintooltwo.szerorecords,sInfo:M.str.turnitintooltwo.sinfo,sSearch:"",sLengthMenu:M.str.turnitintooltwo.slengthmigrationmenu,sInfoEmpty:M.str.turnitintooltwo.semptytable,oPaginate:{sNext:M.str.turnitintooltwo.snext,sPrevious:M.str.turnitintooltwo.sprevious}};$("#unlinkUserTable").dataTable({bDestroy:!0,bProcessing:!0,bServerSide:!0,oLanguage:dataTablesLang,aaSorting:[[2,"asc"]],aLengthMenu:[[10,25,50,100,-1],[10,25,50,100,"All"]],sAjaxSource:"ajax.php?action=get_users",aoColumns:[{bSortable:!1,fnCreatedCell:function(e,t,a,s,i){$(e).addClass("centered_cell")}},null,{aDataSort:[2,3]},{aDataSort:[3,2]},null],fnDrawCallback:function(){$('input[name="selectallcb"]').attr("checked",!1)}}),$("#migrationTable").dataTable({bDestroy:!0,bProcessing:!0,bServerSide:!0,oLanguage:dataTablesLangMigration,aaSorting:[[1,"asc"]],aLengthMenu:[[10,25,50,100,-1],[10,25,50,100,"All"]],sAjaxSource:"ajax.php?action=get_assignments",sDom:'<"top"lf>rt<"bottom"irp><"clear">',aoColumns:[{bSortable:!0,sClass:"centered_cell",bSearchable:!1},{bSortable:!0,bSearchable:!0}]}),$("#migrationTable_filter input").attr("placeholder","Search"),$("#filesTable").dataTable({bDestroy:!0,bProcessing:!0,bServerSide:!0,oLanguage:dataTablesLang,sAjaxSource:"ajax.php?action=get_files",aoColumns:[null,null,null,{sClass:"filename c0",sWidth:"40%"},null,{sClass:"fullname c1",sWidth:"35%"},null,{sClass:"created c2",sWidth:"22%"},{sClass:"remove c3",sWidth:"3%"}],aoColumnDefs:[{bSearchable:!0,bVisible:!1,aTargets:[0]},{bSearchable:!0,bVisible:!1,aTargets:[1]},{bSearchable:!0,bVisible:!1,aTargets:[2]},{bSearchable:!0,bVisible:!0,aTargets:[3]},{bSearchable:!0,bVisible:!1,aTargets:[4]},{bSearchable:!0,bVisible:!0,aTargets:[5]},{bSearchable:!0,bVisible:!1,aTargets:[6]},{bSearchable:!0,bVisible:!0,aTargets:[7]},{bSearchable:!0,bVisible:!0,aTargets:[8]}],fnDrawCallback:function(e){if(0!=e.aiDisplay.length)for(var t=$("#filesTable tbody tr"),a=t[0].getElementsByTagName("td").length,s="",i=0;iip'}),$.datepicker.regional[""].dateFormat="d M yy",$.datepicker.setDefaults($.datepicker.regional[""]);var courseBrowserTable=$("#courseBrowserTable").dataTable({bProcessing:!0,oLanguage:dataTablesLang,aaSorting:[[6,"asc"]],sAjaxSource:"ajax.php",aoColumnDefs:[{bSearchable:!1,bSortable:!1,sWidth:"5%",bVisible:!0,aTargets:[0],fnCreatedCell:function(e){$(e).addClass("center")}},{bSearchable:!0,bVisible:!0,sWidth:"45%",iDataSort:6,aTargets:[1]},{bSearchable:!0,bVisible:!0,sWidth:"10%",aTargets:[2]},{bSearchable:!0,bVisible:!0,sWidth:"20%",iDataSort:7,aTargets:[3],fnCreatedCell:function(e){$(e).addClass("right")}},{bSearchable:!1,bVisible:!0,sWidth:"10%",aTargets:[4],fnCreatedCell:function(e){$(e).addClass("right")}},{bSearchable:!0,bVisible:!0,sWidth:"10%",aTargets:[5],fnCreatedCell:function(e){$(e).addClass("center")}},{bSearchable:!0,bVisible:!1,aTargets:[6]},{bSearchable:!0,bVisible:!1,aTargets:[7]}],fnServerData:function(e,t,a){$.ajax({dataType:"json",type:"POST",url:e,data:{action:"search_classes",course_title:$("#search_course_title").val(),course_integration:$("#search_course_integration").val(),course_end_date:$("#search_course_end_date").val(),sesskey:M.cfg.sesskey},success:function(e){a(e)}})},bStateSave:!0,fnStateSave:function(e,t){try{localStorage.setItem(uid+"DataTables",JSON.stringify(t))}catch(a){}},fnStateLoad:function(e){try{return JSON.parse(localStorage.getItem(uid+"DataTables"))}catch(t){}},fnDrawCallback:function(){$('input[name="selectallcb"]').attr("checked",!1),initialiseCourseRecreation(),initialiseEditEndDate(),$("#search_courses_button").removeAttr("disabled")}});$("#search_courses_button").click(function(){return $(this).attr("disabled","disabled"),courseBrowserTable.fnReloadAjax(),courseBrowserTable.fnStandingRedraw(),!1}),$("#search_course_end_date").datepicker();var oTable=$("#assignmentBrowserTable").dataTable({bProcessing:!0,oLanguage:dataTablesLang,sAjaxSource:"ajax.php",fnServerData:function(sSource,aoData,fnCallback){$("#id_create_course").attr("disabled","disabled"),$("#id_update_course").attr("disabled","disabled"),$("#assignmentBrowserTable").length>0&&$(".side-pre-only #page-content #region-main").css({"margin-left":"0px"}),$("#id_assignmentname").attr("disabled","disabled"),$("#id_create_assignment").attr("disabled","disabled"),$.ajax({dataType:"json",type:"POST",url:sSource,data:{action:"get_assignments",tii_course_id:$("#tii_course_id").html(),sesskey:M.cfg.sesskey},success:function(result){eval(result),initialiseCourseBrowserButtons(oTable),fnCallback(result),"0"!=$("#course_id").html()&&result.number_of_assignments>0?($("#id_assignmentname").removeAttr("disabled"),$("#id_create_assignment").removeAttr("disabled"),$(".assignmentids_check").removeAttr("disabled"),initialiseCreateAssignmentButton(oTable)):($("#id_assignmentname").attr("disabled","disabled"),$("#id_create_assignment").attr("disabled","disabled"),$(".assignmentids_check").attr("disabled","disabled")),$("#id_create_course").removeAttr("disabled"),$("#id_update_course").removeAttr("disabled")}})},aoColumnDefs:[{bSearchable:!1,bVisible:!0,aTargets:[0]},{bSearchable:!0,bVisible:!0,aTargets:[1],fnCreatedCell:function(e){$(e).addClass("nowrap")}},{bSearchable:!0,bVisible:!0,aTargets:[2]},{bSearchable:!0,bVisible:!0,aTargets:[3]}]});if($("#create_classes_button").colorbox({iframe:!0,width:"60%",top:"200px",height:"124px",opacity:"0.7",className:"course_creation",href:function(){var e=$(".create_course_category").val(),t=$(".create_assignment_checkbox").is(":checked")?"1":"0",a="";$(".browser_checkbox:checked").each(function(e){a+="&class_id"+e+"="+$(this).val(),e++});var s=window.location.href,i=s.replace("cmd=courses","cmd=multiple_class_recreation");return i+"&view_context=box&category="+e+"&assignments="+t+a+"&sesskey="+M.cfg.sesskey},onCleanup:function(){window.location=window.location}}),$("#class_ids").length>0){$(".side-pre-only #page-content #region-main").css({"margin-left":"0px"}),$(".has-region-side-pre #page-content #region-main").css({width:"100%","margin-top":"-30px"});var class_ids=$("#class_ids").html();$.ajax({dataType:"html",type:"POST",url:"ajax.php",data:{action:"create_courses",class_ids:class_ids,course_category:$("#course_category").html(),create_assignments:$("#create_assignments").html(),sesskey:M.cfg.sesskey},success:function(e){$("#course_creation_status").html(e)}})}}); -//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInR1cm5pdGludG9vbHR3b19leHRyYS5qcyJdLCJuYW1lcyI6WyJqUXVlcnkiLCJkb2N1bWVudCIsInJlYWR5IiwiJCIsImluaXRpYWxpc2VFZGl0RW5kRGF0ZSIsImNvbG9yYm94IiwiaW5saW5lIiwid2lkdGgiLCJ0b3AiLCJiYWNrZ3JvdW5kIiwiaGVpZ2h0Iiwib3BhY2l0eSIsImNsYXNzTmFtZSIsIm9uTG9hZCIsImxpZ2h0Qm94Q2xvc2VCdXR0b24iLCJvbkNvbXBsZXRlIiwiY3VycmVudF9kYXRlIiwidGhpcyIsImF0dHIiLCJzcGxpdCIsInZhbCIsImlkU3RyIiwidGlpX2NvdXJzZV9pZCIsImh0bWwiLCJzaG93IiwiY3NzIiwiY2xpY2siLCJhamF4IiwiZGF0YVR5cGUiLCJ0eXBlIiwidXJsIiwiZGF0YSIsImFjdGlvbiIsInRpaV9jb3Vyc2VfdGl0bGUiLCJzZXNza2V5IiwiTSIsImNmZyIsImVuZF9kYXRlX2QiLCJlbmRfZGF0ZV9tIiwiZW5kX2RhdGVfeSIsInN1Y2Nlc3MiLCJldmFsIiwic3RhdHVzIiwicGFyZW50IiwiZm4iLCJjbG9zZSIsImVuZF9kYXRlIiwiY3VycmVudF9tc2ciLCJtc2ciLCJvbkNsZWFudXAiLCJoaWRlIiwicmVtb3ZlIiwiYXBwZW5kIiwic3RyIiwidHVybml0aW50b29sdHdvIiwiY2xvc2VidXR0b24iLCJpbml0aWFsaXNlQ291cnNlUmVjcmVhdGlvbiIsIndpbmRvd1dpZHRoIiwid2luZG93IiwiY29sb3JCb3hXaWR0aCIsIndpbmRvd0hlaWdodCIsImNvbG9yQm94SGVpZ2h0IiwiaWZyYW1lIiwibGVuZ3RoIiwic2xpZGVEb3duIiwic2xpZGVVcCIsImluaXRpYWxpc2VDb3Vyc2VCcm93c2VyQnV0dG9ucyIsIm9UYWJsZSIsInRpaV9jb3Vyc2VfbmFtZSIsImVuY29kZVVSSUNvbXBvbmVudCIsImNvdXJzZV9uYW1lIiwiY291cnNlX2NhdGVnb3J5Iiwib2JqIiwicGFyc2VKU09OIiwiaGlkZUNvdXJzZUNyZWF0aW9uT3B0aW9ucyIsImNvdXJzZV90b19saW5rIiwiY291cnNlaWQiLCJjYl9lbGVtZW50IiwidGlja19lbGVtZW50Iiwic2xpZGVUb2dnbGUiLCJjb3Vyc2VuYW1lIiwicmVtb3ZlQ2xhc3MiLCJyZW1vdmVBdHRyIiwiY2hhbmdlIiwiZmlsdGVyIiwibm90IiwiaW5pdGlhbGlzZUNyZWF0ZUFzc2lnbm1lbnRCdXR0b24iLCJ1bmJpbmQiLCJwYXJ0cyIsImVhY2giLCJpIiwiY2hhckF0Iiwic3Vic3RyaW5nIiwiY291cnNlX2lkIiwiYXNzaWdubWVudF9uYW1lIiwiZm5SZWxvYWRBamF4IiwiZm5TdGFuZGluZ1JlZHJhdyIsInRvZ2dsZUNsYXNzIiwiZGF0YVRhYmxlc0xhbmciLCJub2ludGVncmF0aW9uIiwic1Byb2Nlc3NpbmciLCJzcHJvY2Vzc2luZyIsInNaZXJvUmVjb3JkcyIsInN6ZXJvcmVjb3JkcyIsInNJbmZvIiwic2luZm8iLCJzU2VhcmNoIiwic3NlYXJjaCIsInNMZW5ndGhNZW51Iiwic2xlbmd0aG1lbnUiLCJzSW5mb0VtcHR5Iiwic2VtcHR5dGFibGUiLCJvUGFnaW5hdGUiLCJzTmV4dCIsInNuZXh0Iiwic1ByZXZpb3VzIiwic3ByZXZpb3VzIiwiZGF0YVRhYmxlc0xhbmdNaWdyYXRpb24iLCJzbGVuZ3RobWlncmF0aW9ubWVudSIsImRhdGFUYWJsZSIsImJEZXN0cm95IiwiYlByb2Nlc3NpbmciLCJiU2VydmVyU2lkZSIsIm9MYW5ndWFnZSIsImFhU29ydGluZyIsImFMZW5ndGhNZW51Iiwic0FqYXhTb3VyY2UiLCJhb0NvbHVtbnMiLCJiU29ydGFibGUiLCJmbkNyZWF0ZWRDZWxsIiwiblRkIiwic0RhdGEiLCJvRGF0YSIsImlSb3ciLCJpQ29sIiwiYWRkQ2xhc3MiLCJhRGF0YVNvcnQiLCJmbkRyYXdDYWxsYmFjayIsInNEb20iLCJzQ2xhc3MiLCJiU2VhcmNoYWJsZSIsInNXaWR0aCIsImFvQ29sdW1uRGVmcyIsImJWaXNpYmxlIiwiYVRhcmdldHMiLCJvU2V0dGluZ3MiLCJhaURpc3BsYXkiLCJuVHJzIiwiaUNvbHNwYW4iLCJnZXRFbGVtZW50c0J5VGFnTmFtZSIsInNMYXN0R3JvdXAiLCJzR3JvdXAiLCJfaURpc3BsYXlTdGFydCIsImFvRGF0YSIsIl9hRGF0YSIsIm5Hcm91cCIsImNyZWF0ZUVsZW1lbnQiLCJuQ2VsbCIsImNvbFNwYW4iLCJpbm5lckhUTUwiLCJhcHBlbmRDaGlsZCIsInBhcmVudE5vZGUiLCJpbnNlcnRCZWZvcmUiLCJhYVNvcnRpbmdGaXhlZCIsImRhdGVwaWNrZXIiLCJyZWdpb25hbCIsImRhdGVGb3JtYXQiLCJzZXREZWZhdWx0cyIsImNvdXJzZUJyb3dzZXJUYWJsZSIsImlEYXRhU29ydCIsImZuU2VydmVyRGF0YSIsInNTb3VyY2UiLCJmbkNhbGxiYWNrIiwiY291cnNlX3RpdGxlIiwiY291cnNlX2ludGVncmF0aW9uIiwiY291cnNlX2VuZF9kYXRlIiwicmVzdWx0IiwiYlN0YXRlU2F2ZSIsImZuU3RhdGVTYXZlIiwibG9jYWxTdG9yYWdlIiwic2V0SXRlbSIsInVpZCIsIkpTT04iLCJzdHJpbmdpZnkiLCJlIiwiZm5TdGF0ZUxvYWQiLCJwYXJzZSIsImdldEl0ZW0iLCJtYXJnaW4tbGVmdCIsIm51bWJlcl9vZl9hc3NpZ25tZW50cyIsImhyZWYiLCJjYXRlZ29yeSIsImFzc2lnbm1lbnRzIiwiaXMiLCJjbGFzc19pZHMiLCJwYWdldXJsIiwibG9jYXRpb24iLCJyZXBsYWNlIiwibWFyZ2luLXRvcCIsImNyZWF0ZV9hc3NpZ25tZW50cyJdLCJtYXBwaW5ncyI6IkFBQUFBLE9BQU9DLFVBQVVDLE1BQU0sU0FBU0MsR0EwVDVCLFFBQVNDLHlCQUNMRCxFQUFFLDBCQUEwQkUsVUFDeEJDLFFBQU8sRUFBTUMsTUFBTSxNQUFPQyxJQUFLLFFBQVNDLFdBQVksT0FBUUMsT0FBTyxRQUFTQyxRQUFTLE1BQU9DLFVBQVcscUJBQ3ZHQyxPQUFRLFdBQ0pDLHVCQUVKQyxXQUFhLFdBSVQsR0FBSUMsY0FBZWIsRUFBRSxJQUFNQSxFQUFFYyxNQUFNQyxLQUFL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QUV6QyxPQUFPdkssR0FBTSw4QkFBZ0NpSyxFQUFXLGdCQUFrQkMsRUFBY0UsRUFBWSxZQUFjL0osRUFBRUMsSUFBSUYsU0FFaEllLFVBQVcsV0FDUFMsT0FBTzBJLFNBQVcxSSxPQUFPMEksWUFJN0JqTSxFQUFFLGNBQWM0RCxPQUFTLEVBQUcsQ0FHNUI1RCxFQUFFLDZDQUE2Q3NCLEtBQzNDbUssY0FBZ0IsUUFHcEJ6TCxFQUFFLG1EQUFtRHNCLEtBQ2pEbEIsTUFBUyxPQUNUK0wsYUFBYyxTQUdsQixJQUFJSixXQUFZL0wsRUFBRSxjQUFjb0IsTUFFaENwQixHQUFFd0IsTUFDRUMsU0FBWSxPQUNaQyxLQUFRLE9BQ1JDLElBQU8sV0FDUEMsTUFBU0MsT0FBUSxpQkFBa0JrSyxVQUFXQSxVQUFXM0gsZ0JBQWlCcEUsRUFBRSxvQkFBb0JvQixPQUM1RmdMLG1CQUFvQnBNLEVBQUUsdUJBQXVCb0IsT0FBUVcsUUFBU0MsRUFBRUMsSUFBSUYsU0FDeEVNLFFBQVMsU0FBU1QsR0FDZDVCLEVBQUUsMkJBQTJCb0IsS0FBS1EiLCJmaWxlIjoidHVybml0aW50b29sdHdvX2V4dHJhLm1pbi5qcyIsInNvdXJjZXNDb250ZW50IjpbImpRdWVyeShkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24oJCkge1xuICAgIC8vIEFkZCBzdHlsZSB0byBoZWFkZXIgcm93LlxuICAgICQoJy5zdWJtaXNzaW9uc0RhdGFUYWJsZSB0aGVhZCB0ciwgI2NvdXJzZUJyb3dzZXJUYWJsZSB0aGVhZCB0cicpLnRvZ2dsZUNsYXNzKFwiaGVhZGVyXCIpO1xuXG4gICAgLy8gQ29uZmlndXJlIGRhdGF0YWJsZXMgbGFuZ3VhZ2Ugc2V0dGluZ3MuXG4gICAgdmFyIGRhdGFUYWJsZXNMYW5nID0ge1xuICAgICAgICBcIm5vaW50ZWdyYXRpb25cIjogTS5zdHIudHVybml0aW50b29sdHdvLm5vaW50ZWdyYXRpb24sXG4gICAgICAgIFwic1Byb2Nlc3NpbmdcIjogTS5zdHIudHVybml0aW50b29sdHdvLnNwcm9jZXNzaW5nLFxuICAgICAgICBcInNaZXJvUmVjb3Jkc1wiOiBNLnN0ci50dXJuaXRpbnRvb2x0d28uc3plcm9yZWNvcmRzLFxuICAgICAgICBcInNJbmZvXCI6IE0uc3RyLnR1cm5pdGludG9vbHR3by5zaW5mbyxcbiAgICAgICAgXCJzU2VhcmNoXCI6IE0uc3RyLnR1cm5pdGludG9vbHR3by5zc2VhcmNoLFxuICAgICAgICBcInNMZW5ndGhNZW51XCI6IE0uc3RyLnR1cm5pdGludG9vbHR3by5zbGVuZ3RobWVudSxcbiAgICAgICAgXCJzSW5mb0VtcHR5XCI6IE0uc3RyLnR1cm5pdGludG9vbHR3by5zZW1wdHl0YWJsZSxcbiAgICAgICAgXCJvUGFnaW5hdGVcIjoge1xuICAgICAgICAgICAgXCJzTmV4dFwiOiBNLnN0ci50dXJuaXRpbnRvb2x0d28uc25leHQsXG4gICAgICAgICAgICBcInNQcmV2aW91c1wiOiBNLnN0ci50dXJuaXRpbnRvb2x0d28uc3ByZXZpb3VzXG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gQ29uZmlndXJlIGRhdGF0YWJsZXMgbGFuZ3VhZ2Ugc2V0dGluZ3MgZm9yIG1pZ3JhdGlvbiB0b29sLlxuICAgIHZhciBkYXRhVGFibGVzTGFuZ01pZ3JhdGlvbiA9IHtcbiAgICAgICAgXCJub2ludGVncmF0aW9uXCI6IE0uc3RyLnR1cm5pdGludG9vbHR3by5ub2ludGVncmF0aW9uLFxuICAgICAgICBcInNQcm9jZXNzaW5nXCI6IE0uc3RyLnR1cm5pdGludG9vbHR3by5zcHJvY2Vzc2luZyxcbiAgICAgICAgXCJzWmVyb1JlY29yZHNcIjogTS5zdHIudHVybml0aW50b29sdHdvLnN6ZXJvcmVjb3JkcyxcbiAgICAgICAgXCJzSW5mb1wiOiBNLnN0ci50dXJuaXRpbnRvb2x0d28uc2luZm8sXG4gICAgICAgIFwic1NlYXJjaFwiOiAnJyxcbiAgICAgICAgXCJzTGVuZ3RoTWVudVwiOiBNLnN0ci50dXJuaXRpbnRvb2x0d28uc2xlbmd0aG1pZ3JhdGlvbm1lbnUsXG4gICAgICAgIFwic0luZm9FbXB0eVwiOiBNLnN0ci50dXJuaXRpbnRvb2x0d28uc2VtcHR5dGFibGUsXG4gICAgICAgIFwib1BhZ2luYXRlXCI6IHtcbiAgICAgICAgICAgIFwic05leHRcIjogTS5zdHIudHVybml0aW50b29sdHdvLnNuZXh0LFxuICAgICAgICAgICAgXCJzUHJldmlvdXNcIjogTS5zdHIudHVybml0aW50b29sdHdvLnNwcmV2aW91c1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIC8vIENvbmZpZ3VyZSB0aGUgdW5saW5rIGFuZCByZWxpbmsgdXNlcnMgZGF0YXRhYmxlIGluIHRoZSBwbHVnaW4gc2V0dGluZ3MgYXJlYS5cbiAgICAkKCcjdW5saW5rVXNlclRhYmxlJykuZGF0YVRhYmxlKHtcbiAgICAgICAgXCJiRGVzdHJveVwiOiB0cnVlLFxuICAgICAgICBcImJQcm9jZXNzaW5nXCI6IHRydWUsXG4gICAgICAgIFwiYlNlcnZlclNpZGVcIjogdHJ1ZSxcbiAgICAgICAgXCJvTGFuZ3VhZ2VcIjogZGF0YVRhYmxlc0xhbmcsXG4gICAgICAgIFwiYWFTb3J0aW5nXCI6IFtbIDIsIFwiYXNjXCIgXV0sXG4gICAgICAgIFwiYUxlbmd0aE1lbnVcIjogW1sxMCwgMjUsIDUwLCAxMDAsIC0xXSwgWzEwLCAyNSwgNTAsIDEwMCwgXCJBbGxcIl1dLFxuICAgICAgICBcInNBamF4U291cmNlXCI6IFwiYWpheC5waHA/YWN0aW9uPWdldF91c2Vyc1wiLFxuICAgICAgICBcImFvQ29sdW1uc1wiOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XCJiU29ydGFibGVcIjogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJmbkNyZWF0ZWRDZWxsXCI6IGZ1bmN0aW9uIChuVGQsIHNEYXRhLCBvRGF0YSwgaVJvdywgaUNvbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKG5UZCkuYWRkQ2xhc3MoJ2NlbnRlcmVkX2NlbGwnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICB7XCJhRGF0YVNvcnRcIjogWyAyLCAzIF19LFxuICAgICAgICAgICAgICAgICAgICAgICAge1wiYURhdGFTb3J0XCI6IFsgMywgMiBdfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG51bGxcbiAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgIFwiZm5EcmF3Q2FsbGJhY2tcIjogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgJCgnaW5wdXRbbmFtZT1cInNlbGVjdGFsbGNiXCJdJykuYXR0cignY2hlY2tlZCcsIGZhbHNlKTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gQ29uZmlndXJlIHRoZSBtaWdyYXRpb24gZGF0YXRhYmxlIGluIHRoZSBwbHVnaW4gc2V0dGluZ3MgYXJlYS5cbiAgICAkKCcjbWlncmF0aW9uVGFibGUnKS5kYXRhVGFibGUoe1xuICAgICAgICBcImJEZXN0cm95XCI6IHRydWUsXG4gICAgICAgIFwiYlByb2Nlc3NpbmdcIjogdHJ1ZSxcbiAgICAgICAgXCJiU2VydmVyU2lkZVwiOiB0cnVlLFxuICAgICAgICBcIm9MYW5ndWFnZVwiOiBkYXRhVGFibGVzTGFuZ01pZ3JhdGlvbixcbiAgICAgICAgXCJhYVNvcnRpbmdcIjogW1sgMSwgXCJhc2NcIiBdXSxcbiAgICAgICAgXCJhTGVuZ3RoTWVudVwiOiBbWzEwLCAyNSwgNTAsIDEwMCwgLTFdLCBbMTAsIDI1LCA1MCwgMTAwLCBcIkFsbFwiXV0sXG4gICAgICAgIFwic0FqYXhTb3VyY2VcIjogXCJhamF4LnBocD9hY3Rpb249Z2V0X2Fzc2lnbm1lbnRzXCIsXG4gICAgICAgIFwic0RvbVwiOiAnPFwidG9wXCJsZj5ydDxcImJvdHRvbVwiaXJwPjxcImNsZWFyXCI+JyxcbiAgICAgICAgXCJhb0NvbHVtbnNcIjogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1wiYlNvcnRhYmxlXCI6IHRydWUsIFwic0NsYXNzXCI6IFwiY2VudGVyZWRfY2VsbFwiLCBcImJTZWFyY2hhYmxlXCI6IGZhbHNlfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcImJTb3J0YWJsZVwiOiB0cnVlLCBcImJTZWFyY2hhYmxlXCI6IHRydWV9XG4gICAgICAgICAgICAgICAgICAgICBdXG4gICAgfSk7XG4gICAgJCgnI21pZ3JhdGlvblRhYmxlX2ZpbHRlciBpbnB1dCcpLmF0dHIoXCJwbGFjZWhvbGRlclwiLCAnU2VhcmNoJyk7XG5cbiAgICAvLyBDb25maWd1cmUgdGhlIGZpbGVzIGRhdGF0YWJsZSBpbiB0aGUgcGx1Z2luIHNldHRpbmdzIGFyZWEsIGdyb3VwIHRoZSBmaWxlcyBieSBhc3NpZ25tZW50LlxuICAgICQoJyNmaWxlc1RhYmxlJykuZGF0YVRhYmxlKCB7XG4gICAgICAgIFwiYkRlc3Ryb3lcIjogdHJ1ZSxcbiAgICAgICAgXCJiUHJvY2Vzc2luZ1wiOiB0cnVlLFxuICAgICAgICBcImJTZXJ2ZXJTaWRlXCI6IHRydWUsXG4gICAgICAgIFwib0xhbmd1YWdlXCI6IGRhdGFUYWJsZXNMYW5nLFxuICAgICAgICBcInNBamF4U291cmNlXCI6IFwiYWpheC5waHA/YWN0aW9uPWdldF9maWxlc1wiLFxuICAgICAgICBcImFvQ29sdW1uc1wiOiBbXG4gICAgICAgICAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICAgICAgICAgIHtcInNDbGFzc1wiOiBcImZpbGVuYW1lIGMwXCIsIFwic1dpZHRoXCI6IFwiNDAlXCJ9LFxuICAgICAgICAgICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgICAgICAgICB7XCJzQ2xhc3NcIjogXCJmdWxsbmFtZSBjMVwiLCBcInNXaWR0aFwiOiBcIjM1JVwifSxcbiAgICAgICAgICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgICAgICAgICAge1wic0NsYXNzXCI6IFwiY3JlYXRlZCBjMlwiLCBcInNXaWR0aFwiOiBcIjIyJVwifSxcbiAgICAgICAgICAgICAgICAgICAge1wic0NsYXNzXCI6IFwicmVtb3ZlIGMzXCIsIFwic1dpZHRoXCI6IFwiMyVcIn1cbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICBcImFvQ29sdW1uRGVmc1wiOiBbXG4gICAgICAgICAgICAgICAgICAgIHtcImJTZWFyY2hhYmxlXCI6IHRydWUsIFwiYlZpc2libGVcIjogZmFsc2UsIFwiYVRhcmdldHNcIjogWyAwIF19LFxuICAgICAgICAgICAgICAgICAgICB7XCJiU2VhcmNoYWJsZVwiOiB0cnVlLCBcImJWaXNpYmxlXCI6IGZhbHNlLCBcImFUYXJnZXRzXCI6IFsgMSBdfSxcbiAgICAgICAgICAgICAgICAgICAge1wiYlNlYXJjaGFibGVcIjogdHJ1ZSwgXCJiVmlzaWJsZVwiOiBmYWxzZSwgXCJhVGFyZ2V0c1wiOiBbIDIgXX0sXG4gICAgICAgICAgICAgICAgICAgIHtcImJTZWFyY2hhYmxlXCI6IHRydWUsIFwiYlZpc2libGVcIjogdHJ1ZSwgXCJhVGFyZ2V0c1wiOiBbIDMgXX0sXG4gICAgICAgICAgICAgICAgICAgIHtcImJTZWFyY2hhYmxlXCI6IHRydWUsIFwiYlZpc2libGVcIjogZmFsc2UsIFwiYVRhcmdldHNcIjogWyA0IF19LFxuICAgICAgICAgICAgICAgICAgICB7XCJiU2VhcmNoYWJsZVwiOiB0cnVlLCBcImJWaXNpYmxlXCI6IHRydWUsIFwiYVRhcmdldHNcIjogWyA1IF19LFxuICAgICAgICAgICAgICAgICAgICB7XCJiU2VhcmNoYWJsZVwiOiB0cnVlLCBcImJWaXNpYmxlXCI6IGZhbHNlLCBcImFUYXJnZXRzXCI6IFsgNiBdfSxcbiAgICAgICAgICAgICAgICAgICAge1wiYlNlYXJjaGFibGVcIjogdHJ1ZSwgXCJiVmlzaWJsZVwiOiB0cnVlLCBcImFUYXJnZXRzXCI6IFsgNyBdfSxcbiAgICAgICAgICAgICAgICAgICAge1wiYlNlYXJjaGFibGVcIjogdHJ1ZSwgXCJiVmlzaWJsZVwiOiB0cnVlLCBcImFUYXJnZXRzXCI6IFsgOCBdfVxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgIFwiZm5EcmF3Q2FsbGJhY2tcIjogZnVuY3Rpb24gKCBvU2V0dGluZ3MgKSB7XG4gICAgICAgICAgICBpZiAoIG9TZXR0aW5ncy5haURpc3BsYXkubGVuZ3RoID09IDAgKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIG5UcnMgPSAkKCcjZmlsZXNUYWJsZSB0Ym9keSB0cicpO1xuICAgICAgICAgICAgdmFyIGlDb2xzcGFuID0gblRyc1swXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgndGQnKS5sZW5ndGg7XG4gICAgICAgICAgICB2YXIgc0xhc3RHcm91cCA9IFwiXCI7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5UcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgaURpc3BsYXlJbmRleCA9IG9TZXR0aW5ncy5faURpc3BsYXlTdGFydCArIGk7XG4gICAgICAgICAgICAgICAgdmFyIHNHcm91cCA9IG9TZXR0aW5ncy5hb0RhdGFbIG9TZXR0aW5ncy5haURpc3BsYXlbaV0gXS5fYURhdGFbMF07XG4gICAgICAgICAgICAgICAgaWYgKCBzR3JvdXAgIT0gc0xhc3RHcm91cCApXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB2YXIgbkdyb3VwID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggJ3RyJyApO1xuICAgICAgICAgICAgICAgICAgICB2YXIgbkNlbGwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAndGQnICk7XG4gICAgICAgICAgICAgICAgICAgIG5DZWxsLmNvbFNwYW4gPSBpQ29sc3BhbjtcbiAgICAgICAgICAgICAgICAgICAgbkNlbGwuY2xhc3NOYW1lID0gXCJncm91cFwiO1xuICAgICAgICAgICAgICAgICAgICBuQ2VsbC5pbm5lckhUTUwgPSBzR3JvdXA7XG4gICAgICAgICAgICAgICAgICAgIG5Hcm91cC5hcHBlbmRDaGlsZCggbkNlbGwgKTtcbiAgICAgICAgICAgICAgICAgICAgblRyc1tpXS5wYXJlbnROb2RlLmluc2VydEJlZm9yZSggbkdyb3VwLCBuVHJzW2ldICk7XG4gICAgICAgICAgICAgICAgICAgIHNMYXN0R3JvdXAgPSBzR3JvdXA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBcImFhU29ydGluZ0ZpeGVkXCI6IFtbIDAsICdhc2MnIF1dLFxuICAgICAgICBcImFhU29ydGluZ1wiOiBbWyAxLCAnYXNjJyBdXSxcbiAgICAgICAgXCJzRG9tXCI6ICdsZnI8XCJnaXZlSGVpZ2h0XCJ0PmlwJ1xuICAgIH0pO1xuXG4gICAgJC5kYXRlcGlja2VyLnJlZ2lvbmFsW1wiXCJdLmRhdGVGb3JtYXQgPSAnZCBNIHl5JztcbiAgICAkLmRhdGVwaWNrZXIuc2V0RGVmYXVsdHMoJC5kYXRlcGlja2VyLnJlZ2lvbmFsWycnXSk7XG5cbiAgICAvLyBDb25maWd1cmUgdGhlIGNvdXJzZSBicm93c2VyIGRhdGEgdGFibGUgYW5kIHNob3cgY2xhc3NlcyBmcm9tIFR1cm5pdGluIGFjb2N1bnQuXG4gICAgdmFyIGNvdXJzZUJyb3dzZXJUYWJsZSA9ICQoJyNjb3Vyc2VCcm93c2VyVGFibGUnKS5kYXRhVGFibGUoe1xuICAgICAgICBcImJQcm9jZXNzaW5nXCI6IHRydWUsXG4gICAgICAgIFwib0xhbmd1YWdlXCI6IGRhdGFUYWJsZXNMYW5nLFxuICAgICAgICBcImFhU29ydGluZ1wiOiBbWyA2LCAnYXNjJ11dLFxuICAgICAgICBcInNBamF4U291cmNlXCI6IFwiYWpheC5waHBcIixcbiAgICAgICAgXCJhb0NvbHVtbkRlZnNcIjogW1xuICAgICAgICAgICAgICAgICAgICB7XCJiU2VhcmNoYWJsZVwiOiBmYWxzZSwgXCJiU29ydGFibGVcIjogZmFsc2UsIFwic1dpZHRoXCI6IFwiNSVcIiwgXCJiVmlzaWJsZVwiOiB0cnVlLCBcImFUYXJnZXRzXCI6IFsgMCBdLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJmbkNyZWF0ZWRDZWxsXCI6IGZ1bmN0aW9uIChuVGQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKG5UZCkuYWRkQ2xhc3MoJ2NlbnRlcicpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfX0sXG4gICAgICAgICAgICAgICAgICAgIHtcImJTZWFyY2hhYmxlXCI6IHRydWUsIFwiYlZpc2libGVcIjogdHJ1ZSwgXCJzV2lkdGhcIjogXCI0NSVcIiwgXCJpRGF0YVNvcnRcIjogNiwgXCJhVGFyZ2V0c1wiOiBbIDEgXX0sXG4gICAgICAgICAgICAgICAgICAgIHtcImJTZWFyY2hhYmxlXCI6IHRydWUsIFwiYlZpc2libGVcIjogdHJ1ZSwgXCJzV2lkdGhcIjogXCIxMCVcIiwgXCJhVGFyZ2V0c1wiOiBbIDIgXX0sXG4gICAgICAgICAgICAgICAgICAgIHtcImJTZWFyY2hhYmxlXCI6IHRydWUsIFwiYlZpc2libGVcIjogdHJ1ZSwgXCJzV2lkdGhcIjogXCIyMCVcIiwgXCJpRGF0YVNvcnRcIjogNywgXCJhVGFyZ2V0c1wiOiBbIDMgXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiZm5DcmVhdGVkQ2VsbFwiOiBmdW5jdGlvbiAoblRkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJChuVGQpLmFkZENsYXNzKCdyaWdodCcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfX0sXG4gICAgICAgICAgICAgICAgICAgIHtcImJTZWFyY2hhYmxlXCI6IGZhbHNlLCBcImJWaXNpYmxlXCI6IHRydWUsIFwic1dpZHRoXCI6IFwiMTAlXCIsIFwiYVRhcmdldHNcIjogWyA0IF0sXG4gICAgICAgICAgICAgICAgICAgICAgICBcImZuQ3JlYXRlZENlbGxcIjogZnVuY3Rpb24gKG5UZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoblRkKS5hZGRDbGFzcygncmlnaHQnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH19LFxuICAgICAgICAgICAgICAgICAgICB7XCJiU2VhcmNoYWJsZVwiOiB0cnVlLCBcImJWaXNpYmxlXCI6IHRydWUsIFwic1dpZHRoXCI6IFwiMTAlXCIsIFwiYVRhcmdldHNcIjogWyA1IF0sXG4gICAgICAgICAgICAgICAgICAgICAgICBcImZuQ3JlYXRlZENlbGxcIjogZnVuY3Rpb24gKG5UZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoblRkKS5hZGRDbGFzcygnY2VudGVyJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9fSxcbiAgICAgICAgICAgICAgICAgICAge1wiYlNlYXJjaGFibGVcIjogdHJ1ZSwgXCJiVmlzaWJsZVwiOiBmYWxzZSwgXCJhVGFyZ2V0c1wiOiBbIDYgXX0sXG4gICAgICAgICAgICAgICAgICAgIHtcImJTZWFyY2hhYmxlXCI6IHRydWUsIFwiYlZpc2libGVcIjogZmFsc2UsIFwiYVRhcmdldHNcIjogWyA3IF19XG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgXCJmblNlcnZlckRhdGFcIjogZnVuY3Rpb24gKCBzU291cmNlLCBhb0RhdGEsIGZuQ2FsbGJhY2sgKSB7XG4gICAgICAgICAgICAkLmFqYXgoe1xuICAgICAgICAgICAgICAgIFwiZGF0YVR5cGVcIjogJ2pzb24nLFxuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIlBPU1RcIixcbiAgICAgICAgICAgICAgICBcInVybFwiOiBzU291cmNlLFxuICAgICAgICAgICAgICAgIFwiZGF0YVwiOiB7YWN0aW9uOiBcInNlYXJjaF9jbGFzc2VzXCIsIGNvdXJzZV90aXRsZTogJCgnI3NlYXJjaF9jb3Vyc2VfdGl0bGUnKS52YWwoKSxcbiAgICAgICAgICAgICAgICAgICAgY291cnNlX2ludGVncmF0aW9uOiAkKCcjc2VhcmNoX2NvdXJzZV9pbnRlZ3JhdGlvbicpLnZhbCgpLFxuICAgICAgICAgICAgICAgICAgICBjb3Vyc2VfZW5kX2RhdGU6ICQoJyNzZWFyY2hfY291cnNlX2VuZF9kYXRlJykudmFsKCksIHNlc3NrZXk6IE0uY2ZnLnNlc3NrZXl9LFxuICAgICAgICAgICAgICAgIFwic3VjY2Vzc1wiOiBmdW5jdGlvbihyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgZm5DYWxsYmFjayhyZXN1bHQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBcImJTdGF0ZVNhdmVcIjogdHJ1ZSxcbiAgICAgICAgXCJmblN0YXRlU2F2ZVwiOiBmdW5jdGlvbiAob1NldHRpbmdzLCBvRGF0YSkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSggdWlkICsgJ0RhdGFUYWJsZXMnLCBKU09OLnN0cmluZ2lmeShvRGF0YSkgKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKCBlICkge1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBcImZuU3RhdGVMb2FkXCI6IGZ1bmN0aW9uIChvU2V0dGluZ3MpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoIGxvY2FsU3RvcmFnZS5nZXRJdGVtKHVpZCArICdEYXRhVGFibGVzJykgKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKCBlICkge1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBcImZuRHJhd0NhbGxiYWNrXCI6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICQoJ2lucHV0W25hbWU9XCJzZWxlY3RhbGxjYlwiXScpLmF0dHIoJ2NoZWNrZWQnLCBmYWxzZSk7XG4gICAgICAgICAgICBpbml0aWFsaXNlQ291cnNlUmVjcmVhdGlvbigpO1xuICAgICAgICAgICAgaW5pdGlhbGlzZUVkaXRFbmREYXRlKCk7XG4gICAgICAgICAgICAkKFwiI3NlYXJjaF9jb3Vyc2VzX2J1dHRvblwiKS5yZW1vdmVBdHRyKCdkaXNhYmxlZCcpO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICAkKFwiI3NlYXJjaF9jb3Vyc2VzX2J1dHRvblwiKS5jbGljayhmdW5jdGlvbiAoKSB7XG4gICAgICAgICQodGhpcykuYXR0cignZGlzYWJsZWQnLCAnZGlzYWJsZWQnKTtcbiAgICAgICAgY291cnNlQnJvd3NlclRhYmxlLmZuUmVsb2FkQWpheCgpO1xuICAgICAgICBjb3Vyc2VCcm93c2VyVGFibGUuZm5TdGFuZGluZ1JlZHJhdygpO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSk7XG5cbiAgICAkKCcjc2VhcmNoX2NvdXJzZV9lbmRfZGF0ZScpLmRhdGVwaWNrZXIoKTtcblxuICAgIC8vIEluaXRpYWxpc2UgYXNzaWdubWVudCBicm93c2VyIHRhYmxlLlxuICAgIHZhciBvVGFibGUgPSAkKCcjYXNzaWdubWVudEJyb3dzZXJUYWJsZScpLmRhdGFUYWJsZSh7XG4gICAgICAgIFwiYlByb2Nlc3NpbmdcIjogdHJ1ZSxcbiAgICAgICAgXCJvTGFuZ3VhZ2VcIjogZGF0YVRhYmxlc0xhbmcsXG4gICAgICAgIFwic0FqYXhTb3VyY2VcIjogXCJhamF4LnBocFwiLFxuICAgICAgICBcImZuU2VydmVyRGF0YVwiOiBmdW5jdGlvbiAoIHNTb3VyY2UsIGFvRGF0YSwgZm5DYWxsYmFjayApIHtcblxuICAgICAgICAgICAgLy8gRGlzYWJsZSBjb3Vyc2UgYnV0dG9ucy5cbiAgICAgICAgICAgICQoJyNpZF9jcmVhdGVfY291cnNlJykuYXR0cignZGlzYWJsZWQnLCdkaXNhYmxlZCcpO1xuICAgICAgICAgICAgJCgnI2lkX3VwZGF0ZV9jb3Vyc2UnKS5hdHRyKCdkaXNhYmxlZCcsJ2Rpc2FibGVkJyk7XG5cbiAgICAgICAgICAgIC8vIE1vdmUgYm94IHdpdGhpbiBmb3JtLlxuICAgICAgICAgICAgaWYgKCQoXCIjYXNzaWdubWVudEJyb3dzZXJUYWJsZVwiKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgJChcIi5zaWRlLXByZS1vbmx5ICNwYWdlLWNvbnRlbnQgI3JlZ2lvbi1tYWluXCIpLmNzcyh7J21hcmdpbi1sZWZ0JyA6ICcwcHgnfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAkKFwiI2lkX2Fzc2lnbm1lbnRuYW1lXCIpLmF0dHIoJ2Rpc2FibGVkJywgJ2Rpc2FibGVkJyk7XG4gICAgICAgICAgICAkKFwiI2lkX2NyZWF0ZV9hc3NpZ25tZW50XCIpLmF0dHIoJ2Rpc2FibGVkJywgJ2Rpc2FibGVkJyk7XG4gICAgICAgICAgICAkLmFqYXgoe1xuICAgICAgICAgICAgICAgIFwiZGF0YVR5cGVcIjogJ2pzb24nLFxuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIlBPU1RcIixcbiAgICAgICAgICAgICAgICBcInVybFwiOiBzU291cmNlLFxuICAgICAgICAgICAgICAgIFwiZGF0YVwiOiB7YWN0aW9uOiBcImdldF9hc3NpZ25tZW50c1wiLCB0aWlfY291cnNlX2lkOiAkKFwiI3RpaV9jb3Vyc2VfaWRcIikuaHRtbCgpLCBzZXNza2V5OiBNLmNmZy5zZXNza2V5fSxcbiAgICAgICAgICAgICAgICBcInN1Y2Nlc3NcIjogZnVuY3Rpb24ocmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgICAgIGV2YWwocmVzdWx0KTtcbiAgICAgICAgICAgICAgICAgICAgaW5pdGlhbGlzZUNvdXJzZUJyb3dzZXJCdXR0b25zKG9UYWJsZSk7XG4gICAgICAgICAgICAgICAgICAgIGZuQ2FsbGJhY2socmVzdWx0KTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoJChcIiNjb3Vyc2VfaWRcIikuaHRtbCgpICE9IFwiMFwiICYmIHJlc3VsdC5udW1iZXJfb2ZfYXNzaWdubWVudHMgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAkKFwiI2lkX2Fzc2lnbm1lbnRuYW1lXCIpLnJlbW92ZUF0dHIoJ2Rpc2FibGVkJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAkKFwiI2lkX2NyZWF0ZV9hc3NpZ25tZW50XCIpLnJlbW92ZUF0dHIoJ2Rpc2FibGVkJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAkKFwiLmFzc2lnbm1lbnRpZHNfY2hlY2tcIikucmVtb3ZlQXR0cignZGlzYWJsZWQnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxpc2VDcmVhdGVBc3NpZ25tZW50QnV0dG9uKG9UYWJsZSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAkKFwiI2lkX2Fzc2lnbm1lbnRuYW1lXCIpLmF0dHIoJ2Rpc2FibGVkJywgJ2Rpc2FibGVkJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAkKFwiI2lkX2NyZWF0ZV9hc3NpZ25tZW50XCIpLmF0dHIoJ2Rpc2FibGVkJywgJ2Rpc2FibGVkJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAkKFwiLmFzc2lnbm1lbnRpZHNfY2hlY2tcIikuYXR0cignZGlzYWJsZWQnLCAnZGlzYWJsZWQnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIEVuYWJsZSBjb3Vyc2UgYnV0dG9ucy5cbiAgICAgICAgICAgICAgICAgICAgJCgnI2lkX2NyZWF0ZV9jb3Vyc2UnKS5yZW1vdmVBdHRyKCdkaXNhYmxlZCcpO1xuICAgICAgICAgICAgICAgICAgICAkKCcjaWRfdXBkYXRlX2NvdXJzZScpLnJlbW92ZUF0dHIoJ2Rpc2FibGVkJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIFwiYW9Db2x1bW5EZWZzXCI6IFtcbiAgICAgICAgICAgIHtcImJTZWFyY2hhYmxlXCI6IGZhbHNlLCBcImJWaXNpYmxlXCI6IHRydWUsIFwiYVRhcmdldHNcIjogWyAwIF19LFxuICAgICAgICAgICAge1wiYlNlYXJjaGFibGVcIjogdHJ1ZSwgXCJiVmlzaWJsZVwiOiB0cnVlLCBcImFUYXJnZXRzXCI6IFsgMSBdLFxuICAgICAgICAgICAgICAgIFwiZm5DcmVhdGVkQ2VsbFwiOiBmdW5jdGlvbiAoblRkKSB7XG4gICAgICAgICAgICAgICAgICAgICQoblRkKS5hZGRDbGFzcygnbm93cmFwJyk7XG4gICAgICAgICAgICAgICAgfX0sXG4gICAgICAgICAgICB7XCJiU2VhcmNoYWJsZVwiOiB0cnVlLCBcImJWaXNpYmxlXCI6IHRydWUsIFwiYVRhcmdldHNcIjogWyAyIF19LFxuICAgICAgICAgICAge1wiYlNlYXJjaGFibGVcIjogdHJ1ZSwgXCJiVmlzaWJsZVwiOiB0cnVlLCBcImFUYXJnZXRzXCI6IFsgMyBdfVxuICAgICAgICBdXG4gICAgfSk7XG5cbiAgICAvLyBPcGVuIGFuIGlmcmFtZSBsaWdodCBib3ggd2hpY2ggYWxsb3dzIHRoZSBjcmVhdGlvbiBvZiBjbGFzc2VzLlxuICAgICQoJyNjcmVhdGVfY2xhc3Nlc19idXR0b24nKS5jb2xvcmJveCh7XG4gICAgICAgIGlmcmFtZTp0cnVlLCB3aWR0aDonNjAlJywgdG9wOiAnMjAwcHgnLCBoZWlnaHQ6JzEyNHB4Jywgb3BhY2l0eTogXCIwLjdcIiwgY2xhc3NOYW1lOiBcImNvdXJzZV9jcmVhdGlvblwiLFxuICAgICAgICBocmVmOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICB2YXIgY2F0ZWdvcnkgPSAkKCcuY3JlYXRlX2NvdXJzZV9jYXRlZ29yeScpLnZhbCgpO1xuICAgICAgICAgICAgICAgIHZhciBhc3NpZ25tZW50cyA9ICgkKCcuY3JlYXRlX2Fzc2lnbm1lbnRfY2hlY2tib3gnKS5pcygnOmNoZWNrZWQnKSkgPyBcIjFcIiA6IFwiMFwiO1xuXG4gICAgICAgICAgICAgICAgdmFyIGNsYXNzX2lkcyA9IFwiXCI7XG4gICAgICAgICAgICAgICAgdmFyIGkgPSAwO1xuICAgICAgICAgICAgICAgICQoJy5icm93c2VyX2NoZWNrYm94OmNoZWNrZWQnKS5lYWNoKGZ1bmN0aW9uKGkpe1xuICAgICAgICAgICAgICAgICAgICBjbGFzc19pZHMgKz0gXCImY2xhc3NfaWRcIiArIGkgKyBcIj1cIiArICQodGhpcykudmFsKCk7XG4gICAgICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIHZhciBwYWdldXJsID0gd2luZG93LmxvY2F0aW9uLmhyZWY7XG4gICAgICAgICAgICAgICAgdmFyIHVybCA9IHBhZ2V1cmwucmVwbGFjZShcImNtZD1jb3Vyc2VzXCIsIFwiY21kPW11bHRpcGxlX2NsYXNzX3JlY3JlYXRpb25cIik7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gdXJsICsgXCImdmlld19jb250ZXh0PWJveCZjYXRlZ29yeT1cIiArIGNhdGVnb3J5ICsgXCImYXNzaWdubWVudHM9XCIgKyBhc3NpZ25tZW50cyArIGNsYXNzX2lkcyArIFwiJnNlc3NrZXk9XCIgKyBNLmNmZy5zZXNza2V5O1xuICAgICAgICB9LFxuICAgICAgICBvbkNsZWFudXA6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uID0gd2luZG93LmxvY2F0aW9uO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAoJCgnI2NsYXNzX2lkcycpLmxlbmd0aCA+IDApIHtcblxuICAgICAgICAvLyBNb3ZlIGJveCB3aXRoaW4gZnJhbWUuXG4gICAgICAgICQoXCIuc2lkZS1wcmUtb25seSAjcGFnZS1jb250ZW50ICNyZWdpb24tbWFpblwiKS5jc3Moe1xuICAgICAgICAgICAgJ21hcmdpbi1sZWZ0JyA6ICcwcHgnXG4gICAgICAgIH0pO1xuXG4gICAgICAgICQoXCIuaGFzLXJlZ2lvbi1zaWRlLXByZSAjcGFnZS1jb250ZW50ICNyZWdpb24tbWFpblwiKS5jc3Moe1xuICAgICAgICAgICAgJ3dpZHRoJzogJzEwMCUnLFxuICAgICAgICAgICAgJ21hcmdpbi10b3AnOiAnLTMwcHgnXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHZhciBjbGFzc19pZHMgPSAkKCcjY2xhc3NfaWRzJykuaHRtbCgpO1xuXG4gICAgICAgICQuYWpheCh7XG4gICAgICAgICAgICBcImRhdGFUeXBlXCI6ICdodG1sJyxcbiAgICAgICAgICAgIFwidHlwZVwiOiBcIlBPU1RcIixcbiAgICAgICAgICAgIFwidXJsXCI6IFwiYWpheC5waHBcIixcbiAgICAgICAgICAgIFwiZGF0YVwiOiB7YWN0aW9uOiBcImNyZWF0ZV9jb3Vyc2VzXCIsIGNsYXNzX2lkczogY2xhc3NfaWRzLCBjb3Vyc2VfY2F0ZWdvcnk6ICQoXCIjY291cnNlX2NhdGVnb3J5XCIpLmh0bWwoKSxcbiAgICAgICAgICAgICAgICBjcmVhdGVfYXNzaWdubWVudHM6ICQoXCIjY3JlYXRlX2Fzc2lnbm1lbnRzXCIpLmh0bWwoKSwgc2Vzc2tleTogTS5jZmcuc2Vzc2tleX0sXG4gICAgICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbihkYXRhKSB7XG4gICAgICAgICAgICAgICAgJCgnI2NvdXJzZV9jcmVhdGlvbl9zdGF0dXMnKS5odG1sKGRhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBTaG93IGxpZ2h0IGJveCB0byBjaGFuZ2UgdGhlIGVuZCBkYXRlIG9mIGEgY291cnNlLlxuICAgIGZ1bmN0aW9uIGluaXRpYWxpc2VFZGl0RW5kRGF0ZSgpIHtcbiAgICAgICAgJChcImEuZWRpdF9jb3Vyc2VfZW5kX2xpbmtcIikuY29sb3Jib3goe1xuICAgICAgICAgICAgaW5saW5lOnRydWUsIHdpZHRoOlwiNjAlXCIsIHRvcDogXCIxMDBweFwiLCBiYWNrZ3JvdW5kOiBcIiNmZmZcIiwgaGVpZ2h0OlwiMjYwcHhcIiwgb3BhY2l0eTogXCIwLjdcIiwgY2xhc3NOYW1lOiBcImVkaXRfZW5kX2RhdGVfZm9ybVwiLFxuICAgICAgICAgICAgb25Mb2FkOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICBsaWdodEJveENsb3NlQnV0dG9uKCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgb25Db21wbGV0ZSA6IGZ1bmN0aW9uKCkge1xuXG4gICAgICAgICAgICAgICAgLy8gR2V0IGN1cnJlbnQgZGF0ZSBmcm9tIHRoZSBzcGFuIGlkIHdpdGhpbiB0aGUgbGluayBhbmQgc2V0XG4gICAgICAgICAgICAgICAgLy8gdGhlIGRhdGUgb2YgdGhlIGRhdGVwaWNrZXIgaW4gdGhlIGxpZ2h0Ym94IHRvIHRoYXQuXG4gICAgICAgICAgICAgICAgdmFyIGN1cnJlbnRfZGF0ZSA9ICQoJyMnICsgJCh0aGlzKS5hdHRyKFwiaWRcIikgKyAnIHNwYW4nKS5hdHRyKFwiaWRcIik7XG4gICAgICAgICAgICAgICAgY3VycmVudF9kYXRlID0gY3VycmVudF9kYXRlLnNwbGl0KFwiX1wiKTtcbiAgICAgICAgICAgICAgICAkKCcjaWRfbmV3X2NvdXJzZV9lbmRfZGF0ZV9kYXknKS52YWwoY3VycmVudF9kYXRlWzFdKTtcbiAgICAgICAgICAgICAgICAkKCcjaWRfbmV3X2NvdXJzZV9lbmRfZGF0ZV9tb250aCcpLnZhbChjdXJyZW50X2RhdGVbMl0pO1xuICAgICAgICAgICAgICAgICQoJyNpZF9uZXdfY291cnNlX2VuZF9kYXRlX3llYXInKS52YWwoY3VycmVudF9kYXRlWzNdKTtcblxuICAgICAgICAgICAgICAgIHZhciBpZFN0ciA9ICQodGhpcykuYXR0cihcImlkXCIpLnNwbGl0KFwiX1wiKTtcbiAgICAgICAgICAgICAgICB2YXIgdGlpX2NvdXJzZV9pZCA9IGlkU3RyWzJdO1xuICAgICAgICAgICAgICAgICQoJ2lucHV0W25hbWU9XCJ0aWlfY291cnNlX2lkXCJdJykudmFsKHRpaV9jb3Vyc2VfaWQpO1xuICAgICAgICAgICAgICAgICQoJ2lucHV0W25hbWU9XCJ0aWlfY291cnNlX3RpdGxlXCJdJykudmFsKCQoJ2EjY291cnNlXycgKyB0aWlfY291cnNlX2lkKS5odG1sKCkpO1xuICAgICAgICAgICAgICAgICQoJyNjYm94TG9hZGVkQ29udGVudCAuZWRpdF9jb3Vyc2VfZW5kX2RhdGVfZm9ybScpLnNob3coKTtcbiAgICAgICAgICAgICAgICAkKCcjZGF0ZXNlbGVjdG9yLWNhbGVuZGFyLXBhbmVsJykuY3NzKCd6LWluZGV4JywgJzk5OTknKTtcblxuICAgICAgICAgICAgICAgICQoJyNpZF9zYXZlX2VuZF9kYXRlJykuY2xpY2soZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgICQuYWpheCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBcImRhdGFUeXBlXCI6ICdqc29uJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIlBPU1RcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwidXJsXCI6IFwiYWpheC5waHBcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiZGF0YVwiOiB7YWN0aW9uOiBcImVkaXRfY291cnNlX2VuZF9kYXRlXCIsIHRpaV9jb3Vyc2VfaWQ6IHRpaV9jb3Vyc2VfaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGlpX2NvdXJzZV90aXRsZTogJCgnYSNjb3Vyc2VfJyArIHRpaV9jb3Vyc2VfaWQpLmh0bWwoKSwgc2Vzc2tleTogTS5jZmcuc2Vzc2tleSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRfZGF0ZV9kOiAkKCcjaWRfbmV3X2NvdXJzZV9lbmRfZGF0ZV9kYXknKS52YWwoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRfZGF0ZV9tOiAkKCcjaWRfbmV3X2NvdXJzZV9lbmRfZGF0ZV9tb250aCcpLnZhbCgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZF9kYXRlX3k6ICQoJyNpZF9uZXdfY291cnNlX2VuZF9kYXRlX3llYXInKS52YWwoKVxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uKGRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmFsKGRhdGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhLnN0YXR1cyA9PSBcInN1Y2Nlc3NcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQuJC5mbi5jb2xvcmJveC5jbG9zZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCcjY291cnNlX2RhdGVfJyArIHRpaV9jb3Vyc2VfaWQgKyAnIHNwYW4nKS5odG1sKGRhdGEuZW5kX2RhdGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjdXJyZW50X21zZyA9ICQoJyNlZGl0X2VuZF9kYXRlX2Rlc2MnKS5odG1sO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCcjZWRpdF9lbmRfZGF0ZV9kZXNjJykuaHRtbChjdXJyZW50X21zZyArIFwiIFwiICsgZGF0YS5tc2cpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgb25DbGVhbnVwOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAkKCcuZWRpdF9jb3Vyc2VfZW5kX2RhdGVfZm9ybScpLmhpZGUoKTtcbiAgICAgICAgICAgICAgICAkKCcjdGlpX2Nsb3NlX2JhcicpLnJlbW92ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaWdodEJveENsb3NlQnV0dG9uKCkge1xuICAgICAgICAkKCdib2R5JykuYXBwZW5kKCc8ZGl2IGlkPVwidGlpX2Nsb3NlX2JhclwiPjxhIGhyZWY9XCIjXCIgb25jbGljaz1cIiQuY29sb3Jib3guY2xvc2UoKTsgcmV0dXJuIGZhbHNlO1wiPicgKyBNLnN0ci50dXJuaXRpbnRvb2x0d28uY2xvc2VidXR0b24gKyAnPC9hPjwvZGl2PicpO1xuICAgIH1cblxuICAgIC8vIFNob3cgbGlnaHQgYm94IHdpdGggYSBmb3JtIHRvIGVpdGhlciBjcmVhdGUgYSBuZXcgY291cnNlIG9yIGxpbmsgYW4gdW5saW5rZWQgTW9vZGxlIGNvdXJzZVxuICAgIC8vIHRvIHRoZSBjbGlja2VkIFR1cm5pdGluIGNsYXNzLCB0aGVuIHN1YnNlcXVlbnRseSBjcmVhdGUgYSBNb29kbGUgYXNzaWdubWVudCB1c2luZyB0aGUgc2VsZWN0ZWRcbiAgICAvLyBleGlzdGluZyBhc3NpZ25tZW50cyBvbiBUdXJuaXRpbiBhcyBwYXJ0cy5cbiAgICBmdW5jdGlvbiBpbml0aWFsaXNlQ291cnNlUmVjcmVhdGlvbigpIHtcblxuICAgICAgICB2YXIgd2luZG93V2lkdGggPSAkKHdpbmRvdykud2lkdGgoKTtcbiAgICAgICAgdmFyIGNvbG9yQm94V2lkdGggPSBcIjgwJVwiO1xuICAgICAgICBpZiAod2luZG93V2lkdGggPCAxMDAwKSB7XG4gICAgICAgICAgICBjb2xvckJveFdpZHRoID0gXCI4NjBweFwiO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHdpbmRvd0hlaWdodCA9ICQod2luZG93KS53aWR0aCgpO1xuICAgICAgICB2YXIgY29sb3JCb3hIZWlnaHQgPSBcIjgwJVwiO1xuICAgICAgICBpZiAod2luZG93SGVpZ2h0IDwgNzAwKSB7XG4gICAgICAgICAgICBjb2xvckJveEhlaWdodCA9IFwiNjAwcHhcIjtcbiAgICAgICAgfVxuXG4gICAgICAgICQoXCJhLmNvdXJzZV9yZWNyZWF0ZVwiKS5jb2xvcmJveCh7XG4gICAgICAgICAgICBpZnJhbWU6dHJ1ZSwgd2lkdGg6Y29sb3JCb3hXaWR0aCwgaGVpZ2h0OmNvbG9yQm94SGVpZ2h0LCB0b3A6ICcxMDBweCcsIGNsYXNzTmFtZTogXCJtaWdyYXRpb25cIiwgb3BhY2l0eTogXCIwLjdcIixcbiAgICAgICAgICAgIG9uTG9hZDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgbGlnaHRCb3hDbG9zZUJ1dHRvbigpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG9uQ2xlYW51cDpmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAkKCcjdGlpX2Nsb3NlX2JhcicpLnJlbW92ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAkKCcuYnJvd3Nlcl9jaGVja2JveCcpLmNsaWNrKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgaWYgKCQoJy5icm93c2VyX2NoZWNrYm94OmNoZWNrZWQnKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgJCgnLmNyZWF0ZV9jaGVja2JveGVzJykuc2xpZGVEb3duKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICQoJy5jcmVhdGVfY2hlY2tib3hlcycpLnNsaWRlVXAoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gTWFrZSB0aGUgYnV0dG9ucyBvbiB0aGUgY291cnNlIGNyZWF0aW9uL2xpbmsgZm9ybXMgY2xpY2thYmxlIGFuZCBjb25maWd1cmUgdGhlIHJlbGV2YW50IHRyaWdnZXJlZCBldmVudC5cbiAgICBmdW5jdGlvbiBpbml0aWFsaXNlQ291cnNlQnJvd3NlckJ1dHRvbnMob1RhYmxlKSB7XG4gICAgICAgICQoJyNpZF9jcmVhdGVfY291cnNlJykuY2xpY2soZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAkLmFqYXgoe1xuICAgICAgICAgICAgICAgIFwiZGF0YVR5cGVcIjogJ2h0bWwnLFxuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIlBPU1RcIixcbiAgICAgICAgICAgICAgICBcInVybFwiOiBcImFqYXgucGhwXCIsXG4gICAgICAgICAgICAgICAgXCJkYXRhXCI6IHthY3Rpb246IFwiY3JlYXRlX2NvdXJzZVwiLCB0aWlfY291cnNlX2lkOiAkKFwiI3RpaV9jb3Vyc2VfaWRcIikuaHRtbCgpLFxuICAgICAgICAgICAgICAgICAgICB0aWlfY291cnNlX25hbWU6IGVuY29kZVVSSUNvbXBvbmVudCgkKFwiI3RpaV9jb3Vyc2VfbmFtZVwiKS5odG1sKCkpLFxuICAgICAgICAgICAgICAgICAgICBjb3Vyc2VfbmFtZTogZW5jb2RlVVJJQ29tcG9uZW50KCQoXCIjaWRfY291cnNlbmFtZVwiKS52YWwoKSksXG4gICAgICAgICAgICAgICAgICAgIGNvdXJzZV9jYXRlZ29yeTogJChcIiNpZF9jb3Vyc2VjYXRlZ29yeVwiKS52YWwoKSwgc2Vzc2tleTogTS5jZmcuc2Vzc2tleX0sXG4gICAgICAgICAgICAgICAgc3VjY2VzczogZnVuY3Rpb24oZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgb2JqID0galF1ZXJ5LnBhcnNlSlNPTihkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgaGlkZUNvdXJzZUNyZWF0aW9uT3B0aW9ucyhvYmosIG9UYWJsZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgICQoJyNpZF91cGRhdGVfY291cnNlJykuY2xpY2soZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAkLmFqYXgoe1xuICAgICAgICAgICAgICAgIFwiZGF0YVR5cGVcIjogJ2h0bWwnLFxuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIlBPU1RcIixcbiAgICAgICAgICAgICAgICBcInVybFwiOiBcImFqYXgucGhwXCIsXG4gICAgICAgICAgICAgICAgXCJkYXRhXCI6IHthY3Rpb246IFwibGlua19jb3Vyc2VcIiwgdGlpX2NvdXJzZV9pZDogJChcIiN0aWlfY291cnNlX2lkXCIpLmh0bWwoKSxcbiAgICAgICAgICAgICAgICAgICAgdGlpX2NvdXJzZV9uYW1lOiAkKFwiI3RpaV9jb3Vyc2VfbmFtZVwiKS5odG1sKCksIGNvdXJzZV90b19saW5rOiAkKFwiI2lkX2NvdXJzZXRvbGlua1wiKS52YWwoKSxcbiAgICAgICAgICAgICAgICAgICAgc2Vzc2tleTogTS5jZmcuc2Vzc2tleX0sXG4gICAgICAgICAgICAgICAgc3VjY2VzczogZnVuY3Rpb24oZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgb2JqID0galF1ZXJ5LnBhcnNlSlNPTihkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgaGlkZUNvdXJzZUNyZWF0aW9uT3B0aW9ucyhvYmosIG9UYWJsZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIEhpZGUgdGhlIGNvdXJzZSBjcmVhdGlvbi9saW5raW5nIGZvcm0gb25jZSB0aGUgc2VsZWN0ZWQgVHVybml0aW5cbiAgICAvLyBjb3Vyc2UgaGFzIGJlZW4gY3JlYXRlZC9saW5rZWQgbG9jYWxseSBhbmQgaW5pdGlhbGlzZSB0aGUgY3JlYXRlIGFzc2lnbm1lbnQgYnV0dG9uLlxuICAgIGZ1bmN0aW9uIGhpZGVDb3Vyc2VDcmVhdGlvbk9wdGlvbnMob2JqLCBvVGFibGUpIHtcbiAgICAgICAgaWYgKG9iaiAhPSAwKSB7XG4gICAgICAgICAgICAkKFwiI2NvdXJzZV9pZFwiKS5odG1sKG9iai5jb3Vyc2VpZCk7XG5cbiAgICAgICAgICAgIHZhciBjYl9lbGVtZW50ID0gJ2lucHV0W25hbWU9XCJjaGVja18nICsgJCgnI3RpaV9jb3Vyc2VfaWQnKS5odG1sKCkgKyAnXCJdJztcbiAgICAgICAgICAgIHBhcmVudC4kKGNiX2VsZW1lbnQpLmhpZGUoKTtcbiAgICAgICAgICAgIHZhciB0aWNrX2VsZW1lbnQgPSAnI3RpY2tfJyArICQoJyN0aWlfY291cnNlX2lkJykuaHRtbCgpO1xuICAgICAgICAgICAgcGFyZW50LiQodGlja19lbGVtZW50KS5zaG93KCk7XG5cbiAgICAgICAgICAgICQoJ2ZpZWxkc2V0W2lkJD1cImNyZWF0ZV9jb3Vyc2VfZmllbGRzZXRcIl0nKS5wYXJlbnQoKS5zbGlkZVRvZ2dsZSgpO1xuICAgICAgICAgICAgJCgnZmllbGRzZXRbaWQkPVwidXBkYXRlX2NvdXJzZV9maWVsZHNldFwiXScpLnBhcmVudCgpLnNsaWRlVG9nZ2xlKCk7XG5cbiAgICAgICAgICAgICQoXCIjb3JfY29udGFpbmVyXCIpLmhpZGUoKTtcblxuICAgICAgICAgICAgJCgnI2V4aXN0aW5nX2NvdXJzZV90aXRsZV9zcGFuJykuaHRtbChvYmouY291cnNlbmFtZSk7XG4gICAgICAgICAgICAkKCcuZXhpc3RpbmdfY291cnNlX3RpdGxlX2gzJykucmVtb3ZlQ2xhc3MoJ2hpZGRlbl9jbGFzcycpO1xuXG4gICAgICAgICAgICBpZiAoJCgnLmFzc2lnbm1lbnRpZHNfY2hlY2snKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgJChcIi5hc3NpZ25tZW50aWRzX2NoZWNrXCIpLnJlbW92ZUF0dHIoJ2Rpc2FibGVkJyk7XG4gICAgICAgICAgICAgICAgJChcIiNpZF9hc3NpZ25tZW50bmFtZVwiKS5yZW1vdmVBdHRyKCdkaXNhYmxlZCcpO1xuICAgICAgICAgICAgICAgICQoXCIjaWRfY3JlYXRlX2Fzc2lnbm1lbnRcIikucmVtb3ZlQXR0cignZGlzYWJsZWQnKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgJCgnLmFzc2lnbm1lbnRpZHNfY2hlY2snKS5jaGFuZ2UoZnVuY3Rpb24oKXtcbiAgICAgICAgICAgICAgICBpZiAoJCgnLmFzc2lnbm1lbnRpZHNfY2hlY2snKS5maWx0ZXIoJzpjaGVja2VkJykubGVuZ3RoID49IDUpIHtcbiAgICAgICAgICAgICAgICAgICAgJChcIi5hc3NpZ25tZW50aWRzX2NoZWNrXCIpLm5vdCgnOmNoZWNrZWQnKS5hdHRyKCdkaXNhYmxlZCcsICdkaXNhYmxlZCcpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICQoXCIuYXNzaWdubWVudGlkc19jaGVja1wiKS5yZW1vdmVBdHRyKCdkaXNhYmxlZCcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpbml0aWFsaXNlQ3JlYXRlQXNzaWdubWVudEJ1dHRvbihvVGFibGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gQmluZCB0aGUgZXZlbnQgdG8gY3JlYXRlIGFuIGFzc2lnbm1lbnQgZnJvbSB0aGUgc2VsZWN0ZWQgcGFydHMuXG4gICAgZnVuY3Rpb24gaW5pdGlhbGlzZUNyZWF0ZUFzc2lnbm1lbnRCdXR0b24ob1RhYmxlKSB7XG4gICAgICAgICQoJyNpZF9jcmVhdGVfYXNzaWdubWVudCcpLnVuYmluZChcImNsaWNrXCIpO1xuICAgICAgICAkKCcjaWRfY3JlYXRlX2Fzc2lnbm1lbnQnKS5jbGljayhmdW5jdGlvbigpIHtcblxuICAgICAgICAgICAgdmFyIHBhcnRzID0gXCJcIjtcbiAgICAgICAgICAgICQoJy5hc3NpZ25tZW50aWRzX2NoZWNrOmNoZWNrZWQnKS5lYWNoKGZ1bmN0aW9uKGkpe1xuICAgICAgICAgICAgICAgIHBhcnRzICs9ICQodGhpcykudmFsKCkgKyBcIixcIjtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKHBhcnRzLmNoYXJBdChwYXJ0cy5sZW5ndGggLSAxKSA9PSAnLCcpIHtcbiAgICAgICAgICAgICAgICBwYXJ0cy5zdWJzdHJpbmcoMCwgcGFydHMubGVuZ3RoIC0gMSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICQoXCIjaWRfY3JlYXRlX2Fzc2lnbm1lbnRcIikuYXR0cignZGlzYWJsZWQnLCAnZGlzYWJsZWQnKTtcblxuICAgICAgICAgICAgJC5hamF4KHtcbiAgICAgICAgICAgICAgICBcImRhdGFUeXBlXCI6ICdodG1sJyxcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJQT1NUXCIsXG4gICAgICAgICAgICAgICAgXCJ1cmxcIjogXCJhamF4LnBocFwiLFxuICAgICAgICAgICAgICAgIFwiZGF0YVwiOiB7YWN0aW9uOiBcImNyZWF0ZV9hc3NpZ25tZW50XCIsIGNvdXJzZV9pZDogJChcIiNjb3Vyc2VfaWRcIikuaHRtbCgpLFxuICAgICAgICAgICAgICAgICAgICBhc3NpZ25tZW50X25hbWU6ICQoXCIjaWRfYXNzaWdubWVudG5hbWVcIikudmFsKCksIHBhcnRzOiBwYXJ0cywgc2Vzc2tleTogTS5jZmcuc2Vzc2tleX0sXG4gICAgICAgICAgICAgICAgc3VjY2VzczogZnVuY3Rpb24oZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICBvVGFibGUuZm5SZWxvYWRBamF4KCk7XG4gICAgICAgICAgICAgICAgICAgIG9UYWJsZS5mblN0YW5kaW5nUmVkcmF3KCk7XG4gICAgICAgICAgICAgICAgICAgICQoXCIjaWRfYXNzaWdubWVudG5hbWVcIikucmVtb3ZlQXR0cignZGlzYWJsZWQnKTtcbiAgICAgICAgICAgICAgICAgICAgJChcIiNpZF9jcmVhdGVfYXNzaWdubWVudFwiKS5yZW1vdmVBdHRyKCdkaXNhYmxlZCcpO1xuICAgICAgICAgICAgICAgICAgICAkKFwiLmFzc2lnbm1lbnRpZHNfY2hlY2tcIikucmVtb3ZlQXR0cignZGlzYWJsZWQnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxufSk7Il19 +jQuery(document).ready(function($){function initialiseEditEndDate(){$("a.edit_course_end_link").colorbox({inline:!0,width:"60%",top:"100px",background:"#fff",height:"260px",opacity:"0.7",className:"edit_end_date_form",onLoad:function(){lightBoxCloseButton()},onComplete:function(){var current_date=$("#"+$(this).attr("id")+" span").attr("id");current_date=current_date.split("_"),$("#id_new_course_end_date_day").val(current_date[1]),$("#id_new_course_end_date_month").val(current_date[2]),$("#id_new_course_end_date_year").val(current_date[3]);var idStr=$(this).attr("id").split("_"),tii_course_id=idStr[2];$('input[name="tii_course_id"]').val(tii_course_id),$('input[name="tii_course_title"]').val($("a#course_"+tii_course_id).html()),$("#cboxLoadedContent .edit_course_end_date_form").show(),$("#dateselector-calendar-panel").css("z-index","9999"),$("#id_save_end_date").click(function(){$.ajax({dataType:"json",type:"POST",url:"ajax.php",data:{action:"edit_course_end_date",tii_course_id:tii_course_id,tii_course_title:$("a#course_"+tii_course_id).html(),sesskey:M.cfg.sesskey,end_date_d:$("#id_new_course_end_date_day").val(),end_date_m:$("#id_new_course_end_date_month").val(),end_date_y:$("#id_new_course_end_date_year").val()},success:function(data){if(eval(data),"success"==data.status)parent.$.fn.colorbox.close(),$("#course_date_"+tii_course_id+" span").html(data.end_date);else{var current_msg=$("#edit_end_date_desc").html;$("#edit_end_date_desc").html(current_msg+" "+data.msg)}}})})},onCleanup:function(){$(".edit_course_end_date_form").hide(),$("#tii_close_bar").remove()}})}function lightBoxCloseButton(){$("body").append('")}function initialiseCourseRecreation(){var e=$(window).width(),t="80%";e<1e3&&(t="860px");var a=$(window).width(),s="80%";a<700&&(s="600px"),$("a.course_recreate").colorbox({iframe:!0,width:t,height:s,top:"100px",className:"migration",opacity:"0.7",onLoad:function(){lightBoxCloseButton()},onCleanup:function(){$("#tii_close_bar").remove()}}),$(".browser_checkbox").click(function(){$(".browser_checkbox:checked").length>0?$(".create_checkboxes").slideDown():$(".create_checkboxes").slideUp()})}function initialiseCourseBrowserButtons(e){$("#id_create_course").click(function(){$.ajax({dataType:"html",type:"POST",url:"ajax.php",data:{action:"create_course",tii_course_id:$("#tii_course_id").html(),tii_course_name:encodeURIComponent($("#tii_course_name").html()),course_name:encodeURIComponent($("#id_coursename").val()),course_category:$("#id_coursecategory").val(),sesskey:M.cfg.sesskey},success:function(t){var a=jQuery.parseJSON(t);hideCourseCreationOptions(a,e)}})}),$("#id_update_course").click(function(){$.ajax({dataType:"html",type:"POST",url:"ajax.php",data:{action:"link_course",tii_course_id:$("#tii_course_id").html(),tii_course_name:$("#tii_course_name").html(),course_to_link:$("#id_coursetolink").val(),sesskey:M.cfg.sesskey},success:function(t){var a=jQuery.parseJSON(t);hideCourseCreationOptions(a,e)}})})}function hideCourseCreationOptions(e,t){if(0!=e){$("#course_id").html(e.courseid);var a='input[name="check_'+$("#tii_course_id").html()+'"]';parent.$(a).hide();var s="#tick_"+$("#tii_course_id").html();parent.$(s).show(),$('fieldset[id$="create_course_fieldset"]').parent().slideToggle(),$('fieldset[id$="update_course_fieldset"]').parent().slideToggle(),$("#or_container").hide(),$("#existing_course_title_span").html(e.coursename),$(".existing_course_title_h3").removeClass("hidden_class"),$(".assignmentids_check").length>0&&($(".assignmentids_check").removeAttr("disabled"),$("#id_assignmentname").removeAttr("disabled"),$("#id_create_assignment").removeAttr("disabled")),$(".assignmentids_check").change(function(){$(".assignmentids_check").filter(":checked").length>=5?$(".assignmentids_check").not(":checked").attr("disabled","disabled"):$(".assignmentids_check").removeAttr("disabled")}),initialiseCreateAssignmentButton(t)}}function initialiseCreateAssignmentButton(e){$("#id_create_assignment").unbind("click"),$("#id_create_assignment").click(function(){var t="";$(".assignmentids_check:checked").each(function(e){t+=$(this).val()+","}),","==t.charAt(t.length-1)&&t.substring(0,t.length-1),$("#id_create_assignment").attr("disabled","disabled"),$.ajax({dataType:"html",type:"POST",url:"ajax.php",data:{action:"create_assignment",course_id:$("#course_id").html(),assignment_name:$("#id_assignmentname").val(),parts:t,sesskey:M.cfg.sesskey},success:function(t){e.fnReloadAjax(),e.fnStandingRedraw(),$("#id_assignmentname").removeAttr("disabled"),$("#id_create_assignment").removeAttr("disabled"),$(".assignmentids_check").removeAttr("disabled")}})})}$(".submissionsDataTable thead tr, #courseBrowserTable thead tr").toggleClass("header");var dataTablesLang={nointegration:M.str.turnitintooltwo.nointegration,sProcessing:M.str.turnitintooltwo.sprocessing,sZeroRecords:M.str.turnitintooltwo.szerorecords,sInfo:M.str.turnitintooltwo.sinfo,sSearch:M.str.turnitintooltwo.ssearch,sLengthMenu:M.str.turnitintooltwo.slengthmenu,sInfoEmpty:M.str.turnitintooltwo.semptytable,oPaginate:{sNext:M.str.turnitintooltwo.snext,sPrevious:M.str.turnitintooltwo.sprevious}},dataTablesLangMigration={nointegration:M.str.turnitintooltwo.nointegration,sProcessing:M.str.turnitintooltwo.sprocessing,sZeroRecords:M.str.turnitintooltwo.szerorecords,sInfo:M.str.turnitintooltwo.sinfo,sSearch:"",sLengthMenu:M.str.turnitintooltwo.slengthmigrationmenu,sInfoEmpty:M.str.turnitintooltwo.semptytable,oPaginate:{sNext:M.str.turnitintooltwo.snext,sPrevious:M.str.turnitintooltwo.sprevious}};$("#unlinkUserTable").dataTable({bDestroy:!0,bProcessing:!0,bServerSide:!0,oLanguage:dataTablesLang,aaSorting:[[2,"asc"]],aLengthMenu:[[10,25,50,100,-1],[10,25,50,100,"All"]],sAjaxSource:"ajax.php?action=get_users",aoColumns:[{bSortable:!1,fnCreatedCell:function(e,t,a,s,i){$(e).addClass("centered_cell")}},null,{aDataSort:[2,3]},{aDataSort:[3,2]},null],fnDrawCallback:function(){$('input[name="selectallcb"]').attr("checked",!1)}}),"0"==$("#sametiiaccount").data("sametiiaccount")&&($('select[name="enablemigrationtool"]').attr("disabled","disabled"),$('select[name="enablemigrationtool"]').closest("form").find('input[name="submitbutton"]').attr("disabled","disabled")),$('input[name="selectallcb"]').closest("form").find('input[name="submitbutton"]').attr("disabled","disabled"),$(document).on("click",'#migrationTable input[name="selectallcb"], #migrationTable .browser_checkbox',function(){$("#migrationTable .browser_checkbox:checked").length>0?$("#migrationTable .browser_checkbox").closest("form").find('input[name="submitbutton"]').removeAttr("disabled"):$("#migrationTable .browser_checkbox").closest("form").find('input[name="submitbutton"]').attr("disabled","disabled")});var submitbutton=$("#migrationTable").closest("form").find('input[name="submitbutton"]');submitbutton.click(function(e){e.preventDefault();var t=M.str.turnitintooltwo.confirmv1deletetitle+"\n\n";t+=M.util.get_string("confirmv1deletetext","turnitintooltwo",$("#migrationTable .browser_checkbox:checked").length)+"\n\n",t+=M.str.turnitintooltwo.confirmv1deletewarning,confirm(t)&&$("#migrationTable").closest("form").submit()}),$("#migrationTable").dataTable({bDestroy:!0,bProcessing:!0,bServerSide:!0,oLanguage:dataTablesLangMigration,aaSorting:[[2,"asc"]],aLengthMenu:[[10,25,50,100,-1],[10,25,50,100,"All"]],sAjaxSource:"ajax.php?action=get_assignments",sDom:'<"top"lf>rt<"bottom"irp><"clear">',aoColumns:[{bSortable:!1,bSearchable:!1,fnCreatedCell:function(e,t,a,s,i){$(e).addClass("centered_cell")}},{bSortable:!0,sClass:"centered_cell",bSearchable:!1},{bSortable:!0,bSearchable:!0},{bSortable:!0,sClass:"centered_cell",bSearchable:!1}],fnDrawCallback:function(){$('input[name="selectallcb"]').attr("checked",!1)}}),$("#migrationTable_filter input").attr("placeholder","Search"),$("#filesTable").dataTable({bDestroy:!0,bProcessing:!0,bServerSide:!0,oLanguage:dataTablesLang,sAjaxSource:"ajax.php?action=get_files",aoColumns:[null,null,null,{sClass:"filename c0",sWidth:"40%"},null,{sClass:"fullname c1",sWidth:"35%"},null,{sClass:"created c2",sWidth:"22%"},{sClass:"remove c3",sWidth:"3%"}],aoColumnDefs:[{bSearchable:!0,bVisible:!1,aTargets:[0]},{bSearchable:!0,bVisible:!1,aTargets:[1]},{bSearchable:!0,bVisible:!1,aTargets:[2]},{bSearchable:!0,bVisible:!0,aTargets:[3]},{bSearchable:!0,bVisible:!1,aTargets:[4]},{bSearchable:!0,bVisible:!0,aTargets:[5]},{bSearchable:!0,bVisible:!1,aTargets:[6]},{bSearchable:!0,bVisible:!0,aTargets:[7]},{bSearchable:!0,bVisible:!0,aTargets:[8]}],fnDrawCallback:function(e){if(0!=e.aiDisplay.length)for(var t=$("#filesTable tbody tr"),a=t[0].getElementsByTagName("td").length,s="",i=0;iip'}),$.datepicker.regional[""].dateFormat="d M yy",$.datepicker.setDefaults($.datepicker.regional[""]);var courseBrowserTable=$("#courseBrowserTable").dataTable({bProcessing:!0,oLanguage:dataTablesLang,aaSorting:[[6,"asc"]],sAjaxSource:"ajax.php",aoColumnDefs:[{bSearchable:!1,bSortable:!1,sWidth:"5%",bVisible:!0,aTargets:[0],fnCreatedCell:function(e){$(e).addClass("center")}},{bSearchable:!0,bVisible:!0,sWidth:"45%",iDataSort:6,aTargets:[1]},{bSearchable:!0,bVisible:!0,sWidth:"10%",aTargets:[2]},{bSearchable:!0,bVisible:!0,sWidth:"20%",iDataSort:7,aTargets:[3],fnCreatedCell:function(e){$(e).addClass("right")}},{bSearchable:!1,bVisible:!0,sWidth:"10%",aTargets:[4],fnCreatedCell:function(e){$(e).addClass("right")}},{bSearchable:!0,bVisible:!0,sWidth:"10%",aTargets:[5],fnCreatedCell:function(e){$(e).addClass("center")}},{bSearchable:!0,bVisible:!1,aTargets:[6]},{bSearchable:!0,bVisible:!1,aTargets:[7]}],fnServerData:function(e,t,a){$.ajax({dataType:"json",type:"POST",url:e,data:{action:"search_classes",course_title:$("#search_course_title").val(),course_integration:$("#search_course_integration").val(),course_end_date:$("#search_course_end_date").val(),sesskey:M.cfg.sesskey},success:function(e){a(e)}})},bStateSave:!0,fnStateSave:function(e,t){try{localStorage.setItem(uid+"DataTables",JSON.stringify(t))}catch(a){}},fnStateLoad:function(e){try{return JSON.parse(localStorage.getItem(uid+"DataTables"))}catch(t){}},fnDrawCallback:function(){$('input[name="selectallcb"]').attr("checked",!1),initialiseCourseRecreation(),initialiseEditEndDate(),$("#search_courses_button").removeAttr("disabled")}});$("#search_courses_button").click(function(){return $(this).attr("disabled","disabled"),courseBrowserTable.fnReloadAjax(),courseBrowserTable.fnStandingRedraw(),!1}),$("#search_course_end_date").datepicker();var oTable=$("#assignmentBrowserTable").dataTable({bProcessing:!0,oLanguage:dataTablesLang,sAjaxSource:"ajax.php",fnServerData:function(sSource,aoData,fnCallback){$("#id_create_course").attr("disabled","disabled"),$("#id_update_course").attr("disabled","disabled"),$("#assignmentBrowserTable").length>0&&$(".side-pre-only #page-content #region-main").css({"margin-left":"0px"}),$("#id_assignmentname").attr("disabled","disabled"),$("#id_create_assignment").attr("disabled","disabled"),$.ajax({dataType:"json",type:"POST",url:sSource,data:{action:"get_assignments",tii_course_id:$("#tii_course_id").html(),sesskey:M.cfg.sesskey},success:function(result){eval(result),initialiseCourseBrowserButtons(oTable),fnCallback(result),"0"!=$("#course_id").html()&&result.number_of_assignments>0?($("#id_assignmentname").removeAttr("disabled"),$("#id_create_assignment").removeAttr("disabled"),$(".assignmentids_check").removeAttr("disabled"),initialiseCreateAssignmentButton(oTable)):($("#id_assignmentname").attr("disabled","disabled"),$("#id_create_assignment").attr("disabled","disabled"),$(".assignmentids_check").attr("disabled","disabled")),$("#id_create_course").removeAttr("disabled"),$("#id_update_course").removeAttr("disabled")}})},aoColumnDefs:[{bSearchable:!1,bVisible:!0,aTargets:[0]},{bSearchable:!0,bVisible:!0,aTargets:[1],fnCreatedCell:function(e){$(e).addClass("nowrap")}},{bSearchable:!0,bVisible:!0,aTargets:[2]},{bSearchable:!0,bVisible:!0,aTargets:[3]}]});if($("#create_classes_button").colorbox({iframe:!0,width:"60%",top:"200px",height:"124px",opacity:"0.7",className:"course_creation",href:function(){var e=$(".create_course_category").val(),t=$(".create_assignment_checkbox").is(":checked")?"1":"0",a="";$(".browser_checkbox:checked").each(function(e){a+="&class_id"+e+"="+$(this).val(),e++});var s=window.location.href,i=s.replace("cmd=courses","cmd=multiple_class_recreation");return i+"&view_context=box&category="+e+"&assignments="+t+a+"&sesskey="+M.cfg.sesskey},onCleanup:function(){window.location=window.location}}),$("#class_ids").length>0){$(".side-pre-only #page-content #region-main").css({"margin-left":"0px"}),$(".has-region-side-pre #page-content #region-main").css({width:"100%","margin-top":"-30px"});var class_ids=$("#class_ids").html();$.ajax({dataType:"html",type:"POST",url:"ajax.php",data:{action:"create_courses",class_ids:class_ids,course_category:$("#course_category").html(),create_assignments:$("#create_assignments").html(),sesskey:M.cfg.sesskey},success:function(e){$("#course_creation_status").html(e)}})}}); +//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInR1cm5pdGludG9vbHR3b19leHRyYS5qcyJdLCJuYW1lcyI6WyJqUXVlcnkiLCJkb2N1bWVudCIsInJlYWR5IiwiJCIsImluaXRpYWxpc2VFZGl0RW5kRGF0ZSIsImNvbG9yYm94IiwiaW5saW5lIiwid2lkdGgiLCJ0b3AiLCJiYWNrZ3JvdW5kIiwiaGVpZ2h0Iiwib3BhY2l0eSIsImNsYXNzTmFtZSIsIm9uTG9hZCIsImxpZ2h0Qm94Q2xvc2VCdXR0b24iLCJvbkNvbXBsZXRlIiwiY3VycmVudF9kYXRlIiwidGhpcyIsImF0dHIiLCJzcGxpdCIsInZhbCIsImlkU3RyIiwidGlpX2NvdXJzZV9pZCIsImh0bWwiLCJzaG93IiwiY3NzIiwiY2xpY2siLCJhamF4IiwiZGF0YVR5cGUiLCJ0eXBlIiwidXJsIiwiZGF0YSIsImFjdGlvbiIsInRpaV9jb3Vyc2VfdGl0bGUiLCJzZXNza2V5IiwiTSIsImNmZyIsImVuZF9kYXRlX2QiLCJlbmRfZGF0ZV9tIiwiZW5kX2RhdGVfeSIsInN1Y2Nlc3MiLCJldmFsIiwic3RhdHVzIiwicGFyZW50IiwiZm4iLCJjbG9zZSIsImVuZF9kYXRlIiwiY3VycmVudF9tc2ciLCJtc2ciLCJvbkNsZWFudXAiLCJoaWRlIiwicmVtb3ZlIiwiYXBwZW5kIiwic3RyIiwidHVybml0aW50b29sdHdvIiwiY2xvc2VidXR0b24iLCJpbml0aWFsaXNlQ291cnNlUmVjcmVhdGlvbiIsIndpbmRvd1dpZHRoIiwid2luZG93IiwiY29sb3JCb3hXaWR0aCIsIndpbmRvd0hlaWdodCIsImNvbG9yQm94SGVpZ2h0IiwiaWZyYW1lIiwibGVuZ3RoIiwic2xpZGVEb3duIiwic2xpZGVVcCIsImluaXRpYWxpc2VDb3Vyc2VCcm93c2VyQnV0dG9ucyIsIm9UYWJsZSIsInRpaV9jb3Vyc2VfbmFtZSIsImVuY29kZVVSSUNvbXBvbmVudCIsImNvdXJzZV9uYW1lIiwiY291cnNlX2NhdGVnb3J5Iiwib2JqIiwicGFyc2VKU09OIiwiaGlkZUNvdXJzZUNyZWF0aW9uT3B0aW9ucyIsImNvdXJzZV90b19saW5rIiwiY291cnNlaWQiLCJjYl9lbGVtZW50IiwidGlja19lbGVtZW50Iiwic2xpZGVUb2dnbGUiLCJjb3Vyc2VuYW1lIiwicmVtb3ZlQ2xhc3MiLCJyZW1vdmVBdHRyIiwiY2hhbmdlIiwiZmlsdGVyIiwibm90IiwiaW5pdGlhbGlzZUNyZWF0ZUFzc2lnbm1lbnRCdXR0b24iLCJ1bmJpbmQiLCJwYXJ0cyIsImVhY2giLCJpIiwiY2hhckF0Iiwic3Vic3RyaW5nIiwiY291cnNlX2lkIiwiYXNzaWdubWVudF9uYW1lIiwiZm5SZWxvYWRBamF4IiwiZm5TdGFuZGluZ1JlZHJhdyIsInRvZ2dsZUNsYXNzIiwiZGF0YVRhYmxlc0xhbmciLCJub2ludGVncmF0aW9uIiwic1Byb2Nlc3NpbmciLCJzcHJvY2Vzc2luZyIsInNaZXJvUmVjb3JkcyIsInN6ZXJvcmVjb3JkcyIsInNJbmZvIiwic2luZm8iLCJzU2VhcmNoIiwic3NlYXJjaCIsInNMZW5ndGhNZW51Iiwic2xlbmd0aG1lbnUiLCJzSW5mb0VtcHR5Iiwic2VtcHR5dGFibGUiLCJvUGFnaW5hdGUiLCJzTmV4dCIsInNuZXh0Iiwic1ByZXZpb3VzIiwic3ByZXZpb3VzIiwiZGF0YVRhYmxlc0xhbmdNaWdyYXRpb24iLCJzbGVuZ3RobWlncmF0aW9ubWVudSIsImRhdGFUYWJsZSIsImJEZXN0cm95IiwiYlByb2Nlc3NpbmciLCJiU2VydmVyU2lkZSIsIm9MYW5ndWFnZSIsImFhU29ydGluZyIsImFMZW5ndGhNZW51Iiwic0FqYXhTb3VyY2UiLCJhb0NvbHVtbnMiLCJiU29ydGFibGUiLCJmbkNyZWF0ZWRDZWxsIiwiblRkIiwic0RhdGEiLCJvRGF0YSIsImlSb3ciLCJpQ29sIiwiYWRkQ2xhc3MiLCJhRGF0YVNvcnQiLCJmbkRyYXdDYWxsYmFjayIsImNsb3Nlc3QiLCJmaW5kIiwib24iLCJzdWJtaXRidXR0b24iLCJldiIsInByZXZlbnREZWZhdWx0IiwibWVzc2FnZSIsImNvbmZpcm12MWRlbGV0ZXRpdGxlIiwidXRpbCIsImdldF9zdHJpbmciLCJjb25maXJtdjFkZWxldGV3YXJuaW5nIiwiY29uZmlybSIsInN1Ym1pdCIsInNEb20iLCJiU2VhcmNoYWJsZSIsInNDbGFzcyIsInNXaWR0aCIsImFvQ29sdW1uRGVmcyIsImJWaXNpYmxlIiwiYVRhcmdldHMiLCJvU2V0dGluZ3MiLCJhaURpc3BsYXkiLCJuVHJzIiwiaUNvbHNwYW4iLCJnZXRFbGVtZW50c0J5VGFnTmFtZSIsInNMYXN0R3JvdXAiLCJzR3JvdXAiLCJfaURpc3BsYXlTdGFydCIsImFvRGF0YSIsIl9hRGF0YSIsIm5Hcm91cCIsImNyZWF0ZUVsZW1lbnQiLCJuQ2VsbCIsImNvbFNwYW4iLCJpbm5lckhUTUwiLCJhcHBlbmRDaGlsZCIsInBhcmVudE5vZGUiLCJpbnNlcnRCZWZvcmUiLCJhYVNvcnRpbmdGaXhlZCIsImRhdGVwaWNrZXIiLCJyZWdpb25hbCIsImRhdGVGb3JtYXQiLCJzZXREZWZhdWx0cyIsImNvdXJzZUJyb3dzZXJUYWJsZSIsImlEYXRhU29ydCIsImZuU2VydmVyRGF0YSIsInNTb3VyY2UiLCJmbkNhbGxiYWNrIiwiY291cnNlX3RpdGxlIiwiY291cnNlX2ludGVncmF0aW9uIiwiY291cnNlX2VuZF9kYXRlIiwicmVzdWx0IiwiYlN0YXRlU2F2ZSIsImZuU3RhdGVTYXZlIiwibG9jYWxTdG9yYWdlIiwic2V0SXRlbSIsInVpZCIsIkpTT04iLCJzdHJpbmdpZnkiLCJlIiwiZm5TdGF0ZUxvYWQiLCJwYXJzZSIsImdldEl0ZW0iLCJtYXJnaW4tbGVmdCIsIm51bWJlcl9vZl9hc3NpZ25tZW50cyIsImhyZWYiLCJjYXRlZ29yeSIsImFzc2lnbm1lbnRzIiwiaXMiLCJjbGFzc19pZHMiLCJwYWdldXJsIiwibG9jYXRpb24iLCJyZXBsYWNlIiwibWFyZ2luLXRvcCIsImNyZWF0ZV9hc3NpZ25tZW50cyJdLCJtYXBwaW5ncyI6IkFBQUFBLE9BQU9DLFVBQVVDLE1BQU0sU0FBU0MsR0FrVzVCLFFBQVNDLHlCQUNMRCxFQUFFLDBCQUEwQkUsVUFDeEJDLFFBQU8sRUFBTUMsTUFBTSxNQUFPQyxJQUFLLFFBQVNDLFdBQVksT0FBUUMsT0FBTyxRQUFTQyxRQUFTLE1BQU9DLFVBQVcscUJBQ3ZHQyxPQUFRLFdBQ0pDLHVCQUVKQyxXQUFhLFdBSVQsR0FBSUMsY0FBZWIsRUFBRSxJQUFNQSxFQUFFYyxNQUFNQyxLQUFLLE1BQVEsU0FBU0EsS0FBSyxLQUM5REYsY0FBZUEsYUFBYUcsTUFBTSxLQUNsQ2hCLEVBQUUsK0JBQStCaUIsSUFBSUosYUFBYSxJQUNsRGIsRUFBRSxpQ0FBaUNpQixJQUFJSixhQUFhLElBQ3BEYixFQUFFLGdDQUFnQ2lCLElBQUlKLGFBQWEsR0FFbkQsSUFBSUssT0FBUWxCLEVBQUVjLE1BQU1DLEtBQUssTUFBTUMsTUFBTSxLQUNqQ0csY0FBZ0JELE1BQU0sRUFDMUJsQixHQUFFLCtCQUErQmlCLElBQUlFLGVBQ3JDbkIsRUFBRSxrQ0FBa0NpQixJQUFJakIsRUFBRSxZQUFjbUIsZUFBZUMsUUFDdkVwQixFQUFFLGlEQUFpRHFCLE9BQ25EckIsRUFBRSxnQ0FBZ0NzQixJQUFJLFVBQVcsUUFFakR0QixFQUFFLHFCQUFxQnVCLE1BQU0sV0FDekJ2QixFQUFFd0IsTUFDRUMsU0FBWSxPQUNaQyxLQUFRLE9BQ1JDLElBQU8sV0FDUEMsTUFBU0MsT0FBUSx1QkFBd0JWLGNBQWVBLGNBQ3BEVyxpQkFBa0I5QixFQUFFLFlBQWNtQixlQUFlQyxPQUFRVyxRQUFTQyxFQUFFQyxJQUFJRixRQUN4RUcsV0FBWWxDLEVBQUUsK0JBQStCaUIsTUFDN0NrQixXQUFZbkMsRUFBRSxpQ0FBaUNpQixNQUMvQ21CLFdBQVlwQyxFQUFFLGdDQUFnQ2lCLE9BRWxEb0IsUUFBUyxTQUFTVCxNQUVkLEdBREFVLEtBQUtWLE1BQ2MsV0FBZkEsS0FBS1csT0FDTEMsT0FBT3hDLEVBQUV5QyxHQUFHdkMsU0FBU3dDLFFBQ3JCMUMsRUFBRSxnQkFBa0JtQixjQUFnQixTQUFTQyxLQUFLUSxLQUFLZSxjQUNwRCxDQUNILEdBQUlDLGFBQWM1QyxFQUFFLHVCQUF1Qm9CLElBQzNDcEIsR0FBRSx1QkFBdUJvQixLQUFLd0IsWUFBYyxJQUFNaEIsS0FBS2lCLFlBTTNFQyxVQUFXLFdBQ1A5QyxFQUFFLDhCQUE4QitDLE9BQ2hDL0MsRUFBRSxrQkFBa0JnRCxZQUtoQyxRQUFTckMsdUJBQ0xYLEVBQUUsUUFBUWlELE9BQU8sbUZBQXFGakIsRUFBRWtCLElBQUlDLGdCQUFnQkMsWUFBYyxjQU05SSxRQUFTQyw4QkFFTCxHQUFJQyxHQUFjdEQsRUFBRXVELFFBQVFuRCxRQUN4Qm9ELEVBQWdCLEtBQ2hCRixHQUFjLE1BQ2RFLEVBQWdCLFFBR3BCLElBQUlDLEdBQWV6RCxFQUFFdUQsUUFBUW5ELFFBQ3pCc0QsRUFBaUIsS0FDakJELEdBQWUsTUFDZkMsRUFBaUIsU0FHckIxRCxFQUFFLHFCQUFxQkUsVUFDbkJ5RCxRQUFPLEVBQU12RCxNQUFNb0QsRUFBZWpELE9BQU9tRCxFQUFnQnJELElBQUssUUFBU0ksVUFBVyxZQUFhRCxRQUFTLE1BQ3hHRSxPQUFRLFdBQ0pDLHVCQUVKbUMsVUFBVSxXQUNOOUMsRUFBRSxrQkFBa0JnRCxZQUk1QmhELEVBQUUscUJBQXFCdUIsTUFBTSxXQUNyQnZCLEVBQUUsNkJBQTZCNEQsT0FBUyxFQUN4QzVELEVBQUUsc0JBQXNCNkQsWUFFeEI3RCxFQUFFLHNCQUFzQjhELFlBTXBDLFFBQVNDLGdDQUErQkMsR0FDcENoRSxFQUFFLHFCQUFxQnVCLE1BQU0sV0FDekJ2QixFQUFFd0IsTUFDRUMsU0FBWSxPQUNaQyxLQUFRLE9BQ1JDLElBQU8sV0FDUEMsTUFBU0MsT0FBUSxnQkFBaUJWLGNBQWVuQixFQUFFLGtCQUFrQm9CLE9BQ2pFNkMsZ0JBQWlCQyxtQkFBbUJsRSxFQUFFLG9CQUFvQm9CLFFBQzFEK0MsWUFBYUQsbUJBQW1CbEUsRUFBRSxrQkFBa0JpQixPQUNwRG1ELGdCQUFpQnBFLEVBQUUsc0JBQXNCaUIsTUFBT2MsUUFBU0MsRUFBRUMsSUFBSUYsU0FDbkVNLFFBQVMsU0FBU1QsR0FDZCxHQUFJeUMsR0FBTXhFLE9BQU95RSxVQUFVMUMsRUFDM0IyQywyQkFBMEJGLEVBQUtMLFFBSzNDaEUsRUFBRSxxQkFBcUJ1QixNQUFNLFdBQ3pCdkIsRUFBRXdCLE1BQ0VDLFNBQVksT0FDWkMsS0FBUSxPQUNSQyxJQUFPLFdBQ1BDLE1BQVNDLE9BQVEsY0FBZVYsY0FBZW5CLEVBQUUsa0JBQWtCb0IsT0FDL0Q2QyxnQkFBaUJqRSxFQUFFLG9CQUFvQm9CLE9BQVFvRCxlQUFnQnhFLEVBQUUsb0JBQW9CaUIsTUFDckZjLFFBQVNDLEVBQUVDLElBQUlGLFNBQ25CTSxRQUFTLFNBQVNULEdBQ2QsR0FBSXlDLEdBQU14RSxPQUFPeUUsVUFBVTFDLEVBQzNCMkMsMkJBQTBCRixFQUFLTCxRQVEvQyxRQUFTTywyQkFBMEJGLEVBQUtMLEdBQ3BDLEdBQVcsR0FBUEssRUFBVSxDQUNWckUsRUFBRSxjQUFjb0IsS0FBS2lELEVBQUlJLFNBRXpCLElBQUlDLEdBQWEscUJBQXVCMUUsRUFBRSxrQkFBa0JvQixPQUFTLElBQ3JFb0IsUUFBT3hDLEVBQUUwRSxHQUFZM0IsTUFDckIsSUFBSTRCLEdBQWUsU0FBVzNFLEVBQUUsa0JBQWtCb0IsTUFDbERvQixRQUFPeEMsRUFBRTJFLEdBQWN0RCxPQUV2QnJCLEVBQUUsMENBQTBDd0MsU0FBU29DLGNBQ3JENUUsRUFBRSwwQ0FBMEN3QyxTQUFTb0MsY0FFckQ1RSxFQUFFLGlCQUFpQitDLE9BRW5CL0MsRUFBRSwrQkFBK0JvQixLQUFLaUQsRUFBSVEsWUFDMUM3RSxFQUFFLDZCQUE2QjhFLFlBQVksZ0JBRXZDOUUsRUFBRSx3QkFBd0I0RCxPQUFTLElBQ25DNUQsRUFBRSx3QkFBd0IrRSxXQUFXLFlBQ3JDL0UsRUFBRSxzQkFBc0IrRSxXQUFXLFlBQ25DL0UsRUFBRSx5QkFBeUIrRSxXQUFXLGFBRzFDL0UsRUFBRSx3QkFBd0JnRixPQUFPLFdBQ3pCaEYsRUFBRSx3QkFBd0JpRixPQUFPLFlBQVlyQixRQUFVLEVBQ3ZENUQsRUFBRSx3QkFBd0JrRixJQUFJLFlBQVluRSxLQUFLLFdBQVksWUFFM0RmLEVBQUUsd0JBQXdCK0UsV0FBVyxjQUk3Q0ksaUNBQWlDbkIsSUFLekMsUUFBU21CLGtDQUFpQ25CLEdBQ3RDaEUsRUFBRSx5QkFBeUJvRixPQUFPLFNBQ2xDcEYsRUFBRSx5QkFBeUJ1QixNQUFNLFdBRTdCLEdBQUk4RCxHQUFRLEVBQ1pyRixHQUFFLGdDQUFnQ3NGLEtBQUssU0FBU0MsR0FDNUNGLEdBQVNyRixFQUFFYyxNQUFNRyxNQUFRLE1BRVMsS0FBbENvRSxFQUFNRyxPQUFPSCxFQUFNekIsT0FBUyxJQUM1QnlCLEVBQU1JLFVBQVUsRUFBR0osRUFBTXpCLE9BQVMsR0FHdEM1RCxFQUFFLHlCQUF5QmUsS0FBSyxXQUFZLFlBRTVDZixFQUFFd0IsTUFDRUMsU0FBWSxPQUNaQyxLQUFRLE9BQ1JDLElBQU8sV0FDUEMsTUFBU0MsT0FBUSxvQkFBcUI2RCxVQUFXMUYsRUFBRSxjQUFjb0IsT0FDN0R1RSxnQkFBaUIzRixFQUFFLHNCQUFzQmlCLE1BQU9vRSxNQUFPQSxFQUFPdEQsUUFBU0MsRUFBRUMsSUFBSUYsU0FDakZNLFFBQVMsU0FBU1QsR0FDZG9DLEVBQU80QixlQUNQNUIsRUFBTzZCLG1CQUNQN0YsRUFBRSxzQkFBc0IrRSxXQUFXLFlBQ25DL0UsRUFBRSx5QkFBeUIrRSxXQUFXLFlBQ3RDL0UsRUFBRSx3QkFBd0IrRSxXQUFXLGlCQS9oQnJEL0UsRUFBRSxnRUFBZ0U4RixZQUFZLFNBRzlFLElBQUlDLGlCQUNBQyxjQUFpQmhFLEVBQUVrQixJQUFJQyxnQkFBZ0I2QyxjQUN2Q0MsWUFBZWpFLEVBQUVrQixJQUFJQyxnQkFBZ0IrQyxZQUNyQ0MsYUFBZ0JuRSxFQUFFa0IsSUFBSUMsZ0JBQWdCaUQsYUFDdENDLE1BQVNyRSxFQUFFa0IsSUFBSUMsZ0JBQWdCbUQsTUFDL0JDLFFBQVd2RSxFQUFFa0IsSUFBSUMsZ0JBQWdCcUQsUUFDakNDLFlBQWV6RSxFQUFFa0IsSUFBSUMsZ0JBQWdCdUQsWUFDckNDLFdBQWMzRSxFQUFFa0IsSUFBSUMsZ0JBQWdCeUQsWUFDcENDLFdBQ0lDLE1BQVM5RSxFQUFFa0IsSUFBSUMsZ0JBQWdCNEQsTUFDL0JDLFVBQWFoRixFQUFFa0IsSUFBSUMsZ0JBQWdCOEQsWUFLdkNDLHlCQUNBbEIsY0FBaUJoRSxFQUFFa0IsSUFBSUMsZ0JBQWdCNkMsY0FDdkNDLFlBQWVqRSxFQUFFa0IsSUFBSUMsZ0JBQWdCK0MsWUFDckNDLGFBQWdCbkUsRUFBRWtCLElBQUlDLGdCQUFnQmlELGFBQ3RDQyxNQUFTckUsRUFBRWtCLElBQUlDLGdCQUFnQm1ELE1BQy9CQyxRQUFXLEdBQ1hFLFlBQWV6RSxFQUFFa0IsSUFBSUMsZ0JBQWdCZ0UscUJBQ3JDUixXQUFjM0UsRUFBRWtCLElBQUlDLGdCQUFnQnlELFlBQ3BDQyxXQUNJQyxNQUFTOUUsRUFBRWtCLElBQUlDLGdCQUFnQjRELE1BQy9CQyxVQUFhaEYsRUFBRWtCLElBQUlDLGdCQUFnQjhELFdBSzNDakgsR0FBRSxvQkFBb0JvSCxXQUNsQkMsVUFBWSxFQUNaQyxhQUFlLEVBQ2ZDLGFBQWUsRUFDZkMsVUFBYXpCLGVBQ2IwQixZQUFnQixFQUFHLFFBQ25CQyxjQUFpQixHQUFJLEdBQUksR0FBSSxTQUFXLEdBQUksR0FBSSxHQUFJLElBQUssUUFDekRDLFlBQWUsNEJBQ2ZDLFlBQ2lCQyxXQUFhLEVBQ1ZDLGNBQWlCLFNBQVVDLEVBQUtDLEVBQU9DLEVBQU9DLEVBQU1DLEdBQ2hEbkksRUFBRStILEdBQUtLLFNBQVMsbUJBRXhCLE1BQ0NDLFdBQWUsRUFBRyxLQUNsQkEsV0FBZSxFQUFHLElBQ25CLE1BRWhCQyxlQUFrQixXQUNkdEksRUFBRSw2QkFBNkJlLEtBQUssV0FBVyxNQUtILEtBQS9DZixFQUFFLG1CQUFtQjRCLEtBQUssb0JBQzNCNUIsRUFBRSxzQ0FBc0NlLEtBQUssV0FBWSxZQUN6RGYsRUFBRSxzQ0FBc0N1SSxRQUFRLFFBQVFDLEtBQUssOEJBQThCekgsS0FBSyxXQUFZLGFBSWhIZixFQUFFLDZCQUE2QnVJLFFBQVEsUUFBUUMsS0FBSyw4QkFBOEJ6SCxLQUFLLFdBQVksWUFDbkdmLEVBQUVGLFVBQVUySSxHQUFHLFFBQVMsK0VBQWdGLFdBQ2hHekksRUFBRSw2Q0FBNkM0RCxPQUFTLEVBQ3hENUQsRUFBRSxxQ0FBcUN1SSxRQUFRLFFBQVFDLEtBQUssOEJBQThCekQsV0FBVyxZQUVyRy9FLEVBQUUscUNBQXFDdUksUUFBUSxRQUFRQyxLQUFLLDhCQUE4QnpILEtBQUssV0FBWSxhQUtuSCxJQUFJMkgsY0FBZTFJLEVBQUUsbUJBQW1CdUksUUFBUSxRQUFRQyxLQUFLLDZCQUM3REUsY0FBYW5ILE1BQU0sU0FBU29ILEdBQ3hCQSxFQUFHQyxnQkFHSCxJQUFJQyxHQUFVN0csRUFBRWtCLElBQUlDLGdCQUFnQjJGLHFCQUFxQixNQUN6REQsSUFBVzdHLEVBQUUrRyxLQUFLQyxXQUFXLHNCQUF1QixrQkFBbUJoSixFQUFFLDZDQUE2QzRELFFBQVEsT0FDOUhpRixHQUFXN0csRUFBRWtCLElBQUlDLGdCQUFnQjhGLHVCQUU3QkMsUUFBUUwsSUFDUjdJLEVBQUUsbUJBQW1CdUksUUFBUSxRQUFRWSxXQU03Q25KLEVBQUUsbUJBQW1Cb0gsV0FDakJDLFVBQVksRUFDWkMsYUFBZSxFQUNmQyxhQUFlLEVBQ2ZDLFVBQWFOLHdCQUNiTyxZQUFnQixFQUFHLFFBQ25CQyxjQUFpQixHQUFJLEdBQUksR0FBSSxTQUFXLEdBQUksR0FBSSxHQUFJLElBQUssUUFDekRDLFlBQWUsa0NBQ2Z5QixLQUFRLG9DQUNSeEIsWUFDaUJDLFdBQWEsRUFBT3dCLGFBQWUsRUFDaEN2QixjQUFpQixTQUFVQyxFQUFLQyxFQUFPQyxFQUFPQyxFQUFNQyxHQUNoRG5JLEVBQUUrSCxHQUFLSyxTQUFTLG9CQUV2QlAsV0FBYSxFQUFNeUIsT0FBVSxnQkFBaUJELGFBQWUsSUFDN0R4QixXQUFhLEVBQU13QixhQUFlLElBQ2xDeEIsV0FBYSxFQUFNeUIsT0FBVSxnQkFBaUJELGFBQWUsSUFFOUVmLGVBQWtCLFdBQ2R0SSxFQUFFLDZCQUE2QmUsS0FBSyxXQUFXLE1BR3ZEZixFQUFFLGdDQUFnQ2UsS0FBSyxjQUFlLFVBR3REZixFQUFFLGVBQWVvSCxXQUNiQyxVQUFZLEVBQ1pDLGFBQWUsRUFDZkMsYUFBZSxFQUNmQyxVQUFhekIsZUFDYjRCLFlBQWUsNEJBQ2ZDLFdBQ1ksS0FDQSxLQUNBLE1BQ0MwQixPQUFVLGNBQWVDLE9BQVUsT0FDcEMsTUFDQ0QsT0FBVSxjQUFlQyxPQUFVLE9BQ3BDLE1BQ0NELE9BQVUsYUFBY0MsT0FBVSxRQUNsQ0QsT0FBVSxZQUFhQyxPQUFVLE9BRTlDQyxlQUNhSCxhQUFlLEVBQU1JLFVBQVksRUFBT0MsVUFBYyxLQUN0REwsYUFBZSxFQUFNSSxVQUFZLEVBQU9DLFVBQWMsS0FDdERMLGFBQWUsRUFBTUksVUFBWSxFQUFPQyxVQUFjLEtBQ3RETCxhQUFlLEVBQU1JLFVBQVksRUFBTUMsVUFBYyxLQUNyREwsYUFBZSxFQUFNSSxVQUFZLEVBQU9DLFVBQWMsS0FDdERMLGFBQWUsRUFBTUksVUFBWSxFQUFNQyxVQUFjLEtBQ3JETCxhQUFlLEVBQU1JLFVBQVksRUFBT0MsVUFBYyxLQUN0REwsYUFBZSxFQUFNSSxVQUFZLEVBQU1DLFVBQWMsS0FDckRMLGFBQWUsRUFBTUksVUFBWSxFQUFNQyxVQUFjLEtBRWxFcEIsZUFBa0IsU0FBV3FCLEdBQ3pCLEdBQW1DLEdBQTlCQSxFQUFVQyxVQUFVaEcsT0FRekIsSUFBSyxHQUhEaUcsR0FBTzdKLEVBQUUsd0JBQ1Q4SixFQUFXRCxFQUFLLEdBQUdFLHFCQUFxQixNQUFNbkcsT0FDOUNvRyxFQUFhLEdBQ1J6RSxFQUFJLEVBQUdBLEVBQUlzRSxFQUFLakcsT0FBUTJCLElBQUssQ0FDbEMsR0FDSTBFLElBRGdCTixFQUFVTyxlQUFpQjNFLEVBQ2xDb0UsRUFBVVEsT0FBUVIsRUFBVUMsVUFBVXJFLElBQUs2RSxPQUFPLEdBQy9ELElBQUtILEdBQVVELEVBQ2YsQ0FDSSxHQUFJSyxHQUFTdkssU0FBU3dLLGNBQWUsTUFDakNDLEVBQVF6SyxTQUFTd0ssY0FBZSxLQUNwQ0MsR0FBTUMsUUFBVVYsRUFDaEJTLEVBQU05SixVQUFZLFFBQ2xCOEosRUFBTUUsVUFBWVIsRUFDbEJJLEVBQU9LLFlBQWFILEdBQ3BCVixFQUFLdEUsR0FBR29GLFdBQVdDLGFBQWNQLEVBQVFSLEVBQUt0RSxJQUM5Q3lFLEVBQWFDLEtBSXpCWSxpQkFBcUIsRUFBRyxRQUN4QnBELFlBQWdCLEVBQUcsUUFDbkIyQixLQUFRLHlCQUdacEosRUFBRThLLFdBQVdDLFNBQVMsSUFBSUMsV0FBYSxTQUN2Q2hMLEVBQUU4SyxXQUFXRyxZQUFZakwsRUFBRThLLFdBQVdDLFNBQVMsSUFHL0MsSUFBSUcsb0JBQXFCbEwsRUFBRSx1QkFBdUJvSCxXQUM5Q0UsYUFBZSxFQUNmRSxVQUFhekIsZUFDYjBCLFlBQWdCLEVBQUcsUUFDbkJFLFlBQWUsV0FDZjZCLGVBQ2FILGFBQWUsRUFBT3hCLFdBQWEsRUFBTzBCLE9BQVUsS0FBTUUsVUFBWSxFQUFNQyxVQUFjLEdBQ3ZGNUIsY0FBaUIsU0FBVUMsR0FDdkIvSCxFQUFFK0gsR0FBS0ssU0FBUyxhQUV2QmlCLGFBQWUsRUFBTUksVUFBWSxFQUFNRixPQUFVLE1BQU80QixVQUFhLEVBQUd6QixVQUFjLEtBQ3RGTCxhQUFlLEVBQU1JLFVBQVksRUFBTUYsT0FBVSxNQUFPRyxVQUFjLEtBQ3RFTCxhQUFlLEVBQU1JLFVBQVksRUFBTUYsT0FBVSxNQUFPNEIsVUFBYSxFQUFHekIsVUFBYyxHQUNuRjVCLGNBQWlCLFNBQVVDLEdBQ3ZCL0gsRUFBRStILEdBQUtLLFNBQVMsWUFFdkJpQixhQUFlLEVBQU9JLFVBQVksRUFBTUYsT0FBVSxNQUFPRyxVQUFjLEdBQ3BFNUIsY0FBaUIsU0FBVUMsR0FDdkIvSCxFQUFFK0gsR0FBS0ssU0FBUyxZQUV2QmlCLGFBQWUsRUFBTUksVUFBWSxFQUFNRixPQUFVLE1BQU9HLFVBQWMsR0FDbkU1QixjQUFpQixTQUFVQyxHQUN2Qi9ILEVBQUUrSCxHQUFLSyxTQUFTLGFBRXZCaUIsYUFBZSxFQUFNSSxVQUFZLEVBQU9DLFVBQWMsS0FDdERMLGFBQWUsRUFBTUksVUFBWSxFQUFPQyxVQUFjLEtBRW5FMEIsYUFBZ0IsU0FBV0MsRUFBU2xCLEVBQVFtQixHQUN4Q3RMLEVBQUV3QixNQUNFQyxTQUFZLE9BQ1pDLEtBQVEsT0FDUkMsSUFBTzBKLEVBQ1B6SixNQUFTQyxPQUFRLGlCQUFrQjBKLGFBQWN2TCxFQUFFLHdCQUF3QmlCLE1BQ3ZFdUssbUJBQW9CeEwsRUFBRSw4QkFBOEJpQixNQUNwRHdLLGdCQUFpQnpMLEVBQUUsMkJBQTJCaUIsTUFBT2MsUUFBU0MsRUFBRUMsSUFBSUYsU0FDeEVNLFFBQVcsU0FBU3FKLEdBQ2hCSixFQUFXSSxPQUl2QkMsWUFBYyxFQUNkQyxZQUFlLFNBQVVqQyxFQUFXMUIsR0FDaEMsSUFDSTRELGFBQWFDLFFBQVNDLElBQU0sYUFBY0MsS0FBS0MsVUFBVWhFLElBQzNELE1BQVFpRSxNQUdkQyxZQUFlLFNBQVV4QyxHQUNyQixJQUNJLE1BQU9xQyxNQUFLSSxNQUFPUCxhQUFhUSxRQUFRTixJQUFNLGVBQ2hELE1BQVFHLE1BR2Q1RCxlQUFrQixXQUNkdEksRUFBRSw2QkFBNkJlLEtBQUssV0FBVyxHQUMvQ3NDLDZCQUNBcEQsd0JBQ0FELEVBQUUsMEJBQTBCK0UsV0FBVyxjQUkvQy9FLEdBQUUsMEJBQTBCdUIsTUFBTSxXQUk5QixNQUhBdkIsR0FBRWMsTUFBTUMsS0FBSyxXQUFZLFlBQ3pCbUssbUJBQW1CdEYsZUFDbkJzRixtQkFBbUJyRixvQkFDWixJQUdYN0YsRUFBRSwyQkFBMkI4SyxZQUc3QixJQUFJOUcsUUFBU2hFLEVBQUUsMkJBQTJCb0gsV0FDdENFLGFBQWUsRUFDZkUsVUFBYXpCLGVBQ2I0QixZQUFlLFdBQ2Z5RCxhQUFnQixTQUFXQyxRQUFTbEIsT0FBUW1CLFlBR3hDdEwsRUFBRSxxQkFBcUJlLEtBQUssV0FBVyxZQUN2Q2YsRUFBRSxxQkFBcUJlLEtBQUssV0FBVyxZQUduQ2YsRUFBRSwyQkFBMkI0RCxPQUFTLEdBQ3RDNUQsRUFBRSw2Q0FBNkNzQixLQUFLZ0wsY0FBZ0IsUUFFeEV0TSxFQUFFLHNCQUFzQmUsS0FBSyxXQUFZLFlBQ3pDZixFQUFFLHlCQUF5QmUsS0FBSyxXQUFZLFlBQzVDZixFQUFFd0IsTUFDRUMsU0FBWSxPQUNaQyxLQUFRLE9BQ1JDLElBQU8wSixRQUNQekosTUFBU0MsT0FBUSxrQkFBbUJWLGNBQWVuQixFQUFFLGtCQUFrQm9CLE9BQVFXLFFBQVNDLEVBQUVDLElBQUlGLFNBQzlGTSxRQUFXLFNBQVNxSixRQUNoQnBKLEtBQUtvSixRQUNMM0gsK0JBQStCQyxRQUMvQnNILFdBQVdJLFFBRW1CLEtBQTFCMUwsRUFBRSxjQUFjb0IsUUFBaUJzSyxPQUFPYSxzQkFBd0IsR0FDaEV2TSxFQUFFLHNCQUFzQitFLFdBQVcsWUFDbkMvRSxFQUFFLHlCQUF5QitFLFdBQVcsWUFDdEMvRSxFQUFFLHdCQUF3QitFLFdBQVcsWUFDckNJLGlDQUFpQ25CLFVBRWpDaEUsRUFBRSxzQkFBc0JlLEtBQUssV0FBWSxZQUN6Q2YsRUFBRSx5QkFBeUJlLEtBQUssV0FBWSxZQUM1Q2YsRUFBRSx3QkFBd0JlLEtBQUssV0FBWSxhQUkvQ2YsRUFBRSxxQkFBcUIrRSxXQUFXLFlBQ2xDL0UsRUFBRSxxQkFBcUIrRSxXQUFXLGdCQUk5Q3lFLGVBQ0tILGFBQWUsRUFBT0ksVUFBWSxFQUFNQyxVQUFjLEtBQ3RETCxhQUFlLEVBQU1JLFVBQVksRUFBTUMsVUFBYyxHQUNsRDVCLGNBQWlCLFNBQVVDLEdBQ3ZCL0gsRUFBRStILEdBQUtLLFNBQVMsYUFFdkJpQixhQUFlLEVBQU1JLFVBQVksRUFBTUMsVUFBYyxLQUNyREwsYUFBZSxFQUFNSSxVQUFZLEVBQU1DLFVBQWMsTUE0QjlELElBdkJBMUosRUFBRSwwQkFBMEJFLFVBQ3hCeUQsUUFBTyxFQUFNdkQsTUFBTSxNQUFPQyxJQUFLLFFBQVNFLE9BQU8sUUFBU0MsUUFBUyxNQUFPQyxVQUFXLGtCQUNuRitMLEtBQU0sV0FDRSxHQUFJQyxHQUFXek0sRUFBRSwyQkFBMkJpQixNQUN4Q3lMLEVBQWUxTSxFQUFFLCtCQUErQjJNLEdBQUcsWUFBZSxJQUFNLElBRXhFQyxFQUFZLEVBRWhCNU0sR0FBRSw2QkFBNkJzRixLQUFLLFNBQVNDLEdBQ3pDcUgsR0FBYSxZQUFjckgsRUFBSSxJQUFNdkYsRUFBRWMsTUFBTUcsTUFDN0NzRSxLQUdKLElBQUlzSCxHQUFVdEosT0FBT3VKLFNBQVNOLEtBQzFCN0ssRUFBTWtMLEVBQVFFLFFBQVEsY0FBZSxnQ0FFekMsT0FBT3BMLEdBQU0sOEJBQWdDOEssRUFBVyxnQkFBa0JDLEVBQWNFLEVBQVksWUFBYzVLLEVBQUVDLElBQUlGLFNBRWhJZSxVQUFXLFdBQ1BTLE9BQU91SixTQUFXdkosT0FBT3VKLFlBSTdCOU0sRUFBRSxjQUFjNEQsT0FBUyxFQUFHLENBRzVCNUQsRUFBRSw2Q0FBNkNzQixLQUMzQ2dMLGNBQWdCLFFBR3BCdE0sRUFBRSxtREFBbURzQixLQUNqRGxCLE1BQVMsT0FDVDRNLGFBQWMsU0FHbEIsSUFBSUosV0FBWTVNLEVBQUUsY0FBY29CLE1BRWhDcEIsR0FBRXdCLE1BQ0VDLFNBQVksT0FDWkMsS0FBUSxPQUNSQyxJQUFPLFdBQ1BDLE1BQVNDLE9BQVEsaUJBQWtCK0ssVUFBV0EsVUFBV3hJLGdCQUFpQnBFLEVBQUUsb0JBQW9Cb0IsT0FDNUY2TCxtQkFBb0JqTixFQUFFLHVCQUF1Qm9CLE9BQVFXLFFBQVNDLEVBQUVDLElBQUlGLFNBQ3hFTSxRQUFTLFNBQVNULEdBQ2Q1QixFQUFFLDJCQUEyQm9CLEtBQUtRIiwiZmlsZSI6InR1cm5pdGludG9vbHR3b19leHRyYS5taW4uanMiLCJzb3VyY2VzQ29udGVudCI6WyJqUXVlcnkoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uKCQpIHtcbiAgICAvLyBBZGQgc3R5bGUgdG8gaGVhZGVyIHJvdy5cbiAgICAkKCcuc3VibWlzc2lvbnNEYXRhVGFibGUgdGhlYWQgdHIsICNjb3Vyc2VCcm93c2VyVGFibGUgdGhlYWQgdHInKS50b2dnbGVDbGFzcyhcImhlYWRlclwiKTtcblxuICAgIC8vIENvbmZpZ3VyZSBkYXRhdGFibGVzIGxhbmd1YWdlIHNldHRpbmdzLlxuICAgIHZhciBkYXRhVGFibGVzTGFuZyA9IHtcbiAgICAgICAgXCJub2ludGVncmF0aW9uXCI6IE0uc3RyLnR1cm5pdGludG9vbHR3by5ub2ludGVncmF0aW9uLFxuICAgICAgICBcInNQcm9jZXNzaW5nXCI6IE0uc3RyLnR1cm5pdGludG9vbHR3by5zcHJvY2Vzc2luZyxcbiAgICAgICAgXCJzWmVyb1JlY29yZHNcIjogTS5zdHIudHVybml0aW50b29sdHdvLnN6ZXJvcmVjb3JkcyxcbiAgICAgICAgXCJzSW5mb1wiOiBNLnN0ci50dXJuaXRpbnRvb2x0d28uc2luZm8sXG4gICAgICAgIFwic1NlYXJjaFwiOiBNLnN0ci50dXJuaXRpbnRvb2x0d28uc3NlYXJjaCxcbiAgICAgICAgXCJzTGVuZ3RoTWVudVwiOiBNLnN0ci50dXJuaXRpbnRvb2x0d28uc2xlbmd0aG1lbnUsXG4gICAgICAgIFwic0luZm9FbXB0eVwiOiBNLnN0ci50dXJuaXRpbnRvb2x0d28uc2VtcHR5dGFibGUsXG4gICAgICAgIFwib1BhZ2luYXRlXCI6IHtcbiAgICAgICAgICAgIFwic05leHRcIjogTS5zdHIudHVybml0aW50b29sdHdvLnNuZXh0LFxuICAgICAgICAgICAgXCJzUHJldmlvdXNcIjogTS5zdHIudHVybml0aW50b29sdHdvLnNwcmV2aW91c1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIC8vIENvbmZpZ3VyZSBkYXRhdGFibGVzIGxhbmd1YWdlIHNldHRpbmdzIGZvciBtaWdyYXRpb24gdG9vbC5cbiAgICB2YXIgZGF0YVRhYmxlc0xhbmdNaWdyYXRpb24gPSB7XG4gICAgICAgIFwibm9pbnRlZ3JhdGlvblwiOiBNLnN0ci50dXJuaXRpbnRvb2x0d28ubm9pbnRlZ3JhdGlvbixcbiAgICAgICAgXCJzUHJvY2Vzc2luZ1wiOiBNLnN0ci50dXJuaXRpbnRvb2x0d28uc3Byb2Nlc3NpbmcsXG4gICAgICAgIFwic1plcm9SZWNvcmRzXCI6IE0uc3RyLnR1cm5pdGludG9vbHR3by5zemVyb3JlY29yZHMsXG4gICAgICAgIFwic0luZm9cIjogTS5zdHIudHVybml0aW50b29sdHdvLnNpbmZvLFxuICAgICAgICBcInNTZWFyY2hcIjogJycsXG4gICAgICAgIFwic0xlbmd0aE1lbnVcIjogTS5zdHIudHVybml0aW50b29sdHdvLnNsZW5ndGhtaWdyYXRpb25tZW51LFxuICAgICAgICBcInNJbmZvRW1wdHlcIjogTS5zdHIudHVybml0aW50b29sdHdvLnNlbXB0eXRhYmxlLFxuICAgICAgICBcIm9QYWdpbmF0ZVwiOiB7XG4gICAgICAgICAgICBcInNOZXh0XCI6IE0uc3RyLnR1cm5pdGludG9vbHR3by5zbmV4dCxcbiAgICAgICAgICAgIFwic1ByZXZpb3VzXCI6IE0uc3RyLnR1cm5pdGludG9vbHR3by5zcHJldmlvdXNcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBDb25maWd1cmUgdGhlIHVubGluayBhbmQgcmVsaW5rIHVzZXJzIGRhdGF0YWJsZSBpbiB0aGUgcGx1Z2luIHNldHRpbmdzIGFyZWEuXG4gICAgJCgnI3VubGlua1VzZXJUYWJsZScpLmRhdGFUYWJsZSh7XG4gICAgICAgIFwiYkRlc3Ryb3lcIjogdHJ1ZSxcbiAgICAgICAgXCJiUHJvY2Vzc2luZ1wiOiB0cnVlLFxuICAgICAgICBcImJTZXJ2ZXJTaWRlXCI6IHRydWUsXG4gICAgICAgIFwib0xhbmd1YWdlXCI6IGRhdGFUYWJsZXNMYW5nLFxuICAgICAgICBcImFhU29ydGluZ1wiOiBbWyAyLCBcImFzY1wiIF1dLFxuICAgICAgICBcImFMZW5ndGhNZW51XCI6IFtbMTAsIDI1LCA1MCwgMTAwLCAtMV0sIFsxMCwgMjUsIDUwLCAxMDAsIFwiQWxsXCJdXSxcbiAgICAgICAgXCJzQWpheFNvdXJjZVwiOiBcImFqYXgucGhwP2FjdGlvbj1nZXRfdXNlcnNcIixcbiAgICAgICAgXCJhb0NvbHVtbnNcIjogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1wiYlNvcnRhYmxlXCI6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZm5DcmVhdGVkQ2VsbFwiOiBmdW5jdGlvbiAoblRkLCBzRGF0YSwgb0RhdGEsIGlSb3csIGlDb2wpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChuVGQpLmFkZENsYXNzKCdjZW50ZXJlZF9jZWxsJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfX0sXG4gICAgICAgICAgICAgICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAge1wiYURhdGFTb3J0XCI6IFsgMiwgMyBdfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcImFEYXRhU29ydFwiOiBbIDMsIDIgXX0sXG4gICAgICAgICAgICAgICAgICAgICAgICBudWxsXG4gICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICBcImZuRHJhd0NhbGxiYWNrXCI6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICQoJ2lucHV0W25hbWU9XCJzZWxlY3RhbGxjYlwiXScpLmF0dHIoJ2NoZWNrZWQnLCBmYWxzZSk7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIERpc2FibGUgdGhlIHN1Ym1pdCBidXR0b24gaWYgVHVybml0aW4gdjEgYW5kIHYyIGFjY291bnQgaWRzIGFyZSBkaWZmZXJlbnQgaW4gTWlncmF0aW9uIFRvb2wuXG4gICAgaWYgKCAkKCcjc2FtZXRpaWFjY291bnQnKS5kYXRhKCdzYW1ldGlpYWNjb3VudCcpID09IFwiMFwiICkge1xuICAgICAgICAkKCdzZWxlY3RbbmFtZT1cImVuYWJsZW1pZ3JhdGlvbnRvb2xcIl0nKS5hdHRyKCdkaXNhYmxlZCcsICdkaXNhYmxlZCcpO1xuICAgICAgICAkKCdzZWxlY3RbbmFtZT1cImVuYWJsZW1pZ3JhdGlvbnRvb2xcIl0nKS5jbG9zZXN0KCdmb3JtJykuZmluZCgnaW5wdXRbbmFtZT1cInN1Ym1pdGJ1dHRvblwiXScpLmF0dHIoJ2Rpc2FibGVkJywgJ2Rpc2FibGVkJyk7XG4gICAgfVxuXG4gICAgLy8gRGlzYWJsZSB0aGUgZGVsZXRlIGJ1dHRvbiBpbiBtaWdyYXRpb24gdGFiIGlmIHRoZXJlIGFyZSBubyByZXN1bHRzIHNlbGVjdGVkIGFuZCByZS1lbmFibGUgaWYgdGhlcmUgYXJlLlxuICAgICQoJ2lucHV0W25hbWU9XCJzZWxlY3RhbGxjYlwiXScpLmNsb3Nlc3QoJ2Zvcm0nKS5maW5kKCdpbnB1dFtuYW1lPVwic3VibWl0YnV0dG9uXCJdJykuYXR0cignZGlzYWJsZWQnLCAnZGlzYWJsZWQnKTtcbiAgICAkKGRvY3VtZW50KS5vbignY2xpY2snLCAnI21pZ3JhdGlvblRhYmxlIGlucHV0W25hbWU9XCJzZWxlY3RhbGxjYlwiXSwgI21pZ3JhdGlvblRhYmxlIC5icm93c2VyX2NoZWNrYm94JywgZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmICgkKCcjbWlncmF0aW9uVGFibGUgLmJyb3dzZXJfY2hlY2tib3g6Y2hlY2tlZCcpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICQoJyNtaWdyYXRpb25UYWJsZSAuYnJvd3Nlcl9jaGVja2JveCcpLmNsb3Nlc3QoJ2Zvcm0nKS5maW5kKCdpbnB1dFtuYW1lPVwic3VibWl0YnV0dG9uXCJdJykucmVtb3ZlQXR0cignZGlzYWJsZWQnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICQoJyNtaWdyYXRpb25UYWJsZSAuYnJvd3Nlcl9jaGVja2JveCcpLmNsb3Nlc3QoJ2Zvcm0nKS5maW5kKCdpbnB1dFtuYW1lPVwic3VibWl0YnV0dG9uXCJdJykuYXR0cignZGlzYWJsZWQnLCAnZGlzYWJsZWQnKTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gQXNrIGFkbWluaXN0cmF0b3IgZm9yIGNvbmZpcm1hdGlvbiBpZiB1c2VyIGNsaWNrcyB0byBkZWxldGUgc2VsZWN0ZWQgVjEgYXNzaWdubWVudHMuXG4gICAgdmFyIHN1Ym1pdGJ1dHRvbiA9ICQoJyNtaWdyYXRpb25UYWJsZScpLmNsb3Nlc3QoJ2Zvcm0nKS5maW5kKCdpbnB1dFtuYW1lPVwic3VibWl0YnV0dG9uXCJdJyk7XG4gICAgc3VibWl0YnV0dG9uLmNsaWNrKGZ1bmN0aW9uKGV2KSB7XG4gICAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgLy8gQ29uc3RydWN0IGNvbmZpcm0gbWVzc2FnZSB0byBhZG1pbmlzdHJhdG9yLlxuICAgICAgICB2YXIgbWVzc2FnZSA9IE0uc3RyLnR1cm5pdGludG9vbHR3by5jb25maXJtdjFkZWxldGV0aXRsZSsnXFxuXFxuJztcbiAgICAgICAgbWVzc2FnZSArPSBNLnV0aWwuZ2V0X3N0cmluZygnY29uZmlybXYxZGVsZXRldGV4dCcsICd0dXJuaXRpbnRvb2x0d28nLCAkKCcjbWlncmF0aW9uVGFibGUgLmJyb3dzZXJfY2hlY2tib3g6Y2hlY2tlZCcpLmxlbmd0aCkrJ1xcblxcbic7XG4gICAgICAgIG1lc3NhZ2UgKz0gTS5zdHIudHVybml0aW50b29sdHdvLmNvbmZpcm12MWRlbGV0ZXdhcm5pbmc7XG5cbiAgICAgICAgaWYgKGNvbmZpcm0obWVzc2FnZSkpIHtcbiAgICAgICAgICAgICQoJyNtaWdyYXRpb25UYWJsZScpLmNsb3Nlc3QoJ2Zvcm0nKS5zdWJtaXQoKTtcbiAgICAgICAgfVxuXG4gICAgfSk7XG5cbiAgICAvLyBDb25maWd1cmUgdGhlIG1pZ3JhdGlvbiBkYXRhdGFibGUgaW4gdGhlIHBsdWdpbiBzZXR0aW5ncyBhcmVhLlxuICAgICQoJyNtaWdyYXRpb25UYWJsZScpLmRhdGFUYWJsZSh7XG4gICAgICAgIFwiYkRlc3Ryb3lcIjogdHJ1ZSxcbiAgICAgICAgXCJiUHJvY2Vzc2luZ1wiOiB0cnVlLFxuICAgICAgICBcImJTZXJ2ZXJTaWRlXCI6IHRydWUsXG4gICAgICAgIFwib0xhbmd1YWdlXCI6IGRhdGFUYWJsZXNMYW5nTWlncmF0aW9uLFxuICAgICAgICBcImFhU29ydGluZ1wiOiBbWyAyLCBcImFzY1wiIF1dLFxuICAgICAgICBcImFMZW5ndGhNZW51XCI6IFtbMTAsIDI1LCA1MCwgMTAwLCAtMV0sIFsxMCwgMjUsIDUwLCAxMDAsIFwiQWxsXCJdXSxcbiAgICAgICAgXCJzQWpheFNvdXJjZVwiOiBcImFqYXgucGhwP2FjdGlvbj1nZXRfYXNzaWdubWVudHNcIixcbiAgICAgICAgXCJzRG9tXCI6ICc8XCJ0b3BcImxmPnJ0PFwiYm90dG9tXCJpcnA+PFwiY2xlYXJcIj4nLFxuICAgICAgICBcImFvQ29sdW1uc1wiOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XCJiU29ydGFibGVcIjogZmFsc2UsIFwiYlNlYXJjaGFibGVcIjogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJmbkNyZWF0ZWRDZWxsXCI6IGZ1bmN0aW9uIChuVGQsIHNEYXRhLCBvRGF0YSwgaVJvdywgaUNvbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKG5UZCkuYWRkQ2xhc3MoJ2NlbnRlcmVkX2NlbGwnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcImJTb3J0YWJsZVwiOiB0cnVlLCBcInNDbGFzc1wiOiBcImNlbnRlcmVkX2NlbGxcIiwgXCJiU2VhcmNoYWJsZVwiOiBmYWxzZX0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XCJiU29ydGFibGVcIjogdHJ1ZSwgXCJiU2VhcmNoYWJsZVwiOiB0cnVlfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcImJTb3J0YWJsZVwiOiB0cnVlLCBcInNDbGFzc1wiOiBcImNlbnRlcmVkX2NlbGxcIiwgXCJiU2VhcmNoYWJsZVwiOiBmYWxzZX1cbiAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgIFwiZm5EcmF3Q2FsbGJhY2tcIjogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAkKCdpbnB1dFtuYW1lPVwic2VsZWN0YWxsY2JcIl0nKS5hdHRyKCdjaGVja2VkJywgZmFsc2UpO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgJCgnI21pZ3JhdGlvblRhYmxlX2ZpbHRlciBpbnB1dCcpLmF0dHIoXCJwbGFjZWhvbGRlclwiLCAnU2VhcmNoJyk7XG5cbiAgICAvLyBDb25maWd1cmUgdGhlIGZpbGVzIGRhdGF0YWJsZSBpbiB0aGUgcGx1Z2luIHNldHRpbmdzIGFyZWEsIGdyb3VwIHRoZSBmaWxlcyBieSBhc3NpZ25tZW50LlxuICAgICQoJyNmaWxlc1RhYmxlJykuZGF0YVRhYmxlKCB7XG4gICAgICAgIFwiYkRlc3Ryb3lcIjogdHJ1ZSxcbiAgICAgICAgXCJiUHJvY2Vzc2luZ1wiOiB0cnVlLFxuICAgICAgICBcImJTZXJ2ZXJTaWRlXCI6IHRydWUsXG4gICAgICAgIFwib0xhbmd1YWdlXCI6IGRhdGFUYWJsZXNMYW5nLFxuICAgICAgICBcInNBamF4U291cmNlXCI6IFwiYWpheC5waHA/YWN0aW9uPWdldF9maWxlc1wiLFxuICAgICAgICBcImFvQ29sdW1uc1wiOiBbXG4gICAgICAgICAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICAgICAgICAgIHtcInNDbGFzc1wiOiBcImZpbGVuYW1lIGMwXCIsIFwic1dpZHRoXCI6IFwiNDAlXCJ9LFxuICAgICAgICAgICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgICAgICAgICB7XCJzQ2xhc3NcIjogXCJmdWxsbmFtZSBjMVwiLCBcInNXaWR0aFwiOiBcIjM1JVwifSxcbiAgICAgICAgICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgICAgICAgICAge1wic0NsYXNzXCI6IFwiY3JlYXRlZCBjMlwiLCBcInNXaWR0aFwiOiBcIjIyJVwifSxcbiAgICAgICAgICAgICAgICAgICAge1wic0NsYXNzXCI6IFwicmVtb3ZlIGMzXCIsIFwic1dpZHRoXCI6IFwiMyVcIn1cbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICBcImFvQ29sdW1uRGVmc1wiOiBbXG4gICAgICAgICAgICAgICAgICAgIHtcImJTZWFyY2hhYmxlXCI6IHRydWUsIFwiYlZpc2libGVcIjogZmFsc2UsIFwiYVRhcmdldHNcIjogWyAwIF19LFxuICAgICAgICAgICAgICAgICAgICB7XCJiU2VhcmNoYWJsZVwiOiB0cnVlLCBcImJWaXNpYmxlXCI6IGZhbHNlLCBcImFUYXJnZXRzXCI6IFsgMSBdfSxcbiAgICAgICAgICAgICAgICAgICAge1wiYlNlYXJjaGFibGVcIjogdHJ1ZSwgXCJiVmlzaWJsZVwiOiBmYWxzZSwgXCJhVGFyZ2V0c1wiOiBbIDIgXX0sXG4gICAgICAgICAgICAgICAgICAgIHtcImJTZWFyY2hhYmxlXCI6IHRydWUsIFwiYlZpc2libGVcIjogdHJ1ZSwgXCJhVGFyZ2V0c1wiOiBbIDMgXX0sXG4gICAgICAgICAgICAgICAgICAgIHtcImJTZWFyY2hhYmxlXCI6IHRydWUsIFwiYlZpc2libGVcIjogZmFsc2UsIFwiYVRhcmdldHNcIjogWyA0IF19LFxuICAgICAgICAgICAgICAgICAgICB7XCJiU2VhcmNoYWJsZVwiOiB0cnVlLCBcImJWaXNpYmxlXCI6IHRydWUsIFwiYVRhcmdldHNcIjogWyA1IF19LFxuICAgICAgICAgICAgICAgICAgICB7XCJiU2VhcmNoYWJsZVwiOiB0cnVlLCBcImJWaXNpYmxlXCI6IGZhbHNlLCBcImFUYXJnZXRzXCI6IFsgNiBdfSxcbiAgICAgICAgICAgICAgICAgICAge1wiYlNlYXJjaGFibGVcIjogdHJ1ZSwgXCJiVmlzaWJsZVwiOiB0cnVlLCBcImFUYXJnZXRzXCI6IFsgNyBdfSxcbiAgICAgICAgICAgICAgICAgICAge1wiYlNlYXJjaGFibGVcIjogdHJ1ZSwgXCJiVmlzaWJsZVwiOiB0cnVlLCBcImFUYXJnZXRzXCI6IFsgOCBdfVxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgIFwiZm5EcmF3Q2FsbGJhY2tcIjogZnVuY3Rpb24gKCBvU2V0dGluZ3MgKSB7XG4gICAgICAgICAgICBpZiAoIG9TZXR0aW5ncy5haURpc3BsYXkubGVuZ3RoID09IDAgKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIG5UcnMgPSAkKCcjZmlsZXNUYWJsZSB0Ym9keSB0cicpO1xuICAgICAgICAgICAgdmFyIGlDb2xzcGFuID0gblRyc1swXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgndGQnKS5sZW5ndGg7XG4gICAgICAgICAgICB2YXIgc0xhc3RHcm91cCA9IFwiXCI7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5UcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgaURpc3BsYXlJbmRleCA9IG9TZXR0aW5ncy5faURpc3BsYXlTdGFydCArIGk7XG4gICAgICAgICAgICAgICAgdmFyIHNHcm91cCA9IG9TZXR0aW5ncy5hb0RhdGFbIG9TZXR0aW5ncy5haURpc3BsYXlbaV0gXS5fYURhdGFbMF07XG4gICAgICAgICAgICAgICAgaWYgKCBzR3JvdXAgIT0gc0xhc3RHcm91cCApXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB2YXIgbkdyb3VwID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggJ3RyJyApO1xuICAgICAgICAgICAgICAgICAgICB2YXIgbkNlbGwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAndGQnICk7XG4gICAgICAgICAgICAgICAgICAgIG5DZWxsLmNvbFNwYW4gPSBpQ29sc3BhbjtcbiAgICAgICAgICAgICAgICAgICAgbkNlbGwuY2xhc3NOYW1lID0gXCJncm91cFwiO1xuICAgICAgICAgICAgICAgICAgICBuQ2VsbC5pbm5lckhUTUwgPSBzR3JvdXA7XG4gICAgICAgICAgICAgICAgICAgIG5Hcm91cC5hcHBlbmRDaGlsZCggbkNlbGwgKTtcbiAgICAgICAgICAgICAgICAgICAgblRyc1tpXS5wYXJlbnROb2RlLmluc2VydEJlZm9yZSggbkdyb3VwLCBuVHJzW2ldICk7XG4gICAgICAgICAgICAgICAgICAgIHNMYXN0R3JvdXAgPSBzR3JvdXA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBcImFhU29ydGluZ0ZpeGVkXCI6IFtbIDAsICdhc2MnIF1dLFxuICAgICAgICBcImFhU29ydGluZ1wiOiBbWyAxLCAnYXNjJyBdXSxcbiAgICAgICAgXCJzRG9tXCI6ICdsZnI8XCJnaXZlSGVpZ2h0XCJ0PmlwJ1xuICAgIH0pO1xuXG4gICAgJC5kYXRlcGlja2VyLnJlZ2lvbmFsW1wiXCJdLmRhdGVGb3JtYXQgPSAnZCBNIHl5JztcbiAgICAkLmRhdGVwaWNrZXIuc2V0RGVmYXVsdHMoJC5kYXRlcGlja2VyLnJlZ2lvbmFsWycnXSk7XG5cbiAgICAvLyBDb25maWd1cmUgdGhlIGNvdXJzZSBicm93c2VyIGRhdGEgdGFibGUgYW5kIHNob3cgY2xhc3NlcyBmcm9tIFR1cm5pdGluIGFjb2N1bnQuXG4gICAgdmFyIGNvdXJzZUJyb3dzZXJUYWJsZSA9ICQoJyNjb3Vyc2VCcm93c2VyVGFibGUnKS5kYXRhVGFibGUoe1xuICAgICAgICBcImJQcm9jZXNzaW5nXCI6IHRydWUsXG4gICAgICAgIFwib0xhbmd1YWdlXCI6IGRhdGFUYWJsZXNMYW5nLFxuICAgICAgICBcImFhU29ydGluZ1wiOiBbWyA2LCAnYXNjJ11dLFxuICAgICAgICBcInNBamF4U291cmNlXCI6IFwiYWpheC5waHBcIixcbiAgICAgICAgXCJhb0NvbHVtbkRlZnNcIjogW1xuICAgICAgICAgICAgICAgICAgICB7XCJiU2VhcmNoYWJsZVwiOiBmYWxzZSwgXCJiU29ydGFibGVcIjogZmFsc2UsIFwic1dpZHRoXCI6IFwiNSVcIiwgXCJiVmlzaWJsZVwiOiB0cnVlLCBcImFUYXJnZXRzXCI6IFsgMCBdLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJmbkNyZWF0ZWRDZWxsXCI6IGZ1bmN0aW9uIChuVGQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKG5UZCkuYWRkQ2xhc3MoJ2NlbnRlcicpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfX0sXG4gICAgICAgICAgICAgICAgICAgIHtcImJTZWFyY2hhYmxlXCI6IHRydWUsIFwiYlZpc2libGVcIjogdHJ1ZSwgXCJzV2lkdGhcIjogXCI0NSVcIiwgXCJpRGF0YVNvcnRcIjogNiwgXCJhVGFyZ2V0c1wiOiBbIDEgXX0sXG4gICAgICAgICAgICAgICAgICAgIHtcImJTZWFyY2hhYmxlXCI6IHRydWUsIFwiYlZpc2libGVcIjogdHJ1ZSwgXCJzV2lkdGhcIjogXCIxMCVcIiwgXCJhVGFyZ2V0c1wiOiBbIDIgXX0sXG4gICAgICAgICAgICAgICAgICAgIHtcImJTZWFyY2hhYmxlXCI6IHRydWUsIFwiYlZpc2libGVcIjogdHJ1ZSwgXCJzV2lkdGhcIjogXCIyMCVcIiwgXCJpRGF0YVNvcnRcIjogNywgXCJhVGFyZ2V0c1wiOiBbIDMgXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiZm5DcmVhdGVkQ2VsbFwiOiBmdW5jdGlvbiAoblRkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJChuVGQpLmFkZENsYXNzKCdyaWdodCcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfX0sXG4gICAgICAgICAgICAgICAgICAgIHtcImJTZWFyY2hhYmxlXCI6IGZhbHNlLCBcImJWaXNpYmxlXCI6IHRydWUsIFwic1dpZHRoXCI6IFwiMTAlXCIsIFwiYVRhcmdldHNcIjogWyA0IF0sXG4gICAgICAgICAgICAgICAgICAgICAgICBcImZuQ3JlYXRlZENlbGxcIjogZnVuY3Rpb24gKG5UZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoblRkKS5hZGRDbGFzcygncmlnaHQnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH19LFxuICAgICAgICAgICAgICAgICAgICB7XCJiU2VhcmNoYWJsZVwiOiB0cnVlLCBcImJWaXNpYmxlXCI6IHRydWUsIFwic1dpZHRoXCI6IFwiMTAlXCIsIFwiYVRhcmdldHNcIjogWyA1IF0sXG4gICAgICAgICAgICAgICAgICAgICAgICBcImZuQ3JlYXRlZENlbGxcIjogZnVuY3Rpb24gKG5UZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoblRkKS5hZGRDbGFzcygnY2VudGVyJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9fSxcbiAgICAgICAgICAgICAgICAgICAge1wiYlNlYXJjaGFibGVcIjogdHJ1ZSwgXCJiVmlzaWJsZVwiOiBmYWxzZSwgXCJhVGFyZ2V0c1wiOiBbIDYgXX0sXG4gICAgICAgICAgICAgICAgICAgIHtcImJTZWFyY2hhYmxlXCI6IHRydWUsIFwiYlZpc2libGVcIjogZmFsc2UsIFwiYVRhcmdldHNcIjogWyA3IF19XG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgXCJmblNlcnZlckRhdGFcIjogZnVuY3Rpb24gKCBzU291cmNlLCBhb0RhdGEsIGZuQ2FsbGJhY2sgKSB7XG4gICAgICAgICAgICAkLmFqYXgoe1xuICAgICAgICAgICAgICAgIFwiZGF0YVR5cGVcIjogJ2pzb24nLFxuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIlBPU1RcIixcbiAgICAgICAgICAgICAgICBcInVybFwiOiBzU291cmNlLFxuICAgICAgICAgICAgICAgIFwiZGF0YVwiOiB7YWN0aW9uOiBcInNlYXJjaF9jbGFzc2VzXCIsIGNvdXJzZV90aXRsZTogJCgnI3NlYXJjaF9jb3Vyc2VfdGl0bGUnKS52YWwoKSxcbiAgICAgICAgICAgICAgICAgICAgY291cnNlX2ludGVncmF0aW9uOiAkKCcjc2VhcmNoX2NvdXJzZV9pbnRlZ3JhdGlvbicpLnZhbCgpLFxuICAgICAgICAgICAgICAgICAgICBjb3Vyc2VfZW5kX2RhdGU6ICQoJyNzZWFyY2hfY291cnNlX2VuZF9kYXRlJykudmFsKCksIHNlc3NrZXk6IE0uY2ZnLnNlc3NrZXl9LFxuICAgICAgICAgICAgICAgIFwic3VjY2Vzc1wiOiBmdW5jdGlvbihyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgZm5DYWxsYmFjayhyZXN1bHQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBcImJTdGF0ZVNhdmVcIjogdHJ1ZSxcbiAgICAgICAgXCJmblN0YXRlU2F2ZVwiOiBmdW5jdGlvbiAob1NldHRpbmdzLCBvRGF0YSkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSggdWlkICsgJ0RhdGFUYWJsZXMnLCBKU09OLnN0cmluZ2lmeShvRGF0YSkgKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKCBlICkge1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBcImZuU3RhdGVMb2FkXCI6IGZ1bmN0aW9uIChvU2V0dGluZ3MpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoIGxvY2FsU3RvcmFnZS5nZXRJdGVtKHVpZCArICdEYXRhVGFibGVzJykgKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKCBlICkge1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBcImZuRHJhd0NhbGxiYWNrXCI6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICQoJ2lucHV0W25hbWU9XCJzZWxlY3RhbGxjYlwiXScpLmF0dHIoJ2NoZWNrZWQnLCBmYWxzZSk7XG4gICAgICAgICAgICBpbml0aWFsaXNlQ291cnNlUmVjcmVhdGlvbigpO1xuICAgICAgICAgICAgaW5pdGlhbGlzZUVkaXRFbmREYXRlKCk7XG4gICAgICAgICAgICAkKFwiI3NlYXJjaF9jb3Vyc2VzX2J1dHRvblwiKS5yZW1vdmVBdHRyKCdkaXNhYmxlZCcpO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICAkKFwiI3NlYXJjaF9jb3Vyc2VzX2J1dHRvblwiKS5jbGljayhmdW5jdGlvbiAoKSB7XG4gICAgICAgICQodGhpcykuYXR0cignZGlzYWJsZWQnLCAnZGlzYWJsZWQnKTtcbiAgICAgICAgY291cnNlQnJvd3NlclRhYmxlLmZuUmVsb2FkQWpheCgpO1xuICAgICAgICBjb3Vyc2VCcm93c2VyVGFibGUuZm5TdGFuZGluZ1JlZHJhdygpO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSk7XG5cbiAgICAkKCcjc2VhcmNoX2NvdXJzZV9lbmRfZGF0ZScpLmRhdGVwaWNrZXIoKTtcblxuICAgIC8vIEluaXRpYWxpc2UgYXNzaWdubWVudCBicm93c2VyIHRhYmxlLlxuICAgIHZhciBvVGFibGUgPSAkKCcjYXNzaWdubWVudEJyb3dzZXJUYWJsZScpLmRhdGFUYWJsZSh7XG4gICAgICAgIFwiYlByb2Nlc3NpbmdcIjogdHJ1ZSxcbiAgICAgICAgXCJvTGFuZ3VhZ2VcIjogZGF0YVRhYmxlc0xhbmcsXG4gICAgICAgIFwic0FqYXhTb3VyY2VcIjogXCJhamF4LnBocFwiLFxuICAgICAgICBcImZuU2VydmVyRGF0YVwiOiBmdW5jdGlvbiAoIHNTb3VyY2UsIGFvRGF0YSwgZm5DYWxsYmFjayApIHtcblxuICAgICAgICAgICAgLy8gRGlzYWJsZSBjb3Vyc2UgYnV0dG9ucy5cbiAgICAgICAgICAgICQoJyNpZF9jcmVhdGVfY291cnNlJykuYXR0cignZGlzYWJsZWQnLCdkaXNhYmxlZCcpO1xuICAgICAgICAgICAgJCgnI2lkX3VwZGF0ZV9jb3Vyc2UnKS5hdHRyKCdkaXNhYmxlZCcsJ2Rpc2FibGVkJyk7XG5cbiAgICAgICAgICAgIC8vIE1vdmUgYm94IHdpdGhpbiBmb3JtLlxuICAgICAgICAgICAgaWYgKCQoXCIjYXNzaWdubWVudEJyb3dzZXJUYWJsZVwiKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgJChcIi5zaWRlLXByZS1vbmx5ICNwYWdlLWNvbnRlbnQgI3JlZ2lvbi1tYWluXCIpLmNzcyh7J21hcmdpbi1sZWZ0JyA6ICcwcHgnfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAkKFwiI2lkX2Fzc2lnbm1lbnRuYW1lXCIpLmF0dHIoJ2Rpc2FibGVkJywgJ2Rpc2FibGVkJyk7XG4gICAgICAgICAgICAkKFwiI2lkX2NyZWF0ZV9hc3NpZ25tZW50XCIpLmF0dHIoJ2Rpc2FibGVkJywgJ2Rpc2FibGVkJyk7XG4gICAgICAgICAgICAkLmFqYXgoe1xuICAgICAgICAgICAgICAgIFwiZGF0YVR5cGVcIjogJ2pzb24nLFxuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIlBPU1RcIixcbiAgICAgICAgICAgICAgICBcInVybFwiOiBzU291cmNlLFxuICAgICAgICAgICAgICAgIFwiZGF0YVwiOiB7YWN0aW9uOiBcImdldF9hc3NpZ25tZW50c1wiLCB0aWlfY291cnNlX2lkOiAkKFwiI3RpaV9jb3Vyc2VfaWRcIikuaHRtbCgpLCBzZXNza2V5OiBNLmNmZy5zZXNza2V5fSxcbiAgICAgICAgICAgICAgICBcInN1Y2Nlc3NcIjogZnVuY3Rpb24ocmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgICAgIGV2YWwocmVzdWx0KTtcbiAgICAgICAgICAgICAgICAgICAgaW5pdGlhbGlzZUNvdXJzZUJyb3dzZXJCdXR0b25zKG9UYWJsZSk7XG4gICAgICAgICAgICAgICAgICAgIGZuQ2FsbGJhY2socmVzdWx0KTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoJChcIiNjb3Vyc2VfaWRcIikuaHRtbCgpICE9IFwiMFwiICYmIHJlc3VsdC5udW1iZXJfb2ZfYXNzaWdubWVudHMgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAkKFwiI2lkX2Fzc2lnbm1lbnRuYW1lXCIpLnJlbW92ZUF0dHIoJ2Rpc2FibGVkJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAkKFwiI2lkX2NyZWF0ZV9hc3NpZ25tZW50XCIpLnJlbW92ZUF0dHIoJ2Rpc2FibGVkJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAkKFwiLmFzc2lnbm1lbnRpZHNfY2hlY2tcIikucmVtb3ZlQXR0cignZGlzYWJsZWQnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxpc2VDcmVhdGVBc3NpZ25tZW50QnV0dG9uKG9UYWJsZSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAkKFwiI2lkX2Fzc2lnbm1lbnRuYW1lXCIpLmF0dHIoJ2Rpc2FibGVkJywgJ2Rpc2FibGVkJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAkKFwiI2lkX2NyZWF0ZV9hc3NpZ25tZW50XCIpLmF0dHIoJ2Rpc2FibGVkJywgJ2Rpc2FibGVkJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAkKFwiLmFzc2lnbm1lbnRpZHNfY2hlY2tcIikuYXR0cignZGlzYWJsZWQnLCAnZGlzYWJsZWQnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIEVuYWJsZSBjb3Vyc2UgYnV0dG9ucy5cbiAgICAgICAgICAgICAgICAgICAgJCgnI2lkX2NyZWF0ZV9jb3Vyc2UnKS5yZW1vdmVBdHRyKCdkaXNhYmxlZCcpO1xuICAgICAgICAgICAgICAgICAgICAkKCcjaWRfdXBkYXRlX2NvdXJzZScpLnJlbW92ZUF0dHIoJ2Rpc2FibGVkJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIFwiYW9Db2x1bW5EZWZzXCI6IFtcbiAgICAgICAgICAgIHtcImJTZWFyY2hhYmxlXCI6IGZhbHNlLCBcImJWaXNpYmxlXCI6IHRydWUsIFwiYVRhcmdldHNcIjogWyAwIF19LFxuICAgICAgICAgICAge1wiYlNlYXJjaGFibGVcIjogdHJ1ZSwgXCJiVmlzaWJsZVwiOiB0cnVlLCBcImFUYXJnZXRzXCI6IFsgMSBdLFxuICAgICAgICAgICAgICAgIFwiZm5DcmVhdGVkQ2VsbFwiOiBmdW5jdGlvbiAoblRkKSB7XG4gICAgICAgICAgICAgICAgICAgICQoblRkKS5hZGRDbGFzcygnbm93cmFwJyk7XG4gICAgICAgICAgICAgICAgfX0sXG4gICAgICAgICAgICB7XCJiU2VhcmNoYWJsZVwiOiB0cnVlLCBcImJWaXNpYmxlXCI6IHRydWUsIFwiYVRhcmdldHNcIjogWyAyIF19LFxuICAgICAgICAgICAge1wiYlNlYXJjaGFibGVcIjogdHJ1ZSwgXCJiVmlzaWJsZVwiOiB0cnVlLCBcImFUYXJnZXRzXCI6IFsgMyBdfVxuICAgICAgICBdXG4gICAgfSk7XG5cbiAgICAvLyBPcGVuIGFuIGlmcmFtZSBsaWdodCBib3ggd2hpY2ggYWxsb3dzIHRoZSBjcmVhdGlvbiBvZiBjbGFzc2VzLlxuICAgICQoJyNjcmVhdGVfY2xhc3Nlc19idXR0b24nKS5jb2xvcmJveCh7XG4gICAgICAgIGlmcmFtZTp0cnVlLCB3aWR0aDonNjAlJywgdG9wOiAnMjAwcHgnLCBoZWlnaHQ6JzEyNHB4Jywgb3BhY2l0eTogXCIwLjdcIiwgY2xhc3NOYW1lOiBcImNvdXJzZV9jcmVhdGlvblwiLFxuICAgICAgICBocmVmOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICB2YXIgY2F0ZWdvcnkgPSAkKCcuY3JlYXRlX2NvdXJzZV9jYXRlZ29yeScpLnZhbCgpO1xuICAgICAgICAgICAgICAgIHZhciBhc3NpZ25tZW50cyA9ICgkKCcuY3JlYXRlX2Fzc2lnbm1lbnRfY2hlY2tib3gnKS5pcygnOmNoZWNrZWQnKSkgPyBcIjFcIiA6IFwiMFwiO1xuXG4gICAgICAgICAgICAgICAgdmFyIGNsYXNzX2lkcyA9IFwiXCI7XG4gICAgICAgICAgICAgICAgdmFyIGkgPSAwO1xuICAgICAgICAgICAgICAgICQoJy5icm93c2VyX2NoZWNrYm94OmNoZWNrZWQnKS5lYWNoKGZ1bmN0aW9uKGkpe1xuICAgICAgICAgICAgICAgICAgICBjbGFzc19pZHMgKz0gXCImY2xhc3NfaWRcIiArIGkgKyBcIj1cIiArICQodGhpcykudmFsKCk7XG4gICAgICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIHZhciBwYWdldXJsID0gd2luZG93LmxvY2F0aW9uLmhyZWY7XG4gICAgICAgICAgICAgICAgdmFyIHVybCA9IHBhZ2V1cmwucmVwbGFjZShcImNtZD1jb3Vyc2VzXCIsIFwiY21kPW11bHRpcGxlX2NsYXNzX3JlY3JlYXRpb25cIik7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gdXJsICsgXCImdmlld19jb250ZXh0PWJveCZjYXRlZ29yeT1cIiArIGNhdGVnb3J5ICsgXCImYXNzaWdubWVudHM9XCIgKyBhc3NpZ25tZW50cyArIGNsYXNzX2lkcyArIFwiJnNlc3NrZXk9XCIgKyBNLmNmZy5zZXNza2V5O1xuICAgICAgICB9LFxuICAgICAgICBvbkNsZWFudXA6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uID0gd2luZG93LmxvY2F0aW9uO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAoJCgnI2NsYXNzX2lkcycpLmxlbmd0aCA+IDApIHtcblxuICAgICAgICAvLyBNb3ZlIGJveCB3aXRoaW4gZnJhbWUuXG4gICAgICAgICQoXCIuc2lkZS1wcmUtb25seSAjcGFnZS1jb250ZW50ICNyZWdpb24tbWFpblwiKS5jc3Moe1xuICAgICAgICAgICAgJ21hcmdpbi1sZWZ0JyA6ICcwcHgnXG4gICAgICAgIH0pO1xuXG4gICAgICAgICQoXCIuaGFzLXJlZ2lvbi1zaWRlLXByZSAjcGFnZS1jb250ZW50ICNyZWdpb24tbWFpblwiKS5jc3Moe1xuICAgICAgICAgICAgJ3dpZHRoJzogJzEwMCUnLFxuICAgICAgICAgICAgJ21hcmdpbi10b3AnOiAnLTMwcHgnXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHZhciBjbGFzc19pZHMgPSAkKCcjY2xhc3NfaWRzJykuaHRtbCgpO1xuXG4gICAgICAgICQuYWpheCh7XG4gICAgICAgICAgICBcImRhdGFUeXBlXCI6ICdodG1sJyxcbiAgICAgICAgICAgIFwidHlwZVwiOiBcIlBPU1RcIixcbiAgICAgICAgICAgIFwidXJsXCI6IFwiYWpheC5waHBcIixcbiAgICAgICAgICAgIFwiZGF0YVwiOiB7YWN0aW9uOiBcImNyZWF0ZV9jb3Vyc2VzXCIsIGNsYXNzX2lkczogY2xhc3NfaWRzLCBjb3Vyc2VfY2F0ZWdvcnk6ICQoXCIjY291cnNlX2NhdGVnb3J5XCIpLmh0bWwoKSxcbiAgICAgICAgICAgICAgICBjcmVhdGVfYXNzaWdubWVudHM6ICQoXCIjY3JlYXRlX2Fzc2lnbm1lbnRzXCIpLmh0bWwoKSwgc2Vzc2tleTogTS5jZmcuc2Vzc2tleX0sXG4gICAgICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbihkYXRhKSB7XG4gICAgICAgICAgICAgICAgJCgnI2NvdXJzZV9jcmVhdGlvbl9zdGF0dXMnKS5odG1sKGRhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBTaG93IGxpZ2h0IGJveCB0byBjaGFuZ2UgdGhlIGVuZCBkYXRlIG9mIGEgY291cnNlLlxuICAgIGZ1bmN0aW9uIGluaXRpYWxpc2VFZGl0RW5kRGF0ZSgpIHtcbiAgICAgICAgJChcImEuZWRpdF9jb3Vyc2VfZW5kX2xpbmtcIikuY29sb3Jib3goe1xuICAgICAgICAgICAgaW5saW5lOnRydWUsIHdpZHRoOlwiNjAlXCIsIHRvcDogXCIxMDBweFwiLCBiYWNrZ3JvdW5kOiBcIiNmZmZcIiwgaGVpZ2h0OlwiMjYwcHhcIiwgb3BhY2l0eTogXCIwLjdcIiwgY2xhc3NOYW1lOiBcImVkaXRfZW5kX2RhdGVfZm9ybVwiLFxuICAgICAgICAgICAgb25Mb2FkOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICBsaWdodEJveENsb3NlQnV0dG9uKCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgb25Db21wbGV0ZSA6IGZ1bmN0aW9uKCkge1xuXG4gICAgICAgICAgICAgICAgLy8gR2V0IGN1cnJlbnQgZGF0ZSBmcm9tIHRoZSBzcGFuIGlkIHdpdGhpbiB0aGUgbGluayBhbmQgc2V0XG4gICAgICAgICAgICAgICAgLy8gdGhlIGRhdGUgb2YgdGhlIGRhdGVwaWNrZXIgaW4gdGhlIGxpZ2h0Ym94IHRvIHRoYXQuXG4gICAgICAgICAgICAgICAgdmFyIGN1cnJlbnRfZGF0ZSA9ICQoJyMnICsgJCh0aGlzKS5hdHRyKFwiaWRcIikgKyAnIHNwYW4nKS5hdHRyKFwiaWRcIik7XG4gICAgICAgICAgICAgICAgY3VycmVudF9kYXRlID0gY3VycmVudF9kYXRlLnNwbGl0KFwiX1wiKTtcbiAgICAgICAgICAgICAgICAkKCcjaWRfbmV3X2NvdXJzZV9lbmRfZGF0ZV9kYXknKS52YWwoY3VycmVudF9kYXRlWzFdKTtcbiAgICAgICAgICAgICAgICAkKCcjaWRfbmV3X2NvdXJzZV9lbmRfZGF0ZV9tb250aCcpLnZhbChjdXJyZW50X2RhdGVbMl0pO1xuICAgICAgICAgICAgICAgICQoJyNpZF9uZXdfY291cnNlX2VuZF9kYXRlX3llYXInKS52YWwoY3VycmVudF9kYXRlWzNdKTtcblxuICAgICAgICAgICAgICAgIHZhciBpZFN0ciA9ICQodGhpcykuYXR0cihcImlkXCIpLnNwbGl0KFwiX1wiKTtcbiAgICAgICAgICAgICAgICB2YXIgdGlpX2NvdXJzZV9pZCA9IGlkU3RyWzJdO1xuICAgICAgICAgICAgICAgICQoJ2lucHV0W25hbWU9XCJ0aWlfY291cnNlX2lkXCJdJykudmFsKHRpaV9jb3Vyc2VfaWQpO1xuICAgICAgICAgICAgICAgICQoJ2lucHV0W25hbWU9XCJ0aWlfY291cnNlX3RpdGxlXCJdJykudmFsKCQoJ2EjY291cnNlXycgKyB0aWlfY291cnNlX2lkKS5odG1sKCkpO1xuICAgICAgICAgICAgICAgICQoJyNjYm94TG9hZGVkQ29udGVudCAuZWRpdF9jb3Vyc2VfZW5kX2RhdGVfZm9ybScpLnNob3coKTtcbiAgICAgICAgICAgICAgICAkKCcjZGF0ZXNlbGVjdG9yLWNhbGVuZGFyLXBhbmVsJykuY3NzKCd6LWluZGV4JywgJzk5OTknKTtcblxuICAgICAgICAgICAgICAgICQoJyNpZF9zYXZlX2VuZF9kYXRlJykuY2xpY2soZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgICQuYWpheCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBcImRhdGFUeXBlXCI6ICdqc29uJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIlBPU1RcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwidXJsXCI6IFwiYWpheC5waHBcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiZGF0YVwiOiB7YWN0aW9uOiBcImVkaXRfY291cnNlX2VuZF9kYXRlXCIsIHRpaV9jb3Vyc2VfaWQ6IHRpaV9jb3Vyc2VfaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGlpX2NvdXJzZV90aXRsZTogJCgnYSNjb3Vyc2VfJyArIHRpaV9jb3Vyc2VfaWQpLmh0bWwoKSwgc2Vzc2tleTogTS5jZmcuc2Vzc2tleSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRfZGF0ZV9kOiAkKCcjaWRfbmV3X2NvdXJzZV9lbmRfZGF0ZV9kYXknKS52YWwoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRfZGF0ZV9tOiAkKCcjaWRfbmV3X2NvdXJzZV9lbmRfZGF0ZV9tb250aCcpLnZhbCgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZF9kYXRlX3k6ICQoJyNpZF9uZXdfY291cnNlX2VuZF9kYXRlX3llYXInKS52YWwoKVxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uKGRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmFsKGRhdGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhLnN0YXR1cyA9PSBcInN1Y2Nlc3NcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQuJC5mbi5jb2xvcmJveC5jbG9zZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCcjY291cnNlX2RhdGVfJyArIHRpaV9jb3Vyc2VfaWQgKyAnIHNwYW4nKS5odG1sKGRhdGEuZW5kX2RhdGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjdXJyZW50X21zZyA9ICQoJyNlZGl0X2VuZF9kYXRlX2Rlc2MnKS5odG1sO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCcjZWRpdF9lbmRfZGF0ZV9kZXNjJykuaHRtbChjdXJyZW50X21zZyArIFwiIFwiICsgZGF0YS5tc2cpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgb25DbGVhbnVwOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAkKCcuZWRpdF9jb3Vyc2VfZW5kX2RhdGVfZm9ybScpLmhpZGUoKTtcbiAgICAgICAgICAgICAgICAkKCcjdGlpX2Nsb3NlX2JhcicpLnJlbW92ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaWdodEJveENsb3NlQnV0dG9uKCkge1xuICAgICAgICAkKCdib2R5JykuYXBwZW5kKCc8ZGl2IGlkPVwidGlpX2Nsb3NlX2JhclwiPjxhIGhyZWY9XCIjXCIgb25jbGljaz1cIiQuY29sb3Jib3guY2xvc2UoKTsgcmV0dXJuIGZhbHNlO1wiPicgKyBNLnN0ci50dXJuaXRpbnRvb2x0d28uY2xvc2VidXR0b24gKyAnPC9hPjwvZGl2PicpO1xuICAgIH1cblxuICAgIC8vIFNob3cgbGlnaHQgYm94IHdpdGggYSBmb3JtIHRvIGVpdGhlciBjcmVhdGUgYSBuZXcgY291cnNlIG9yIGxpbmsgYW4gdW5saW5rZWQgTW9vZGxlIGNvdXJzZVxuICAgIC8vIHRvIHRoZSBjbGlja2VkIFR1cm5pdGluIGNsYXNzLCB0aGVuIHN1YnNlcXVlbnRseSBjcmVhdGUgYSBNb29kbGUgYXNzaWdubWVudCB1c2luZyB0aGUgc2VsZWN0ZWRcbiAgICAvLyBleGlzdGluZyBhc3NpZ25tZW50cyBvbiBUdXJuaXRpbiBhcyBwYXJ0cy5cbiAgICBmdW5jdGlvbiBpbml0aWFsaXNlQ291cnNlUmVjcmVhdGlvbigpIHtcblxuICAgICAgICB2YXIgd2luZG93V2lkdGggPSAkKHdpbmRvdykud2lkdGgoKTtcbiAgICAgICAgdmFyIGNvbG9yQm94V2lkdGggPSBcIjgwJVwiO1xuICAgICAgICBpZiAod2luZG93V2lkdGggPCAxMDAwKSB7XG4gICAgICAgICAgICBjb2xvckJveFdpZHRoID0gXCI4NjBweFwiO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHdpbmRvd0hlaWdodCA9ICQod2luZG93KS53aWR0aCgpO1xuICAgICAgICB2YXIgY29sb3JCb3hIZWlnaHQgPSBcIjgwJVwiO1xuICAgICAgICBpZiAod2luZG93SGVpZ2h0IDwgNzAwKSB7XG4gICAgICAgICAgICBjb2xvckJveEhlaWdodCA9IFwiNjAwcHhcIjtcbiAgICAgICAgfVxuXG4gICAgICAgICQoXCJhLmNvdXJzZV9yZWNyZWF0ZVwiKS5jb2xvcmJveCh7XG4gICAgICAgICAgICBpZnJhbWU6dHJ1ZSwgd2lkdGg6Y29sb3JCb3hXaWR0aCwgaGVpZ2h0OmNvbG9yQm94SGVpZ2h0LCB0b3A6ICcxMDBweCcsIGNsYXNzTmFtZTogXCJtaWdyYXRpb25cIiwgb3BhY2l0eTogXCIwLjdcIixcbiAgICAgICAgICAgIG9uTG9hZDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgbGlnaHRCb3hDbG9zZUJ1dHRvbigpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG9uQ2xlYW51cDpmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAkKCcjdGlpX2Nsb3NlX2JhcicpLnJlbW92ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAkKCcuYnJvd3Nlcl9jaGVja2JveCcpLmNsaWNrKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgaWYgKCQoJy5icm93c2VyX2NoZWNrYm94OmNoZWNrZWQnKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgJCgnLmNyZWF0ZV9jaGVja2JveGVzJykuc2xpZGVEb3duKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICQoJy5jcmVhdGVfY2hlY2tib3hlcycpLnNsaWRlVXAoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gTWFrZSB0aGUgYnV0dG9ucyBvbiB0aGUgY291cnNlIGNyZWF0aW9uL2xpbmsgZm9ybXMgY2xpY2thYmxlIGFuZCBjb25maWd1cmUgdGhlIHJlbGV2YW50IHRyaWdnZXJlZCBldmVudC5cbiAgICBmdW5jdGlvbiBpbml0aWFsaXNlQ291cnNlQnJvd3NlckJ1dHRvbnMob1RhYmxlKSB7XG4gICAgICAgICQoJyNpZF9jcmVhdGVfY291cnNlJykuY2xpY2soZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAkLmFqYXgoe1xuICAgICAgICAgICAgICAgIFwiZGF0YVR5cGVcIjogJ2h0bWwnLFxuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIlBPU1RcIixcbiAgICAgICAgICAgICAgICBcInVybFwiOiBcImFqYXgucGhwXCIsXG4gICAgICAgICAgICAgICAgXCJkYXRhXCI6IHthY3Rpb246IFwiY3JlYXRlX2NvdXJzZVwiLCB0aWlfY291cnNlX2lkOiAkKFwiI3RpaV9jb3Vyc2VfaWRcIikuaHRtbCgpLFxuICAgICAgICAgICAgICAgICAgICB0aWlfY291cnNlX25hbWU6IGVuY29kZVVSSUNvbXBvbmVudCgkKFwiI3RpaV9jb3Vyc2VfbmFtZVwiKS5odG1sKCkpLFxuICAgICAgICAgICAgICAgICAgICBjb3Vyc2VfbmFtZTogZW5jb2RlVVJJQ29tcG9uZW50KCQoXCIjaWRfY291cnNlbmFtZVwiKS52YWwoKSksXG4gICAgICAgICAgICAgICAgICAgIGNvdXJzZV9jYXRlZ29yeTogJChcIiNpZF9jb3Vyc2VjYXRlZ29yeVwiKS52YWwoKSwgc2Vzc2tleTogTS5jZmcuc2Vzc2tleX0sXG4gICAgICAgICAgICAgICAgc3VjY2VzczogZnVuY3Rpb24oZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgb2JqID0galF1ZXJ5LnBhcnNlSlNPTihkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgaGlkZUNvdXJzZUNyZWF0aW9uT3B0aW9ucyhvYmosIG9UYWJsZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgICQoJyNpZF91cGRhdGVfY291cnNlJykuY2xpY2soZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAkLmFqYXgoe1xuICAgICAgICAgICAgICAgIFwiZGF0YVR5cGVcIjogJ2h0bWwnLFxuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIlBPU1RcIixcbiAgICAgICAgICAgICAgICBcInVybFwiOiBcImFqYXgucGhwXCIsXG4gICAgICAgICAgICAgICAgXCJkYXRhXCI6IHthY3Rpb246IFwibGlua19jb3Vyc2VcIiwgdGlpX2NvdXJzZV9pZDogJChcIiN0aWlfY291cnNlX2lkXCIpLmh0bWwoKSxcbiAgICAgICAgICAgICAgICAgICAgdGlpX2NvdXJzZV9uYW1lOiAkKFwiI3RpaV9jb3Vyc2VfbmFtZVwiKS5odG1sKCksIGNvdXJzZV90b19saW5rOiAkKFwiI2lkX2NvdXJzZXRvbGlua1wiKS52YWwoKSxcbiAgICAgICAgICAgICAgICAgICAgc2Vzc2tleTogTS5jZmcuc2Vzc2tleX0sXG4gICAgICAgICAgICAgICAgc3VjY2VzczogZnVuY3Rpb24oZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgb2JqID0galF1ZXJ5LnBhcnNlSlNPTihkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgaGlkZUNvdXJzZUNyZWF0aW9uT3B0aW9ucyhvYmosIG9UYWJsZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIEhpZGUgdGhlIGNvdXJzZSBjcmVhdGlvbi9saW5raW5nIGZvcm0gb25jZSB0aGUgc2VsZWN0ZWQgVHVybml0aW5cbiAgICAvLyBjb3Vyc2UgaGFzIGJlZW4gY3JlYXRlZC9saW5rZWQgbG9jYWxseSBhbmQgaW5pdGlhbGlzZSB0aGUgY3JlYXRlIGFzc2lnbm1lbnQgYnV0dG9uLlxuICAgIGZ1bmN0aW9uIGhpZGVDb3Vyc2VDcmVhdGlvbk9wdGlvbnMob2JqLCBvVGFibGUpIHtcbiAgICAgICAgaWYgKG9iaiAhPSAwKSB7XG4gICAgICAgICAgICAkKFwiI2NvdXJzZV9pZFwiKS5odG1sKG9iai5jb3Vyc2VpZCk7XG5cbiAgICAgICAgICAgIHZhciBjYl9lbGVtZW50ID0gJ2lucHV0W25hbWU9XCJjaGVja18nICsgJCgnI3RpaV9jb3Vyc2VfaWQnKS5odG1sKCkgKyAnXCJdJztcbiAgICAgICAgICAgIHBhcmVudC4kKGNiX2VsZW1lbnQpLmhpZGUoKTtcbiAgICAgICAgICAgIHZhciB0aWNrX2VsZW1lbnQgPSAnI3RpY2tfJyArICQoJyN0aWlfY291cnNlX2lkJykuaHRtbCgpO1xuICAgICAgICAgICAgcGFyZW50LiQodGlja19lbGVtZW50KS5zaG93KCk7XG5cbiAgICAgICAgICAgICQoJ2ZpZWxkc2V0W2lkJD1cImNyZWF0ZV9jb3Vyc2VfZmllbGRzZXRcIl0nKS5wYXJlbnQoKS5zbGlkZVRvZ2dsZSgpO1xuICAgICAgICAgICAgJCgnZmllbGRzZXRbaWQkPVwidXBkYXRlX2NvdXJzZV9maWVsZHNldFwiXScpLnBhcmVudCgpLnNsaWRlVG9nZ2xlKCk7XG5cbiAgICAgICAgICAgICQoXCIjb3JfY29udGFpbmVyXCIpLmhpZGUoKTtcblxuICAgICAgICAgICAgJCgnI2V4aXN0aW5nX2NvdXJzZV90aXRsZV9zcGFuJykuaHRtbChvYmouY291cnNlbmFtZSk7XG4gICAgICAgICAgICAkKCcuZXhpc3RpbmdfY291cnNlX3RpdGxlX2gzJykucmVtb3ZlQ2xhc3MoJ2hpZGRlbl9jbGFzcycpO1xuXG4gICAgICAgICAgICBpZiAoJCgnLmFzc2lnbm1lbnRpZHNfY2hlY2snKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgJChcIi5hc3NpZ25tZW50aWRzX2NoZWNrXCIpLnJlbW92ZUF0dHIoJ2Rpc2FibGVkJyk7XG4gICAgICAgICAgICAgICAgJChcIiNpZF9hc3NpZ25tZW50bmFtZVwiKS5yZW1vdmVBdHRyKCdkaXNhYmxlZCcpO1xuICAgICAgICAgICAgICAgICQoXCIjaWRfY3JlYXRlX2Fzc2lnbm1lbnRcIikucmVtb3ZlQXR0cignZGlzYWJsZWQnKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgJCgnLmFzc2lnbm1lbnRpZHNfY2hlY2snKS5jaGFuZ2UoZnVuY3Rpb24oKXtcbiAgICAgICAgICAgICAgICBpZiAoJCgnLmFzc2lnbm1lbnRpZHNfY2hlY2snKS5maWx0ZXIoJzpjaGVja2VkJykubGVuZ3RoID49IDUpIHtcbiAgICAgICAgICAgICAgICAgICAgJChcIi5hc3NpZ25tZW50aWRzX2NoZWNrXCIpLm5vdCgnOmNoZWNrZWQnKS5hdHRyKCdkaXNhYmxlZCcsICdkaXNhYmxlZCcpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICQoXCIuYXNzaWdubWVudGlkc19jaGVja1wiKS5yZW1vdmVBdHRyKCdkaXNhYmxlZCcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpbml0aWFsaXNlQ3JlYXRlQXNzaWdubWVudEJ1dHRvbihvVGFibGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gQmluZCB0aGUgZXZlbnQgdG8gY3JlYXRlIGFuIGFzc2lnbm1lbnQgZnJvbSB0aGUgc2VsZWN0ZWQgcGFydHMuXG4gICAgZnVuY3Rpb24gaW5pdGlhbGlzZUNyZWF0ZUFzc2lnbm1lbnRCdXR0b24ob1RhYmxlKSB7XG4gICAgICAgICQoJyNpZF9jcmVhdGVfYXNzaWdubWVudCcpLnVuYmluZChcImNsaWNrXCIpO1xuICAgICAgICAkKCcjaWRfY3JlYXRlX2Fzc2lnbm1lbnQnKS5jbGljayhmdW5jdGlvbigpIHtcblxuICAgICAgICAgICAgdmFyIHBhcnRzID0gXCJcIjtcbiAgICAgICAgICAgICQoJy5hc3NpZ25tZW50aWRzX2NoZWNrOmNoZWNrZWQnKS5lYWNoKGZ1bmN0aW9uKGkpe1xuICAgICAgICAgICAgICAgIHBhcnRzICs9ICQodGhpcykudmFsKCkgKyBcIixcIjtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKHBhcnRzLmNoYXJBdChwYXJ0cy5sZW5ndGggLSAxKSA9PSAnLCcpIHtcbiAgICAgICAgICAgICAgICBwYXJ0cy5zdWJzdHJpbmcoMCwgcGFydHMubGVuZ3RoIC0gMSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICQoXCIjaWRfY3JlYXRlX2Fzc2lnbm1lbnRcIikuYXR0cignZGlzYWJsZWQnLCAnZGlzYWJsZWQnKTtcblxuICAgICAgICAgICAgJC5hamF4KHtcbiAgICAgICAgICAgICAgICBcImRhdGFUeXBlXCI6ICdodG1sJyxcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJQT1NUXCIsXG4gICAgICAgICAgICAgICAgXCJ1cmxcIjogXCJhamF4LnBocFwiLFxuICAgICAgICAgICAgICAgIFwiZGF0YVwiOiB7YWN0aW9uOiBcImNyZWF0ZV9hc3NpZ25tZW50XCIsIGNvdXJzZV9pZDogJChcIiNjb3Vyc2VfaWRcIikuaHRtbCgpLFxuICAgICAgICAgICAgICAgICAgICBhc3NpZ25tZW50X25hbWU6ICQoXCIjaWRfYXNzaWdubWVudG5hbWVcIikudmFsKCksIHBhcnRzOiBwYXJ0cywgc2Vzc2tleTogTS5jZmcuc2Vzc2tleX0sXG4gICAgICAgICAgICAgICAgc3VjY2VzczogZnVuY3Rpb24oZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICBvVGFibGUuZm5SZWxvYWRBamF4KCk7XG4gICAgICAgICAgICAgICAgICAgIG9UYWJsZS5mblN0YW5kaW5nUmVkcmF3KCk7XG4gICAgICAgICAgICAgICAgICAgICQoXCIjaWRfYXNzaWdubWVudG5hbWVcIikucmVtb3ZlQXR0cignZGlzYWJsZWQnKTtcbiAgICAgICAgICAgICAgICAgICAgJChcIiNpZF9jcmVhdGVfYXNzaWdubWVudFwiKS5yZW1vdmVBdHRyKCdkaXNhYmxlZCcpO1xuICAgICAgICAgICAgICAgICAgICAkKFwiLmFzc2lnbm1lbnRpZHNfY2hlY2tcIikucmVtb3ZlQXR0cignZGlzYWJsZWQnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxufSk7Il19 diff --git a/lang/en/turnitintooltwo.php b/lang/en/turnitintooltwo.php index 0b7b2093..8a2114c5 100755 --- a/lang/en/turnitintooltwo.php +++ b/lang/en/turnitintooltwo.php @@ -589,6 +589,9 @@ $string['migration_event_name'] = 'Migrate V1 Assignment To V2'; $string['migration_event_desc'] = 'Turnitin Tool V1 Course: {$a->v1_name} ({$a->v1_cm_id}) has been migrated to Turnitin V2 ({$a->v2_cm_id}).'; $string['migrationtoolv1list'] = 'Below, you can find a list of Moodle Direct V1 assignments that have not yet migrated to V2.'; +$string['migrationtoolprogress'] = 'Select the migrated V1 assignments that you\'d like to remove. V1 assignments that have not yet been migrated cannot be removed.'; +$string['delete_selected'] = 'Delete Selected'; +$string['v1assignmentsdeleted'] = 'The assignment(s) have been successfully deleted.'; $string['complete'] = 'complete'; $string['assignments'] = 'assignments'; $string['migrationtoolerror'] = 'The migration of this assignment has failed. Please try again.'; diff --git a/settings_extras.php b/settings_extras.php index e13b200a..8af00053 100644 --- a/settings_extras.php +++ b/settings_extras.php @@ -488,19 +488,51 @@ $assignmentids = (isset($_REQUEST['assignmentids'])) ? $_REQUEST["assignmentids"] : array(); $assignmentids = clean_param_array($assignmentids, PARAM_INT); + // Delete assignments if the form has been submitted. + if (isset($assignmentids) && count($assignmentids) > 0) { + v1migration::turnitintooltwo_delete_assignments($assignmentids); + + $urlparams = array('cmd' => 'v1migration', 'msg' => 'delete', 'type' => 'success'); + redirect(new moodle_url('/mod/turnitintooltwo/settings_extras.php', $urlparams)); + exit; + } + + // Show successful delete message if applicable. + if ($msg == 'delete') { + $close = html_writer::tag('button', '×', array('class' => 'close', 'data-dismiss' => 'alert')); + $alert = html_writer::tag('div', $close.get_string("v1assignmentsdeleted", 'turnitintooltwo'), + array('class' => 'alert alert-success', 'role' => 'alert')); + } + $table = new html_table(); $table->id = "migrationTable"; $rows = array(); // Do the table headers. $cells = array(); + $checkbox = html_writer::checkbox('selectallcb', 1, false, '', array('title' => get_string('migrationselectall', 'turnitintooltwo'))); + $cells[0] = new html_table_cell($checkbox); + $cells[0]->attributes['class'] = 'centered_cell centered_cb_cell'; $cells['assignmentid'] = new html_table_cell(get_string('assignmentid', 'turnitintooltwo')); $cells['title'] = new html_table_cell(get_string('migrationassignmenttitle', 'turnitintooltwo')); - $cells['assignmentid']->attributes['width'] = "20%"; - $cells['title']->attributes['width'] = "80%"; + $cells['migrationstatus'] = new html_table_cell(get_string('hasmigrated', 'turnitintooltwo')); + + // Set the header widths. Title can take up the remainder. + $cells[0]->attributes['width'] = "100px"; + $cells['assignmentid']->attributes['width'] = "150px"; + $cells['migrationstatus']->attributes['width'] = "100px"; $table->head = $cells; - $html .= $OUTPUT->box(html_writer::table($table), ''); + + $elements2[] = array('html', html_writer::table($table)); + $customdata2["elements"] = $elements2; + $customdata2["show_cancel"] = false; + $customdata2["disable_form_change_checker"] = true; + $customdata2["submit_label"] = get_string('delete_selected', 'turnitintooltwo'); + + $optionsform = new turnitintooltwo_form($CFG->wwwroot.'/mod/turnitintooltwo/settings_extras.php?cmd=v1migration', $customdata2); + + $html .= html_writer::tag('div', $optionsform->display(), array('id' => 'migration-delete-selected')); $output .= $alert . $html; diff --git a/tests/unit/classes/v1migration/v1migration_test.php b/tests/unit/classes/v1migration/v1migration_test.php index 50053164..b1301d4d 100755 --- a/tests/unit/classes/v1migration/v1migration_test.php +++ b/tests/unit/classes/v1migration/v1migration_test.php @@ -778,7 +778,7 @@ public function test_turnitintooltwo_getassignments() { $_POST = array(); $_POST["sEcho"] = 1; - $_POST["iColumns"] = 2; + $_POST["iColumns"] = 4; $_POST["sColumns"] = ",,,"; $_POST["iDisplayStart"] = 0; $_POST["iDisplayLength"] = 10; @@ -786,15 +786,25 @@ public function test_turnitintooltwo_getassignments() { $_POST["sSearch_0"] = ""; $_POST["bRegex_0"] = "false"; $_POST["bSearchable_0"] = "true"; - $_POST["bSortable_0"] = "true"; + $_POST["bSortable_0"] = "false"; $_POST["mDataProp_1"] = 1; $_POST["sSearch_1"] = ""; $_POST["bRegex_1"] = "false"; $_POST["bSearchable_1"] = "true"; $_POST["bSortable_1"] = "true"; + $_POST["mDataProp_2"] = 2; + $_POST["sSearch_2"] = ""; + $_POST["bRegex_2"] = "false"; + $_POST["bSearchable_2"] = "true"; + $_POST["bSortable_2"] = "true"; + $_POST["mDataProp_3"] = 3; + $_POST["sSearch_3"] = ""; + $_POST["bRegex_3"] = "false"; + $_POST["bSearchable_3"] = "false"; + $_POST["bSortable_3"] = "true"; $_POST["sSearch"] = ""; $_POST["bRegex"] = "false"; - $_POST["iSortCol_0"] = 1; + $_POST["iSortCol_0"] = 2; $_POST["sSortDir_0"] = "asc"; $_POST["iSortingCols"] = 1; $_POST["_"] = 1494857276336; @@ -830,15 +840,26 @@ public function test_turnitintooltwo_getassignments() { $assignments = $DB->get_records('turnitintool', NULL, "name ASC", "id, name, migrated", $_POST["iDisplayStart"], $_POST["iDisplayLength"]); $outputrows = array(); foreach ($assignments as $key => $value) { - $assignmentlink = new moodle_url('/mod/turnitintool/view.php', array('a' => $value->id, 'id' => '0')); - $assignmenttitle = html_writer::link($assignmentlink, format_string($value->name), array('target' => '_blank' )); + if ($value->migrated == 1) { + $checkbox = ''; + $sronly = html_writer::tag('span', get_string('yes', 'turnitintooltwo'), array('class' => 'sr-only')); + $migrationValue = html_writer::tag('span', $sronly, array('class' => 'fa fa-check')); - $outputrows[] = array($value->id, $assignmenttitle); + $assignmenttitle = format_string($value->name); + } else { + $checkbox = ""; + $sronly = html_writer::tag('span', get_string('no', 'turnitintooltwo'), array('class' => 'sr-only')); + $migrationValue = html_writer::tag('span', $sronly, array('class' => 'fa fa-times')); + + $assignmentlink = new moodle_url('/mod/turnitintool/view.php', array('a' => $value->id, 'id' => '0')); + $assignmenttitle = html_writer::link($assignmentlink, format_string($value->name), array('target' => '_blank' )); + } + $outputrows[] = array($checkbox, $value->id, $assignmenttitle, $migrationValue); } $expectedoutput = array("aaData" => $outputrows, "sEcho" => $_POST["sEcho"], - "iTotalRecords" => 10, - "iTotalDisplayRecords" => 20); + "iTotalRecords" => $_POST["iDisplayLength"], + "iTotalDisplayRecords" => $numAssignments); $this->assertEquals($_POST["iDisplayLength"], count($assignments)); $response = v1migration::turnitintooltwo_getassignments(); @@ -850,24 +871,85 @@ public function test_turnitintooltwo_getassignments() { ORDER BY name asc"; $queryparams = array("search_term_2" => "%".$_POST["sSearch"]."%"); $assignments = $DB->get_records_sql($query, $queryparams, $_POST["iDisplayStart"], $_POST["iDisplayLength"]); + $totalassignments = count($DB->get_records_sql($query, $queryparams)); $outputrows = array(); foreach ($assignments as $key => $value) { - $assignmentlink = new moodle_url('/mod/turnitintool/view.php', array('a' => $value->id, 'id' => '0')); - $assignmenttitle = html_writer::link($assignmentlink, format_string($value->name), array('target' => '_blank' )); + if ($value->migrated == 1) { + $checkbox = ''; + $sronly = html_writer::tag('span', get_string('yes', 'turnitintooltwo'), array('class' => 'sr-only')); + $migrationValue = html_writer::tag('span', $sronly, array('class' => 'fa fa-check')); + + $assignmenttitle = format_string($value->name); + } else { + $checkbox = ""; + $sronly = html_writer::tag('span', get_string('no', 'turnitintooltwo'), array('class' => 'sr-only')); + $migrationValue = html_writer::tag('span', $sronly, array('class' => 'fa fa-times')); - $outputrows[] = array($value->id, $assignmenttitle); + $assignmentlink = new moodle_url('/mod/turnitintool/view.php', array('a' => $value->id, 'id' => '0')); + $assignmenttitle = html_writer::link($assignmentlink, format_string($value->name), array('target' => '_blank' )); + } + $outputrows[] = array($checkbox, $value->id, $assignmenttitle, $migrationValue); } $expectedoutput = array("aaData" => $outputrows, "sEcho" => $_POST["sEcho"], - "iTotalRecords" => 10, - "iTotalDisplayRecords" => 20); + "iTotalRecords" => $_POST["iDisplayLength"], + "iTotalDisplayRecords" => $totalassignments); $this->assertEquals($_POST["iDisplayLength"], count($assignments)); $response = v1migration::turnitintooltwo_getassignments(); $this->assertEquals($expectedoutput, $response); } + /** + * Test that assignments are deleted when given a list of assignments. + */ + public function test_turnitintooltwo_delete_assignments() { + global $DB; + + if (!$this->v1installed()) { + return false; + } + + // Generate a new course. + $course = $this->getDataGenerator()->create_course(); + + // Create some V1 assignments. + $v1assignment1 = $this->make_test_assignment($course->id, 'turnitintool', "Assignment 1", 5); + $v1assignment2 = $this->make_test_assignment($course->id, 'turnitintool', "Assignment 2", 5); + $v1assignment3 = $this->make_test_assignment($course->id, 'turnitintool', "Assignment 3", 5); + + $cm1 = get_coursemodule_from_instance('turnitintool', $v1assignment1->id); + $cm2 = get_coursemodule_from_instance('turnitintool', $v1assignment2->id); + $cm3 = get_coursemodule_from_instance('turnitintool', $v1assignment3->id); + + // Check that the assignments have been created correctly. + $v1assignments = $DB->get_records('turnitintool'); + $v1parts = $DB->get_records('turnitintool_parts'); + $v1submissions = $DB->get_records('turnitintool_submissions'); + $this->assertEquals(3, count($v1assignments)); + $this->assertEquals(3, count($v1parts)); + $this->assertEquals(15, count($v1submissions)); + + // Delete the assignments. + $response = v1migration::turnitintooltwo_delete_assignments(array($v1assignment1->id, $v1assignment2->id, $v1assignment3->id)); + + // Verify that they have been deleted. + $v1assignments = $DB->get_records('turnitintool'); + $v1parts = $DB->get_records('turnitintool_parts'); + $v1submissions = $DB->get_records('turnitintool_submissions'); + $this->assertEquals(0, count($v1assignments)); + $this->assertEquals(0, count($v1parts)); + $this->assertEquals(0, count($v1submissions)); + + // Verify that records have been removed from the course_modules table. + $v1cm = $DB->get_records('course_modules', array('id' => $cm1->id)); + $this->assertEquals(0, count($v1cm)); + $v2cm = $DB->get_records('course_modules', array('id' => $cm2->id)); + $this->assertEquals(0, count($v2cm)); + $v3cm = $DB->get_records('course_modules', array('id' => $cm3->id)); + $this->assertEquals(0, count($v3cm)); + } /** * Test that assignments are deleted when given an assignment. From 511db0008f4bfe13b2d9c323aadf241dacab1e70 Mon Sep 17 00:00:00 2001 From: David Winn Date: Wed, 7 Mar 2018 16:15:57 +0000 Subject: [PATCH 18/21] Refactor of the old deletion function to use the new method. --- classes/v1migration/v1migration.php | 28 ----------- settings_extras.php | 4 +- .../classes/v1migration/v1migration_test.php | 50 ------------------- 3 files changed, 3 insertions(+), 79 deletions(-) diff --git a/classes/v1migration/v1migration.php b/classes/v1migration/v1migration.php index 5827fe81..ecc31d40 100644 --- a/classes/v1migration/v1migration.php +++ b/classes/v1migration/v1migration.php @@ -681,34 +681,6 @@ public static function delete_migrated_assignment($assignmentid) { } } - /** - * Delete a list of assignments. - * - * @param array $assignmentids The assignment IDs to delete. - */ - public static function turnitintooltwo_delete_assignments($assignmentids) { - global $CFG, $DB; - - require_once($CFG->dirroot . "/mod/turnitintool/lib.php"); - - foreach ($assignmentids as $assignmentid) { - $cm = get_coursemodule_from_instance('turnitintool', $assignmentid); - - // We have found that backups aren't reliable on MSSQL so rather than use Moodle's - // function which uses the recycle tool and the backup procedure. We handle the deletion directly. - if ($CFG->dbtype == 'mssql' || $CFG->dbtype == 'sqlsrv') { - turnitintool_delete_instance($assignmentid); - - // Delete course module. - $DB->delete_records('course_modules', array('id' => $cm->id)); - - rebuild_course_cache($cm->course); - } else { - course_delete_module($cm->id); - } - } - } - /** * Check that v1 and v2 account ids are the same. */ diff --git a/settings_extras.php b/settings_extras.php index 8af00053..9ecbbd37 100644 --- a/settings_extras.php +++ b/settings_extras.php @@ -490,7 +490,9 @@ // Delete assignments if the form has been submitted. if (isset($assignmentids) && count($assignmentids) > 0) { - v1migration::turnitintooltwo_delete_assignments($assignmentids); + foreach ($assignmentids as $assignmentid) { + v1migration::delete_migrated_assignment($assignmentid); + } $urlparams = array('cmd' => 'v1migration', 'msg' => 'delete', 'type' => 'success'); redirect(new moodle_url('/mod/turnitintooltwo/settings_extras.php', $urlparams)); diff --git a/tests/unit/classes/v1migration/v1migration_test.php b/tests/unit/classes/v1migration/v1migration_test.php index b1301d4d..504a26fa 100755 --- a/tests/unit/classes/v1migration/v1migration_test.php +++ b/tests/unit/classes/v1migration/v1migration_test.php @@ -901,56 +901,6 @@ public function test_turnitintooltwo_getassignments() { $this->assertEquals($expectedoutput, $response); } - /** - * Test that assignments are deleted when given a list of assignments. - */ - public function test_turnitintooltwo_delete_assignments() { - global $DB; - - if (!$this->v1installed()) { - return false; - } - - // Generate a new course. - $course = $this->getDataGenerator()->create_course(); - - // Create some V1 assignments. - $v1assignment1 = $this->make_test_assignment($course->id, 'turnitintool', "Assignment 1", 5); - $v1assignment2 = $this->make_test_assignment($course->id, 'turnitintool', "Assignment 2", 5); - $v1assignment3 = $this->make_test_assignment($course->id, 'turnitintool', "Assignment 3", 5); - - $cm1 = get_coursemodule_from_instance('turnitintool', $v1assignment1->id); - $cm2 = get_coursemodule_from_instance('turnitintool', $v1assignment2->id); - $cm3 = get_coursemodule_from_instance('turnitintool', $v1assignment3->id); - - // Check that the assignments have been created correctly. - $v1assignments = $DB->get_records('turnitintool'); - $v1parts = $DB->get_records('turnitintool_parts'); - $v1submissions = $DB->get_records('turnitintool_submissions'); - $this->assertEquals(3, count($v1assignments)); - $this->assertEquals(3, count($v1parts)); - $this->assertEquals(15, count($v1submissions)); - - // Delete the assignments. - $response = v1migration::turnitintooltwo_delete_assignments(array($v1assignment1->id, $v1assignment2->id, $v1assignment3->id)); - - // Verify that they have been deleted. - $v1assignments = $DB->get_records('turnitintool'); - $v1parts = $DB->get_records('turnitintool_parts'); - $v1submissions = $DB->get_records('turnitintool_submissions'); - $this->assertEquals(0, count($v1assignments)); - $this->assertEquals(0, count($v1parts)); - $this->assertEquals(0, count($v1submissions)); - - // Verify that records have been removed from the course_modules table. - $v1cm = $DB->get_records('course_modules', array('id' => $cm1->id)); - $this->assertEquals(0, count($v1cm)); - $v2cm = $DB->get_records('course_modules', array('id' => $cm2->id)); - $this->assertEquals(0, count($v2cm)); - $v3cm = $DB->get_records('course_modules', array('id' => $cm3->id)); - $this->assertEquals(0, count($v3cm)); - } - /** * Test that assignments are deleted when given an assignment. */ From 2327a0a93fe403ce135bd6a166b244d031476a1c Mon Sep 17 00:00:00 2001 From: John McGettrick Date: Mon, 12 Mar 2018 14:58:53 +0000 Subject: [PATCH 19/21] Change migration tool table intro --- lang/en/turnitintooltwo.php | 3 ++- settings_extras.php | 2 +- version.php | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/lang/en/turnitintooltwo.php b/lang/en/turnitintooltwo.php index 8a2114c5..0eb81f5d 100755 --- a/lang/en/turnitintooltwo.php +++ b/lang/en/turnitintooltwo.php @@ -588,7 +588,8 @@ $string['migrationredirect'] = 'You will be redirected to the Moodle Direct V2 assignment upon completion.'; $string['migration_event_name'] = 'Migrate V1 Assignment To V2'; $string['migration_event_desc'] = 'Turnitin Tool V1 Course: {$a->v1_name} ({$a->v1_cm_id}) has been migrated to Turnitin V2 ({$a->v2_cm_id}).'; -$string['migrationtoolv1list'] = 'Below, you can find a list of Moodle Direct V1 assignments that have not yet migrated to V2.'; +$string['migrationtoolv1list'] = 'Use the list below to remove the Moodle Direct V1 assignments that migrated prior to version {$a}; this will resolve any inaccuracies in the Moodle grade book. You can also identify V1 assignments that have not yet migrated to V2. +

For more information, visit the release notes at: guides.turnitin.com/releasenotes'; $string['migrationtoolprogress'] = 'Select the migrated V1 assignments that you\'d like to remove. V1 assignments that have not yet been migrated cannot be removed.'; $string['delete_selected'] = 'Delete Selected'; $string['v1assignmentsdeleted'] = 'The assignment(s) have been successfully deleted.'; diff --git a/settings_extras.php b/settings_extras.php index 9ecbbd37..8b343740 100644 --- a/settings_extras.php +++ b/settings_extras.php @@ -481,7 +481,7 @@ $html .= html_writer::tag('hr', ''); $html .= html_writer::tag('h2', get_string('migration_status', 'turnitintooltwo'), array('class' => 'migrationheader')); - $html .= html_writer::tag('p', get_string('migrationtoolv1list', 'turnitintooltwo')); + $html .= html_writer::tag('p', get_string('migrationtoolv1list', 'turnitintooltwo', '2018031201')); $jsrequired = true; diff --git a/version.php b/version.php index 71f36c77..34a232a4 100644 --- a/version.php +++ b/version.php @@ -25,7 +25,7 @@ $plugin = new StdClass(); } -$plugin->version = 2018011601; +$plugin->version = 2018031201; $plugin->release = "2.7+"; $plugin->requires = 2014051200; $plugin->component = 'mod_turnitintooltwo'; From 051fb0fa0988bb1606b0fc3dc2e61b34a9598ec6 Mon Sep 17 00:00:00 2001 From: John McGettrick Date: Mon, 12 Mar 2018 15:18:41 +0000 Subject: [PATCH 20/21] Update release notes --- CHANGELOG.md | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index f84a273d..2de7234b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,25 @@ +### 2018-March-12 +### v2018031201 + +#### Fixes and enhancements + +--- + +#### Manual adjustments to grades now stick during V1 to V2 migration + +>Following the migration of a Moodle Direct V1 assignment to V2, grades that had been manually adjusted in the Moodle grade book would be overwritten to match the grade originally set in Turnitin Feedback Studio. With this overwrite being completely unintentional, we've made several backend changes to ensure that future manual adjustments within the grade book always remain fixed during migration. + +#### V1 assignments are now removed automatically after migration + +>If an administrator failed to delete a Moodle Direct V1 assignment after its migration to V2, the grade of the V1 assignment would remain in the Moodle grade book, causing grades to effectively double. We've now adjusted the behavior of the Moodle Migration Tool to resolve this. So that you no longer need to worry about incorrect grades in the grade book, Moodle V1 assignments are now automatically deleted after migration. +> +>There may be instances where you'll still be required to remove V1 assignments manually (for example, the migration has been successful but there are conflicting grades in the grade book). + +#### Deleting V1 assignments that were migrated in prior versions + +> You can manually delete your previously migrated assignments from the usual spot in the Moodle Migration Tool; we encourage you to delete these as soon as possible in order to resolve any current issues in the grade book. Any V1 assignments migrated after this update will be automatically deleted. + + ### :snowflake: Date: 2018-January-16 ### :snowflake: Release: v2018011601 From e4e226e89710fe0519a1ceeeaf9d21df884fa2a1 Mon Sep 17 00:00:00 2001 From: John McGettrick Date: Mon, 12 Mar 2018 15:22:30 +0000 Subject: [PATCH 21/21] Add seperator --- CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2de7234b..f6072644 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,7 @@ ### 2018-March-12 ### v2018031201 -#### Fixes and enhancements +### Fixes and enhancements --- @@ -19,6 +19,7 @@ > You can manually delete your previously migrated assignments from the usual spot in the Moodle Migration Tool; we encourage you to delete these as soon as possible in order to resolve any current issues in the grade book. Any V1 assignments migrated after this update will be automatically deleted. +--- ### :snowflake: Date: 2018-January-16 ### :snowflake: Release: v2018011601