您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Greasy Fork is available in English.
.
当前为
// ==UserScript== // @name 好大学在线 助手 // @namespace https://github.com/ShenHongFei/cnmooc-assistant // @homepage https://github.com/ShenHongFei/cnmooc-assistant // @author 沈鸿飞 // @description . // @version 2017.11.24.03.19 // @match http://www.cnmooc.org/study/initplay/*.mooc // @match http://www.cnmooc.org/study/unit/*.mooc // @run-at document-idle // ==/UserScript== // 满分批阅当前 mark() var add_button, answers, assistant_api, assistant_div, auto_fill, complete_item, fun, get_quiz_answers, mark, mark_all, name, options, pause_quiz_timer, print_answers, questions, test_answer, unblock_video_progress, indexOf = [].indexOf; mark = async function() { $('input[id^=quiz_]').each(function(i, e) { var max_point; max_point = e.className.match(/max\[(\d+)\]/)[1]; return e.setAttribute('value', max_point); }); await sleep(200); $('#submitReviewBtn').click(); await sleep(200); $("input[value='提交互评']").click(); await sleep(200); return $("input[value='确定']").click(); }; // 满分批阅所有 mark_all() mark_all = async function() { var i, j, results; $('#gotoReviewSubmitBtn').click(); results = []; for (i = j = 1; j <= 3; i = ++j) { await sleep(700); results.push(mark()); } return results; }; // 完成该项 complete_item = function() { return updateStudyOver(); }; // 解锁视频进度 unblock_video_progress = function() { $('#isOver').val(2); return eval($(".video-show script").html()); }; // 暂停计时 pause_quiz_timer = function() { var useTimeFlag; if (typeof unsafeWindow !== 'undefined') { return unsafeWindow.useTimeFlag = false; } else { return useTimeFlag = false; } }; // answers={question.quizId:[options(string)]} answers = null; questions = null; options = null; // async 修改自 doSubmitExam_ajax test_answer = async function(questions) { var allRightFlag, gradeId, i, question, reSubmit, ret_data, score, totalScore, userQuiz2, user_Quiz, user_quizs; //处理每道题计时 _quizUseTimeRecord[_quizIdRecord] = _quizUseTimeRecord[_quizIdRecord] || 0; _quizUseTimeRecord[_quizIdRecord] = parseInt(_quizUseTimeRecord[_quizIdRecord]) + _quizUseTime; user_quizs = (function() { var j, len, results; results = []; for (j = 0, len = questions.length; j < len; j++) { question = questions[j]; results.push(JSON.stringify(question)); } return results; })(); reSubmit = $('#reSubmit').val(); gradeId = $('#gradeId').val(); userQuiz2 = []; totalScore = 0; allRightFlag = true; i = 0; while (i < user_quizs.length) { user_Quiz = JSON.parse(user_quizs[i]); user_Quiz['useTime'] = _quizUseTimeRecord[user_Quiz['quizId']]; _quizUseTimeRecord[user_Quiz['quizId']] = 0; userQuiz2.push(JSON.stringify(user_Quiz)); score = parseInt(user_Quiz['markQuizScore']); totalScore += score; if (score === 0) { allRightFlag = false; } i++; } if (allRightFlag) { totalScore = 10000; } user_quizs = userQuiz2; console.log(user_quizs); ret_data = (await $.when($.ajax({ url: CONTEXTPATH + '/examSubmit/7681/saveExam/1/' + examPaperId + '/' + examSubmitId + '.mooc?testPaperId=' + examTestPaperId, type: 'post', data: { gradeId: gradeId, reSubmit: reSubmit, submitquizs: user_quizs, submitFlag: 0, useTime: 1, totalScore: totalScore, testPaperId: examTestPaperId }, dataType: 'json', success: function(data) { if (!data.successFlag) { throw Error(data.successFlag = false); } }, error: function() { return console.log('test_answer error'); } }))); return JSON.parse(ret_data.examSubmit.submitContent); }; // async get_quiz_answers = async function() { var current_round_option_ids, i, j, l, len, len1, len2, m, n, o, oi, option_id_flags, perfect_answer, qi, question, ref, result, test_result; // 初始化页面问题 questions = (function() { var j, len, ref, results; ref = $('#exam_paper').quiz().getPractice(); results = []; for (j = 0, len = ref.length; j < len; j++) { question = ref[j]; results.push(JSON.parse(question)); } return results; })(); // 枚举、测试、更新答案 options = $('[option_id]').map(function(i, e) { return e.getAttribute('option_id'); }); answers = {}; ref = [1, 2, 4, 8, 3, 5, 6, 7, 9, 10, 11, 12, 13, 14, 15]; for (j = 0, len = ref.length; j < len; j++) { oi = ref[j]; option_id_flags = []; for (i = l = 0; l <= 3; i = ++l) { option_id_flags.push((oi << i & 0b1000) === 0b1000); } // 检测已有正确答案,对每一题生成答案,设置userAnswer for (qi = m = 0, len1 = questions.length; m < len1; qi = ++m) { question = questions[qi]; perfect_answer = answers[question.quizId]; if (perfect_answer) { question.userAnswer = perfect_answer.join(','); } else { current_round_option_ids = []; // option_id 并非连续 for (i = n = 0; n <= 3; i = ++n) { if (option_id_flags[i]) { current_round_option_ids.push(options[qi * 4 + i]); } } question.userAnswer = current_round_option_ids.join(','); } } console.log(questions); // 枚举的答案准备完成,开始测试 test_result = (await test_answer(questions)); for (o = 0, len2 = test_result.length; o < len2; o++) { result = test_result[o]; result = JSON.parse(result); if (result.markResult) { // perfect_options=(parseInt option for option in result.userAnswer.split(',')) answers[result.quizId] = result.userAnswer.split(','); } } } console.log(answers); return answers; }; // async 查看习题答案 print_answers = async function() { var j, len, option, option_id_from, pretty_options, qi, question, x; if (!answers) { await get_quiz_answers(); } pretty_options = ''; for (qi = j = 0, len = questions.length; j < len; qi = ++j) { question = questions[qi]; option_id_from = options[qi * 4]; x = (function() { var l, len1, ref, results; ref = answers[question.quizId]; results = []; for (l = 0, len1 = ref.length; l < len1; l++) { option = ref[l]; results.push(String.fromCharCode('A'.charCodeAt(0) + parseInt(option) - option_id_from)); } return results; })(); pretty_options += `第${qi + 1}题:${x.join(',')}\n`; } console.log(pretty_options); alert(pretty_options); }; // 自动完成习题 auto_fill = async function() { var answer_ids, k, v; if (!answers) { await get_quiz_answers(); } answer_ids = []; for (k in answers) { v = answers[k]; answer_ids = answer_ids.concat(v); } // todo:多选题再次点击会取消选择 $("[option_id]").filter(function(i, e) { var ref; return ref = e.getAttribute('option_id'), indexOf.call(answer_ids, ref) >= 0; }).find('[class|="input"]').click(); }; assistant_api = { '解锁视频进度': unblock_video_progress, '完成该项': complete_item, '暂停答题计时': pause_quiz_timer, '自动完成习题': auto_fill, '查看习题答案': print_answers }; // userscript 环境 if (typeof unsafeWindow !== 'undefined') { // 暴露assistant接口 unsafeWindow.assistant = {}; for (name in assistant_api) { fun = assistant_api[name]; unsafeWindow.assistant[fun.name] = fun; } // 返回课程主页改为返回导航 $('#backCourse').contents().last().replaceWith('返回导航'); $('#backCourse').off('click'); $("#backCourse").on('click', function() { return location.href = CONTEXTPATH + "/portal/session/unitNavigation/" + $("#courseOpenId").val() + ".mooc"; }); // 助手界面显示 assistant_div = document.createElement('div'); assistant_div.id = 'assistant'; $('.main-scroll')[0].prepend(assistant_div); // 助手界面添加按钮 add_button = function(text, fun) { var btn; btn = document.createElement('button'); btn.textContent = text; btn.onclick = fun; // todo:优雅的样式设置 btn.style = 'margin:5px;padding:5px'; return assistant_div.appendChild(btn); }; for (name in assistant_api) { fun = assistant_api[name]; add_button(name, fun); } // tab切换 $('.tab-inner').on('click', function() { // todo:智能判断可用功能 return console.log(this); }); } //router= // 10:video_helper_init //# 20:pdf_helper # pdf页面 //# 50:quiz_helper # 选择题 //router[$('#itemType').val()]() //async_ajax_test=-> // ajax_ret=await $.when $.ajax // url:'http://www.cnmooc.org/study/unit/197091.mooc' // success:->console.log 'success callback' // console.log ajax_ret.length //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC5jb2ZmZWUiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7O0FBQUEsSUFBQSxVQUFBLEVBQUEsT0FBQSxFQUFBLGFBQUEsRUFBQSxhQUFBLEVBQUEsU0FBQSxFQUFBLGFBQUEsRUFBQSxHQUFBLEVBQUEsZ0JBQUEsRUFBQSxJQUFBLEVBQUEsUUFBQSxFQUFBLElBQUEsRUFBQSxPQUFBLEVBQUEsZ0JBQUEsRUFBQSxhQUFBLEVBQUEsU0FBQSxFQUFBLFdBQUEsRUFBQSxzQkFBQTtFQUFBOztBQWNBLElBQUEsR0FBSyxNQUFBLFFBQUEsQ0FBQSxDQUFBO0VBQ0QsQ0FBQSxDQUFFLGtCQUFGLENBQXFCLENBQUMsSUFBdEIsQ0FBMkIsUUFBQSxDQUFDLENBQUQsRUFBRyxDQUFILENBQUE7QUFDdkIsUUFBQTtJQUFBLFNBQUEsR0FBVSxDQUFDLENBQUMsU0FBUyxDQUFDLEtBQVosQ0FBa0IsY0FBbEIsQ0FBa0MsQ0FBQSxDQUFBO1dBQzVDLENBQUMsQ0FBQyxZQUFGLENBQWUsT0FBZixFQUF1QixTQUF2QjtFQUZ1QixDQUEzQjtFQUdBLE1BQU0sS0FBQSxDQUFNLEdBQU47RUFDTixDQUFBLENBQUUsa0JBQUYsQ0FBcUIsQ0FBQyxLQUF0QixDQUFBO0VBQ0EsTUFBTSxLQUFBLENBQU0sR0FBTjtFQUNOLENBQUEsQ0FBRSxxQkFBRixDQUF3QixDQUFDLEtBQXpCLENBQUE7RUFDQSxNQUFNLEtBQUEsQ0FBTSxHQUFOO1NBQ04sQ0FBQSxDQUFFLG1CQUFGLENBQXNCLENBQUMsS0FBdkIsQ0FBQTtBQVRDLEVBZEw7OztBQTBCQSxRQUFBLEdBQVMsTUFBQSxRQUFBLENBQUEsQ0FBQTtBQUNMLE1BQUEsQ0FBQSxFQUFBLENBQUEsRUFBQTtFQUFBLENBQUEsQ0FBRSxzQkFBRixDQUF5QixDQUFDLEtBQTFCLENBQUE7QUFDQTtFQUFBLEtBQVMsMEJBQVQ7SUFDSSxNQUFNLEtB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WUFBRixDQUFlLENBQUMsRUFBaEIsQ0FBbUIsT0FBbkIsRUFBMkIsUUFBQSxDQUFBLENBQUEsRUFBQTs7V0FFdkIsT0FBTyxDQUFDLEdBQVIsQ0FBWSxJQUFaO0VBRnVCLENBQTNCLEVBOUJKOzs7QUFsS0EiLCJzb3VyY2VzQ29udGVudCI6WyIjID09VXNlclNjcmlwdD09XG4jIEBuYW1lICAgICAgICAg5aW95aSn5a2m5Zyo57q/IOWKqeaJi1xuIyBAbmFtZXNwYWNlICAgIGh0dHBzOi8vZ2l0aHViLmNvbS9TaGVuSG9uZ0ZlaS9jbm1vb2MtYXNzaXN0YW50XG4jIEBob21lcGFnZSAgICAgaHR0cHM6Ly9naXRodWIuY29tL1NoZW5Ib25nRmVpL2NubW9vYy1hc3Npc3RhbnRcbiMgQGF1dGhvciAgICAgICDmsojpuL/po55cbiMgQGRlc2NyaXB0aW9uICAuXG4jIEB2ZXJzaW9uICAgICAgMjAxNy4xMS4yNC4wMy4xOVxuIyBAbWF0Y2ggICAgICAgIGh0dHA6Ly93d3cuY25tb29jLm9yZy9zdHVkeS9pbml0cGxheS8qLm1vb2NcbiMgQG1hdGNoICAgICAgICBodHRwOi8vd3d3LmNubW9vYy5vcmcvc3R1ZHkvdW5pdC8qLm1vb2NcbiMgQHJlcXVpcmUgICAgICBmaWxlOi8vRTovU0RLL2NubW9vYy1hc3Npc3RhbnQvaW5kZXguanNcbiMgQHJ1bi1hdCAgICAgICBkb2N1bWVudC1pZGxlXG4jID09L1VzZXJTY3JpcHQ9PVxuICAgIFxuIyDmu6HliIbmibnpmIXlvZPliY0gbWFyaygpXG5tYXJrPS0+XG4gICAgJCgnaW5wdXRbaWRePXF1aXpfXScpLmVhY2ggKGksZSktPlxuICAgICAgICBtYXhfcG9pbnQ9ZS5jbGFzc05hbWUubWF0Y2goL21heFxcWyhcXGQrKVxcXS8pWzFdXG4gICAgICAgIGUuc2V0QXR0cmlidXRlKCd2YWx1ZScsbWF4X3BvaW50KVxuICAgIGF3YWl0IHNsZWVwKDIwMClcbiAgICAkKCcjc3VibWl0UmV2aWV3QnRuJykuY2xpY2soKVxuICAgIGF3YWl0IHNsZWVwKDIwMClcbiAgICAkKFwiaW5wdXRbdmFsdWU9J+aPkOS6pOS6kuivhCddXCIpLmNsaWNrKClcbiAgICBhd2FpdCBzbGVlcCgyMDApXG4gICAgJChcImlucHV0W3ZhbHVlPSfnoa7lrponXVwiKS5jbGljaygpXG5cbiMg5ruh5YiG5om56ZiF5omA5pyJIG1hcmtfYWxsKClcbm1hcmtfYWxsPS0+XG4gICAgJCgnI2dvdG9SZXZpZXdTdWJtaXRCdG4nKS5jbGljaygpXG4gICAgZm9yIGkgaW4gWzEuLjNdXG4gICAgICAgIGF3YWl0IHNsZWVwKDcwMClcbiAgICAgICAgbWFyaygpXG5cbiMg5a6M5oiQ6K+l6aG5XG5jb21wbGV0ZV9pdGVtPS0+XG4gICAgdXBkYXRlU3R1ZHlPdmVyKClcblxuIyDop6PplIHop4bpopHov5vluqZcbnVuYmxvY2tfdmlkZW9fcHJvZ3Jlc3M9LT5cbiAgICAkKCcjaXNPdmVyJykudmFsKDIpXG4gICAgZXZhbCgkKFwiLnZpZGVvLXNob3cgc2NyaXB0XCIpLmh0bWwoKSlcblxuIyDmmoLlgZzorqHml7ZcbnBhdXNlX3F1aXpfdGltZXI9LT5cbiAgICBpZiB0eXBlb2YgdW5zYWZlV2luZG93IT0ndW5kZWZpbmVkJ1xuICAgICAgICB1bnNhZmVXaW5kb3cudXNlVGltZUZsYWc9ZmFsc2VcbiAgICBlbHNlIHVzZVRpbWVGbGFnPWZhbHNlXG5cbiMgYW5zd2Vycz17cXVlc3Rpb24ucXVpeklkOltvcHRpb25zKHN0cmluZyldfVxuYW5zd2Vycz1udWxsXG5xdWVzdGlvbnM9bnVsbFxub3B0aW9ucz1udWxsXG5cbiMgYXN5bmMg5L+u5pS56IeqIGRvU3VibWl0RXhhbV9hamF4XG50ZXN0X2Fuc3dlcj0ocXVlc3Rpb25zKS0+XG4gICAgI+WkhOeQhuavj+mBk+mimOiuoeaXtlxuICAgIF9xdWl6VXNlVGltZVJlY29yZFtfcXVpeklkUmVjb3JkXT1fcXVpelVzZVRpbWVSZWNvcmRbX3F1aXpJZFJlY29yZF0gb3IgMFxuICAgIF9xdWl6VXNlVGltZVJlY29yZFtfcXVpeklkUmVjb3JkXT1wYXJzZUludChfcXVpelVzZVRpbWVSZWNvcmRbX3F1aXpJZFJlY29yZF0pK19xdWl6VXNlVGltZVxuICAgIHVzZXJfcXVpenM9KEpTT04uc3RyaW5naWZ5IHF1ZXN0aW9uIGZvciBxdWVzdGlvbiBpbiBxdWVzdGlvbnMpXG4gICAgcmVTdWJtaXQ9JCgnI3JlU3VibWl0JykudmFsKClcbiAgICBncmFkZUlkPSQoJyNncmFkZUlkJykudmFsKClcbiAgICB1c2VyUXVpejI9W11cbiAgICB0b3RhbFNjb3JlPTBcbiAgICBhbGxSaWdodEZsYWc9dHJ1ZVxuICAgIGk9MFxuICAgIHdoaWxlIGk8dXNlcl9xdWl6cy5sZW5ndGhcbiAgICAgICAgdXNlcl9RdWl6PUpTT04ucGFyc2UodXNlcl9xdWl6c1tpXSlcbiAgICAgICAgdXNlcl9RdWl6Wyd1c2VUaW1lJ109X3F1aXpVc2VUaW1lUmVjb3JkW3VzZXJfUXVpelsncXVpeklkJ11dXG4gICAgICAgIF9xdWl6VXNlVGltZVJlY29yZFt1c2VyX1F1aXpbJ3F1aXpJZCddXT0wXG4gICAgICAgIFxuICAgICAgICB1c2VyUXVpejIucHVzaCBKU09OLnN0cmluZ2lmeSh1c2VyX1F1aXopXG4gICAgICAgIHNjb3JlPXBhcnNlSW50KHVzZXJfUXVpelsnbWFya1F1aXpTY29yZSddKVxuICAgICAgICB0b3RhbFNjb3JlKz1zY29yZVxuICAgICAgICBpZiBzY29yZT09MFxuICAgICAgICAgICAgYWxsUmlnaHRGbGFnPWZhbHNlXG4gICAgICAgIGkrK1xuICAgIGlmIGFsbFJpZ2h0RmxhZ1xuICAgICAgICB0b3RhbFNjb3JlPTEwMDAwXG4gICAgICAgIFxuICAgIHVzZXJfcXVpenM9dXNlclF1aXoyXG4gICAgY29uc29sZS5sb2codXNlcl9xdWl6cylcbiAgICByZXRfZGF0YT1hd2FpdCAkLndoZW4gJC5hamF4XG4gICAgICAgIHVybDpDT05URVhUUEFUSCsnL2V4YW1TdWJtaXQvNzY4MS9zYXZlRXhhbS8xLycrZXhhbVBhcGVySWQrJy8nK2V4YW1TdWJtaXRJZCsnLm1vb2M/dGVzdFBhcGVySWQ9JytleGFtVGVzdFBhcGVySWRcbiAgICAgICAgdHlwZToncG9zdCdcbiAgICAgICAgZGF0YTpcbiAgICAgICAgICAgIGdyYWRlSWQ6Z3JhZGVJZFxuICAgICAgICAgICAgcmVTdWJtaXQ6cmVTdWJtaXRcbiAgICAgICAgICAgIHN1Ym1pdHF1aXpzOnVzZXJfcXVpenNcbiAgICAgICAgICAgIHN1Ym1pdEZsYWc6MFxuICAgICAgICAgICAgdXNlVGltZToxXG4gICAgICAgICAgICB0b3RhbFNjb3JlOnRvdGFsU2NvcmVcbiAgICAgICAgICAgIHRlc3RQYXBlcklkOmV4YW1UZXN0UGFwZXJJZFxuICAgICAgICBkYXRhVHlwZTonanNvbidcbiAgICAgICAgc3VjY2VzczooZGF0YSkgLT4gaWYgIWRhdGEuc3VjY2Vzc0ZsYWcgdGhlbiB0aHJvdyBFcnJvcihkYXRhLnN1Y2Nlc3NGbGFnPWZhbHNlKVxuICAgICAgICBlcnJvcjotPiBjb25zb2xlLmxvZygndGVzdF9hbnN3ZXIgZXJyb3InKVxuICAgIEpTT04ucGFyc2UgcmV0X2RhdGEuZXhhbVN1Ym1pdC5zdWJtaXRDb250ZW50XG5cbiMgYXN5bmNcbmdldF9xdWl6X2Fuc3dlcnM9LT5cbiAgICAjIOWIneWni+WMlumhtemdoumXrumimFxuICAgIHF1ZXN0aW9ucz0oSlNPTi5wYXJzZSBxdWVzdGlvbiBmb3IgcXVlc3Rpb24gaW4gJCgnI2V4YW1fcGFwZXInKS5xdWl6KCkuZ2V0UHJhY3RpY2UoKSlcbiAgICBcbiAgICAjIOaemuS4vuOAgea1i+ivleOAgeabtOaWsOetlOahiFxuICAgIG9wdGlvbnM9JCgnW29wdGlvbl9pZF0nKS5tYXAgKGksZSktPiBlLmdldEF0dHJpYnV0ZSgnb3B0aW9uX2lkJylcbiAgICBhbnN3ZXJzPXt9XG4gICAgZm9yIG9pIGluIFsxLDIsNCw4LDMsNSw2LDcsOSwxMCwxMSwxMiwxMywxNCwxNV1cbiAgICAgICAgb3B0aW9uX2lkX2ZsYWdzPVtdXG4gICAgICAgIGZvciBpIGluIFswLi4zXVxuICAgICAgICAgICAgb3B0aW9uX2lkX2ZsYWdzLnB1c2ggKG9pPDxpJjBiMTAwMCk9PTBiMTAwMFxuICAgICAgICAjIOajgOa1i+W3suacieato+ehruetlOahiO+8jOWvueavj+S4gOmimOeUn+aIkOetlOahiO+8jOiuvue9rnVzZXJBbnN3ZXJcbiAgICAgICAgZm9yIHF1ZXN0aW9uLHFpIGluIHF1ZXN0aW9uc1xuICAgICAgICAgICAgcGVyZmVjdF9hbnN3ZXI9YW5zd2Vyc1txdWVzdGlvbi5xdWl6SWRdXG4gICAgICAgICAgICBpZiBwZXJmZWN0X2Fuc3dlclxuICAgICAgICAgICAgICAgIHF1ZXN0aW9uLnVzZXJBbnN3ZXI9cGVyZmVjdF9hbnN3ZXIuam9pbignLCcpXG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgY3VycmVudF9yb3VuZF9vcHRpb25faWRzPVtdXG4gICAgICAgICAgICAgICAgIyBvcHRpb25faWQg5bm26Z2e6L+e57utXG4gICAgICAgICAgICAgICAgZm9yIGkgaW4gWzAuLjNdXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfcm91bmRfb3B0aW9uX2lkcy5wdXNoIG9wdGlvbnNbcWkqNCtpXSBpZiBvcHRpb25faWRfZmxhZ3NbaV1cbiAgICAgICAgICAgICAgICBxdWVzdGlvbi51c2VyQW5zd2VyPWN1cnJlbnRfcm91bmRfb3B0aW9uX2lkcy5qb2luKCcsJylcbiAgICAgICAgY29uc29sZS5sb2cgcXVlc3Rpb25zXG4gICAgICAgICMg5p6a5Li+55qE562U5qGI5YeG5aSH5a6M5oiQ77yM5byA5aeL5rWL6K+VXG4gICAgICAgIHRlc3RfcmVzdWx0PWF3YWl0IHRlc3RfYW5zd2VyKHF1ZXN0aW9ucylcbiAgICAgICAgZm9yIHJlc3VsdCBpbiB0ZXN0X3Jlc3VsdFxuICAgICAgICAgICAgcmVzdWx0PUpTT04ucGFyc2UocmVzdWx0KVxuICAgICAgICAgICAgaWYgcmVzdWx0Lm1hcmtSZXN1bHRcbiAgICAgICAgICAgICAgICAjIHBlcmZlY3Rfb3B0aW9ucz0ocGFyc2VJbnQgb3B0aW9uIGZvciBvcHRpb24gaW4gcmVzdWx0LnVzZXJBbnN3ZXIuc3BsaXQoJywnKSlcbiAgICAgICAgICAgICAgICBhbnN3ZXJzW3Jlc3VsdC5xdWl6SWRdPXJlc3VsdC51c2VyQW5zd2VyLnNwbGl0KCcsJylcbiAgICBjb25zb2xlLmxvZyBhbnN3ZXJzXG4gICAgYW5zd2Vyc1xuXG4jIGFzeW5jIOafpeeci+S5oOmimOetlOahiFxucHJpbnRfYW5zd2Vycz0tPlxuICAgIGF3YWl0IGdldF9xdWl6X2Fuc3dlcnMoKSBpZiAhYW5zd2Vyc1xuICAgIHByZXR0eV9vcHRpb25zPScnXG4gICAgZm9yIHF1ZXN0aW9uLHFpIGluIHF1ZXN0aW9uc1xuICAgICAgICBvcHRpb25faWRfZnJvbT1vcHRpb25zW3FpKjRdXG4gICAgICAgIHg9KFN0cmluZy5mcm9tQ2hhckNvZGUoJ0EnLmNoYXJDb2RlQXQoMCkrcGFyc2VJbnQob3B0aW9uKS1vcHRpb25faWRfZnJvbSkgZm9yIG9wdGlvbiBpbiBhbnN3ZXJzW3F1ZXN0aW9uLnF1aXpJZF0pXG4gICAgICAgIHByZXR0eV9vcHRpb25zKz1cIuesrCN7cWkrMX3popjvvJoje3guam9pbignLCcpfVxcblwiXG4gICAgY29uc29sZS5sb2cocHJldHR5X29wdGlvbnMpXG4gICAgYWxlcnQocHJldHR5X29wdGlvbnMpXG4gICAgcmV0dXJuXG5cbiMg6Ieq5Yqo5a6M5oiQ5Lmg6aKYXG5hdXRvX2ZpbGw9LT5cbiAgICBhd2FpdCBnZXRfcXVpel9hbnN3ZXJzKCkgaWYgIWFuc3dlcnNcbiAgICBhbnN3ZXJfaWRzPVtdXG4gICAgZm9yIGssdiBvZiBhbnN3ZXJzXG4gICAgICAgIGFuc3dlcl9pZHM9YW5zd2VyX2lkcy5jb25jYXQgdlxuICAgICMgdG9kbzrlpJrpgInpopjlho3mrKHngrnlh7vkvJrlj5bmtojpgInmi6lcbiAgICAkKFwiW29wdGlvbl9pZF1cIikuZmlsdGVyIChpLGUpLT5lLmdldEF0dHJpYnV0ZSgnb3B0aW9uX2lkJykgaW4gYW5zd2VyX2lkc1xuICAgICAgICAuZmluZCgnW2NsYXNzfD1cImlucHV0XCJdJylcbiAgICAgICAgLmNsaWNrKClcbiAgICByZXR1cm5cblxuYXNzaXN0YW50X2FwaT1cbiAgICAn6Kej6ZSB6KeG6aKR6L+b5bqmJzp1bmJsb2NrX3ZpZGVvX3Byb2dyZXNzXG4gICAgJ+WujOaIkOivpemhuScgICAgOmNvbXBsZXRlX2l0ZW1cbiAgICAn5pqC5YGc562U6aKY6K6h5pe2JzpwYXVzZV9xdWl6X3RpbWVyXG4gICAgJ+iHquWKqOWujOaIkOS5oOmimCc6YXV0b19maWxsXG4gICAgJ+afpeeci+S5oOmimOetlOahiCc6cHJpbnRfYW5zd2Vyc1xuXG4jIHVzZXJzY3JpcHQg546v5aKDXG5pZiB0eXBlb2YgdW5zYWZlV2luZG93IT0ndW5kZWZpbmVkJ1xuICAgICMg5pq06ZyyYXNzaXN0YW505o6l5Y+jXG4gICAgdW5zYWZlV2luZG93LmFzc2lzdGFudD17fVxuICAgIGZvciBuYW1lLGZ1biBvZiBhc3Npc3RhbnRfYXBpXG4gICAgICAgIHVuc2FmZVdpbmRvdy5hc3Npc3RhbnRbZnVuLm5hbWVdPWZ1blxuXG4gICAgIyDov5Tlm57or77nqIvkuLvpobXmlLnkuLrov5Tlm57lr7zoiKpcbiAgICAkKCcjYmFja0NvdXJzZScpLmNvbnRlbnRzKCkubGFzdCgpLnJlcGxhY2VXaXRoKCfov5Tlm57lr7zoiKonKVxuICAgICQoJyNiYWNrQ291cnNlJykub2ZmKCdjbGljaycpXG4gICAgJChcIiNiYWNrQ291cnNlXCIpLm9uICdjbGljaycsIC0+XG4gICAgICAgIGxvY2F0aW9uLmhyZWYgPSBDT05URVhUUEFUSCArIFwiL3BvcnRhbC9zZXNzaW9uL3VuaXROYXZpZ2F0aW9uL1wiICsgJChcIiNjb3Vyc2VPcGVuSWRcIikudmFsKCkgKyBcIi5tb29jXCJcbiAgICBcbiAgICAjIOWKqeaJi+eVjOmdouaYvuekulxuICAgIGFzc2lzdGFudF9kaXY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JylcbiAgICBhc3Npc3RhbnRfZGl2LmlkPSdhc3Npc3RhbnQnXG4gICAgJCgnLm1haW4tc2Nyb2xsJylbMF0ucHJlcGVuZChhc3Npc3RhbnRfZGl2KVxuICAgIFxuICAgICMg5Yqp5omL55WM6Z2i5re75Yqg5oyJ6ZKuXG4gICAgYWRkX2J1dHRvbj0odGV4dCxmdW4pLT5cbiAgICAgICAgYnRuPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpXG4gICAgICAgIGJ0bi50ZXh0Q29udGVudD10ZXh0XG4gICAgICAgIGJ0bi5vbmNsaWNrPWZ1blxuICAgICAgICAjIHRvZG865LyY6ZuF55qE5qC35byP6K6+572uXG4gICAgICAgIGJ0bi5zdHlsZT0nbWFyZ2luOjVweDtwYWRkaW5nOjVweCdcbiAgICAgICAgYXNzaXN0YW50X2Rpdi5hcHBlbmRDaGlsZChidG4pXG4gICAgICAgIFxuICAgIGZvciBuYW1lLGZ1biBvZiBhc3Npc3RhbnRfYXBpXG4gICAgICAgIGFkZF9idXR0b24obmFtZSxmdW4pXG4gICAgICAgIFxuICAgICMgdGFi5YiH5o2iXG4gICAgJCgnLnRhYi1pbm5lcicpLm9uICdjbGljaycsLT5cbiAgICAgICAgIyB0b2RvOuaZuuiDveWIpOaWreWPr+eUqOWKn+iDvVxuICAgICAgICBjb25zb2xlLmxvZyB0aGlzXG4gICAgXG4jcm91dGVyPVxuIyAgICAxMDp2aWRlb19oZWxwZXJfaW5pdFxuIyMgICAgMjA6cGRmX2hlbHBlciAjIHBkZumhtemdolxuIyMgICAgNTA6cXVpel9oZWxwZXIgIyDpgInmi6npophcbiMgICAgXG4jcm91dGVyWyQoJyNpdGVtVHlwZScpLnZhbCgpXSgpXG4jXG4jYXN5bmNfYWpheF90ZXN0PS0+XG4jICAgIGFqYXhfcmV0PWF3YWl0ICQud2hlbiAkLmFqYXhcbiMgICAgICAgIHVybDonaHR0cDovL3d3dy5jbm1vb2Mub3JnL3N0dWR5L3VuaXQvMTk3MDkxLm1vb2MnXG4jICAgICAgICBzdWNjZXNzOi0+Y29uc29sZS5sb2cgJ3N1Y2Nlc3MgY2FsbGJhY2snXG4jICAgIGNvbnNvbGUubG9nIGFqYXhfcmV0Lmxlbmd0aCJdfQ== //# sourceURL=E:\SDK\cnmooc-assistant\index.coffee